(krb5_DES_string_to_key): If the opaque length it set to 1, and
content is 0x01, use the afs3 string-to-key. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16078 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -188,68 +188,6 @@ krb5_DES_schedule(krb5_context context,
|
||||
DES_set_key(key->key->keyvalue.data, key->schedule->data);
|
||||
}
|
||||
|
||||
static void
|
||||
DES_string_to_key_int(unsigned char *data, size_t length, DES_cblock *key)
|
||||
{
|
||||
DES_key_schedule schedule;
|
||||
int i;
|
||||
int reverse = 0;
|
||||
unsigned char *p;
|
||||
|
||||
unsigned char swap[] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
|
||||
0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf };
|
||||
memset(key, 0, 8);
|
||||
|
||||
p = (unsigned char*)key;
|
||||
for (i = 0; i < length; i++) {
|
||||
unsigned char tmp = data[i];
|
||||
if (!reverse)
|
||||
*p++ ^= (tmp << 1);
|
||||
else
|
||||
*--p ^= (swap[tmp & 0xf] << 4) | swap[(tmp & 0xf0) >> 4];
|
||||
if((i % 8) == 7)
|
||||
reverse = !reverse;
|
||||
}
|
||||
DES_set_odd_parity(key);
|
||||
if(DES_is_weak_key(key))
|
||||
(*key)[7] ^= 0xF0;
|
||||
DES_set_key(key, &schedule);
|
||||
DES_cbc_cksum((void*)data, key, length, &schedule, key);
|
||||
memset(&schedule, 0, sizeof(schedule));
|
||||
DES_set_odd_parity(key);
|
||||
if(DES_is_weak_key(key))
|
||||
(*key)[7] ^= 0xF0;
|
||||
}
|
||||
|
||||
static krb5_error_code
|
||||
krb5_DES_string_to_key(krb5_context context,
|
||||
krb5_enctype enctype,
|
||||
krb5_data password,
|
||||
krb5_salt salt,
|
||||
krb5_data opaque,
|
||||
krb5_keyblock *key)
|
||||
{
|
||||
unsigned char *s;
|
||||
size_t len;
|
||||
DES_cblock tmp;
|
||||
|
||||
len = password.length + salt.saltvalue.length;
|
||||
s = malloc(len);
|
||||
if(len > 0 && s == NULL) {
|
||||
krb5_set_error_string(context, "malloc: out of memory");
|
||||
return ENOMEM;
|
||||
}
|
||||
memcpy(s, password.data, password.length);
|
||||
memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length);
|
||||
DES_string_to_key_int(s, len, &tmp);
|
||||
key->keytype = enctype;
|
||||
krb5_data_copy(&key->keyvalue, tmp, sizeof(tmp));
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
memset(s, 0, len);
|
||||
free(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_AFS_STRING_TO_KEY
|
||||
|
||||
/* This defines the Andrew string_to_key function. It accepts a password
|
||||
@@ -349,6 +287,78 @@ DES_AFS3_string_to_key(krb5_context context,
|
||||
}
|
||||
#endif /* ENABLE_AFS_STRING_TO_KEY */
|
||||
|
||||
static void
|
||||
DES_string_to_key_int(unsigned char *data, size_t length, DES_cblock *key)
|
||||
{
|
||||
DES_key_schedule schedule;
|
||||
int i;
|
||||
int reverse = 0;
|
||||
unsigned char *p;
|
||||
|
||||
unsigned char swap[] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
|
||||
0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf };
|
||||
memset(key, 0, 8);
|
||||
|
||||
p = (unsigned char*)key;
|
||||
for (i = 0; i < length; i++) {
|
||||
unsigned char tmp = data[i];
|
||||
if (!reverse)
|
||||
*p++ ^= (tmp << 1);
|
||||
else
|
||||
*--p ^= (swap[tmp & 0xf] << 4) | swap[(tmp & 0xf0) >> 4];
|
||||
if((i % 8) == 7)
|
||||
reverse = !reverse;
|
||||
}
|
||||
DES_set_odd_parity(key);
|
||||
if(DES_is_weak_key(key))
|
||||
(*key)[7] ^= 0xF0;
|
||||
DES_set_key(key, &schedule);
|
||||
DES_cbc_cksum((void*)data, key, length, &schedule, key);
|
||||
memset(&schedule, 0, sizeof(schedule));
|
||||
DES_set_odd_parity(key);
|
||||
if(DES_is_weak_key(key))
|
||||
(*key)[7] ^= 0xF0;
|
||||
}
|
||||
|
||||
static krb5_error_code
|
||||
krb5_DES_string_to_key(krb5_context context,
|
||||
krb5_enctype enctype,
|
||||
krb5_data password,
|
||||
krb5_salt salt,
|
||||
krb5_data opaque,
|
||||
krb5_keyblock *key)
|
||||
{
|
||||
unsigned char *s;
|
||||
size_t len;
|
||||
DES_cblock tmp;
|
||||
|
||||
#ifdef ENABLE_AFS_STRING_TO_KEY
|
||||
if (opaque.length == 1) {
|
||||
unsigned long v;
|
||||
_krb5_get_int(opaque.data, &v, 1);
|
||||
if (v == 1)
|
||||
return DES_AFS3_string_to_key(context, enctype, password,
|
||||
salt, opaque, key);
|
||||
}
|
||||
#endif
|
||||
|
||||
len = password.length + salt.saltvalue.length;
|
||||
s = malloc(len);
|
||||
if(len > 0 && s == NULL) {
|
||||
krb5_set_error_string(context, "malloc: out of memory");
|
||||
return ENOMEM;
|
||||
}
|
||||
memcpy(s, password.data, password.length);
|
||||
memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length);
|
||||
DES_string_to_key_int(s, len, &tmp);
|
||||
key->keytype = enctype;
|
||||
krb5_data_copy(&key->keyvalue, tmp, sizeof(tmp));
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
memset(s, 0, len);
|
||||
free(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
krb5_DES_random_to_key(krb5_context context,
|
||||
krb5_keyblock *key,
|
||||
|
Reference in New Issue
Block a user