diff options
Diffstat (limited to 'src/lib/crypto/make_checksum_iov.c')
-rw-r--r-- | src/lib/crypto/make_checksum_iov.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/lib/crypto/make_checksum_iov.c b/src/lib/crypto/make_checksum_iov.c index 0d862c8352..3cf4af6052 100644 --- a/src/lib/crypto/make_checksum_iov.c +++ b/src/lib/crypto/make_checksum_iov.c @@ -36,10 +36,11 @@ krb5_c_make_checksum_iov(krb5_context context, krb5_crypto_iov *data, size_t num_data) { - krb5_error_code ret; + unsigned int i; size_t cksumlen; + krb5_error_code ret; + krb5_data cksum_data; krb5_crypto_iov *checksum; - size_t i; for (i = 0; i < krb5_cksumtypes_length; i++) { if (krb5_cksumtypes_list[i].ctype == cksumtype) @@ -49,20 +50,33 @@ krb5_c_make_checksum_iov(krb5_context context, if (i == krb5_cksumtypes_length) return(KRB5_BAD_ENCTYPE); - if (krb5_cksumtypes_list[i].keyhash) - cksumlen = krb5_cksumtypes_list[i].keyhash->hashsize; + if (krb5_cksumtypes_list[i].keyhash != NULL) + cksum_data.length = krb5_cksumtypes_list[i].keyhash->hashsize; + else + cksum_data.length = krb5_cksumtypes_list[i].hash->hashsize; + + if (krb5_cksumtypes_list[i].trunc_size != 0) + cksumlen = krb5_cksumtypes_list[i].trunc_size; else - cksumlen = krb5_cksumtypes_list[i].hash->hashsize; + cksumlen = cksum_data.length; checksum = krb5int_c_locate_iov(data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); if (checksum == NULL || checksum->data.length < cksumlen) return(KRB5_BAD_MSIZE); - checksum->data.length = cksumlen; + cksum_data.data = malloc(cksum_data.length); + if (cksum_data.data == NULL) + return(ENOMEM); ret = krb5int_c_make_checksum_iov(&krb5_cksumtypes_list[i], key, usage, data, num_data, - &checksum->data); + &cksum_data); + if (ret == 0) { + memcpy(checksum->data.data, cksum_data.data, cksumlen); + checksum->data.length = cksumlen; + } + + free(cksum_data.data); return(ret); } |