(_krb5_pk_octetstring2key): string2key function used in pk-init-25
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15622 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -4301,6 +4301,66 @@ krb5_random_to_key(krb5_context context,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
_krb5_pk_octetstring2key(krb5_context context,
|
||||||
|
krb5_enctype type,
|
||||||
|
const void *dhdata,
|
||||||
|
size_t dhsize,
|
||||||
|
const void *c_n_data,
|
||||||
|
const heim_octet_string *c_n,
|
||||||
|
const heim_octet_string *k_n,
|
||||||
|
krb5_keyblock *key)
|
||||||
|
{
|
||||||
|
struct encryption_type *et = _find_enctype(type);
|
||||||
|
krb5_error_code ret;
|
||||||
|
size_t keylen, offset;
|
||||||
|
void *keydata;
|
||||||
|
unsigned char counter;
|
||||||
|
char shaoutput[20];
|
||||||
|
|
||||||
|
if(et == NULL) {
|
||||||
|
krb5_set_error_string(context, "encryption type %d not supported",
|
||||||
|
type);
|
||||||
|
return KRB5_PROG_ETYPE_NOSUPP;
|
||||||
|
}
|
||||||
|
keylen = (et->keytype->bits + 7) / 8;
|
||||||
|
|
||||||
|
keydata = malloc(keylen);
|
||||||
|
if (keydata == NULL) {
|
||||||
|
krb5_set_error_string(context, "malloc: out of memory");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
counter = 0;
|
||||||
|
offset = 0;
|
||||||
|
do {
|
||||||
|
SHA_CTX m;
|
||||||
|
|
||||||
|
SHA1_Init(&m);
|
||||||
|
SHA1_Update(&m, &counter, 1);
|
||||||
|
SHA1_Update(&m, dhdata, dhsize);
|
||||||
|
if (c_n)
|
||||||
|
SHA1_Update(&m, c_n->data, c_n->length);
|
||||||
|
if (k_n)
|
||||||
|
SHA1_Update(&m, k_n->data, k_n->length);
|
||||||
|
SHA1_Final(shaoutput, &m);
|
||||||
|
|
||||||
|
memcpy((unsigned char *)keydata + offset,
|
||||||
|
shaoutput,
|
||||||
|
min(keylen - offset, sizeof(shaoutput)));
|
||||||
|
|
||||||
|
offset += sizeof(shaoutput);
|
||||||
|
counter++;
|
||||||
|
} while(offset < keylen);
|
||||||
|
memset(shaoutput, 0, sizeof(shaoutput));
|
||||||
|
|
||||||
|
ret = krb5_random_to_key(context, type, keydata, keylen, key);
|
||||||
|
memset(keydata, 0, sizeof(keylen));
|
||||||
|
free(keydata);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef CRYPTO_DEBUG
|
#ifdef CRYPTO_DEBUG
|
||||||
|
|
||||||
static krb5_error_code
|
static krb5_error_code
|
||||||
|
Reference in New Issue
Block a user