(DES3_postproc): new version that does the right thing
(*): don't put and recover length in 3DES encoding other small fixes git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6294 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1621,8 +1621,10 @@ encrypt_internal_derived(krb5_context context,
|
|||||||
q = p;
|
q = p;
|
||||||
krb5_generate_random_block(q, et->confoundersize); /* XXX */
|
krb5_generate_random_block(q, et->confoundersize); /* XXX */
|
||||||
q += et->confoundersize;
|
q += et->confoundersize;
|
||||||
|
#if 0
|
||||||
_krb5_put_int(q, len, 4);
|
_krb5_put_int(q, len, 4);
|
||||||
q += 4;
|
q += 4;
|
||||||
|
#endif
|
||||||
memcpy(q, data, len);
|
memcpy(q, data, len);
|
||||||
|
|
||||||
ret = create_checksum(context,
|
ret = create_checksum(context,
|
||||||
@@ -1762,8 +1764,9 @@ decrypt_internal_derived(krb5_context context,
|
|||||||
#endif
|
#endif
|
||||||
(*et->encrypt)(dkey, p, len, 0);
|
(*et->encrypt)(dkey, p, len, 0);
|
||||||
|
|
||||||
cksum.checksum.data = p + len;
|
cksum.checksum.data = p + len;
|
||||||
cksum.checksum.length = checksum_sz;
|
cksum.checksum.length = checksum_sz;
|
||||||
|
cksum.cksumtype = CHECKSUMTYPE(et->keyed_checksum);
|
||||||
|
|
||||||
ret = verify_checksum(context,
|
ret = verify_checksum(context,
|
||||||
crypto,
|
crypto,
|
||||||
@@ -1775,8 +1778,11 @@ decrypt_internal_derived(krb5_context context,
|
|||||||
free(p);
|
free(p);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
_krb5_get_int(p + et->confoundersize, &l, 4);
|
_krb5_get_int(p + et->confoundersize, &l, 4);
|
||||||
memmove(p, p + et->confoundersize + 4, l);
|
#endif
|
||||||
|
l = len - et->confoundersize - checksum_sz;
|
||||||
|
memmove(p, p + et->confoundersize + checksum_sz, l);
|
||||||
result->data = realloc(p, l);
|
result->data = realloc(p, l);
|
||||||
if(p == NULL) {
|
if(p == NULL) {
|
||||||
free(p);
|
free(p);
|
||||||
@@ -1927,6 +1933,42 @@ krb5_generate_random_block(void *buf, size_t len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DES3_postproc(krb5_context context,
|
||||||
|
unsigned char *k, size_t len, struct key_data *key)
|
||||||
|
{
|
||||||
|
unsigned char x[24];
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
memset(x, 0, sizeof(x));
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
unsigned char foo;
|
||||||
|
|
||||||
|
for (j = 0; j < 7; ++j) {
|
||||||
|
unsigned char b = k[7 * i + j];
|
||||||
|
|
||||||
|
x[8 * i + j] = b;
|
||||||
|
}
|
||||||
|
foo = 0;
|
||||||
|
for (j = 6; j >= 0; --j) {
|
||||||
|
foo |= k[7 * i + j] & 1;
|
||||||
|
foo <<= 1;
|
||||||
|
}
|
||||||
|
x[8 * i + 7] = foo;
|
||||||
|
}
|
||||||
|
k = key->key->keyvalue.data;
|
||||||
|
memcpy(k, x, 24);
|
||||||
|
memset(x, 0, sizeof(x));
|
||||||
|
if (key->schedule) {
|
||||||
|
krb5_free_data(context, key->schedule);
|
||||||
|
key->schedule = NULL;
|
||||||
|
}
|
||||||
|
des_set_odd_parity((des_cblock*)k);
|
||||||
|
des_set_odd_parity((des_cblock*)(k + 8));
|
||||||
|
des_set_odd_parity((des_cblock*)(k + 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/* XXX should be moved someplace else */
|
/* XXX should be moved someplace else */
|
||||||
static void
|
static void
|
||||||
DES3_postproc(krb5_context context,
|
DES3_postproc(krb5_context context,
|
||||||
@@ -1960,12 +2002,15 @@ DES3_postproc(krb5_context context,
|
|||||||
k = key->key->keyvalue.data;
|
k = key->key->keyvalue.data;
|
||||||
memcpy(k, x, 24);
|
memcpy(k, x, 24);
|
||||||
memset(x, 0, sizeof(x));
|
memset(x, 0, sizeof(x));
|
||||||
krb5_free_data(context, key->schedule);
|
if (key->schedule) {
|
||||||
key->schedule = NULL;
|
krb5_free_data(context, key->schedule);
|
||||||
|
key->schedule = NULL;
|
||||||
|
}
|
||||||
des_set_odd_parity((des_cblock*)k);
|
des_set_odd_parity((des_cblock*)k);
|
||||||
des_set_odd_parity((des_cblock*)(k + 8));
|
des_set_odd_parity((des_cblock*)(k + 8));
|
||||||
des_set_odd_parity((des_cblock*)(k + 16));
|
des_set_odd_parity((des_cblock*)(k + 16));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
derive_key(krb5_context context,
|
derive_key(krb5_context context,
|
||||||
@@ -1998,17 +2043,26 @@ derive_key(krb5_context context,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
void *c = malloc(len);
|
void *c = malloc(len);
|
||||||
|
size_t res_len = (kt->bits + 7) / 8;
|
||||||
|
|
||||||
if(c == NULL)
|
if(c == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
memcpy(c, constant, len);
|
memcpy(c, constant, len);
|
||||||
(*et->encrypt)(key, c, len, 1);
|
(*et->encrypt)(key, c, len, 1);
|
||||||
k = malloc((kt->bits + 7) / 8);
|
k = malloc(res_len);
|
||||||
if(k == NULL)
|
if(k == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
_krb5_n_fold(c, len, k, kt->bits);
|
_krb5_n_fold(c, len, k, res_len);
|
||||||
free(c);
|
free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
des_set_odd_parity((des_cblock*)k);
|
||||||
|
des_set_odd_parity((des_cblock*)(k + 8));
|
||||||
|
des_set_odd_parity((des_cblock*)(k + 16));
|
||||||
|
memcpy (key->key->keyvalue.data, k, 24);
|
||||||
|
#endif
|
||||||
|
#if 1
|
||||||
/* XXX keytype dependent post-processing */
|
/* XXX keytype dependent post-processing */
|
||||||
switch(kt->type) {
|
switch(kt->type) {
|
||||||
case KEYTYPE_DES3:
|
case KEYTYPE_DES3:
|
||||||
@@ -2020,6 +2074,7 @@ derive_key(krb5_context context,
|
|||||||
ret = KRB5_CRYPTO_INTERNAL;
|
ret = KRB5_CRYPTO_INTERNAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
memset(k, 0, nblocks * et->blocksize);
|
memset(k, 0, nblocks * et->blocksize);
|
||||||
free(k);
|
free(k);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2132,13 +2187,17 @@ krb5_string_to_key_derived(krb5_context context,
|
|||||||
struct encryption_type *et = _find_enctype(etype);
|
struct encryption_type *et = _find_enctype(etype);
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
struct key_data kd;
|
struct key_data kd;
|
||||||
|
u_char *tmp;
|
||||||
|
|
||||||
if(et == NULL)
|
if(et == NULL)
|
||||||
return KRB5_PROG_ETYPE_NOSUPP;
|
return KRB5_PROG_ETYPE_NOSUPP;
|
||||||
ALLOC(kd.key, 1);
|
ALLOC(kd.key, 1);
|
||||||
kd.key->keytype = etype;
|
kd.key->keytype = etype;
|
||||||
|
tmp = malloc (et->keytype->bits / 8);
|
||||||
|
_krb5_n_fold(str, len, tmp, et->keytype->bits / 8);
|
||||||
krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
|
krb5_data_alloc(&kd.key->keyvalue, et->keytype->size);
|
||||||
_krb5_n_fold(str, len, kd.key->keyvalue.data, kd.key->keyvalue.length);
|
kd.schedule = NULL;
|
||||||
|
DES3_postproc (context, tmp, et->keytype->bits / 8, &kd); /* XXX */
|
||||||
ret = derive_key(context,
|
ret = derive_key(context,
|
||||||
et,
|
et,
|
||||||
&kd,
|
&kd,
|
||||||
|
Reference in New Issue
Block a user