OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | 4 |
5 /* | 5 /* |
6 * Moved from secpkcs7.c | 6 * Moved from secpkcs7.c |
7 */ | 7 */ |
8 | 8 |
9 #include "cert.h" | 9 #include "cert.h" |
10 #include "certi.h" | 10 #include "certi.h" |
(...skipping 1105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 { | 1116 { |
1117 return SECFailure; | 1117 return SECFailure; |
1118 } | 1118 } |
1119 } | 1119 } |
1120 /* free the array of CRLs */ | 1120 /* free the array of CRLs */ |
1121 if (cache->crls) | 1121 if (cache->crls) |
1122 { | 1122 { |
1123 PORT_Free(cache->crls); | 1123 PORT_Free(cache->crls); |
1124 } | 1124 } |
1125 /* destroy the cert */ | 1125 /* destroy the cert */ |
1126 if (cache->issuer) | 1126 if (cache->issuerDERCert) |
1127 { | 1127 { |
1128 CERT_DestroyCertificate(cache->issuer); | 1128 SECITEM_FreeItem(cache->issuerDERCert, PR_TRUE); |
1129 } | 1129 } |
1130 /* free the subject */ | 1130 /* free the subject */ |
1131 if (cache->subject) | 1131 if (cache->subject) |
1132 { | 1132 { |
1133 SECITEM_FreeItem(cache->subject, PR_TRUE); | 1133 SECITEM_FreeItem(cache->subject, PR_TRUE); |
1134 } | 1134 } |
1135 /* free the distribution points */ | 1135 /* free the distribution points */ |
1136 if (cache->distributionPoint) | 1136 if (cache->distributionPoint) |
1137 { | 1137 { |
1138 SECITEM_FreeItem(cache->distributionPoint, PR_TRUE); | 1138 SECITEM_FreeItem(cache->distributionPoint, PR_TRUE); |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 if (PR_TRUE == GetOpaqueCRLFields(crlobject->crl)->decodingError) | 1564 if (PR_TRUE == GetOpaqueCRLFields(crlobject->crl)->decodingError) |
1565 { | 1565 { |
1566 crlobject->sigChecked = PR_TRUE; /* we can never verify a CRL | 1566 crlobject->sigChecked = PR_TRUE; /* we can never verify a CRL |
1567 with bogus DER. Mark it checked so we won't try again */ | 1567 with bogus DER. Mark it checked so we won't try again */ |
1568 PORT_SetError(SEC_ERROR_BAD_DER); | 1568 PORT_SetError(SEC_ERROR_BAD_DER); |
1569 return SECSuccess; | 1569 return SECSuccess; |
1570 } | 1570 } |
1571 else | 1571 else |
1572 { | 1572 { |
1573 SECStatus signstatus = SECFailure; | 1573 SECStatus signstatus = SECFailure; |
1574 if (cache->issuer) | 1574 if (cache->issuerDERCert) |
1575 { | 1575 { |
1576 signstatus = CERT_VerifyCRL(crlobject->crl, cache->issuer, vfdate, | 1576 » CERTCertificate *issuer = CERT_NewTempCertificate(cache->dbHandle, |
| 1577 » » cache->issuerDERCert, NULL, PR_FALSE, PR_TRUE); |
| 1578 |
| 1579 » if (issuer) { |
| 1580 signstatus = CERT_VerifyCRL(crlobject->crl, issuer, vfdate, |
1577 wincx); | 1581 wincx); |
| 1582 CERT_DestroyCertificate(issuer); |
| 1583 } |
1578 } | 1584 } |
1579 if (SECSuccess != signstatus) | 1585 if (SECSuccess != signstatus) |
1580 { | 1586 { |
1581 if (!cache->issuer) | 1587 if (!cache->issuerDERCert) |
1582 { | 1588 { |
1583 /* we tried to verify without an issuer cert . This is | 1589 /* we tried to verify without an issuer cert . This is |
1584 because this CRL came through a call to SEC_FindCrlByName. | 1590 because this CRL came through a call to SEC_FindCrlByName. |
1585 So, we don't cache this verification failure. We'll try | 1591 So, we don't cache this verification failure. We'll try |
1586 to verify the CRL again when a certificate from that issuer | 1592 to verify the CRL again when a certificate from that issuer |
1587 becomes available */ | 1593 becomes available */ |
1588 } else | 1594 } else |
1589 { | 1595 { |
1590 crlobject->sigChecked = PR_TRUE; | 1596 crlobject->sigChecked = PR_TRUE; |
1591 } | 1597 } |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1918 } | 1924 } |
1919 if (PR_TRUE == mustunlock) | 1925 if (PR_TRUE == mustunlock) |
1920 { | 1926 { |
1921 cache->lastcheck = PR_Now(); | 1927 cache->lastcheck = PR_Now(); |
1922 DPCache_UnlockWrite(); | 1928 DPCache_UnlockWrite(); |
1923 mustunlock = PR_FALSE; | 1929 mustunlock = PR_FALSE; |
1924 } | 1930 } |
1925 } | 1931 } |
1926 | 1932 |
1927 /* add issuer certificate if it was previously unavailable */ | 1933 /* add issuer certificate if it was previously unavailable */ |
1928 if (issuer && (NULL == cache->issuer) && | 1934 if (issuer && (NULL == cache->issuerDERCert) && |
1929 (SECSuccess == CERT_CheckCertUsage(issuer, KU_CRL_SIGN))) | 1935 (SECSuccess == CERT_CheckCertUsage(issuer, KU_CRL_SIGN))) |
1930 { | 1936 { |
1931 /* if we didn't have a valid issuer cert yet, but we do now. add it */ | 1937 /* if we didn't have a valid issuer cert yet, but we do now. add it */ |
1932 DPCache_LockWrite(); | 1938 DPCache_LockWrite(); |
1933 if (!cache->issuer) | 1939 if (!cache->issuerDERCert) |
1934 { | 1940 { |
1935 dirty = PR_TRUE; | 1941 dirty = PR_TRUE; |
1936 cache->issuer = CERT_DupCertificate(issuer); | 1942 » cache->dbHandle = issuer->dbhandle; |
| 1943 » cache->issuerDERCert = SECITEM_DupItem(&issuer->derCert); |
1937 } | 1944 } |
1938 DPCache_UnlockWrite(); | 1945 DPCache_UnlockWrite(); |
1939 } | 1946 } |
1940 | 1947 |
1941 /* verify CRLs that couldn't be checked when inserted into the cache | 1948 /* verify CRLs that couldn't be checked when inserted into the cache |
1942 because the issuer cert or a verification date was unavailable. | 1949 because the issuer cert or a verification date was unavailable. |
1943 These are CRLs that were inserted into the cache through | 1950 These are CRLs that were inserted into the cache through |
1944 SEC_FindCrlByName, or through manual insertion, rather than through a | 1951 SEC_FindCrlByName, or through manual insertion, rather than through a |
1945 certificate verification (CERT_CheckCRL) */ | 1952 certificate verification (CERT_CheckCRL) */ |
1946 | 1953 |
1947 if (cache->issuer && vfdate ) | 1954 if (cache->issuerDERCert && vfdate ) |
1948 { | 1955 { |
1949 mustunlock = PR_FALSE; | 1956 mustunlock = PR_FALSE; |
1950 /* re-process all unverified CRLs */ | 1957 /* re-process all unverified CRLs */ |
1951 for (i = 0; i < cache->ncrls ; i++) | 1958 for (i = 0; i < cache->ncrls ; i++) |
1952 { | 1959 { |
1953 CachedCrl* savcrl = cache->crls[i]; | 1960 CachedCrl* savcrl = cache->crls[i]; |
1954 if (!savcrl) | 1961 if (!savcrl) |
1955 { | 1962 { |
1956 continue; | 1963 continue; |
1957 } | 1964 } |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 #else | 2201 #else |
2195 cache->lock = PR_NewLock(); | 2202 cache->lock = PR_NewLock(); |
2196 #endif | 2203 #endif |
2197 if (!cache->lock) | 2204 if (!cache->lock) |
2198 { | 2205 { |
2199 PORT_Free(cache); | 2206 PORT_Free(cache); |
2200 return SECFailure; | 2207 return SECFailure; |
2201 } | 2208 } |
2202 if (issuer) | 2209 if (issuer) |
2203 { | 2210 { |
2204 cache->issuer = CERT_DupCertificate(issuer); | 2211 » cache->dbHandle = issuer->dbhandle; |
| 2212 » cache->issuerDERCert = SECITEM_DupItem(&issuer->derCert); |
2205 } | 2213 } |
2206 cache->distributionPoint = SECITEM_DupItem(dp); | 2214 cache->distributionPoint = SECITEM_DupItem(dp); |
2207 cache->subject = SECITEM_DupItem(subject); | 2215 cache->subject = SECITEM_DupItem(subject); |
2208 cache->lastfetch = 0; | 2216 cache->lastfetch = 0; |
2209 cache->lastcheck = 0; | 2217 cache->lastcheck = 0; |
2210 *returned = cache; | 2218 *returned = cache; |
2211 return SECSuccess; | 2219 return SECSuccess; |
2212 } | 2220 } |
2213 | 2221 |
2214 /* create an issuer cache object (per CA subject ) */ | 2222 /* create an issuer cache object (per CA subject ) */ |
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3362 to CERT_CacheCRL previously. That API takes a SECItem*, thus, we | 3370 to CERT_CacheCRL previously. That API takes a SECItem*, thus, we |
3363 just do a pointer comparison here. | 3371 just do a pointer comparison here. |
3364 */ | 3372 */ |
3365 if (b->crl->derCrl == a->crl->derCrl) | 3373 if (b->crl->derCrl == a->crl->derCrl) |
3366 { | 3374 { |
3367 *isDupe = PR_TRUE; | 3375 *isDupe = PR_TRUE; |
3368 } | 3376 } |
3369 } | 3377 } |
3370 return SECSuccess; | 3378 return SECSuccess; |
3371 } | 3379 } |
OLD | NEW |