summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-12-15 13:45:05 +0000
committertb <>2023-12-15 13:45:05 +0000
commit33938838e6871c50d612d2a8ed137a1557e9c72f (patch)
treef6269f6174e016baf81421c67ac58bbae6d9385a /src
parent150cb2d757cac1a44068bbda820f9aefd1c67494 (diff)
downloadopenbsd-33938838e6871c50d612d2a8ed137a1557e9c72f.tar.gz
openbsd-33938838e6871c50d612d2a8ed137a1557e9c72f.tar.bz2
openbsd-33938838e6871c50d612d2a8ed137a1557e9c72f.zip
Disallow ciphers with EVP_CIPH_FLAG_CUSTOM_CIPHER in CMAC
These are usually AEAD ciphers, for which CMAC makes little sense (if you need a MAC and all you have is an AEAD, you don't need CMAC, you can just use a zero length cipher text). Also, since the CMAC implementation only allows 64 and 128 bit block sizes, the AEADs would error out later anyway. The only family of ciphers this effectively excludes is AES key wrap, for which CMAC makes little sense. One notable side effect of doing this is that the EVP_Cipher() return value checks in the CMAC code magically become correct. EVP. What's not to love about it. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/cmac/cmac.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/lib/libcrypto/cmac/cmac.c b/src/lib/libcrypto/cmac/cmac.c
index f653219b8f..0df40277bc 100644
--- a/src/lib/libcrypto/cmac/cmac.c
+++ b/src/lib/libcrypto/cmac/cmac.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: cmac.c,v 1.16 2023/11/29 21:35:57 tb Exp $ */ 1/* $OpenBSD: cmac.c,v 1.17 2023/12/15 13:45:05 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project. 3 * project.
4 */ 4 */
@@ -191,6 +191,13 @@ CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
191 191
192 /* Initialise context. */ 192 /* Initialise context. */
193 if (cipher != NULL) { 193 if (cipher != NULL) {
194 /*
195 * Disallow ciphers for which EVP_Cipher() behaves differently.
196 * These are AEAD ciphers (or AES keywrap) for which the CMAC
197 * construction makes little sense.
198 */
199 if ((cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) != 0)
200 return 0;
194 if (!EVP_EncryptInit_ex(&ctx->cctx, cipher, NULL, NULL, NULL)) 201 if (!EVP_EncryptInit_ex(&ctx->cctx, cipher, NULL, NULL, NULL))
195 return 0; 202 return 0;
196 } 203 }