From e9662cad42794a688e952133cb1b6c47d8f1b88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sun, 1 Jun 2008 22:26:08 +0000 Subject: [PATCH] Use wind_utf8ucs2_length to convert the password to utf16. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23236 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/crypto.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/krb5/crypto.c b/lib/krb5/crypto.c index b4a8ab572..af7362dd5 100644 --- a/lib/krb5/crypto.c +++ b/lib/krb5/crypto.c @@ -561,25 +561,39 @@ ARCFOUR_string_to_key(krb5_context context, krb5_data opaque, krb5_keyblock *key) { - char *s, *p; - size_t len; - int i; - MD4_CTX m; krb5_error_code ret; + uint16_t *s; + size_t len, i; + MD4_CTX m; - len = 2 * password.length; - s = malloc (len); + ret = wind_utf8ucs2_length(password.data, &len); + if (ret) { + krb5_set_error_string(context, "Password not an UCS2 string"); + return ret; + } + + s = malloc (len * sizeof(s[0])); if (len != 0 && s == NULL) { krb5_set_error_string(context, "malloc: out of memory"); - ret = ENOMEM; + return ENOMEM; + } + + ret = wind_utf8ucs2(password.data, s, &len); + if (ret) { + krb5_set_error_string(context, "Password not an UCS2 string"); goto out; } - for (p = s, i = 0; i < password.length; ++i) { - *p++ = ((char *)password.data)[i]; - *p++ = 0; - } + + /* LE encoding */ MD4_Init (&m); - MD4_Update (&m, s, len); + for (i = 0; i < len; i++) { + unsigned char p; + p = (s[0] & 0xff); + MD4_Update (&m, &p, 1); + p = (s[0] >> 8) & 0xff; + MD4_Update (&m, &p, 1); + } + key->keytype = enctype; ret = krb5_data_alloc (&key->keyvalue, 16); if (ret) { @@ -587,9 +601,9 @@ ARCFOUR_string_to_key(krb5_context context, goto out; } MD4_Final (key->keyvalue.data, &m); - memset (s, 0, len); ret = 0; out: + memset (s, 0, len); free (s); return ret; }