f426625b6a
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 <paul.dale@oracle.com>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8406)
(cherry picked from commit
|
||
---|---|---|
.. | ||
bio_b64.c | ||
bio_enc.c | ||
bio_md.c | ||
bio_ok.c | ||
build.info | ||
c_allc.c | ||
c_alld.c | ||
cmeth_lib.c | ||
digest.c | ||
e_aes.c | ||
e_aes_cbc_hmac_sha1.c | ||
e_aes_cbc_hmac_sha256.c | ||
e_aria.c | ||
e_bf.c | ||
e_camellia.c | ||
e_cast.c | ||
e_chacha20_poly1305.c | ||
e_des.c | ||
e_des3.c | ||
e_idea.c | ||
e_null.c | ||
e_old.c | ||
e_rc2.c | ||
e_rc4.c | ||
e_rc4_hmac_md5.c | ||
e_rc5.c | ||
e_seed.c | ||
e_sm4.c | ||
e_xcbc_d.c | ||
encode.c | ||
evp_cnf.c | ||
evp_enc.c | ||
evp_err.c | ||
evp_key.c | ||
evp_lib.c | ||
evp_locl.h | ||
evp_pbe.c | ||
evp_pkey.c | ||
m_md2.c | ||
m_md4.c | ||
m_md5.c | ||
m_md5_sha1.c | ||
m_mdc2.c | ||
m_null.c | ||
m_ripemd.c | ||
m_sha1.c | ||
m_sha3.c | ||
m_sigver.c | ||
m_wp.c | ||
names.c | ||
p5_crpt.c | ||
p5_crpt2.c | ||
p_dec.c | ||
p_enc.c | ||
p_lib.c | ||
p_open.c | ||
p_seal.c | ||
p_sign.c | ||
p_verify.c | ||
pbe_scrypt.c | ||
pmeth_fn.c | ||
pmeth_gn.c | ||
pmeth_lib.c |