# HG changeset patch # User Benjamin Beurdouche # Date 1595031218 0 # Node ID c25adfdfab34ddb08d3262aac3242e3399de1095 # Parent f282556e6cc7715f5754aeaadda6f902590e7e38 Bug 1636771 - Fix incorrect call to Chacha20Poly1305 by PKCS11. r=jcj,kjacobs,rrelyea Differential Revision: https://phabricator.services.mozilla.com/D74801 diff --git a/gtests/pk11_gtest/pk11_chacha20poly1305_unittest.cc b/gtests/pk11_gtest/pk11_chacha20poly1305_unittest.cc --- a/gtests/pk11_gtest/pk11_chacha20poly1305_unittest.cc +++ b/gtests/pk11_gtest/pk11_chacha20poly1305_unittest.cc @@ -40,28 +40,35 @@ class Pkcs11ChaCha20Poly1305Test aead_params.ulNonceLen = iv_len; aead_params.pAAD = toUcharPtr(aad); aead_params.ulAADLen = aad_len; aead_params.ulTagLen = 16; SECItem params = {siBuffer, reinterpret_cast(&aead_params), sizeof(aead_params)}; - // Encrypt with bad parameters. + // Encrypt with bad parameters (TagLen is too long). unsigned int encrypted_len = 0; std::vector encrypted(data_len + aead_params.ulTagLen); aead_params.ulTagLen = 158072; SECStatus rv = PK11_Encrypt(key.get(), kMech, ¶ms, encrypted.data(), &encrypted_len, encrypted.size(), data, data_len); EXPECT_EQ(SECFailure, rv); EXPECT_EQ(0U, encrypted_len); - aead_params.ulTagLen = 16; + + // Encrypt with bad parameters (TagLen is too short). + aead_params.ulTagLen = 2; + rv = PK11_Encrypt(key.get(), kMech, ¶ms, encrypted.data(), + &encrypted_len, encrypted.size(), data, data_len); + EXPECT_EQ(SECFailure, rv); + EXPECT_EQ(0U, encrypted_len); // Encrypt. + aead_params.ulTagLen = 16; rv = PK11_Encrypt(key.get(), kMech, ¶ms, encrypted.data(), &encrypted_len, encrypted.size(), data, data_len); // Return if encryption failure was expected due to invalid IV. // Without valid ciphertext, all further tests can be skipped. if (invalid_iv) { EXPECT_EQ(rv, SECFailure); EXPECT_EQ(0U, encrypted_len) diff --git a/lib/freebl/chacha20poly1305.c b/lib/freebl/chacha20poly1305.c --- a/lib/freebl/chacha20poly1305.c +++ b/lib/freebl/chacha20poly1305.c @@ -76,17 +76,17 @@ ChaCha20Poly1305_InitContext(ChaCha20Pol { #ifdef NSS_DISABLE_CHACHAPOLY return SECFailure; #else if (keyLen != 32) { PORT_SetError(SEC_ERROR_BAD_KEY); return SECFailure; } - if (tagLen == 0 || tagLen > 16) { + if (tagLen != 16) { PORT_SetError(SEC_ERROR_INPUT_LEN); return SECFailure; } PORT_Memcpy(ctx->key, key, sizeof(ctx->key)); ctx->tagLen = tagLen; return SECSuccess;