From 66ed53c848c60cbaf7a11fa56f1959abf5ef09c0 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 26 Mar 2019 13:32:39 +0000 Subject: [PATCH] Don't allow SHAKE128/SHAKE256 with HMAC See discussion in github issue #8563 Fixes #8563 Reviewed-by: Matthias St. Pierre (Merged from https://github.com/openssl/openssl/pull/8585) --- crypto/hmac/hmac.c | 7 +++++++ doc/man3/HMAC.pod | 4 +++- test/recipes/30-test_evp_data/evpmac.txt | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/crypto/hmac/hmac.c b/crypto/hmac/hmac.c index e4031b44a5..a29f553bbe 100644 --- a/crypto/hmac/hmac.c +++ b/crypto/hmac/hmac.c @@ -35,6 +35,13 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, return 0; } + /* + * The HMAC construction is not allowed to be used with the + * extendable-output functions (XOF) shake128 and shake256. + */ + if ((EVP_MD_meth_get_flags(md) & EVP_MD_FLAG_XOF) != 0) + return 0; + if (key != NULL) { reset = 1; j = EVP_MD_block_size(md); diff --git a/doc/man3/HMAC.pod b/doc/man3/HMAC.pod index 65386a7baa..30c0e6bac3 100644 --- a/doc/man3/HMAC.pod +++ b/doc/man3/HMAC.pod @@ -63,7 +63,9 @@ If B is NULL, the digest is placed in a static array. The size of the output is placed in B, unless it is B. Note: passing a NULL value for B to use the static array is not thread safe. -B can be EVP_sha1(), EVP_ripemd160() etc. +B is a message digest such as EVP_sha1(), EVP_ripemd160() etc. HMAC does +not support variable output length digests such as EVP_shake128() and +EVP_shake256(). HMAC_CTX_new() creates a new HMAC_CTX in heap memory. diff --git a/test/recipes/30-test_evp_data/evpmac.txt b/test/recipes/30-test_evp_data/evpmac.txt index 2bcb3c33be..6c55496e40 100644 --- a/test/recipes/30-test_evp_data/evpmac.txt +++ b/test/recipes/30-test_evp_data/evpmac.txt @@ -351,6 +351,14 @@ Input = "Sample message for keylen>blocklen" Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384858687 Output = 5f464f5e5b7848e3885e49b2c385f0694985d0e38966242dc4a5fe3fea4b37d46b65ceced5dcf59438dd840bab22269f0ba7febdb9fcf74602a35666b2a32915 +Title = HMAC self generated tests + +MAC = HMAC +Algorithm = SHAKE128 +Input = "Test that SHAKE128 fails" +Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +Result = DIGESTSIGNINIT_ERROR + Title = CMAC tests (from FIPS module) -- 2.25.1