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 <appro@openssl.org>
This commit is contained in:
parent
a2c1dedc5d
commit
51a6081719
3 changed files with 17 additions and 18 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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}
|
||||
};
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue