summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2019-04-03 15:33:37 +0000
committertb <>2019-04-03 15:33:37 +0000
commit1292146bda904a7983b666fdf116ea07699d00e6 (patch)
tree8077e8ba614ed3a964beb415a20d1db8a87aecc9 /src
parent453060073ca204b0494e6a26765f826e02733527 (diff)
downloadopenbsd-1292146bda904a7983b666fdf116ea07699d00e6.tar.gz
openbsd-1292146bda904a7983b666fdf116ea07699d00e6.tar.bz2
openbsd-1292146bda904a7983b666fdf116ea07699d00e6.zip
Avoid some out of bound accesses in aesni_cbc_hmac_sha1_cipher().
The plen variable can be NO_PAYLOAD_LENGTH == (size_t)-1, so doing tls_aad[plen-4] is no good. Also check that the length of the AAD set via the control interface is equal to 13 since the whole file is written with that case in mind. Note that we no longer use this code in LibreSSL/OpenBSD. We eliminated the use of these control interfaces and stitched cipher modes in libssl a while ago. Problem found by Guido Vranken with his cryptofuzz - thanks! input & ok beck, jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c b/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
index f25b927aeb..9be17e36f2 100644
--- a/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
+++ b/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: e_aes_cbc_hmac_sha1.c,v 1.14 2016/11/05 10:47:57 miod Exp $ */ 1/* $OpenBSD: e_aes_cbc_hmac_sha1.c,v 1.15 2019/04/03 15:33:37 tb Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 2011-2013 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 2011-2013 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -249,7 +249,11 @@ aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
249 /* decrypt HMAC|padding at once */ 249 /* decrypt HMAC|padding at once */
250 aesni_cbc_encrypt(in, out, len, &key->ks, ctx->iv, 0); 250 aesni_cbc_encrypt(in, out, len, &key->ks, ctx->iv, 0);
251 251
252 if (plen) { /* "TLS" mode of operation */ 252 if (plen == 0 || plen == NO_PAYLOAD_LENGTH) {
253 SHA1_Update(&key->md, out, len);
254 } else if (plen < 4) {
255 return 0;
256 } else { /* "TLS" mode of operation */
253 size_t inp_len, mask, j, i; 257 size_t inp_len, mask, j, i;
254 unsigned int res, maxpad, pad, bitlen; 258 unsigned int res, maxpad, pad, bitlen;
255 int ret = 1; 259 int ret = 1;
@@ -459,8 +463,6 @@ aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
459 ret &= (int)~res; 463 ret &= (int)~res;
460#endif 464#endif
461 return ret; 465 return ret;
462 } else {
463 SHA1_Update(&key->md, out, len);
464 } 466 }
465 } 467 }
466 468
@@ -505,7 +507,13 @@ aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
505 case EVP_CTRL_AEAD_TLS1_AAD: 507 case EVP_CTRL_AEAD_TLS1_AAD:
506 { 508 {
507 unsigned char *p = ptr; 509 unsigned char *p = ptr;
508 unsigned int len = p[arg - 2] << 8 | p[arg - 1]; 510 unsigned int len;
511
512 /* RFC 5246, 6.2.3.3: additional data has length 13 */
513 if (arg != 13)
514 return -1;
515
516 len = p[arg - 2] << 8 | p[arg - 1];
509 517
510 if (ctx->encrypt) { 518 if (ctx->encrypt) {
511 key->payload_length = len; 519 key->payload_length = len;
@@ -521,8 +529,6 @@ aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
521 return (int)(((len + SHA_DIGEST_LENGTH + 529 return (int)(((len + SHA_DIGEST_LENGTH +
522 AES_BLOCK_SIZE) & -AES_BLOCK_SIZE) - len); 530 AES_BLOCK_SIZE) & -AES_BLOCK_SIZE) - len);
523 } else { 531 } else {
524 if (arg > 13)
525 arg = 13;
526 memcpy(key->aux.tls_aad, ptr, arg); 532 memcpy(key->aux.tls_aad, ptr, arg);
527 key->payload_length = arg; 533 key->payload_length = arg;
528 534