| Index: patches/nss-rsa-key-check.patch
|
| diff --git a/patches/nss-rsa-key-check.patch b/patches/nss-rsa-key-check.patch
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6935fa78cbb1a4862a84e57f66345c1758fb4b39
|
| --- /dev/null
|
| +++ b/patches/nss-rsa-key-check.patch
|
| @@ -0,0 +1,109 @@
|
| +diff --git a/nss/lib/freebl/blapi.h b/nss/lib/freebl/blapi.h
|
| +index 97fa28b..682be76 100644
|
| +--- a/nss/lib/freebl/blapi.h
|
| ++++ b/nss/lib/freebl/blapi.h
|
| +@@ -62,7 +62,7 @@ extern SECStatus RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey * key,
|
| + /*
|
| + ** Perform a check of private key parameters for consistency.
|
| + */
|
| +-extern SECStatus RSA_PrivateKeyCheck(RSAPrivateKey *key);
|
| ++extern SECStatus RSA_PrivateKeyCheck(const RSAPrivateKey *key);
|
| +
|
| + /*
|
| + ** Given only minimal private key parameters, fill in the rest of the
|
| +diff --git a/nss/lib/freebl/rsa.c b/nss/lib/freebl/rsa.c
|
| +index fb4b5d0..34bc395 100644
|
| +--- a/nss/lib/freebl/rsa.c
|
| ++++ b/nss/lib/freebl/rsa.c
|
| +@@ -1353,33 +1353,8 @@ RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey *key,
|
| + return rsa_PrivateKeyOp(key, output, input, PR_TRUE);
|
| + }
|
| +
|
| +-static SECStatus
|
| +-swap_in_key_value(PLArenaPool *arena, mp_int *mpval, SECItem *buffer)
|
| +-{
|
| +- int len;
|
| +- mp_err err = MP_OKAY;
|
| +- memset(buffer->data, 0, buffer->len);
|
| +- len = mp_unsigned_octet_size(mpval);
|
| +- if (len <= 0) return SECFailure;
|
| +- if ((unsigned int)len <= buffer->len) {
|
| +- /* The new value is no longer than the old buffer, so use it */
|
| +- err = mp_to_unsigned_octets(mpval, buffer->data, len);
|
| +- if (err >= 0) err = MP_OKAY;
|
| +- buffer->len = len;
|
| +- } else if (arena) {
|
| +- /* The new value is longer, but working within an arena */
|
| +- (void)SECITEM_AllocItem(arena, buffer, len);
|
| +- err = mp_to_unsigned_octets(mpval, buffer->data, len);
|
| +- if (err >= 0) err = MP_OKAY;
|
| +- } else {
|
| +- /* The new value is longer, no arena, can't handle this key */
|
| +- return SECFailure;
|
| +- }
|
| +- return (err == MP_OKAY) ? SECSuccess : SECFailure;
|
| +-}
|
| +-
|
| + SECStatus
|
| +-RSA_PrivateKeyCheck(RSAPrivateKey *key)
|
| ++RSA_PrivateKeyCheck(const RSAPrivateKey *key)
|
| + {
|
| + mp_int p, q, n, psub1, qsub1, e, d, d_p, d_q, qInv, res;
|
| + mp_err err = MP_OKAY;
|
| +@@ -1425,18 +1400,10 @@ RSA_PrivateKeyCheck(RSAPrivateKey *key)
|
| + SECITEM_TO_MPINT(key->exponent1, &d_p);
|
| + SECITEM_TO_MPINT(key->exponent2, &d_q);
|
| + SECITEM_TO_MPINT(key->coefficient, &qInv);
|
| +- /* p > q */
|
| ++ /* p > q */
|
| + if (mp_cmp(&p, &q) <= 0) {
|
| +- /* mind the p's and q's (and d_p's and d_q's) */
|
| +- SECItem tmp;
|
| +- mp_exch(&p, &q);
|
| +- mp_exch(&d_p,&d_q);
|
| +- tmp = key->prime1;
|
| +- key->prime1 = key->prime2;
|
| +- key->prime2 = tmp;
|
| +- tmp = key->exponent1;
|
| +- key->exponent1 = key->exponent2;
|
| +- key->exponent2 = tmp;
|
| ++ rv = SECFailure;
|
| ++ goto cleanup;
|
| + }
|
| + #define VERIFY_MPI_EQUAL(m1, m2) \
|
| + if (mp_cmp(m1, m2) != 0) { \
|
| +diff --git a/nss/lib/softoken/pkcs11.c b/nss/lib/softoken/pkcs11.c
|
| +index a4e769e..c541946 100644
|
| +--- a/nss/lib/softoken/pkcs11.c
|
| ++++ b/nss/lib/softoken/pkcs11.c
|
| +@@ -2057,12 +2057,12 @@ sftk_verifyRSAPrivateKey(SFTKObject *object, PRBool fillIfNeeded)
|
| + sftk_item_expand(&tmpKey.exponent1));
|
| + if (crv != CKR_OK) goto loser;
|
| + }
|
| +- if (!exponent1 || exponent1->attrib.pValue != tmpKey.exponent1.data) {
|
| ++ if (!exponent2 || exponent2->attrib.pValue != tmpKey.exponent2.data) {
|
| + crv = sftk_forceAttribute(object, CKA_EXPONENT_2,
|
| + sftk_item_expand(&tmpKey.exponent2));
|
| + if (crv != CKR_OK) goto loser;
|
| + }
|
| +- if (!exponent1 || exponent1->attrib.pValue != tmpKey.exponent1.data) {
|
| ++ if (!coefficient || coefficient->attrib.pValue != tmpKey.coefficient.data) {
|
| + crv = sftk_forceAttribute(object, CKA_COEFFICIENT,
|
| + sftk_item_expand(&tmpKey.coefficient));
|
| + if (crv != CKR_OK) goto loser;
|
| +@@ -2089,6 +2089,15 @@ loser:
|
| + if (publicExponent) {
|
| + sftk_FreeAttribute(publicExponent);
|
| + }
|
| ++ if (exponent1) {
|
| ++ sftk_FreeAttribute(exponent1);
|
| ++ }
|
| ++ if (exponent2) {
|
| ++ sftk_FreeAttribute(exponent2);
|
| ++ }
|
| ++ if (coefficient) {
|
| ++ sftk_FreeAttribute(coefficient);
|
| ++ }
|
| + return rv;
|
| + }
|
| +
|
|
|