add des and DES3 random_to_key hooks, they need special processing

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13742 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2004-04-22 11:53:12 +00:00
parent b17bf61cc0
commit fb27fb0d91

View File

@@ -87,6 +87,7 @@ struct key_type {
void (*random_key)(krb5_context, krb5_keyblock*);
void (*schedule)(krb5_context, struct key_data *);
struct salt_type *string_to_key;
void (*random_to_key)(krb5_context, krb5_keyblock*, const void*, size_t);
};
struct checksum_type {
@@ -149,6 +150,7 @@ static krb5_error_code hmac(krb5_context context,
Checksum *result);
static void free_key_data(krb5_context context, struct key_data *key);
static krb5_error_code usage2arcfour (krb5_context, int *);
static void xor (DES_cblock *, const unsigned char *);
/************************************************************
* *
@@ -331,6 +333,23 @@ DES_AFS3_string_to_key(krb5_context context,
return 0;
}
static void
krb5_DES_random_to_key(krb5_context context,
krb5_keyblock *key,
const void *data,
size_t size)
{
DES_cblock *k = key->keyvalue.data;
memcpy(k, data, key->keyvalue.length);
DES_set_odd_parity(k);
if(DES_is_weak_key(k))
xor(k, (const unsigned char*)"\0\0\0\0\0\0\0\xf0");
}
/*
*
*/
static void
DES3_random_key(krb5_context context,
krb5_keyblock *key)
@@ -461,6 +480,31 @@ DES3_string_to_key_derived(krb5_context context,
return ret;
}
static void
DES3_random_to_key(krb5_context context,
krb5_keyblock *key,
const void *data,
size_t size)
{
u_char *p = key->keyvalue.data;
const u_char *q = data;
DES_cblock *k;
int i, j;
p[7] = p[15] = p[23] = 0;
for (j = 0, i = 0; i < 21; i++) {
j = i / 7;
p[j + i] = q[i] & 0x7f;
p[(j * 8) + 7] = (p[(j * 8) + 7] << 1) | (q[i] >> 7);
}
k = key->keyvalue.data;
for (i = 0; i < 3; i++) {
DES_set_odd_parity(&k[i]);
if(DES_is_weak_key(&k[i]))
xor(&k[i], (const unsigned char*)"\0\0\0\0\0\0\0\xf0");
}
}
/*
* ARCFOUR
*/
@@ -718,7 +762,8 @@ struct key_type keytype_des = {
sizeof(DES_key_schedule),
krb5_DES_random_key,
krb5_DES_schedule,
des_salt
des_salt,
krb5_DES_random_to_key
};
struct key_type keytype_des3 = {
@@ -729,7 +774,8 @@ struct key_type keytype_des3 = {
3 * sizeof(DES_key_schedule),
DES3_random_key,
DES3_schedule,
des3_salt
des3_salt,
DES3_random_to_key
};
struct key_type keytype_des3_derived = {
@@ -740,7 +786,8 @@ struct key_type keytype_des3_derived = {
3 * sizeof(DES_key_schedule),
DES3_random_key,
DES3_schedule,
des3_salt_derived
des3_salt_derived,
DES3_random_to_key
};
#ifdef ENABLE_AES
@@ -3886,11 +3933,10 @@ krb5_random_to_key(krb5_context context,
if(ret)
return ret;
key->keytype = type;
memcpy(key->keyvalue.data, data, et->keytype->size);
#if 0
if (et->random_to_key)
ret = (*et->random_to_key)(context, key, data, size);
#endif
if (et->keytype->random_to_key)
(*et->keytype->random_to_key)(context, key, data, size);
else
memcpy(key->keyvalue.data, data, et->keytype->size);
return 0;
}