Changeset View
Changeset View
Standalone View
Standalone View
crypto/heimdal/lib/krb5/crypto-evp.c
Show All 35 Lines | |||||
void | void | ||||
_krb5_evp_schedule(krb5_context context, | _krb5_evp_schedule(krb5_context context, | ||||
struct _krb5_key_type *kt, | struct _krb5_key_type *kt, | ||||
struct _krb5_key_data *kd) | struct _krb5_key_data *kd) | ||||
{ | { | ||||
struct _krb5_evp_schedule *key = kd->schedule->data; | struct _krb5_evp_schedule *key = kd->schedule->data; | ||||
const EVP_CIPHER *c = (*kt->evp)(); | const EVP_CIPHER *c = (*kt->evp)(); | ||||
EVP_CIPHER_CTX_init(&key->ectx); | key->ectx = EVP_CIPHER_CTX_new(); | ||||
EVP_CIPHER_CTX_init(&key->dctx); | key->dctx = EVP_CIPHER_CTX_new(); | ||||
if (key->ectx == NULL || key->dctx == NULL) | |||||
jhb: This function returns void so there wasn't an easy way to handle failure here more gracefully. | |||||
krb5_abort(context, ENOMEM, "malloc failed"); | |||||
EVP_CipherInit_ex(&key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); | EVP_CipherInit_ex(key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); | ||||
EVP_CipherInit_ex(&key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); | EVP_CipherInit_ex(key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); | ||||
} | } | ||||
void | void | ||||
_krb5_evp_cleanup(krb5_context context, struct _krb5_key_data *kd) | _krb5_evp_cleanup(krb5_context context, struct _krb5_key_data *kd) | ||||
{ | { | ||||
struct _krb5_evp_schedule *key = kd->schedule->data; | struct _krb5_evp_schedule *key = kd->schedule->data; | ||||
EVP_CIPHER_CTX_cleanup(&key->ectx); | EVP_CIPHER_CTX_free(key->ectx); | ||||
EVP_CIPHER_CTX_cleanup(&key->dctx); | EVP_CIPHER_CTX_free(key->dctx); | ||||
} | } | ||||
krb5_error_code | krb5_error_code | ||||
_krb5_evp_encrypt(krb5_context context, | _krb5_evp_encrypt(krb5_context context, | ||||
struct _krb5_key_data *key, | struct _krb5_key_data *key, | ||||
void *data, | void *data, | ||||
size_t len, | size_t len, | ||||
krb5_boolean encryptp, | krb5_boolean encryptp, | ||||
int usage, | int usage, | ||||
void *ivec) | void *ivec) | ||||
{ | { | ||||
struct _krb5_evp_schedule *ctx = key->schedule->data; | struct _krb5_evp_schedule *ctx = key->schedule->data; | ||||
EVP_CIPHER_CTX *c; | EVP_CIPHER_CTX *c; | ||||
c = encryptp ? &ctx->ectx : &ctx->dctx; | c = encryptp ? ctx->ectx : ctx->dctx; | ||||
if (ivec == NULL) { | if (ivec == NULL) { | ||||
/* alloca ? */ | /* alloca ? */ | ||||
size_t len2 = EVP_CIPHER_CTX_iv_length(c); | size_t len2 = EVP_CIPHER_CTX_iv_length(c); | ||||
void *loiv = malloc(len2); | void *loiv = malloc(len2); | ||||
if (loiv == NULL) { | if (loiv == NULL) { | ||||
krb5_clear_error_message(context); | krb5_clear_error_message(context); | ||||
return ENOMEM; | return ENOMEM; | ||||
} | } | ||||
Show All 18 Lines | _krb5_evp_encrypt_cts(krb5_context context, | ||||
void *ivec) | void *ivec) | ||||
{ | { | ||||
size_t i, blocksize; | size_t i, blocksize; | ||||
struct _krb5_evp_schedule *ctx = key->schedule->data; | struct _krb5_evp_schedule *ctx = key->schedule->data; | ||||
unsigned char tmp[EVP_MAX_BLOCK_LENGTH], ivec2[EVP_MAX_BLOCK_LENGTH]; | unsigned char tmp[EVP_MAX_BLOCK_LENGTH], ivec2[EVP_MAX_BLOCK_LENGTH]; | ||||
EVP_CIPHER_CTX *c; | EVP_CIPHER_CTX *c; | ||||
unsigned char *p; | unsigned char *p; | ||||
c = encryptp ? &ctx->ectx : &ctx->dctx; | c = encryptp ? ctx->ectx : ctx->dctx; | ||||
blocksize = EVP_CIPHER_CTX_block_size(c); | blocksize = EVP_CIPHER_CTX_block_size(c); | ||||
if (len < blocksize) { | if (len < blocksize) { | ||||
krb5_set_error_message(context, EINVAL, | krb5_set_error_message(context, EINVAL, | ||||
"message block too short"); | "message block too short"); | ||||
return EINVAL; | return EINVAL; | ||||
} else if (len == blocksize) { | } else if (len == blocksize) { | ||||
▲ Show 20 Lines • Show All 69 Lines • Show Last 20 Lines |
This function returns void so there wasn't an easy way to handle failure here more gracefully. Part of the issue is that the old code assumed that mallocing the 'key' object was the only thing that could fail, but now we can't assume a static size for the EVP contexts, so we end up with a struct containing pointers to two EVP contexts.