diff options
author | tb <> | 2019-04-03 15:33:37 +0000 |
---|---|---|
committer | tb <> | 2019-04-03 15:33:37 +0000 |
commit | 0974fba21e49535e60936c798269b670d2ed764a (patch) | |
tree | 8077e8ba614ed3a964beb415a20d1db8a87aecc9 | |
parent | cd6dd381f1ef67941eda5e6ff9f13348a913adfb (diff) | |
download | openbsd-0974fba21e49535e60936c798269b670d2ed764a.tar.gz openbsd-0974fba21e49535e60936c798269b670d2ed764a.tar.bz2 openbsd-0974fba21e49535e60936c798269b670d2ed764a.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
-rw-r--r-- | src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c | 20 |
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 | ||