Skip to content

Commit f426625

Browse files
committed
Prevent over long nonces in ChaCha20-Poly1305
ChaCha20-Poly1305 is an AEAD cipher, and requires a unique nonce input for every encryption operation. RFC 7539 specifies that the nonce value (IV) should be 96 bits (12 bytes). OpenSSL allows a variable nonce length and front pads the nonce with 0 bytes if it is less than 12 bytes. However it also incorrectly allows a nonce to be set of up to 16 bytes. In this case only the last 12 bytes are significant and any additional leading bytes are ignored. It is a requirement of using this cipher that nonce values are unique. Messages encrypted using a reused nonce value are susceptible to serious confidentiality and integrity attacks. If an application changes the default nonce length to be longer than 12 bytes and then makes a change to the leading bytes of the nonce expecting the new value to be a new unique nonce then such an application could inadvertently encrypt messages with a reused nonce. Additionally the ignored bytes in a long nonce are not covered by the integrity guarantee of this cipher. Any application that relies on the integrity of these ignored leading bytes of a long nonce may be further affected. Any OpenSSL internal use of this cipher, including in SSL/TLS, is safe because no such use sets such a long nonce value. However user applications that use this cipher directly and set a non-default nonce length to be longer than 12 bytes may be vulnerable. CVE-2019-1543 Fixes #8345 Reviewed-by: Paul Dale <[email protected]> Reviewed-by: Richard Levitte <[email protected]> (Merged from #8406) (cherry picked from commit 2a3d0ee)
1 parent c9a826d commit f426625

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

crypto/evp/e_chacha20_poly1305.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ typedef struct {
3030

3131
#define data(ctx) ((EVP_CHACHA_KEY *)(ctx)->cipher_data)
3232

33+
#define CHACHA20_POLY1305_MAX_IVLEN 12
34+
3335
static int chacha_init_key(EVP_CIPHER_CTX *ctx,
3436
const unsigned char user_key[CHACHA_KEY_SIZE],
3537
const unsigned char iv[CHACHA_CTR_SIZE], int enc)
@@ -533,7 +535,7 @@ static int chacha20_poly1305_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,
533535
return 1;
534536

535537
case EVP_CTRL_AEAD_SET_IVLEN:
536-
if (arg <= 0 || arg > CHACHA_CTR_SIZE)
538+
if (arg <= 0 || arg > CHACHA20_POLY1305_MAX_IVLEN)
537539
return 0;
538540
actx->nonce_len = arg;
539541
return 1;

0 commit comments

Comments
 (0)