From 51a6081719373d5dabda0d628d1637c501dd2068 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 22 Sep 2015 08:54:43 +0100 Subject: [PATCH] Change ossltest engine to manually allocate cipher_data The ossltest engine wraps the built-in implementation of aes128-cbc. Normally in an engine the cipher_data structure is automatically allocated by the EVP layer. However this relies on the engine specifying up front the size of that cipher_data structure. In the case of ossltest this value isn't available at compile time. This change makes the ossltest engine allocate its own cipher_data structure instead of leaving it to the EVP layer. Reviewed-by: Andy Polyakov --- engines/e_ossltest.c | 32 ++++++++++++++------------------ engines/e_ossltest_err.c | 2 ++ engines/e_ossltest_err.h | 1 + 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/engines/e_ossltest.c b/engines/e_ossltest.c index 6e50a5fcea..c3390268a5 100644 --- a/engines/e_ossltest.c +++ b/engines/e_ossltest.c @@ -207,23 +207,6 @@ int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, int ossltest_aes128_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl); -/* - * Copy of the definition in crypto/evp/e_aes.c. Only used for the "sizeof" - * below - */ -typedef struct { - union { - double align; - AES_KEY ks; - } ks; - block128_f block; - union { - cbc128_f cbc; - ctr128_f ctr; - } stream; -} EVP_AES_KEY; - - static const EVP_CIPHER ossltest_aes_128_cbc = { \ NID_aes_128_cbc, 16, /* block size */ @@ -233,7 +216,7 @@ static const EVP_CIPHER ossltest_aes_128_cbc = { \ ossltest_aes128_init_key, ossltest_aes128_cbc_cipher, NULL, - sizeof(EVP_AES_KEY), + 0, /* We don't know the size of cipher_data at compile time */ NULL,NULL,NULL,NULL }; @@ -515,6 +498,19 @@ static int digest_sha512_final(EVP_MD_CTX *ctx, unsigned char *md) int ossltest_aes128_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) { + if (ctx->cipher_data == NULL) { + /* + * Normally cipher_data is allocated automatically for an engine but + * we don't know the ctx_size as compile time so we have to do it at + * run time + */ + ctx->cipher_data = OPENSSL_zalloc(EVP_aes_128_cbc()->ctx_size); + if (!ctx->cipher_data) { + OSSLTESTerr(OSSLTEST_F_OSSLTEST_AES128_INIT_KEY, + ERR_R_MALLOC_FAILURE); + return 0; + } + } return EVP_aes_128_cbc()->init(ctx, key, iv, enc); } diff --git a/engines/e_ossltest_err.c b/engines/e_ossltest_err.c index c1b0063b9d..4abb395963 100644 --- a/engines/e_ossltest_err.c +++ b/engines/e_ossltest_err.c @@ -71,6 +71,8 @@ static ERR_STRING_DATA OSSLTEST_str_functs[] = { {ERR_FUNC(OSSLTEST_F_BIND_OSSLTEST), "BIND_OSSLTEST"}, + {ERR_FUNC(OSSLTEST_F_OSSLTEST_AES128_INIT_KEY), + "OSSLTEST_AES128_INIT_KEY"}, {0, NULL} }; diff --git a/engines/e_ossltest_err.h b/engines/e_ossltest_err.h index 8f874e00a0..b46eb05c1c 100644 --- a/engines/e_ossltest_err.h +++ b/engines/e_ossltest_err.h @@ -73,6 +73,7 @@ static void ERR_OSSLTEST_error(int function, int reason, char *file, int line); /* Function codes. */ # define OSSLTEST_F_BIND_OSSLTEST 100 +# define OSSLTEST_F_OSSLTEST_AES128_INIT_KEY 101 /* Reason codes. */ # define OSSLTEST_R_INIT_FAILED 100 -- 2.25.1