#include <krb5/copyright.h>
#include <krb5/krb5.h>
+#include <krb5/kdb5_err.h>
#include <krb5/ext-proto.h>
#include <errno.h>
krb5_keyblock *out;
krb5_encrypt_block *eblock;
{
+ /* encrypted rep has a length encrypted along with the key,
+ so that we win if the keysize != blocksize.
+ However, this means an extra block (at least) if
+ keysize == blocksize. */
+
+ krb5_error_code retval;
+
*out = *in;
out->length = krb5_encrypt_size(in->length, eblock->crypto_entry);
+ out->length += sizeof(out->length);
out->contents = (krb5_octet *)malloc(out->length);
if (!out->contents) {
out->contents = 0;
out->length = 0;
return ENOMEM;
}
- return (*eblock->crypto_entry->encrypt_func)((krb5_pointer) in->contents,
- (krb5_pointer) out->contents,
- in->length, eblock);
+ bcopy(&out->length, out->contents, sizeof(out->length));
+ if (retval = (*eblock->crypto_entry->
+ encrypt_func)((krb5_pointer) in->contents,
+ ((krb5_pointer) out->contents) +
+ sizeof(out->length),
+ in->length, eblock)) {
+ free((char *)out->contents);
+ out->contents = 0;
+ out->length = 0;
+ }
+ return retval;
}
krb5_error_code
krb5_keyblock *out;
krb5_encrypt_block *eblock;
{
+ krb5_error_code retval;
+
*out = *in;
out->length = krb5_encrypt_size(in->length, eblock->crypto_entry);
out->contents = (krb5_octet *)malloc(out->length);
out->length = 0;
return ENOMEM;
}
- return (*eblock->crypto_entry->decrypt_func)((krb5_pointer) in->contents,
- (krb5_pointer) out->contents,
- in->length, eblock);
+ if (retval = (*eblock->crypto_entry->
+ decrypt_func)((krb5_pointer) in->contents,
+ (krb5_pointer) out->contents,
+ in->length, eblock)) {
+ free((char *)out->contents);
+ out->contents = 0;
+ out->length = 0;
+ return retval;
+ }
+ out->length -= sizeof(out->length);
+ if (out->length < 0) {
+ free((char *)out->contents);
+ out->contents = 0;
+ out->length = 0;
+ return KRB5_KDB_INVALIDKEYSIZE;
+ }
+ /* shift key down to beginning of contents, and ignore extra wasted
+ space */
+ bcopy(out->contents, ((krb5_pointer) out->contents ) + sizeof(out->length),
+ out->length);
+ return retval;
}