1*568c901eSArrigo Marchioridiff -ur misc/nss-3.39/nss/lib/cryptohi/secvfy.c misc/build/nss-3.39/nss/lib/cryptohi/secvfy.c 2*568c901eSArrigo Marchiori--- misc/nss-3.39/nss/lib/cryptohi/secvfy.c 2018-08-31 14:55:53.000000000 +0200 3*568c901eSArrigo Marchiori+++ misc/build/nss-3.39/nss/lib/cryptohi/secvfy.c 2022-02-05 22:36:19.617132698 +0100 4*568c901eSArrigo Marchiori@@ -164,6 +164,37 @@ 5*568c901eSArrigo Marchiori PR_FALSE /*XXX: unsafeAllowMissingParameters*/); 6*568c901eSArrigo Marchiori } 7*568c901eSArrigo Marchiori 8*568c901eSArrigo Marchiori+static unsigned int 9*568c901eSArrigo Marchiori+checkedSignatureLen(const SECKEYPublicKey *pubk) 10*568c901eSArrigo Marchiori+{ 11*568c901eSArrigo Marchiori+ unsigned int sigLen = SECKEY_SignatureLen(pubk); 12*568c901eSArrigo Marchiori+ if (sigLen == 0) { 13*568c901eSArrigo Marchiori+ /* Error set by SECKEY_SignatureLen */ 14*568c901eSArrigo Marchiori+ return sigLen; 15*568c901eSArrigo Marchiori+ } 16*568c901eSArrigo Marchiori+ unsigned int maxSigLen; 17*568c901eSArrigo Marchiori+ switch (pubk->keyType) { 18*568c901eSArrigo Marchiori+ case rsaKey: 19*568c901eSArrigo Marchiori+ case rsaPssKey: 20*568c901eSArrigo Marchiori+ maxSigLen = (RSA_MAX_MODULUS_BITS + 7) / 8; 21*568c901eSArrigo Marchiori+ break; 22*568c901eSArrigo Marchiori+ case dsaKey: 23*568c901eSArrigo Marchiori+ maxSigLen = DSA_MAX_SIGNATURE_LEN; 24*568c901eSArrigo Marchiori+ break; 25*568c901eSArrigo Marchiori+ case ecKey: 26*568c901eSArrigo Marchiori+ maxSigLen = 2 * MAX_ECKEY_LEN; 27*568c901eSArrigo Marchiori+ break; 28*568c901eSArrigo Marchiori+ default: 29*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 30*568c901eSArrigo Marchiori+ return 0; 31*568c901eSArrigo Marchiori+ } 32*568c901eSArrigo Marchiori+ if (sigLen > maxSigLen) { 33*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_INVALID_KEY); 34*568c901eSArrigo Marchiori+ return 0; 35*568c901eSArrigo Marchiori+ } 36*568c901eSArrigo Marchiori+ return sigLen; 37*568c901eSArrigo Marchiori+} 38*568c901eSArrigo Marchiori+ 39*568c901eSArrigo Marchiori /* 40*568c901eSArrigo Marchiori * decode the ECDSA or DSA signature from it's DER wrapping. 41*568c901eSArrigo Marchiori * The unwrapped/raw signature is placed in the buffer pointed 42*568c901eSArrigo Marchiori@@ -174,38 +205,38 @@ 43*568c901eSArrigo Marchiori unsigned int len) 44*568c901eSArrigo Marchiori { 45*568c901eSArrigo Marchiori SECItem *dsasig = NULL; /* also used for ECDSA */ 46*568c901eSArrigo Marchiori- SECStatus rv = SECSuccess; 47*568c901eSArrigo Marchiori 48*568c901eSArrigo Marchiori- if ((algid != SEC_OID_ANSIX9_DSA_SIGNATURE) && 49*568c901eSArrigo Marchiori- (algid != SEC_OID_ANSIX962_EC_PUBLIC_KEY)) { 50*568c901eSArrigo Marchiori- if (sig->len != len) { 51*568c901eSArrigo Marchiori- PORT_SetError(SEC_ERROR_BAD_DER); 52*568c901eSArrigo Marchiori- return SECFailure; 53*568c901eSArrigo Marchiori+ /* Safety: Ensure algId is as expected and that signature size is within maxmimums */ 54*568c901eSArrigo Marchiori+ if (algid == SEC_OID_ANSIX9_DSA_SIGNATURE) { 55*568c901eSArrigo Marchiori+ if (len > DSA_MAX_SIGNATURE_LEN) { 56*568c901eSArrigo Marchiori+ goto loser; 57*568c901eSArrigo Marchiori } 58*568c901eSArrigo Marchiori- 59*568c901eSArrigo Marchiori- PORT_Memcpy(dsig, sig->data, sig->len); 60*568c901eSArrigo Marchiori- return SECSuccess; 61*568c901eSArrigo Marchiori- } 62*568c901eSArrigo Marchiori- 63*568c901eSArrigo Marchiori- if (algid == SEC_OID_ANSIX962_EC_PUBLIC_KEY) { 64*568c901eSArrigo Marchiori+ } else if (algid == SEC_OID_ANSIX962_EC_PUBLIC_KEY) { 65*568c901eSArrigo Marchiori if (len > MAX_ECKEY_LEN * 2) { 66*568c901eSArrigo Marchiori- PORT_SetError(SEC_ERROR_BAD_DER); 67*568c901eSArrigo Marchiori- return SECFailure; 68*568c901eSArrigo Marchiori+ goto loser; 69*568c901eSArrigo Marchiori } 70*568c901eSArrigo Marchiori- } 71*568c901eSArrigo Marchiori- dsasig = DSAU_DecodeDerSigToLen((SECItem *)sig, len); 72*568c901eSArrigo Marchiori- 73*568c901eSArrigo Marchiori- if ((dsasig == NULL) || (dsasig->len != len)) { 74*568c901eSArrigo Marchiori- rv = SECFailure; 75*568c901eSArrigo Marchiori } else { 76*568c901eSArrigo Marchiori- PORT_Memcpy(dsig, dsasig->data, dsasig->len); 77*568c901eSArrigo Marchiori+ goto loser; 78*568c901eSArrigo Marchiori } 79*568c901eSArrigo Marchiori 80*568c901eSArrigo Marchiori- if (dsasig != NULL) 81*568c901eSArrigo Marchiori+ /* Decode and pad to length */ 82*568c901eSArrigo Marchiori+ dsasig = DSAU_DecodeDerSigToLen((SECItem *)sig, len); 83*568c901eSArrigo Marchiori+ if (dsasig == NULL) { 84*568c901eSArrigo Marchiori+ goto loser; 85*568c901eSArrigo Marchiori+ } 86*568c901eSArrigo Marchiori+ if (dsasig->len != len) { 87*568c901eSArrigo Marchiori SECITEM_FreeItem(dsasig, PR_TRUE); 88*568c901eSArrigo Marchiori- if (rv == SECFailure) 89*568c901eSArrigo Marchiori- PORT_SetError(SEC_ERROR_BAD_DER); 90*568c901eSArrigo Marchiori- return rv; 91*568c901eSArrigo Marchiori+ goto loser; 92*568c901eSArrigo Marchiori+ } 93*568c901eSArrigo Marchiori+ 94*568c901eSArrigo Marchiori+ PORT_Memcpy(dsig, dsasig->data, len); 95*568c901eSArrigo Marchiori+ SECITEM_FreeItem(dsasig, PR_TRUE); 96*568c901eSArrigo Marchiori+ 97*568c901eSArrigo Marchiori+ return SECSuccess; 98*568c901eSArrigo Marchiori+ 99*568c901eSArrigo Marchiori+loser: 100*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_DER); 101*568c901eSArrigo Marchiori+ return SECFailure; 102*568c901eSArrigo Marchiori } 103*568c901eSArrigo Marchiori 104*568c901eSArrigo Marchiori const SEC_ASN1Template hashParameterTemplate[] = 105*568c901eSArrigo Marchiori@@ -231,7 +262,7 @@ 106*568c901eSArrigo Marchiori sec_DecodeSigAlg(const SECKEYPublicKey *key, SECOidTag sigAlg, 107*568c901eSArrigo Marchiori const SECItem *param, SECOidTag *encalg, SECOidTag *hashalg) 108*568c901eSArrigo Marchiori { 109*568c901eSArrigo Marchiori- int len; 110*568c901eSArrigo Marchiori+ unsigned int len; 111*568c901eSArrigo Marchiori PLArenaPool *arena; 112*568c901eSArrigo Marchiori SECStatus rv; 113*568c901eSArrigo Marchiori SECItem oid; 114*568c901eSArrigo Marchiori@@ -458,48 +489,52 @@ 115*568c901eSArrigo Marchiori cx->pkcs1RSADigestInfo = NULL; 116*568c901eSArrigo Marchiori rv = SECSuccess; 117*568c901eSArrigo Marchiori if (sig) { 118*568c901eSArrigo Marchiori- switch (type) { 119*568c901eSArrigo Marchiori- case rsaKey: 120*568c901eSArrigo Marchiori- rv = recoverPKCS1DigestInfo(hashAlg, &cx->hashAlg, 121*568c901eSArrigo Marchiori- &cx->pkcs1RSADigestInfo, 122*568c901eSArrigo Marchiori- &cx->pkcs1RSADigestInfoLen, 123*568c901eSArrigo Marchiori- cx->key, 124*568c901eSArrigo Marchiori- sig, wincx); 125*568c901eSArrigo Marchiori- break; 126*568c901eSArrigo Marchiori- case rsaPssKey: 127*568c901eSArrigo Marchiori- sigLen = SECKEY_SignatureLen(key); 128*568c901eSArrigo Marchiori- if (sigLen == 0) { 129*568c901eSArrigo Marchiori- /* error set by SECKEY_SignatureLen */ 130*568c901eSArrigo Marchiori- rv = SECFailure; 131*568c901eSArrigo Marchiori+ rv = SECFailure; 132*568c901eSArrigo Marchiori+ if (type == rsaKey) { 133*568c901eSArrigo Marchiori+ rv = recoverPKCS1DigestInfo(hashAlg, &cx->hashAlg, 134*568c901eSArrigo Marchiori+ &cx->pkcs1RSADigestInfo, 135*568c901eSArrigo Marchiori+ &cx->pkcs1RSADigestInfoLen, 136*568c901eSArrigo Marchiori+ cx->key, 137*568c901eSArrigo Marchiori+ sig, wincx); 138*568c901eSArrigo Marchiori+ } else { 139*568c901eSArrigo Marchiori+ sigLen = checkedSignatureLen(key); 140*568c901eSArrigo Marchiori+ /* Check signature length is within limits */ 141*568c901eSArrigo Marchiori+ if (sigLen == 0) { 142*568c901eSArrigo Marchiori+ /* error set by checkedSignatureLen */ 143*568c901eSArrigo Marchiori+ rv = SECFailure; 144*568c901eSArrigo Marchiori+ goto loser; 145*568c901eSArrigo Marchiori+ } 146*568c901eSArrigo Marchiori+ if (sigLen > sizeof(cx->u)) { 147*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 148*568c901eSArrigo Marchiori+ rv = SECFailure; 149*568c901eSArrigo Marchiori+ goto loser; 150*568c901eSArrigo Marchiori+ } 151*568c901eSArrigo Marchiori+ switch (type) { 152*568c901eSArrigo Marchiori+ case rsaPssKey: 153*568c901eSArrigo Marchiori+ if (sig->len != sigLen) { 154*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 155*568c901eSArrigo Marchiori+ rv = SECFailure; 156*568c901eSArrigo Marchiori+ goto loser; 157*568c901eSArrigo Marchiori+ } 158*568c901eSArrigo Marchiori+ PORT_Memcpy(cx->u.buffer, sig->data, sigLen); 159*568c901eSArrigo Marchiori+ rv = SECSuccess; 160*568c901eSArrigo Marchiori break; 161*568c901eSArrigo Marchiori- } 162*568c901eSArrigo Marchiori- if (sig->len != sigLen) { 163*568c901eSArrigo Marchiori- PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 164*568c901eSArrigo Marchiori- rv = SECFailure; 165*568c901eSArrigo Marchiori+ case ecKey: 166*568c901eSArrigo Marchiori+ case dsaKey: 167*568c901eSArrigo Marchiori+ /* decodeECorDSASignature will check sigLen == sig->len after padding */ 168*568c901eSArrigo Marchiori+ rv = decodeECorDSASignature(encAlg, sig, cx->u.buffer, sigLen); 169*568c901eSArrigo Marchiori break; 170*568c901eSArrigo Marchiori- } 171*568c901eSArrigo Marchiori- PORT_Memcpy(cx->u.buffer, sig->data, sigLen); 172*568c901eSArrigo Marchiori- break; 173*568c901eSArrigo Marchiori- case dsaKey: 174*568c901eSArrigo Marchiori- case ecKey: 175*568c901eSArrigo Marchiori- sigLen = SECKEY_SignatureLen(key); 176*568c901eSArrigo Marchiori- if (sigLen == 0) { 177*568c901eSArrigo Marchiori- /* error set by SECKEY_SignatureLen */ 178*568c901eSArrigo Marchiori+ default: 179*568c901eSArrigo Marchiori+ /* Unreachable */ 180*568c901eSArrigo Marchiori rv = SECFailure; 181*568c901eSArrigo Marchiori- break; 182*568c901eSArrigo Marchiori- } 183*568c901eSArrigo Marchiori- rv = decodeECorDSASignature(encAlg, sig, cx->u.buffer, sigLen); 184*568c901eSArrigo Marchiori- break; 185*568c901eSArrigo Marchiori- default: 186*568c901eSArrigo Marchiori- rv = SECFailure; 187*568c901eSArrigo Marchiori- PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 188*568c901eSArrigo Marchiori- break; 189*568c901eSArrigo Marchiori+ goto loser; 190*568c901eSArrigo Marchiori+ } 191*568c901eSArrigo Marchiori+ } 192*568c901eSArrigo Marchiori+ if (rv != SECSuccess) { 193*568c901eSArrigo Marchiori+ goto loser; 194*568c901eSArrigo Marchiori } 195*568c901eSArrigo Marchiori } 196*568c901eSArrigo Marchiori 197*568c901eSArrigo Marchiori- if (rv) 198*568c901eSArrigo Marchiori- goto loser; 199*568c901eSArrigo Marchiori- 200*568c901eSArrigo Marchiori /* check hash alg again, RSA may have changed it.*/ 201*568c901eSArrigo Marchiori if (HASH_GetHashTypeByOidTag(cx->hashAlg) == HASH_AlgNULL) { 202*568c901eSArrigo Marchiori /* error set by HASH_GetHashTypeByOidTag */ 203*568c901eSArrigo Marchiori@@ -634,11 +669,16 @@ 204*568c901eSArrigo Marchiori switch (cx->key->keyType) { 205*568c901eSArrigo Marchiori case ecKey: 206*568c901eSArrigo Marchiori case dsaKey: 207*568c901eSArrigo Marchiori- dsasig.data = cx->u.buffer; 208*568c901eSArrigo Marchiori- dsasig.len = SECKEY_SignatureLen(cx->key); 209*568c901eSArrigo Marchiori+ dsasig.len = checkedSignatureLen(cx->key); 210*568c901eSArrigo Marchiori if (dsasig.len == 0) { 211*568c901eSArrigo Marchiori return SECFailure; 212*568c901eSArrigo Marchiori } 213*568c901eSArrigo Marchiori+ if (dsasig.len > sizeof(cx->u)) { 214*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 215*568c901eSArrigo Marchiori+ return SECFailure; 216*568c901eSArrigo Marchiori+ } 217*568c901eSArrigo Marchiori+ dsasig.data = cx->u.buffer; 218*568c901eSArrigo Marchiori+ 219*568c901eSArrigo Marchiori if (sig) { 220*568c901eSArrigo Marchiori rv = decodeECorDSASignature(cx->encAlg, sig, dsasig.data, 221*568c901eSArrigo Marchiori dsasig.len); 222*568c901eSArrigo Marchiori@@ -680,8 +720,13 @@ 223*568c901eSArrigo Marchiori return SECFailure; 224*568c901eSArrigo Marchiori } 225*568c901eSArrigo Marchiori rsasig.data = cx->u.buffer; 226*568c901eSArrigo Marchiori- rsasig.len = SECKEY_SignatureLen(cx->key); 227*568c901eSArrigo Marchiori+ rsasig.len = checkedSignatureLen(cx->key); 228*568c901eSArrigo Marchiori if (rsasig.len == 0) { 229*568c901eSArrigo Marchiori+ /* Error set by checkedSignatureLen */ 230*568c901eSArrigo Marchiori+ return SECFailure; 231*568c901eSArrigo Marchiori+ } 232*568c901eSArrigo Marchiori+ if (rsasig.len > sizeof(cx->u)) { 233*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 234*568c901eSArrigo Marchiori return SECFailure; 235*568c901eSArrigo Marchiori } 236*568c901eSArrigo Marchiori if (sig) { 237*568c901eSArrigo Marchiori@@ -743,7 +788,6 @@ 238*568c901eSArrigo Marchiori SECStatus rv; 239*568c901eSArrigo Marchiori VFYContext *cx; 240*568c901eSArrigo Marchiori SECItem dsasig; /* also used for ECDSA */ 241*568c901eSArrigo Marchiori- 242*568c901eSArrigo Marchiori rv = SECFailure; 243*568c901eSArrigo Marchiori 244*568c901eSArrigo Marchiori cx = vfy_CreateContext(key, sig, encAlg, hashAlg, NULL, wincx); 245*568c901eSArrigo Marchiori@@ -751,19 +795,25 @@ 246*568c901eSArrigo Marchiori switch (key->keyType) { 247*568c901eSArrigo Marchiori case rsaKey: 248*568c901eSArrigo Marchiori rv = verifyPKCS1DigestInfo(cx, digest); 249*568c901eSArrigo Marchiori+ /* Error (if any) set by verifyPKCS1DigestInfo */ 250*568c901eSArrigo Marchiori break; 251*568c901eSArrigo Marchiori- case dsaKey: 252*568c901eSArrigo Marchiori case ecKey: 253*568c901eSArrigo Marchiori+ case dsaKey: 254*568c901eSArrigo Marchiori dsasig.data = cx->u.buffer; 255*568c901eSArrigo Marchiori- dsasig.len = SECKEY_SignatureLen(cx->key); 256*568c901eSArrigo Marchiori+ dsasig.len = checkedSignatureLen(cx->key); 257*568c901eSArrigo Marchiori if (dsasig.len == 0) { 258*568c901eSArrigo Marchiori+ /* Error set by checkedSignatureLen */ 259*568c901eSArrigo Marchiori+ rv = SECFailure; 260*568c901eSArrigo Marchiori break; 261*568c901eSArrigo Marchiori } 262*568c901eSArrigo Marchiori- if (PK11_Verify(cx->key, &dsasig, (SECItem *)digest, cx->wincx) != 263*568c901eSArrigo Marchiori- SECSuccess) { 264*568c901eSArrigo Marchiori+ if (dsasig.len > sizeof(cx->u)) { 265*568c901eSArrigo Marchiori+ PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 266*568c901eSArrigo Marchiori+ rv = SECFailure; 267*568c901eSArrigo Marchiori+ break; 268*568c901eSArrigo Marchiori+ } 269*568c901eSArrigo Marchiori+ rv = PK11_Verify(cx->key, &dsasig, (SECItem *)digest, cx->wincx); 270*568c901eSArrigo Marchiori+ if (rv != SECSuccess) { 271*568c901eSArrigo Marchiori PORT_SetError(SEC_ERROR_BAD_SIGNATURE); 272*568c901eSArrigo Marchiori- } else { 273*568c901eSArrigo Marchiori- rv = SECSuccess; 274*568c901eSArrigo Marchiori } 275*568c901eSArrigo Marchiori break; 276*568c901eSArrigo Marchiori default: 277