Skip to content

Commit

Permalink
evp-cmac: do not seg-fault when getting mac-size before init
Browse files Browse the repository at this point in the history
Add null check to cmac_size().  This avoids a seg-fault encountered
with cmac when EVP_MAC_CTX_get_mac_size() is called before init.

Extend mac testing in evp_test.c to check that the sizes returned by
EVP_MAC_CTX_get_mac_size() before and after init make sense (this also
ensures that we no longer seg-fault).

Fixes #22842

Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #22858)
  • Loading branch information
James Muir authored and t8m committed Dec 1, 2023
1 parent bed7a87 commit ff18196
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
6 changes: 5 additions & 1 deletion providers/implementations/macs/cmac_prov.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,12 @@ static void *cmac_dup(void *vsrc)
static size_t cmac_size(void *vmacctx)
{
struct cmac_data_st *macctx = vmacctx;
const EVP_CIPHER_CTX *cipherctx = CMAC_CTX_get0_cipher_ctx(macctx->ctx);

return EVP_CIPHER_CTX_get_block_size(CMAC_CTX_get0_cipher_ctx(macctx->ctx));
if (EVP_CIPHER_CTX_get0_cipher(cipherctx) == NULL)
return 0;

return EVP_CIPHER_CTX_get_block_size(cipherctx);
}

static int cmac_setkey(struct cmac_data_st *macctx,
Expand Down
23 changes: 22 additions & 1 deletion test/evp_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -1514,6 +1514,7 @@ static int mac_test_run_mac(EVP_TEST *t)
EVP_MAC_CTX *ctx = NULL;
unsigned char *got = NULL;
size_t got_len = 0, size = 0;
size_t size_before_init, size_after_init, size_val = 0;
int i, block_size = -1, output_size = -1;
OSSL_PARAM params[21], sizes[3], *psizes = sizes;
size_t params_n = 0;
Expand Down Expand Up @@ -1610,6 +1611,9 @@ static int mac_test_run_mac(EVP_TEST *t)
}
params_n++;

if (strcmp(tmpkey, "size") == 0)
size_val = (size_t)strtoul(tmpval, NULL, 0);

OPENSSL_free(tmpkey);
}
params[params_n] = OSSL_PARAM_construct_end();
Expand All @@ -1618,11 +1622,28 @@ static int mac_test_run_mac(EVP_TEST *t)
t->err = "MAC_CREATE_ERROR";
goto err;
}

size_before_init = EVP_MAC_CTX_get_mac_size(ctx);
if (!EVP_MAC_init(ctx, expected->key, expected->key_len, params)) {
t->err = "MAC_INIT_ERROR";
goto err;
}
size_after_init = EVP_MAC_CTX_get_mac_size(ctx);
if (!TEST_false(size_before_init == 0 && size_after_init == 0)) {
t->err = "MAC SIZE not set";
goto err;
}
if (size_before_init != 0) {
/* mac-size not modified by init params */
if (size_val == 0 && !TEST_size_t_eq(size_before_init, size_after_init)) {
t->err = "MAC SIZE check failed";
goto err;
}
/* mac-size modified by init params */
if (size_val != 0 && !TEST_size_t_eq(size_val, size_after_init)) {
t->err = "MAC SIZE check failed";
goto err;
}
}
if (expected->output_size >= 0)
*psizes++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE,
&output_size);
Expand Down

0 comments on commit ff18196

Please sign in to comment.