Chromium Code Reviews| Index: nss/lib/pkcs7/p7decode.c |
| =================================================================== |
| --- nss/lib/pkcs7/p7decode.c (revision 195639) |
| +++ nss/lib/pkcs7/p7decode.c (working copy) |
| @@ -1246,13 +1246,17 @@ |
| /* |
| - * SEC_PKCS7ContentVerifySignature |
| + * sec_pkcs7_verify_signature |
| + * |
| * Look at a PKCS7 contentInfo and check if the signature is good. |
| * The digest was either calculated earlier (and is stored in the |
| * contentInfo itself) or is passed in via "detached_digest". |
| * |
| * The verification checks that the signing cert is valid and trusted |
| - * for the purpose specified by "certusage". |
| + * for the purpose specified by "certusage" at |
| + * - "*atTime" if "atTime" is not null, or |
| + * - the signing time if the signing time is available in "cinfo", or |
| + * - the current time (as returned by PR_Now). |
| * |
| * In addition, if "keepcerts" is true, add any new certificates found |
| * into our local database. |
| @@ -1281,7 +1285,8 @@ |
| SECCertUsage certusage, |
| const SECItem *detached_digest, |
| HASH_HashType digest_type, |
| - PRBool keepcerts) |
| + PRBool keepcerts, |
| + const PRTime *atTime) |
| { |
| SECAlgorithmID **digestalgs, *bulkid; |
| const SECItem *digest; |
| @@ -1299,7 +1304,8 @@ |
| SECItem *content_type; |
| PK11SymKey *sigkey; |
| SECItem *encoded_stime; |
| - int64 stime; |
| + PRTime stime; |
| + PRTime verificationTime; |
| SECStatus rv; |
| /* |
| @@ -1436,8 +1442,14 @@ |
| * in a time (and for non-S/MIME callers to pass in nothing, or |
| * maybe make them pass in the current time, always?). |
| */ |
| - if (CERT_VerifyCert (certdb, cert, PR_TRUE, certusage, |
| - encoded_stime != NULL ? stime : PR_Now(), |
| + if (atTime) { |
| + verificationTime = *atTime; |
| + } else if (encoded_stime != NULL) { |
| + verificationTime = stime; |
| + } else { |
| + verificationTime = PR_Now(); |
| + } |
| + if (CERT_VerifyCert (certdb, cert, PR_TRUE, certusage, verificationTime, |
| cinfo->pwfn_arg, NULL) != SECSuccess) |
| { |
| /* |
| @@ -1518,14 +1530,6 @@ |
| goto done; |
| } |
| -#ifndef NSS_ECC_MORE_THAN_SUITE_B |
| - if (encTag == SEC_OID_ANSIX962_EC_PUBLIC_KEY) { |
| - PORT_SetError(SEC_ERROR_PKCS7_BAD_SIGNATURE); |
| - goto done; |
| - } |
| -#endif |
| - |
| - |
| if (signerinfo->authAttr != NULL) { |
| SEC_PKCS7Attribute *attr; |
| SECItem *value; |
| @@ -1590,7 +1594,6 @@ |
| goto done; |
| } |
| - |
| goodsig = (PRBool)(VFY_VerifyDataDirect(encoded_attrs.data, |
| encoded_attrs.len, |
| publickey, &(signerinfo->encDigest), |
| @@ -1757,7 +1760,7 @@ |
| PRBool keepcerts) |
| { |
| return sec_pkcs7_verify_signature (cinfo, certusage, |
| - NULL, HASH_AlgNULL, keepcerts); |
| + NULL, HASH_AlgNULL, keepcerts, 0); |
|
wtc
2013/04/24 22:49:45
This 0 should be NULL.
|
| } |
| /* |
| @@ -1779,9 +1782,31 @@ |
| { |
| return sec_pkcs7_verify_signature (cinfo, certusage, |
| detached_digest, digest_type, |
| - keepcerts); |
| + keepcerts, NULL); |
| } |
| +/* |
| + * SEC_PKCS7VerifyDetachedSignatureAtTime |
| + * Look at a PKCS7 contentInfo and check if the signature matches |
| + * a passed-in digest (calculated, supposedly, from detached contents). |
| + * The verification checks that the signing cert is valid and trusted |
| + * for the purpose specified by "certusage" at time "atTime". |
| + * |
| + * In addition, if "keepcerts" is true, add any new certificates found |
| + * into our local database. |
| + */ |
| +PRBool |
| +SEC_PKCS7VerifyDetachedSignatureAtTime(SEC_PKCS7ContentInfo *cinfo, |
| + SECCertUsage certusage, |
| + const SECItem *detached_digest, |
| + HASH_HashType digest_type, |
| + PRBool keepcerts, |
| + PRTime atTime) |
| +{ |
| + return sec_pkcs7_verify_signature (cinfo, certusage, |
| + detached_digest, digest_type, |
| + keepcerts, &atTime); |
| +} |
| /* |
| * Return the asked-for portion of the name of the signer of a PKCS7 |
| @@ -1844,7 +1869,7 @@ |
| * some valid usage to pass in. |
| */ |
| (void) sec_pkcs7_verify_signature (cinfo, certUsageEmailSigner, |
| - NULL, HASH_AlgNULL, PR_FALSE); |
| + NULL, HASH_AlgNULL, PR_FALSE, 0); |
|
wtc
2013/04/24 22:49:45
This 0 should be NULL.
|
| signercert = signerinfos[0]->cert; |
| if (signercert == NULL) |
| return NULL; |