diff options
| author | Sam Hartman <hartmans@mit.edu> | 2008-12-02 20:10:20 +0000 |
|---|---|---|
| committer | Sam Hartman <hartmans@mit.edu> | 2008-12-02 20:10:20 +0000 |
| commit | b5d22c309b734f6d3908fafa0e681ef7844ad9b3 (patch) | |
| tree | cb6c8bae9acfc8e05bdcc5b156d4d9896c5e251d /src/lib/crypto/verify_checksum_iov.c | |
| parent | b282e93924be15445fb48ab186da737d62a003f6 (diff) | |
| download | krb5-b5d22c309b734f6d3908fafa0e681ef7844ad9b3.tar.gz krb5-b5d22c309b734f6d3908fafa0e681ef7844ad9b3.tar.xz krb5-b5d22c309b734f6d3908fafa0e681ef7844ad9b3.zip | |
Crypto IOV API per Projects/AEAD encryption API
Merge in the mskrb-crypto-iov branch at r21259 in order to move an
implementation of
http://k5wiki.kerberos.org/wiki/Projects/AEAD_encryption_API onto the
trunk. This branch contains a subset of the commits on the
mskrb-integ branch that implement the krb5 library part of the crypto
IOV API.
ticket: new
Status: open
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@21263 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/crypto/verify_checksum_iov.c')
| -rw-r--r-- | src/lib/crypto/verify_checksum_iov.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/lib/crypto/verify_checksum_iov.c b/src/lib/crypto/verify_checksum_iov.c new file mode 100644 index 000000000..5627188df --- /dev/null +++ b/src/lib/crypto/verify_checksum_iov.c @@ -0,0 +1,92 @@ +/* + * lib/crypto/verify_checksum_iov.c + * + * Copyright 2008 by the Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + */ + +#include "k5-int.h" +#include "cksumtypes.h" +#include "aead.h" + +krb5_error_code KRB5_CALLCONV +krb5_c_verify_checksum_iov(krb5_context context, + krb5_cksumtype checksum_type, + const krb5_keyblock *key, + krb5_keyusage usage, + const krb5_crypto_iov *data, + size_t num_data, + krb5_boolean *valid) +{ + unsigned int i; + size_t hashsize; + krb5_error_code ret; + krb5_data computed; + krb5_crypto_iov *checksum; + + for (i=0; i<krb5_cksumtypes_length; i++) { + if (krb5_cksumtypes_list[i].ctype == checksum_type) + break; + } + + if (i == krb5_cksumtypes_length) + return(KRB5_BAD_ENCTYPE); + + checksum = krb5int_c_locate_iov((krb5_crypto_iov *)data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); + if (checksum == NULL) + return(KRB5_BAD_MSIZE); + + /* if there's actually a verify function, call it */ + + if (krb5_cksumtypes_list[i].keyhash && + krb5_cksumtypes_list[i].keyhash->verify_iov) + return((*(krb5_cksumtypes_list[i].keyhash->verify_iov))(key, usage, 0, + &checksum->data, + data, num_data, + valid)); + + /* otherwise, make the checksum again, and compare */ + + if ((ret = krb5_c_checksum_length(context, checksum_type, &hashsize))) + return(ret); + + if (checksum->data.length != hashsize) + return(KRB5_BAD_MSIZE); + + computed.data = malloc(hashsize); + if (computed.data == NULL) { + return(ENOMEM); + } + computed.length = hashsize; + + if ((ret = krb5int_c_make_checksum_iov(&krb5_cksumtypes_list[i], key, usage, + data, num_data, &computed))) { + free(computed.data); + return(ret); + } + + *valid = (memcmp(computed.data, &checksum->data, hashsize) == 0); + + free(computed.data); + + return(0); +} |
