aboutsummaryrefslogtreecommitdiff
path: root/src/lib/crypto/make_checksum_iov.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/crypto/make_checksum_iov.c')
-rw-r--r--src/lib/crypto/make_checksum_iov.c28
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 0d862c8..3cf4af6 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);
}