| Index: nss/lib/certhigh/ocsp.c
|
| diff --git a/nss/lib/certhigh/ocsp.c b/nss/lib/certhigh/ocsp.c
|
| index 86ae0a063b32910078f4d76cbf6a0469a234d0c0..7e7bb51a744fc21dad3d57a4cbf6dc0d1779d6e5 100644
|
| --- a/nss/lib/certhigh/ocsp.c
|
| +++ b/nss/lib/certhigh/ocsp.c
|
| @@ -33,13 +33,13 @@
|
| #include "ocspi.h"
|
| #include "genname.h"
|
| #include "certxutl.h"
|
| -#include "pk11func.h" /* for PK11_HashBuf */
|
| +#include "pk11func.h" /* for PK11_HashBuf */
|
| #include <stdarg.h>
|
| #include <plhash.h>
|
|
|
| #define DEFAULT_OCSP_CACHE_SIZE 1000
|
| -#define DEFAULT_MINIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT 1*60*60L
|
| -#define DEFAULT_MAXIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT 24*60*60L
|
| +#define DEFAULT_MINIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT 1 * 60 * 60L
|
| +#define DEFAULT_MAXIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT 24 * 60 * 60L
|
| #define DEFAULT_OSCP_TIMEOUT_SECONDS 60
|
| #define MICROSECONDS_PER_SECOND 1000000L
|
|
|
| @@ -89,48 +89,45 @@ static struct OCSPGlobalStruct {
|
| SEC_OcspFailureMode ocspFailureMode;
|
| CERT_StringFromCertFcn alternateOCSPAIAFcn;
|
| PRBool forcePost;
|
| -} OCSP_Global = { NULL,
|
| - NULL,
|
| - DEFAULT_OCSP_CACHE_SIZE,
|
| +} OCSP_Global = { NULL,
|
| + NULL,
|
| + DEFAULT_OCSP_CACHE_SIZE,
|
| DEFAULT_MINIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT,
|
| DEFAULT_MAXIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT,
|
| DEFAULT_OSCP_TIMEOUT_SECONDS,
|
| - {NULL, 0, NULL, NULL},
|
| + { NULL, 0, NULL, NULL },
|
| ocspMode_FailureIsVerificationFailure,
|
| NULL,
|
| - PR_FALSE
|
| - };
|
| -
|
| -
|
| + PR_FALSE };
|
|
|
| /* Forward declarations */
|
| static SECItem *
|
| -ocsp_GetEncodedOCSPResponseFromRequest(PLArenaPool *arena,
|
| +ocsp_GetEncodedOCSPResponseFromRequest(PLArenaPool *arena,
|
| CERTOCSPRequest *request,
|
| const char *location,
|
| - const char *method,
|
| - PRTime time,
|
| + const char *method,
|
| + PRTime time,
|
| PRBool addServiceLocator,
|
| void *pwArg,
|
| CERTOCSPRequest **pRequest);
|
| static SECStatus
|
| -ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *cert,
|
| - PRTime time,
|
| +ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *cert,
|
| + PRTime time,
|
| void *pwArg,
|
| PRBool *certIDWasConsumed,
|
| SECStatus *rv_ocsp);
|
|
|
| static SECStatus
|
| ocsp_GetDecodedVerifiedSingleResponseForID(CERTCertDBHandle *handle,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *cert,
|
| - PRTime time,
|
| - void *pwArg,
|
| - const SECItem *encodedResponse,
|
| - CERTOCSPResponse **pDecodedResponse,
|
| - CERTOCSPSingleResponse **pSingle);
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *cert,
|
| + PRTime time,
|
| + void *pwArg,
|
| + const SECItem *encodedResponse,
|
| + CERTOCSPResponse **pDecodedResponse,
|
| + CERTOCSPSingleResponse **pSingle);
|
|
|
| static SECStatus
|
| ocsp_CertRevokedAfter(ocspRevokedInfo *revokedInfo, PRTime time);
|
| @@ -149,19 +146,20 @@ cert_DupOCSPCertID(const CERTOCSPCertID *src);
|
| #define OCSP_TRACE_CERT(cert) dumpCertificate(cert)
|
| #define OCSP_TRACE_CERTID(certid) dumpCertID(certid)
|
|
|
| -#if defined(XP_UNIX) || defined(XP_WIN32) || defined(XP_BEOS) \
|
| - || defined(XP_MACOSX)
|
| +#if defined(XP_UNIX) || defined(XP_WIN32) || defined(XP_BEOS) || \
|
| + defined(XP_MACOSX)
|
| #define NSS_HAVE_GETENV 1
|
| #endif
|
|
|
| -static PRBool wantOcspTrace(void)
|
| +static PRBool
|
| +wantOcspTrace(void)
|
| {
|
| static PRBool firstTime = PR_TRUE;
|
| static PRBool wantTrace = PR_FALSE;
|
|
|
| #ifdef NSS_HAVE_GETENV
|
| if (firstTime) {
|
| - char *ev = getenv("NSS_TRACE_OCSP");
|
| + char *ev = PR_GetEnvSecure("NSS_TRACE_OCSP");
|
| if (ev && ev[0]) {
|
| wantTrace = PR_TRUE;
|
| }
|
| @@ -176,7 +174,7 @@ ocsp_Trace(const char *format, ...)
|
| {
|
| char buf[2000];
|
| va_list args;
|
| -
|
| +
|
| if (!wantOcspTrace())
|
| return;
|
| va_start(args, format);
|
| @@ -235,10 +233,10 @@ dumpCertificate(CERTCertificate *cert)
|
| DER_DecodeTimeChoice(&timeAfter, &cert->validity.notAfter);
|
| PR_ExplodeTime(timeBefore, PR_GMTParameters, &beforePrintable);
|
| PR_ExplodeTime(timeAfter, PR_GMTParameters, &afterPrintable);
|
| - rv1 = PR_FormatTime(beforestr, 256, "%a %b %d %H:%M:%S %Y",
|
| - &beforePrintable);
|
| - rv2 = PR_FormatTime(afterstr, 256, "%a %b %d %H:%M:%S %Y",
|
| - &afterPrintable);
|
| + rv1 = PR_FormatTime(beforestr, 256, "%a %b %d %H:%M:%S %Y",
|
| + &beforePrintable);
|
| + rv2 = PR_FormatTime(afterstr, 256, "%a %b %d %H:%M:%S %Y",
|
| + &afterPrintable);
|
| ocsp_Trace("OCSP ## VALIDITY: %s to %s\n", rv1 ? beforestr : "",
|
| rv2 ? afterstr : "");
|
| }
|
| @@ -261,27 +259,27 @@ SECStatus
|
| SEC_RegisterDefaultHttpClient(const SEC_HttpClientFcn *fcnTable)
|
| {
|
| if (!OCSP_Global.monitor) {
|
| - PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| + return SECFailure;
|
| }
|
| -
|
| +
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| OCSP_Global.defaultHttpClientFcn = fcnTable;
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| -
|
| +
|
| return SECSuccess;
|
| }
|
|
|
| SECStatus
|
| CERT_RegisterAlternateOCSPAIAInfoCallBack(
|
| - CERT_StringFromCertFcn newCallback,
|
| - CERT_StringFromCertFcn * oldCallback)
|
| + CERT_StringFromCertFcn newCallback,
|
| + CERT_StringFromCertFcn *oldCallback)
|
| {
|
| CERT_StringFromCertFcn old;
|
|
|
| if (!OCSP_Global.monitor) {
|
| - PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| + return SECFailure;
|
| }
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| @@ -289,7 +287,7 @@ CERT_RegisterAlternateOCSPAIAInfoCallBack(
|
| OCSP_Global.alternateOCSPAIAFcn = newCallback;
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| if (oldCallback)
|
| - *oldCallback = old;
|
| + *oldCallback = old;
|
| return SECSuccess;
|
| }
|
|
|
| @@ -300,18 +298,18 @@ ocsp_CacheKeyHashFunction(const void *key)
|
| PLHashNumber hash = 0;
|
| unsigned int i;
|
| unsigned char *walk;
|
| -
|
| +
|
| /* a very simple hash calculation for the initial coding phase */
|
| - walk = (unsigned char*)cid->issuerNameHash.data;
|
| - for (i=0; i < cid->issuerNameHash.len; ++i, ++walk) {
|
| + walk = (unsigned char *)cid->issuerNameHash.data;
|
| + for (i = 0; i < cid->issuerNameHash.len; ++i, ++walk) {
|
| hash += *walk;
|
| }
|
| - walk = (unsigned char*)cid->issuerKeyHash.data;
|
| - for (i=0; i < cid->issuerKeyHash.len; ++i, ++walk) {
|
| + walk = (unsigned char *)cid->issuerKeyHash.data;
|
| + for (i = 0; i < cid->issuerKeyHash.len; ++i, ++walk) {
|
| hash += *walk;
|
| }
|
| - walk = (unsigned char*)cid->serialNumber.data;
|
| - for (i=0; i < cid->serialNumber.len; ++i, ++walk) {
|
| + walk = (unsigned char *)cid->serialNumber.data;
|
| + for (i = 0; i < cid->serialNumber.len; ++i, ++walk) {
|
| hash += *walk;
|
| }
|
| return hash;
|
| @@ -322,13 +320,13 @@ ocsp_CacheKeyCompareFunction(const void *v1, const void *v2)
|
| {
|
| CERTOCSPCertID *cid1 = (CERTOCSPCertID *)v1;
|
| CERTOCSPCertID *cid2 = (CERTOCSPCertID *)v2;
|
| -
|
| - return (SECEqual == SECITEM_CompareItem(&cid1->issuerNameHash,
|
| - &cid2->issuerNameHash)
|
| - && SECEqual == SECITEM_CompareItem(&cid1->issuerKeyHash,
|
| - &cid2->issuerKeyHash)
|
| - && SECEqual == SECITEM_CompareItem(&cid1->serialNumber,
|
| - &cid2->serialNumber));
|
| +
|
| + return (SECEqual == SECITEM_CompareItem(&cid1->issuerNameHash,
|
| + &cid2->issuerNameHash) &&
|
| + SECEqual == SECITEM_CompareItem(&cid1->issuerKeyHash,
|
| + &cid2->issuerKeyHash) &&
|
| + SECEqual == SECITEM_CompareItem(&cid1->serialNumber,
|
| + &cid2->serialNumber));
|
| }
|
|
|
| static SECStatus
|
| @@ -337,32 +335,32 @@ ocsp_CopyRevokedInfo(PLArenaPool *arena, ocspCertStatus *dest,
|
| {
|
| SECStatus rv = SECFailure;
|
| void *mark;
|
| -
|
| +
|
| mark = PORT_ArenaMark(arena);
|
| -
|
| - dest->certStatusInfo.revokedInfo =
|
| - (ocspRevokedInfo *) PORT_ArenaZAlloc(arena, sizeof(ocspRevokedInfo));
|
| +
|
| + dest->certStatusInfo.revokedInfo =
|
| + (ocspRevokedInfo *)PORT_ArenaZAlloc(arena, sizeof(ocspRevokedInfo));
|
| if (!dest->certStatusInfo.revokedInfo) {
|
| goto loser;
|
| }
|
| -
|
| - rv = SECITEM_CopyItem(arena,
|
| - &dest->certStatusInfo.revokedInfo->revocationTime,
|
| +
|
| + rv = SECITEM_CopyItem(arena,
|
| + &dest->certStatusInfo.revokedInfo->revocationTime,
|
| &src->revocationTime);
|
| if (rv != SECSuccess) {
|
| goto loser;
|
| }
|
| -
|
| +
|
| if (src->revocationReason) {
|
| - dest->certStatusInfo.revokedInfo->revocationReason =
|
| + dest->certStatusInfo.revokedInfo->revocationReason =
|
| SECITEM_ArenaDupItem(arena, src->revocationReason);
|
| if (!dest->certStatusInfo.revokedInfo->revocationReason) {
|
| goto loser;
|
| }
|
| - } else {
|
| + } else {
|
| dest->certStatusInfo.revokedInfo->revocationReason = NULL;
|
| }
|
| -
|
| +
|
| PORT_ArenaUnmark(arena, mark);
|
| return SECSuccess;
|
|
|
| @@ -373,39 +371,39 @@ loser:
|
|
|
| static SECStatus
|
| ocsp_CopyCertStatus(PLArenaPool *arena, ocspCertStatus *dest,
|
| - ocspCertStatus*src)
|
| + ocspCertStatus *src)
|
| {
|
| SECStatus rv = SECFailure;
|
| dest->certStatusType = src->certStatusType;
|
| -
|
| +
|
| switch (src->certStatusType) {
|
| - case ocspCertStatus_good:
|
| - dest->certStatusInfo.goodInfo =
|
| - SECITEM_ArenaDupItem(arena, src->certStatusInfo.goodInfo);
|
| - if (dest->certStatusInfo.goodInfo != NULL) {
|
| - rv = SECSuccess;
|
| - }
|
| - break;
|
| - case ocspCertStatus_revoked:
|
| - rv = ocsp_CopyRevokedInfo(arena, dest,
|
| - src->certStatusInfo.revokedInfo);
|
| - break;
|
| - case ocspCertStatus_unknown:
|
| - dest->certStatusInfo.unknownInfo =
|
| - SECITEM_ArenaDupItem(arena, src->certStatusInfo.unknownInfo);
|
| - if (dest->certStatusInfo.unknownInfo != NULL) {
|
| - rv = SECSuccess;
|
| - }
|
| - break;
|
| - case ocspCertStatus_other:
|
| - default:
|
| - PORT_Assert(src->certStatusType == ocspCertStatus_other);
|
| - dest->certStatusInfo.otherInfo =
|
| - SECITEM_ArenaDupItem(arena, src->certStatusInfo.otherInfo);
|
| - if (dest->certStatusInfo.otherInfo != NULL) {
|
| - rv = SECSuccess;
|
| - }
|
| - break;
|
| + case ocspCertStatus_good:
|
| + dest->certStatusInfo.goodInfo =
|
| + SECITEM_ArenaDupItem(arena, src->certStatusInfo.goodInfo);
|
| + if (dest->certStatusInfo.goodInfo != NULL) {
|
| + rv = SECSuccess;
|
| + }
|
| + break;
|
| + case ocspCertStatus_revoked:
|
| + rv = ocsp_CopyRevokedInfo(arena, dest,
|
| + src->certStatusInfo.revokedInfo);
|
| + break;
|
| + case ocspCertStatus_unknown:
|
| + dest->certStatusInfo.unknownInfo =
|
| + SECITEM_ArenaDupItem(arena, src->certStatusInfo.unknownInfo);
|
| + if (dest->certStatusInfo.unknownInfo != NULL) {
|
| + rv = SECSuccess;
|
| + }
|
| + break;
|
| + case ocspCertStatus_other:
|
| + default:
|
| + PORT_Assert(src->certStatusType == ocspCertStatus_other);
|
| + dest->certStatusInfo.otherInfo =
|
| + SECITEM_ArenaDupItem(arena, src->certStatusInfo.otherInfo);
|
| + if (dest->certStatusInfo.otherInfo != NULL) {
|
| + rv = SECSuccess;
|
| + }
|
| + break;
|
| }
|
| return rv;
|
| }
|
| @@ -453,7 +451,7 @@ ocsp_RemoveCacheItemFromLinkedList(OCSPCacheData *cache, OCSPCacheItem *item)
|
| }
|
|
|
| PORT_Assert(cache->numberOfEntries > 1);
|
| -
|
| +
|
| if (item == cache->LRUitem) {
|
| PORT_Assert(item != cache->MRUitem);
|
| PORT_Assert(item->lessRecent == NULL);
|
| @@ -461,8 +459,7 @@ ocsp_RemoveCacheItemFromLinkedList(OCSPCacheData *cache, OCSPCacheItem *item)
|
| PORT_Assert(item->moreRecent->lessRecent == item);
|
| cache->LRUitem = item->moreRecent;
|
| cache->LRUitem->lessRecent = NULL;
|
| - }
|
| - else if (item == cache->MRUitem) {
|
| + } else if (item == cache->MRUitem) {
|
| PORT_Assert(item->moreRecent == NULL);
|
| PORT_Assert(item->lessRecent != NULL);
|
| PORT_Assert(item->lessRecent->moreRecent == item);
|
| @@ -487,7 +484,7 @@ ocsp_RemoveCacheItemFromLinkedList(OCSPCacheData *cache, OCSPCacheItem *item)
|
| static void
|
| ocsp_MakeCacheEntryMostRecent(OCSPCacheData *cache, OCSPCacheItem *new_most_recent)
|
| {
|
| - OCSP_TRACE(("OCSP ocsp_MakeCacheEntryMostRecent THREADID %p\n",
|
| + OCSP_TRACE(("OCSP ocsp_MakeCacheEntryMostRecent THREADID %p\n",
|
| PR_GetCurrentThread()));
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| if (cache->MRUitem == new_most_recent) {
|
| @@ -504,7 +501,7 @@ ocsp_MakeCacheEntryMostRecent(OCSPCacheData *cache, OCSPCacheItem *new_most_rece
|
| static PRBool
|
| ocsp_IsCacheDisabled(void)
|
| {
|
| - /*
|
| + /*
|
| * maxCacheEntries == 0 means unlimited cache entries
|
| * maxCacheEntries < 0 means cache is disabled
|
| */
|
| @@ -524,12 +521,12 @@ ocsp_FindCacheEntry(OCSPCacheData *cache, CERTOCSPCertID *certID)
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| if (ocsp_IsCacheDisabled())
|
| goto loser;
|
| -
|
| +
|
| found_ocsp_item = (OCSPCacheItem *)PL_HashTableLookup(
|
| - cache->entries, certID);
|
| + cache->entries, certID);
|
| if (!found_ocsp_item)
|
| goto loser;
|
| -
|
| +
|
| OCSP_TRACE(("OCSP ocsp_FindCacheEntry FOUND!\n"));
|
| ocsp_MakeCacheEntryMostRecent(cache, found_ocsp_item);
|
|
|
| @@ -556,7 +553,7 @@ ocsp_RemoveCacheItem(OCSPCacheData *cache, OCSPCacheItem *item)
|
| {
|
| /* The item we're removing could be either the least recently used item,
|
| * or it could be an item that couldn't get updated with newer status info
|
| - * because of an allocation failure, or it could get removed because we're
|
| + * because of an allocation failure, or it could get removed because we're
|
| * cleaning up.
|
| */
|
| OCSP_TRACE(("OCSP ocsp_RemoveCacheItem, THREADID %p\n", PR_GetCurrentThread()));
|
| @@ -586,8 +583,8 @@ ocsp_CheckCacheSize(OCSPCacheData *cache)
|
| /* Cache is not disabled. Number of cache entries is limited.
|
| * The monitor ensures that maxCacheEntries remains positive.
|
| */
|
| - while (cache->numberOfEntries >
|
| - (PRUint32)OCSP_Global.maxCacheEntries) {
|
| + while (cache->numberOfEntries >
|
| + (PRUint32)OCSP_Global.maxCacheEntries) {
|
| ocsp_RemoveCacheItem(cache, cache->LRUitem);
|
| }
|
| }
|
| @@ -600,7 +597,7 @@ CERT_ClearOCSPCache(void)
|
| OCSP_TRACE(("OCSP CERT_ClearOCSPCache\n"));
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| while (OCSP_Global.cache.numberOfEntries > 0) {
|
| - ocsp_RemoveCacheItem(&OCSP_Global.cache,
|
| + ocsp_RemoveCacheItem(&OCSP_Global.cache,
|
| OCSP_Global.cache.LRUitem);
|
| }
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| @@ -609,30 +606,30 @@ CERT_ClearOCSPCache(void)
|
|
|
| static SECStatus
|
| ocsp_CreateCacheItemAndConsumeCertID(OCSPCacheData *cache,
|
| - CERTOCSPCertID *certID,
|
| + CERTOCSPCertID *certID,
|
| OCSPCacheItem **pCacheItem)
|
| {
|
| PLArenaPool *arena;
|
| void *mark;
|
| PLHashEntry *new_hash_entry;
|
| OCSPCacheItem *item;
|
| -
|
| +
|
| PORT_Assert(pCacheItem != NULL);
|
| *pCacheItem = NULL;
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| arena = certID->poolp;
|
| mark = PORT_ArenaMark(arena);
|
| -
|
| +
|
| /* ZAlloc will init all Bools to False and all Pointers to NULL
|
| and all error codes to zero/good. */
|
| - item = (OCSPCacheItem *)PORT_ArenaZAlloc(certID->poolp,
|
| + item = (OCSPCacheItem *)PORT_ArenaZAlloc(certID->poolp,
|
| sizeof(OCSPCacheItem));
|
| if (!item) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| item->certID = certID;
|
| - new_hash_entry = PL_HashTableAdd(cache->entries, item->certID,
|
| + new_hash_entry = PL_HashTableAdd(cache->entries, item->certID,
|
| item);
|
| if (!new_hash_entry) {
|
| goto loser;
|
| @@ -644,7 +641,7 @@ ocsp_CreateCacheItemAndConsumeCertID(OCSPCacheData *cache,
|
|
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| return SECSuccess;
|
| -
|
| +
|
| loser:
|
| PORT_ArenaRelease(arena, mark);
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| @@ -666,7 +663,7 @@ ocsp_SetCacheItemResponse(OCSPCacheItem *item,
|
| if (item->certStatusArena == NULL) {
|
| return SECFailure;
|
| }
|
| - rv = ocsp_CopyCertStatus(item->certStatusArena, &item->certStatus,
|
| + rv = ocsp_CopyCertStatus(item->certStatusArena, &item->certStatus,
|
| response->certStatus);
|
| if (rv != SECSuccess) {
|
| PORT_FreeArena(item->certStatusArena, PR_FALSE);
|
| @@ -674,11 +671,11 @@ ocsp_SetCacheItemResponse(OCSPCacheItem *item,
|
| return rv;
|
| }
|
| item->missingResponseError = 0;
|
| - rv = DER_GeneralizedTimeToTime(&item->thisUpdate,
|
| + rv = DER_GeneralizedTimeToTime(&item->thisUpdate,
|
| &response->thisUpdate);
|
| item->haveThisUpdate = (rv == SECSuccess);
|
| if (response->nextUpdate) {
|
| - rv = DER_GeneralizedTimeToTime(&item->nextUpdate,
|
| + rv = DER_GeneralizedTimeToTime(&item->nextUpdate,
|
| response->nextUpdate);
|
| item->haveNextUpdate = (rv == SECSuccess);
|
| } else {
|
| @@ -694,60 +691,60 @@ ocsp_FreshenCacheItemNextFetchAttemptTime(OCSPCacheItem *cacheItem)
|
| PRTime now;
|
| PRTime earliestAllowedNextFetchAttemptTime;
|
| PRTime latestTimeWhenResponseIsConsideredFresh;
|
| -
|
| +
|
| OCSP_TRACE(("OCSP ocsp_FreshenCacheItemNextFetchAttemptTime\n"));
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| -
|
| +
|
| now = PR_Now();
|
| OCSP_TRACE_TIME("now:", now);
|
| -
|
| +
|
| if (cacheItem->haveThisUpdate) {
|
| OCSP_TRACE_TIME("thisUpdate:", cacheItem->thisUpdate);
|
| latestTimeWhenResponseIsConsideredFresh = cacheItem->thisUpdate +
|
| - OCSP_Global.maximumSecondsToNextFetchAttempt *
|
| - MICROSECONDS_PER_SECOND;
|
| - OCSP_TRACE_TIME("latestTimeWhenResponseIsConsideredFresh:",
|
| + OCSP_Global.maximumSecondsToNextFetchAttempt *
|
| + MICROSECONDS_PER_SECOND;
|
| + OCSP_TRACE_TIME("latestTimeWhenResponseIsConsideredFresh:",
|
| latestTimeWhenResponseIsConsideredFresh);
|
| } else {
|
| latestTimeWhenResponseIsConsideredFresh = now +
|
| - OCSP_Global.minimumSecondsToNextFetchAttempt *
|
| - MICROSECONDS_PER_SECOND;
|
| + OCSP_Global.minimumSecondsToNextFetchAttempt *
|
| + MICROSECONDS_PER_SECOND;
|
| OCSP_TRACE_TIME("no thisUpdate, "
|
| - "latestTimeWhenResponseIsConsideredFresh:",
|
| + "latestTimeWhenResponseIsConsideredFresh:",
|
| latestTimeWhenResponseIsConsideredFresh);
|
| }
|
| -
|
| +
|
| if (cacheItem->haveNextUpdate) {
|
| OCSP_TRACE_TIME("have nextUpdate:", cacheItem->nextUpdate);
|
| }
|
| -
|
| +
|
| if (cacheItem->haveNextUpdate &&
|
| cacheItem->nextUpdate < latestTimeWhenResponseIsConsideredFresh) {
|
| latestTimeWhenResponseIsConsideredFresh = cacheItem->nextUpdate;
|
| OCSP_TRACE_TIME("nextUpdate is smaller than latestFresh, setting "
|
| - "latestTimeWhenResponseIsConsideredFresh:",
|
| + "latestTimeWhenResponseIsConsideredFresh:",
|
| latestTimeWhenResponseIsConsideredFresh);
|
| }
|
| -
|
| +
|
| earliestAllowedNextFetchAttemptTime = now +
|
| - OCSP_Global.minimumSecondsToNextFetchAttempt *
|
| - MICROSECONDS_PER_SECOND;
|
| - OCSP_TRACE_TIME("earliestAllowedNextFetchAttemptTime:",
|
| + OCSP_Global.minimumSecondsToNextFetchAttempt *
|
| + MICROSECONDS_PER_SECOND;
|
| + OCSP_TRACE_TIME("earliestAllowedNextFetchAttemptTime:",
|
| earliestAllowedNextFetchAttemptTime);
|
| -
|
| - if (latestTimeWhenResponseIsConsideredFresh <
|
| +
|
| + if (latestTimeWhenResponseIsConsideredFresh <
|
| earliestAllowedNextFetchAttemptTime) {
|
| - latestTimeWhenResponseIsConsideredFresh =
|
| + latestTimeWhenResponseIsConsideredFresh =
|
| earliestAllowedNextFetchAttemptTime;
|
| - OCSP_TRACE_TIME("latest < earliest, setting latest to:",
|
| + OCSP_TRACE_TIME("latest < earliest, setting latest to:",
|
| latestTimeWhenResponseIsConsideredFresh);
|
| }
|
| -
|
| - cacheItem->nextFetchAttemptTime =
|
| +
|
| + cacheItem->nextFetchAttemptTime =
|
| latestTimeWhenResponseIsConsideredFresh;
|
| - OCSP_TRACE_TIME("nextFetchAttemptTime",
|
| - latestTimeWhenResponseIsConsideredFresh);
|
| + OCSP_TRACE_TIME("nextFetchAttemptTime",
|
| + latestTimeWhenResponseIsConsideredFresh);
|
|
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| }
|
| @@ -776,14 +773,14 @@ ocsp_IsCacheItemFresh(OCSPCacheItem *cacheItem)
|
| }
|
|
|
| /*
|
| - * Status in *certIDWasConsumed will always be correct, regardless of
|
| + * Status in *certIDWasConsumed will always be correct, regardless of
|
| * return value.
|
| * If the caller is unable to transfer ownership of certID,
|
| * then the caller must set certIDWasConsumed to NULL,
|
| * and this function will potentially duplicate the certID object.
|
| */
|
| static SECStatus
|
| -ocsp_CreateOrUpdateCacheEntry(OCSPCacheData *cache,
|
| +ocsp_CreateOrUpdateCacheEntry(OCSPCacheData *cache,
|
| CERTOCSPCertID *certID,
|
| CERTOCSPSingleResponse *single,
|
| PRBool *certIDWasConsumed)
|
| @@ -791,13 +788,13 @@ ocsp_CreateOrUpdateCacheEntry(OCSPCacheData *cache,
|
| SECStatus rv;
|
| OCSPCacheItem *cacheItem;
|
| OCSP_TRACE(("OCSP ocsp_CreateOrUpdateCacheEntry\n"));
|
| -
|
| +
|
| if (certIDWasConsumed)
|
| *certIDWasConsumed = PR_FALSE;
|
| -
|
| +
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| PORT_Assert(OCSP_Global.maxCacheEntries >= 0);
|
| -
|
| +
|
| cacheItem = ocsp_FindCacheEntry(cache, certID);
|
|
|
| /* Don't replace an unknown or revoked entry with an error entry, even if
|
| @@ -867,12 +864,12 @@ extern SECStatus
|
| CERT_SetOCSPFailureMode(SEC_OcspFailureMode ocspFailureMode)
|
| {
|
| switch (ocspFailureMode) {
|
| - case ocspMode_FailureIsVerificationFailure:
|
| - case ocspMode_FailureIsNotAVerificationFailure:
|
| - break;
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + case ocspMode_FailureIsVerificationFailure:
|
| + case ocspMode_FailureIsNotAVerificationFailure:
|
| + break;
|
| + default:
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| @@ -886,14 +883,14 @@ CERT_OCSPCacheSettings(PRInt32 maxCacheEntries,
|
| PRUint32 minimumSecondsToNextFetchAttempt,
|
| PRUint32 maximumSecondsToNextFetchAttempt)
|
| {
|
| - if (minimumSecondsToNextFetchAttempt > maximumSecondsToNextFetchAttempt
|
| - || maxCacheEntries < -1) {
|
| + if (minimumSecondsToNextFetchAttempt > maximumSecondsToNextFetchAttempt ||
|
| + maxCacheEntries < -1) {
|
| PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| return SECFailure;
|
| }
|
| -
|
| +
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| -
|
| +
|
| if (maxCacheEntries < 0) {
|
| OCSP_Global.maxCacheEntries = -1; /* disable cache */
|
| } else if (maxCacheEntries == 0) {
|
| @@ -901,24 +898,24 @@ CERT_OCSPCacheSettings(PRInt32 maxCacheEntries,
|
| } else {
|
| OCSP_Global.maxCacheEntries = maxCacheEntries;
|
| }
|
| -
|
| - if (minimumSecondsToNextFetchAttempt <
|
| - OCSP_Global.minimumSecondsToNextFetchAttempt
|
| - || maximumSecondsToNextFetchAttempt <
|
| +
|
| + if (minimumSecondsToNextFetchAttempt <
|
| + OCSP_Global.minimumSecondsToNextFetchAttempt ||
|
| + maximumSecondsToNextFetchAttempt <
|
| OCSP_Global.maximumSecondsToNextFetchAttempt) {
|
| /*
|
| - * Ensure our existing cache entries are not used longer than the
|
| + * Ensure our existing cache entries are not used longer than the
|
| * new settings allow, we're lazy and just clear the cache
|
| */
|
| CERT_ClearOCSPCache();
|
| }
|
| -
|
| - OCSP_Global.minimumSecondsToNextFetchAttempt =
|
| +
|
| + OCSP_Global.minimumSecondsToNextFetchAttempt =
|
| minimumSecondsToNextFetchAttempt;
|
| - OCSP_Global.maximumSecondsToNextFetchAttempt =
|
| + OCSP_Global.maximumSecondsToNextFetchAttempt =
|
| maximumSecondsToNextFetchAttempt;
|
| ocsp_CheckCacheSize(&OCSP_Global.cache);
|
| -
|
| +
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| return SECSuccess;
|
| }
|
| @@ -932,7 +929,8 @@ CERT_SetOCSPTimeout(PRUint32 seconds)
|
| }
|
|
|
| /* this function is called at NSS initialization time */
|
| -SECStatus OCSP_InitGlobal(void)
|
| +SECStatus
|
| +OCSP_InitGlobal(void)
|
| {
|
| SECStatus rv = SECFailure;
|
|
|
| @@ -944,12 +942,12 @@ SECStatus OCSP_InitGlobal(void)
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| if (!OCSP_Global.cache.entries) {
|
| - OCSP_Global.cache.entries =
|
| - PL_NewHashTable(0,
|
| - ocsp_CacheKeyHashFunction,
|
| - ocsp_CacheKeyCompareFunction,
|
| - PL_CompareValues,
|
| - NULL,
|
| + OCSP_Global.cache.entries =
|
| + PL_NewHashTable(0,
|
| + ocsp_CacheKeyHashFunction,
|
| + ocsp_CacheKeyCompareFunction,
|
| + PL_CompareValues,
|
| + NULL,
|
| NULL);
|
| OCSP_Global.ocspFailureMode = ocspMode_FailureIsVerificationFailure;
|
| OCSP_Global.cache.numberOfEntries = 0;
|
| @@ -969,7 +967,8 @@ SECStatus OCSP_InitGlobal(void)
|
| return rv;
|
| }
|
|
|
| -SECStatus OCSP_ShutdownGlobal(void)
|
| +SECStatus
|
| +OCSP_ShutdownGlobal(void)
|
| {
|
| if (!OCSP_Global.monitor)
|
| return SECSuccess;
|
| @@ -986,12 +985,12 @@ SECStatus OCSP_ShutdownGlobal(void)
|
|
|
| OCSP_Global.defaultHttpClientFcn = NULL;
|
| OCSP_Global.maxCacheEntries = DEFAULT_OCSP_CACHE_SIZE;
|
| - OCSP_Global.minimumSecondsToNextFetchAttempt =
|
| - DEFAULT_MINIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT;
|
| + OCSP_Global.minimumSecondsToNextFetchAttempt =
|
| + DEFAULT_MINIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT;
|
| OCSP_Global.maximumSecondsToNextFetchAttempt =
|
| - DEFAULT_MAXIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT;
|
| + DEFAULT_MAXIMUM_SECONDS_TO_NEXT_OCSP_FETCH_ATTEMPT;
|
| OCSP_Global.ocspFailureMode =
|
| - ocspMode_FailureIsVerificationFailure;
|
| + ocspMode_FailureIsVerificationFailure;
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
|
|
| PR_DestroyMonitor(OCSP_Global.monitor);
|
| @@ -1000,22 +999,23 @@ SECStatus OCSP_ShutdownGlobal(void)
|
| }
|
|
|
| /*
|
| - * A return value of NULL means:
|
| + * A return value of NULL means:
|
| * The application did not register it's own HTTP client.
|
| */
|
| -const SEC_HttpClientFcn *SEC_GetRegisteredHttpClient(void)
|
| +const SEC_HttpClientFcn *
|
| +SEC_GetRegisteredHttpClient(void)
|
| {
|
| const SEC_HttpClientFcn *retval;
|
|
|
| if (!OCSP_Global.monitor) {
|
| - PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| - return NULL;
|
| + PORT_SetError(SEC_ERROR_NOT_INITIALIZED);
|
| + return NULL;
|
| }
|
|
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| retval = OCSP_Global.defaultHttpClientFcn;
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| -
|
| +
|
| return retval;
|
| }
|
|
|
| @@ -1057,7 +1057,6 @@ extern const SEC_ASN1Template ocsp_SingleRequestTemplate[];
|
| extern const SEC_ASN1Template ocsp_SingleResponseTemplate[];
|
| extern const SEC_ASN1Template ocsp_TBSRequestTemplate[];
|
|
|
| -
|
| /*
|
| * Request-related templates...
|
| */
|
| @@ -1069,14 +1068,14 @@ extern const SEC_ASN1Template ocsp_TBSRequestTemplate[];
|
| */
|
| static const SEC_ASN1Template ocsp_OCSPRequestTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(CERTOCSPRequest) },
|
| + 0, NULL, sizeof(CERTOCSPRequest) },
|
| { SEC_ASN1_POINTER,
|
| - offsetof(CERTOCSPRequest, tbsRequest),
|
| - ocsp_TBSRequestTemplate },
|
| + offsetof(CERTOCSPRequest, tbsRequest),
|
| + ocsp_TBSRequestTemplate },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| - offsetof(CERTOCSPRequest, optionalSignature),
|
| - ocsp_PointerToSignatureTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| + offsetof(CERTOCSPRequest, optionalSignature),
|
| + ocsp_PointerToSignatureTemplate },
|
| { 0 }
|
| };
|
|
|
| @@ -1095,22 +1094,22 @@ static const SEC_ASN1Template ocsp_OCSPRequestTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_TBSRequestTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspTBSRequest) },
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT | /* XXX DER_DEFAULT */
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspTBSRequest, version),
|
| - SEC_ASN1_SUB(SEC_IntegerTemplate) },
|
| + 0, NULL, sizeof(ocspTBSRequest) },
|
| + { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT | /* XXX DER_DEFAULT */
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| + offsetof(ocspTBSRequest, version),
|
| + SEC_ASN1_SUB(SEC_IntegerTemplate) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1,
|
| - offsetof(ocspTBSRequest, derRequestorName),
|
| - SEC_ASN1_SUB(SEC_PointerToAnyTemplate) },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1,
|
| + offsetof(ocspTBSRequest, derRequestorName),
|
| + SEC_ASN1_SUB(SEC_PointerToAnyTemplate) },
|
| { SEC_ASN1_SEQUENCE_OF,
|
| - offsetof(ocspTBSRequest, requestList),
|
| - ocsp_SingleRequestTemplate },
|
| + offsetof(ocspTBSRequest, requestList),
|
| + ocsp_SingleRequestTemplate },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 2,
|
| - offsetof(ocspTBSRequest, requestExtensions),
|
| - CERT_SequenceOfCertExtensionTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 2,
|
| + offsetof(ocspTBSRequest, requestExtensions),
|
| + CERT_SequenceOfCertExtensionTemplate },
|
| { 0 }
|
| };
|
|
|
| @@ -1122,16 +1121,16 @@ const SEC_ASN1Template ocsp_TBSRequestTemplate[] = {
|
| */
|
| static const SEC_ASN1Template ocsp_SignatureTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspSignature) },
|
| + 0, NULL, sizeof(ocspSignature) },
|
| { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
|
| - offsetof(ocspSignature, signatureAlgorithm),
|
| - SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| + offsetof(ocspSignature, signatureAlgorithm),
|
| + SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| { SEC_ASN1_BIT_STRING,
|
| - offsetof(ocspSignature, signature) },
|
| + offsetof(ocspSignature, signature) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspSignature, derCerts),
|
| - SEC_ASN1_SUB(SEC_SequenceOfAnyTemplate) },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| + offsetof(ocspSignature, derCerts),
|
| + SEC_ASN1_SUB(SEC_SequenceOfAnyTemplate) },
|
| { 0 }
|
| };
|
|
|
| @@ -1157,19 +1156,18 @@ const SEC_ASN1Template ocsp_PointerToSignatureTemplate[] = {
|
| * is the only way it will compile.
|
| */
|
| const SEC_ASN1Template ocsp_SingleRequestTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspSingleRequest) },
|
| + { SEC_ASN1_SEQUENCE,
|
| + 0, NULL, sizeof(ocspSingleRequest) },
|
| { SEC_ASN1_POINTER,
|
| - offsetof(ocspSingleRequest, reqCert),
|
| - ocsp_CertIDTemplate },
|
| + offsetof(ocspSingleRequest, reqCert),
|
| + ocsp_CertIDTemplate },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| - offsetof(ocspSingleRequest, singleRequestExtensions),
|
| - CERT_SequenceOfCertExtensionTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| + offsetof(ocspSingleRequest, singleRequestExtensions),
|
| + CERT_SequenceOfCertExtensionTemplate },
|
| { 0 }
|
| };
|
|
|
| -
|
| /*
|
| * This data structure and template (CertID) is used by both OCSP
|
| * requests and responses. It is the only one that is shared.
|
| @@ -1187,21 +1185,20 @@ const SEC_ASN1Template ocsp_SingleRequestTemplate[] = {
|
| * is the only way it will compile.
|
| */
|
| const SEC_ASN1Template ocsp_CertIDTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(CERTOCSPCertID) },
|
| + { SEC_ASN1_SEQUENCE,
|
| + 0, NULL, sizeof(CERTOCSPCertID) },
|
| { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
|
| - offsetof(CERTOCSPCertID, hashAlgorithm),
|
| - SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| + offsetof(CERTOCSPCertID, hashAlgorithm),
|
| + SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| { SEC_ASN1_OCTET_STRING,
|
| - offsetof(CERTOCSPCertID, issuerNameHash) },
|
| + offsetof(CERTOCSPCertID, issuerNameHash) },
|
| { SEC_ASN1_OCTET_STRING,
|
| - offsetof(CERTOCSPCertID, issuerKeyHash) },
|
| - { SEC_ASN1_INTEGER,
|
| - offsetof(CERTOCSPCertID, serialNumber) },
|
| + offsetof(CERTOCSPCertID, issuerKeyHash) },
|
| + { SEC_ASN1_INTEGER,
|
| + offsetof(CERTOCSPCertID, serialNumber) },
|
| { 0 }
|
| };
|
|
|
| -
|
| /*
|
| * Response-related templates...
|
| */
|
| @@ -1212,14 +1209,14 @@ const SEC_ASN1Template ocsp_CertIDTemplate[] = {
|
| * responseBytes [0] EXPLICIT ResponseBytes OPTIONAL }
|
| */
|
| const SEC_ASN1Template ocsp_OCSPResponseTemplate[] = {
|
| - { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(CERTOCSPResponse) },
|
| - { SEC_ASN1_ENUMERATED,
|
| - offsetof(CERTOCSPResponse, responseStatus) },
|
| + { SEC_ASN1_SEQUENCE,
|
| + 0, NULL, sizeof(CERTOCSPResponse) },
|
| + { SEC_ASN1_ENUMERATED,
|
| + offsetof(CERTOCSPResponse, responseStatus) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| - offsetof(CERTOCSPResponse, responseBytes),
|
| - ocsp_PointerToResponseBytesTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 0,
|
| + offsetof(CERTOCSPResponse, responseBytes),
|
| + ocsp_PointerToResponseBytesTemplate },
|
| { 0 }
|
| };
|
|
|
| @@ -1230,11 +1227,11 @@ const SEC_ASN1Template ocsp_OCSPResponseTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_ResponseBytesTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspResponseBytes) },
|
| + 0, NULL, sizeof(ocspResponseBytes) },
|
| { SEC_ASN1_OBJECT_ID,
|
| - offsetof(ocspResponseBytes, responseType) },
|
| + offsetof(ocspResponseBytes, responseType) },
|
| { SEC_ASN1_OCTET_STRING,
|
| - offsetof(ocspResponseBytes, response) },
|
| + offsetof(ocspResponseBytes, response) },
|
| { 0 }
|
| };
|
|
|
| @@ -1259,21 +1256,21 @@ const SEC_ASN1Template ocsp_PointerToResponseBytesTemplate[] = {
|
| */
|
| static const SEC_ASN1Template ocsp_BasicOCSPResponseTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspBasicOCSPResponse) },
|
| + 0, NULL, sizeof(ocspBasicOCSPResponse) },
|
| { SEC_ASN1_ANY | SEC_ASN1_SAVE,
|
| - offsetof(ocspBasicOCSPResponse, tbsResponseDataDER) },
|
| + offsetof(ocspBasicOCSPResponse, tbsResponseDataDER) },
|
| { SEC_ASN1_POINTER,
|
| - offsetof(ocspBasicOCSPResponse, tbsResponseData),
|
| - ocsp_ResponseDataTemplate },
|
| + offsetof(ocspBasicOCSPResponse, tbsResponseData),
|
| + ocsp_ResponseDataTemplate },
|
| { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
|
| - offsetof(ocspBasicOCSPResponse, responseSignature.signatureAlgorithm),
|
| - SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| + offsetof(ocspBasicOCSPResponse, responseSignature.signatureAlgorithm),
|
| + SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
|
| { SEC_ASN1_BIT_STRING,
|
| - offsetof(ocspBasicOCSPResponse, responseSignature.signature) },
|
| + offsetof(ocspBasicOCSPResponse, responseSignature.signature) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspBasicOCSPResponse, responseSignature.derCerts),
|
| - SEC_ASN1_SUB(SEC_SequenceOfAnyTemplate) },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| + offsetof(ocspBasicOCSPResponse, responseSignature.derCerts),
|
| + SEC_ASN1_SUB(SEC_SequenceOfAnyTemplate) },
|
| { 0 }
|
| };
|
|
|
| @@ -1291,22 +1288,22 @@ static const SEC_ASN1Template ocsp_BasicOCSPResponseTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_ResponseDataTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspResponseData) },
|
| - { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT | /* XXX DER_DEFAULT */
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspResponseData, version),
|
| - SEC_ASN1_SUB(SEC_IntegerTemplate) },
|
| + 0, NULL, sizeof(ocspResponseData) },
|
| + { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT | /* XXX DER_DEFAULT */
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| + offsetof(ocspResponseData, version),
|
| + SEC_ASN1_SUB(SEC_IntegerTemplate) },
|
| { SEC_ASN1_ANY,
|
| - offsetof(ocspResponseData, derResponderID) },
|
| + offsetof(ocspResponseData, derResponderID) },
|
| { SEC_ASN1_GENERALIZED_TIME,
|
| - offsetof(ocspResponseData, producedAt) },
|
| + offsetof(ocspResponseData, producedAt) },
|
| { SEC_ASN1_SEQUENCE_OF,
|
| - offsetof(ocspResponseData, responses),
|
| - ocsp_SingleResponseTemplate },
|
| + offsetof(ocspResponseData, responses),
|
| + ocsp_SingleResponseTemplate },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| - offsetof(ocspResponseData, responseExtensions),
|
| - CERT_SequenceOfCertExtensionTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| + offsetof(ocspResponseData, responseExtensions),
|
| + CERT_SequenceOfCertExtensionTemplate },
|
| { 0 }
|
| };
|
|
|
| @@ -1327,24 +1324,25 @@ const SEC_ASN1Template ocsp_ResponseDataTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_ResponderIDByNameTemplate[] = {
|
| { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| - offsetof(ocspResponderID, responderIDValue.name),
|
| - CERT_NameTemplate }
|
| + offsetof(ocspResponderID, responderIDValue.name),
|
| + CERT_NameTemplate }
|
| };
|
| const SEC_ASN1Template ocsp_ResponderIDByKeyTemplate[] = {
|
| { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
|
| - SEC_ASN1_XTRN | 2,
|
| - offsetof(ocspResponderID, responderIDValue.keyHash),
|
| - SEC_ASN1_SUB(SEC_OctetStringTemplate) }
|
| + SEC_ASN1_XTRN | 2,
|
| + offsetof(ocspResponderID, responderIDValue.keyHash),
|
| + SEC_ASN1_SUB(SEC_OctetStringTemplate) }
|
| };
|
| static const SEC_ASN1Template ocsp_ResponderIDOtherTemplate[] = {
|
| { SEC_ASN1_ANY,
|
| - offsetof(ocspResponderID, responderIDValue.other) }
|
| + offsetof(ocspResponderID, responderIDValue.other) }
|
| };
|
|
|
| /* Decode choice container, but leave x509 name object encoded */
|
| static const SEC_ASN1Template ocsp_ResponderIDDerNameTemplate[] = {
|
| { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
|
| - SEC_ASN1_XTRN | 1, 0, SEC_ASN1_SUB(SEC_AnyTemplate) }
|
| + SEC_ASN1_XTRN | 1,
|
| + 0, SEC_ASN1_SUB(SEC_AnyTemplate) }
|
| };
|
|
|
| /*
|
| @@ -1361,22 +1359,22 @@ static const SEC_ASN1Template ocsp_ResponderIDDerNameTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_SingleResponseTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(CERTOCSPSingleResponse) },
|
| + 0, NULL, sizeof(CERTOCSPSingleResponse) },
|
| { SEC_ASN1_POINTER,
|
| - offsetof(CERTOCSPSingleResponse, certID),
|
| - ocsp_CertIDTemplate },
|
| + offsetof(CERTOCSPSingleResponse, certID),
|
| + ocsp_CertIDTemplate },
|
| { SEC_ASN1_ANY,
|
| - offsetof(CERTOCSPSingleResponse, derCertStatus) },
|
| + offsetof(CERTOCSPSingleResponse, derCertStatus) },
|
| { SEC_ASN1_GENERALIZED_TIME,
|
| - offsetof(CERTOCSPSingleResponse, thisUpdate) },
|
| + offsetof(CERTOCSPSingleResponse, thisUpdate) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(CERTOCSPSingleResponse, nextUpdate),
|
| - SEC_ASN1_SUB(SEC_PointerToGeneralizedTimeTemplate) },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| + offsetof(CERTOCSPSingleResponse, nextUpdate),
|
| + SEC_ASN1_SUB(SEC_PointerToGeneralizedTimeTemplate) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| - offsetof(CERTOCSPSingleResponse, singleExtensions),
|
| - CERT_SequenceOfCertExtensionTemplate },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| + offsetof(CERTOCSPSingleResponse, singleExtensions),
|
| + CERT_SequenceOfCertExtensionTemplate },
|
| { 0 }
|
| };
|
|
|
| @@ -1395,23 +1393,23 @@ const SEC_ASN1Template ocsp_SingleResponseTemplate[] = {
|
| */
|
| static const SEC_ASN1Template ocsp_CertStatusGoodTemplate[] = {
|
| { SEC_ASN1_POINTER | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspCertStatus, certStatusInfo.goodInfo),
|
| - SEC_ASN1_SUB(SEC_NullTemplate) }
|
| + offsetof(ocspCertStatus, certStatusInfo.goodInfo),
|
| + SEC_ASN1_SUB(SEC_NullTemplate) }
|
| };
|
| static const SEC_ASN1Template ocsp_CertStatusRevokedTemplate[] = {
|
| - { SEC_ASN1_POINTER | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| - offsetof(ocspCertStatus, certStatusInfo.revokedInfo),
|
| - ocsp_RevokedInfoTemplate }
|
| + { SEC_ASN1_POINTER | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1,
|
| + offsetof(ocspCertStatus, certStatusInfo.revokedInfo),
|
| + ocsp_RevokedInfoTemplate }
|
| };
|
| static const SEC_ASN1Template ocsp_CertStatusUnknownTemplate[] = {
|
| { SEC_ASN1_POINTER | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2,
|
| - offsetof(ocspCertStatus, certStatusInfo.unknownInfo),
|
| - SEC_ASN1_SUB(SEC_NullTemplate) }
|
| + offsetof(ocspCertStatus, certStatusInfo.unknownInfo),
|
| + SEC_ASN1_SUB(SEC_NullTemplate) }
|
| };
|
| static const SEC_ASN1Template ocsp_CertStatusOtherTemplate[] = {
|
| { SEC_ASN1_POINTER | SEC_ASN1_XTRN,
|
| - offsetof(ocspCertStatus, certStatusInfo.otherInfo),
|
| - SEC_ASN1_SUB(SEC_AnyTemplate) }
|
| + offsetof(ocspCertStatus, certStatusInfo.otherInfo),
|
| + SEC_ASN1_SUB(SEC_AnyTemplate) }
|
| };
|
|
|
| /*
|
| @@ -1425,18 +1423,17 @@ static const SEC_ASN1Template ocsp_CertStatusOtherTemplate[] = {
|
| */
|
| const SEC_ASN1Template ocsp_RevokedInfoTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspRevokedInfo) },
|
| + 0, NULL, sizeof(ocspRevokedInfo) },
|
| { SEC_ASN1_GENERALIZED_TIME,
|
| - offsetof(ocspRevokedInfo, revocationTime) },
|
| + offsetof(ocspRevokedInfo, revocationTime) },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_EXPLICIT |
|
| - SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
|
| - SEC_ASN1_XTRN | 0,
|
| - offsetof(ocspRevokedInfo, revocationReason),
|
| - SEC_ASN1_SUB(SEC_PointerToEnumeratedTemplate) },
|
| + SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC |
|
| + SEC_ASN1_XTRN | 0,
|
| + offsetof(ocspRevokedInfo, revocationReason),
|
| + SEC_ASN1_SUB(SEC_PointerToEnumeratedTemplate) },
|
| { 0 }
|
| };
|
|
|
| -
|
| /*
|
| * OCSP-specific extension templates:
|
| */
|
| @@ -1448,25 +1445,24 @@ const SEC_ASN1Template ocsp_RevokedInfoTemplate[] = {
|
| */
|
| static const SEC_ASN1Template ocsp_ServiceLocatorTemplate[] = {
|
| { SEC_ASN1_SEQUENCE,
|
| - 0, NULL, sizeof(ocspServiceLocator) },
|
| + 0, NULL, sizeof(ocspServiceLocator) },
|
| { SEC_ASN1_POINTER,
|
| - offsetof(ocspServiceLocator, issuer),
|
| - CERT_NameTemplate },
|
| + offsetof(ocspServiceLocator, issuer),
|
| + CERT_NameTemplate },
|
| { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY,
|
| - offsetof(ocspServiceLocator, locator) },
|
| + offsetof(ocspServiceLocator, locator) },
|
| { 0 }
|
| };
|
|
|
| -
|
| /*
|
| * REQUEST SUPPORT FUNCTIONS (encode/create/decode/destroy):
|
| */
|
|
|
| -/*
|
| +/*
|
| * FUNCTION: CERT_EncodeOCSPRequest
|
| * DER encodes an OCSP Request, possibly adding a signature as well.
|
| * XXX Signing is not yet supported, however; see comments in code.
|
| - * INPUTS:
|
| + * INPUTS:
|
| * PLArenaPool *arena
|
| * The return value is allocated from here.
|
| * If a NULL is passed in, allocation is done from the heap instead.
|
| @@ -1482,7 +1478,7 @@ static const SEC_ASN1Template ocsp_ServiceLocatorTemplate[] = {
|
| */
|
| SECItem *
|
| CERT_EncodeOCSPRequest(PLArenaPool *arena, CERTOCSPRequest *request,
|
| - void *pwArg)
|
| + void *pwArg)
|
| {
|
| SECStatus rv;
|
|
|
| @@ -1491,10 +1487,10 @@ CERT_EncodeOCSPRequest(PLArenaPool *arena, CERTOCSPRequest *request,
|
| PORT_Assert(request->tbsRequest);
|
|
|
| if (request->tbsRequest->extensionHandle != NULL) {
|
| - rv = CERT_FinishExtensions(request->tbsRequest->extensionHandle);
|
| - request->tbsRequest->extensionHandle = NULL;
|
| - if (rv != SECSuccess)
|
| - return NULL;
|
| + rv = CERT_FinishExtensions(request->tbsRequest->extensionHandle);
|
| + request->tbsRequest->extensionHandle = NULL;
|
| + if (rv != SECSuccess)
|
| + return NULL;
|
| }
|
|
|
| /*
|
| @@ -1510,7 +1506,6 @@ CERT_EncodeOCSPRequest(PLArenaPool *arena, CERTOCSPRequest *request,
|
| return SEC_ASN1EncodeItem(arena, NULL, request, ocsp_OCSPRequestTemplate);
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DecodeOCSPRequest
|
| * Decode a DER encoded OCSP Request.
|
| @@ -1533,27 +1528,27 @@ CERT_DecodeOCSPRequest(const SECItem *src)
|
|
|
| arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| if (arena == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| - dest = (CERTOCSPRequest *) PORT_ArenaZAlloc(arena,
|
| - sizeof(CERTOCSPRequest));
|
| + dest = (CERTOCSPRequest *)PORT_ArenaZAlloc(arena,
|
| + sizeof(CERTOCSPRequest));
|
| if (dest == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| dest->arena = arena;
|
|
|
| /* copy the DER into the arena, since Quick DER returns data that points
|
| into the DER input, which may get freed by the caller */
|
| rv = SECITEM_CopyItem(arena, &newSrc, src);
|
| - if ( rv != SECSuccess ) {
|
| - goto loser;
|
| + if (rv != SECSuccess) {
|
| + goto loser;
|
| }
|
|
|
| rv = SEC_QuickDERDecodeItem(arena, dest, ocsp_OCSPRequestTemplate, &newSrc);
|
| if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_REQUEST);
|
| - goto loser;
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_REQUEST);
|
| + goto loser;
|
| }
|
|
|
| /*
|
| @@ -1561,24 +1556,24 @@ CERT_DecodeOCSPRequest(const SECItem *src)
|
| * of doing this copying of the arena pointer.
|
| */
|
| for (i = 0; dest->tbsRequest->requestList[i] != NULL; i++) {
|
| - dest->tbsRequest->requestList[i]->arena = arena;
|
| + dest->tbsRequest->requestList[i]->arena = arena;
|
| }
|
|
|
| return dest;
|
|
|
| loser:
|
| if (arena != NULL) {
|
| - PORT_FreeArena(arena, PR_FALSE);
|
| + PORT_FreeArena(arena, PR_FALSE);
|
| }
|
| return NULL;
|
| }
|
|
|
| SECStatus
|
| -CERT_DestroyOCSPCertID(CERTOCSPCertID* certID)
|
| +CERT_DestroyOCSPCertID(CERTOCSPCertID *certID)
|
| {
|
| if (certID && certID->poolp) {
|
| - PORT_FreeArena(certID->poolp, PR_FALSE);
|
| - return SECSuccess;
|
| + PORT_FreeArena(certID->poolp, PR_FALSE);
|
| + return SECSuccess;
|
| }
|
| PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| return SECFailure;
|
| @@ -1593,7 +1588,7 @@ CERT_DestroyOCSPCertID(CERTOCSPCertID* certID)
|
| */
|
|
|
| SECItem *
|
| -ocsp_DigestValue(PLArenaPool *arena, SECOidTag digestAlg,
|
| +ocsp_DigestValue(PLArenaPool *arena, SECOidTag digestAlg,
|
| SECItem *fill, const SECItem *src)
|
| {
|
| const SECHashObject *digestObject;
|
| @@ -1601,27 +1596,27 @@ ocsp_DigestValue(PLArenaPool *arena, SECOidTag digestAlg,
|
| void *mark = NULL;
|
| void *digestBuff = NULL;
|
|
|
| - if ( arena != NULL ) {
|
| + if (arena != NULL) {
|
| mark = PORT_ArenaMark(arena);
|
| }
|
|
|
| digestObject = HASH_GetHashObjectByOidTag(digestAlg);
|
| - if ( digestObject == NULL ) {
|
| + if (digestObject == NULL) {
|
| goto loser;
|
| }
|
|
|
| if (fill == NULL || fill->data == NULL) {
|
| - result = SECITEM_AllocItem(arena, fill, digestObject->length);
|
| - if ( result == NULL ) {
|
| - goto loser;
|
| - }
|
| - digestBuff = result->data;
|
| + result = SECITEM_AllocItem(arena, fill, digestObject->length);
|
| + if (result == NULL) {
|
| + goto loser;
|
| + }
|
| + digestBuff = result->data;
|
| } else {
|
| - if (fill->len < digestObject->length) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - goto loser;
|
| - }
|
| - digestBuff = fill->data;
|
| + if (fill->len < digestObject->length) {
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + goto loser;
|
| + }
|
| + digestBuff = fill->data;
|
| }
|
|
|
| if (PK11_HashBuf(digestAlg, digestBuff,
|
| @@ -1629,7 +1624,7 @@ ocsp_DigestValue(PLArenaPool *arena, SECOidTag digestAlg,
|
| goto loser;
|
| }
|
|
|
| - if ( arena != NULL ) {
|
| + if (arena != NULL) {
|
| PORT_ArenaUnmark(arena, mark);
|
| }
|
|
|
| @@ -1646,7 +1641,7 @@ loser:
|
| SECITEM_FreeItem(result, (fill == NULL) ? PR_TRUE : PR_FALSE);
|
| }
|
| }
|
| - return(NULL);
|
| + return (NULL);
|
| }
|
|
|
| /*
|
| @@ -1713,18 +1708,18 @@ ocsp_CreateCertID(PLArenaPool *arena, CERTCertificate *cert, PRTime time)
|
|
|
| certID = PORT_ArenaZNew(arena, CERTOCSPCertID);
|
| if (certID == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| rv = SECOID_SetAlgorithmID(arena, &certID->hashAlgorithm, SEC_OID_SHA1,
|
| - NULL);
|
| + NULL);
|
| if (rv != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| issuerCert = CERT_FindCertIssuer(cert, time, certUsageAnyCA);
|
| if (issuerCert == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| if (CERT_GetSubjectNameDigest(arena, issuerCert, SEC_OID_SHA1,
|
| @@ -1745,29 +1740,28 @@ ocsp_CreateCertID(PLArenaPool *arena, CERTCertificate *cert, PRTime time)
|
| }
|
|
|
| if (CERT_GetSubjectPublicKeyDigest(arena, issuerCert, SEC_OID_SHA1,
|
| - &certID->issuerKeyHash) == NULL) {
|
| - goto loser;
|
| + &certID->issuerKeyHash) == NULL) {
|
| + goto loser;
|
| }
|
| certID->issuerSHA1KeyHash.data = certID->issuerKeyHash.data;
|
| certID->issuerSHA1KeyHash.len = certID->issuerKeyHash.len;
|
| /* cache the other two hash algorithms as well */
|
| if (CERT_GetSubjectPublicKeyDigest(arena, issuerCert, SEC_OID_MD5,
|
| - &certID->issuerMD5KeyHash) == NULL) {
|
| - goto loser;
|
| + &certID->issuerMD5KeyHash) == NULL) {
|
| + goto loser;
|
| }
|
| if (CERT_GetSubjectPublicKeyDigest(arena, issuerCert, SEC_OID_MD2,
|
| - &certID->issuerMD2KeyHash) == NULL) {
|
| - goto loser;
|
| + &certID->issuerMD2KeyHash) == NULL) {
|
| + goto loser;
|
| }
|
|
|
| -
|
| /* now we are done with issuerCert */
|
| CERT_DestroyCertificate(issuerCert);
|
| issuerCert = NULL;
|
|
|
| rv = SECITEM_CopyItem(arena, &certID->serialNumber, &cert->serialNumber);
|
| if (rv != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| PORT_ArenaUnmark(arena, mark);
|
| @@ -1775,25 +1769,25 @@ ocsp_CreateCertID(PLArenaPool *arena, CERTCertificate *cert, PRTime time)
|
|
|
| loser:
|
| if (issuerCert != NULL) {
|
| - CERT_DestroyCertificate(issuerCert);
|
| + CERT_DestroyCertificate(issuerCert);
|
| }
|
| PORT_ArenaRelease(arena, mark);
|
| return NULL;
|
| }
|
|
|
| -CERTOCSPCertID*
|
| +CERTOCSPCertID *
|
| CERT_CreateOCSPCertID(CERTCertificate *cert, PRTime time)
|
| {
|
| PLArenaPool *arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| CERTOCSPCertID *certID;
|
| PORT_Assert(arena != NULL);
|
| if (!arena)
|
| - return NULL;
|
| -
|
| + return NULL;
|
| +
|
| certID = ocsp_CreateCertID(arena, cert, time);
|
| if (!certID) {
|
| - PORT_FreeArena(arena, PR_FALSE);
|
| - return NULL;
|
| + PORT_FreeArena(arena, PR_FALSE);
|
| + return NULL;
|
| }
|
| certID->poolp = arena;
|
| return certID;
|
| @@ -1818,11 +1812,11 @@ cert_DupOCSPCertID(const CERTOCSPCertID *src)
|
| if (!dest)
|
| goto loser;
|
|
|
| -#define DUPHELP(element) \
|
| - if (src->element.data && \
|
| - SECITEM_CopyItem(arena, &dest->element, &src->element) \
|
| - != SECSuccess) { \
|
| - goto loser; \
|
| +#define DUPHELP(element) \
|
| + if (src->element.data && \
|
| + SECITEM_CopyItem(arena, &dest->element, &src->element) != \
|
| + SECSuccess) { \
|
| + goto loser; \
|
| }
|
|
|
| DUPHELP(hashAlgorithm.algorithm)
|
| @@ -1850,12 +1844,13 @@ loser:
|
| /*
|
| * Callback to set Extensions in request object
|
| */
|
| -void SetSingleReqExts(void *object, CERTCertExtension **exts)
|
| +void
|
| +SetSingleReqExts(void *object, CERTCertExtension **exts)
|
| {
|
| - ocspSingleRequest *singleRequest =
|
| - (ocspSingleRequest *)object;
|
| + ocspSingleRequest *singleRequest =
|
| + (ocspSingleRequest *)object;
|
|
|
| - singleRequest->singleRequestExtensions = exts;
|
| + singleRequest->singleRequestExtensions = exts;
|
| }
|
|
|
| /*
|
| @@ -1866,7 +1861,7 @@ void SetSingleReqExts(void *object, CERTCertExtension **exts)
|
| */
|
| static SECStatus
|
| ocsp_AddServiceLocatorExtension(ocspSingleRequest *singleRequest,
|
| - CERTCertificate *cert)
|
| + CERTCertificate *cert)
|
| {
|
| ocspServiceLocator *serviceLocator = NULL;
|
| void *extensionHandle = NULL;
|
| @@ -1874,7 +1869,7 @@ ocsp_AddServiceLocatorExtension(ocspSingleRequest *singleRequest,
|
|
|
| serviceLocator = PORT_ZNew(ocspServiceLocator);
|
| if (serviceLocator == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| /*
|
| * Normally it would be a bad idea to do a direct reference like
|
| @@ -1886,10 +1881,10 @@ ocsp_AddServiceLocatorExtension(ocspSingleRequest *singleRequest,
|
| serviceLocator->issuer = &cert->issuer;
|
|
|
| rv = CERT_FindCertExtension(cert, SEC_OID_X509_AUTH_INFO_ACCESS,
|
| - &serviceLocator->locator);
|
| + &serviceLocator->locator);
|
| if (rv != SECSuccess) {
|
| - if (PORT_GetError() != SEC_ERROR_EXTENSION_NOT_FOUND)
|
| - goto loser;
|
| + if (PORT_GetError() != SEC_ERROR_EXTENSION_NOT_FOUND)
|
| + goto loser;
|
| }
|
|
|
| /* prepare for following loser gotos */
|
| @@ -1897,33 +1892,33 @@ ocsp_AddServiceLocatorExtension(ocspSingleRequest *singleRequest,
|
| PORT_SetError(0);
|
|
|
| extensionHandle = cert_StartExtensions(singleRequest,
|
| - singleRequest->arena, SetSingleReqExts);
|
| + singleRequest->arena, SetSingleReqExts);
|
| if (extensionHandle == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| rv = CERT_EncodeAndAddExtension(extensionHandle,
|
| - SEC_OID_PKIX_OCSP_SERVICE_LOCATOR,
|
| - serviceLocator, PR_FALSE,
|
| - ocsp_ServiceLocatorTemplate);
|
| + SEC_OID_PKIX_OCSP_SERVICE_LOCATOR,
|
| + serviceLocator, PR_FALSE,
|
| + ocsp_ServiceLocatorTemplate);
|
|
|
| loser:
|
| if (extensionHandle != NULL) {
|
| - /*
|
| + /*
|
| * Either way we have to finish out the extension context (so it gets
|
| * freed). But careful not to override any already-set bad status.
|
| */
|
| - SECStatus tmprv = CERT_FinishExtensions(extensionHandle);
|
| - if (rv == SECSuccess)
|
| - rv = tmprv;
|
| + SECStatus tmprv = CERT_FinishExtensions(extensionHandle);
|
| + if (rv == SECSuccess)
|
| + rv = tmprv;
|
| }
|
|
|
| /*
|
| * Finally, free the serviceLocator structure itself and we are done.
|
| */
|
| if (serviceLocator != NULL) {
|
| - if (serviceLocator->locator.data != NULL)
|
| - SECITEM_FreeItem(&serviceLocator->locator, PR_FALSE);
|
| - PORT_Free(serviceLocator);
|
| + if (serviceLocator->locator.data != NULL)
|
| + SECITEM_FreeItem(&serviceLocator->locator, PR_FALSE);
|
| + PORT_Free(serviceLocator);
|
| }
|
|
|
| return rv;
|
| @@ -1949,18 +1944,18 @@ ocsp_CreateSingleRequestList(PLArenaPool *arena, CERTCertList *certList,
|
| CERTCertListNode *node = NULL;
|
| int i, count;
|
| void *mark = PORT_ArenaMark(arena);
|
| -
|
| +
|
| node = CERT_LIST_HEAD(certList);
|
| for (count = 0; !CERT_LIST_END(node, certList); count++) {
|
| node = CERT_LIST_NEXT(node);
|
| }
|
|
|
| if (count == 0)
|
| - goto loser;
|
| + goto loser;
|
|
|
| requestList = PORT_ArenaNewArray(arena, ocspSingleRequest *, count + 1);
|
| if (requestList == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| node = CERT_LIST_HEAD(certList);
|
| for (i = 0; !CERT_LIST_END(node, certList); i++) {
|
| @@ -1998,7 +1993,7 @@ loser:
|
|
|
| static ocspSingleRequest **
|
| ocsp_CreateRequestFromCert(PLArenaPool *arena,
|
| - CERTOCSPCertID *certID,
|
| + CERTOCSPCertID *certID,
|
| CERTCertificate *singleCert,
|
| PRTime time,
|
| PRBool includeLocator)
|
| @@ -2016,7 +2011,7 @@ ocsp_CreateRequestFromCert(PLArenaPool *arena,
|
| goto loser;
|
| requestList[0]->arena = arena;
|
| /* certID will live longer than the request */
|
| - requestList[0]->reqCert = certID;
|
| + requestList[0]->reqCert = certID;
|
|
|
| if (includeLocator == PR_TRUE) {
|
| SECStatus rv;
|
| @@ -2067,8 +2062,8 @@ loser:
|
| }
|
|
|
| CERTOCSPRequest *
|
| -cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
| - CERTCertificate *singleCert,
|
| +cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
| + CERTCertificate *singleCert,
|
| PRTime time,
|
| PRBool addServiceLocator,
|
| CERTCertificate *signerCert)
|
| @@ -2091,8 +2086,8 @@ cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
| * Version 1 is the default, so we need not fill in a version number.
|
| * Now create the list of single requests, one for each cert.
|
| */
|
| - request->tbsRequest->requestList =
|
| - ocsp_CreateRequestFromCert(request->arena,
|
| + request->tbsRequest->requestList =
|
| + ocsp_CreateRequestFromCert(request->arena,
|
| certID,
|
| singleCert,
|
| time,
|
| @@ -2106,7 +2101,7 @@ cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
|
|
| /*
|
| * FUNCTION: CERT_CreateOCSPRequest
|
| - * Creates a CERTOCSPRequest, requesting the status of the certs in
|
| + * Creates a CERTOCSPRequest, requesting the status of the certs in
|
| * the given list.
|
| * INPUTS:
|
| * CERTCertList *certList
|
| @@ -2118,7 +2113,7 @@ cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
| * to this routine), who knows about where the request(s) are being
|
| * sent and whether there are any trusted responders in place.
|
| * PRTime time
|
| - * Indicates the time for which the certificate status is to be
|
| + * Indicates the time for which the certificate status is to be
|
| * determined -- this may be used in the search for the cert's issuer
|
| * but has no effect on the request itself.
|
| * PRBool addServiceLocator
|
| @@ -2137,8 +2132,8 @@ cert_CreateSingleCertOCSPRequest(CERTOCSPCertID *certID,
|
| */
|
| CERTOCSPRequest *
|
| CERT_CreateOCSPRequest(CERTCertList *certList, PRTime time,
|
| - PRBool addServiceLocator,
|
| - CERTCertificate *signerCert)
|
| + PRBool addServiceLocator,
|
| + CERTCertificate *signerCert)
|
| {
|
| CERTOCSPRequest *request = NULL;
|
|
|
| @@ -2147,7 +2142,7 @@ CERT_CreateOCSPRequest(CERTCertList *certList, PRTime time,
|
| return NULL;
|
| }
|
| /*
|
| - * XXX When we are prepared to put signing of requests back in,
|
| + * XXX When we are prepared to put signing of requests back in,
|
| * we will need to allocate a signature
|
| * structure for the request, fill in the "derCerts" field in it,
|
| * save the signerCert there, as well as fill in the "requestorName"
|
| @@ -2163,8 +2158,8 @@ CERT_CreateOCSPRequest(CERTCertList *certList, PRTime time,
|
| /*
|
| * Now create the list of single requests, one for each cert.
|
| */
|
| - request->tbsRequest->requestList =
|
| - ocsp_CreateSingleRequestList(request->arena,
|
| + request->tbsRequest->requestList =
|
| + ocsp_CreateSingleRequestList(request->arena,
|
| certList,
|
| time,
|
| addServiceLocator);
|
| @@ -2192,16 +2187,17 @@ CERT_CreateOCSPRequest(CERTCertList *certList, PRTime time,
|
| * All errors are internal or low-level problems (e.g. no memory).
|
| */
|
|
|
| -void SetRequestExts(void *object, CERTCertExtension **exts)
|
| +void
|
| +SetRequestExts(void *object, CERTCertExtension **exts)
|
| {
|
| - CERTOCSPRequest *request = (CERTOCSPRequest *)object;
|
| + CERTOCSPRequest *request = (CERTOCSPRequest *)object;
|
|
|
| - request->tbsRequest->requestExtensions = exts;
|
| + request->tbsRequest->requestExtensions = exts;
|
| }
|
|
|
| SECStatus
|
| CERT_AddOCSPAcceptableResponses(CERTOCSPRequest *request,
|
| - SECOidTag responseType0, ...)
|
| + SECOidTag responseType0, ...)
|
| {
|
| void *extHandle;
|
| va_list ap;
|
| @@ -2213,60 +2209,59 @@ CERT_AddOCSPAcceptableResponses(CERTOCSPRequest *request,
|
|
|
| extHandle = request->tbsRequest->extensionHandle;
|
| if (extHandle == NULL) {
|
| - extHandle = cert_StartExtensions(request, request->arena, SetRequestExts);
|
| - if (extHandle == NULL)
|
| - goto loser;
|
| + extHandle = cert_StartExtensions(request, request->arena, SetRequestExts);
|
| + if (extHandle == NULL)
|
| + goto loser;
|
| }
|
|
|
| /* Count number of OIDS going into the extension value. */
|
| count = 1;
|
| if (responseType0 != SEC_OID_PKIX_OCSP_BASIC_RESPONSE) {
|
| - va_start(ap, responseType0);
|
| - do {
|
| - count++;
|
| - responseType = va_arg(ap, SECOidTag);
|
| - } while (responseType != SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
| - va_end(ap);
|
| + va_start(ap, responseType0);
|
| + do {
|
| + count++;
|
| + responseType = va_arg(ap, SECOidTag);
|
| + } while (responseType != SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
| + va_end(ap);
|
| }
|
|
|
| acceptableResponses = PORT_NewArray(SECItem *, count + 1);
|
| if (acceptableResponses == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| i = 0;
|
| responseOid = SECOID_FindOIDByTag(responseType0);
|
| acceptableResponses[i++] = &(responseOid->oid);
|
| if (count > 1) {
|
| - va_start(ap, responseType0);
|
| - for ( ; i < count; i++) {
|
| - responseType = va_arg(ap, SECOidTag);
|
| - responseOid = SECOID_FindOIDByTag(responseType);
|
| - acceptableResponses[i] = &(responseOid->oid);
|
| - }
|
| - va_end(ap);
|
| + va_start(ap, responseType0);
|
| + for (; i < count; i++) {
|
| + responseType = va_arg(ap, SECOidTag);
|
| + responseOid = SECOID_FindOIDByTag(responseType);
|
| + acceptableResponses[i] = &(responseOid->oid);
|
| + }
|
| + va_end(ap);
|
| }
|
| acceptableResponses[i] = NULL;
|
|
|
| rv = CERT_EncodeAndAddExtension(extHandle, SEC_OID_PKIX_OCSP_RESPONSE,
|
| - &acceptableResponses, PR_FALSE,
|
| - SEC_ASN1_GET(SEC_SequenceOfObjectIDTemplate));
|
| + &acceptableResponses, PR_FALSE,
|
| + SEC_ASN1_GET(SEC_SequenceOfObjectIDTemplate));
|
| if (rv != SECSuccess)
|
| - goto loser;
|
| + goto loser;
|
|
|
| PORT_Free(acceptableResponses);
|
| if (request->tbsRequest->extensionHandle == NULL)
|
| - request->tbsRequest->extensionHandle = extHandle;
|
| + request->tbsRequest->extensionHandle = extHandle;
|
| return SECSuccess;
|
|
|
| loser:
|
| if (acceptableResponses != NULL)
|
| - PORT_Free(acceptableResponses);
|
| + PORT_Free(acceptableResponses);
|
| if (extHandle != NULL)
|
| - (void) CERT_FinishExtensions(extHandle);
|
| + (void)CERT_FinishExtensions(extHandle);
|
| return rv;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DestroyOCSPRequest
|
| * Frees an OCSP Request structure.
|
| @@ -2280,20 +2275,20 @@ void
|
| CERT_DestroyOCSPRequest(CERTOCSPRequest *request)
|
| {
|
| if (request == NULL)
|
| - return;
|
| + return;
|
|
|
| if (request->tbsRequest != NULL) {
|
| - if (request->tbsRequest->requestorName != NULL)
|
| - CERT_DestroyGeneralNameList(request->tbsRequest->requestorName);
|
| - if (request->tbsRequest->extensionHandle != NULL)
|
| - (void) CERT_FinishExtensions(request->tbsRequest->extensionHandle);
|
| + if (request->tbsRequest->requestorName != NULL)
|
| + CERT_DestroyGeneralNameList(request->tbsRequest->requestorName);
|
| + if (request->tbsRequest->extensionHandle != NULL)
|
| + (void)CERT_FinishExtensions(request->tbsRequest->extensionHandle);
|
| }
|
|
|
| if (request->optionalSignature != NULL) {
|
| - if (request->optionalSignature->cert != NULL)
|
| - CERT_DestroyCertificate(request->optionalSignature->cert);
|
| + if (request->optionalSignature->cert != NULL)
|
| + CERT_DestroyCertificate(request->optionalSignature->cert);
|
|
|
| - /*
|
| + /*
|
| * XXX Need to free derCerts? Or do they come out of arena?
|
| * (Currently we never fill in derCerts, which is why the
|
| * answer is not obvious. Once we do, add any necessary code
|
| @@ -2308,10 +2303,9 @@ CERT_DestroyOCSPRequest(CERTOCSPRequest *request)
|
| */
|
| PORT_Assert(request->arena != NULL);
|
| if (request->arena != NULL)
|
| - PORT_FreeArena(request->arena, PR_FALSE);
|
| + PORT_FreeArena(request->arena, PR_FALSE);
|
| }
|
|
|
| -
|
| /*
|
| * RESPONSE SUPPORT FUNCTIONS (encode/create/decode/destroy):
|
| */
|
| @@ -2326,17 +2320,17 @@ ocsp_ResponderIDTemplateByType(CERTOCSPResponderIDType responderIDType)
|
| const SEC_ASN1Template *responderIDTemplate;
|
|
|
| switch (responderIDType) {
|
| - case ocspResponderID_byName:
|
| - responderIDTemplate = ocsp_ResponderIDByNameTemplate;
|
| - break;
|
| - case ocspResponderID_byKey:
|
| - responderIDTemplate = ocsp_ResponderIDByKeyTemplate;
|
| - break;
|
| - case ocspResponderID_other:
|
| - default:
|
| - PORT_Assert(responderIDType == ocspResponderID_other);
|
| - responderIDTemplate = ocsp_ResponderIDOtherTemplate;
|
| - break;
|
| + case ocspResponderID_byName:
|
| + responderIDTemplate = ocsp_ResponderIDByNameTemplate;
|
| + break;
|
| + case ocspResponderID_byKey:
|
| + responderIDTemplate = ocsp_ResponderIDByKeyTemplate;
|
| + break;
|
| + case ocspResponderID_other:
|
| + default:
|
| + PORT_Assert(responderIDType == ocspResponderID_other);
|
| + responderIDTemplate = ocsp_ResponderIDOtherTemplate;
|
| + break;
|
| }
|
|
|
| return responderIDTemplate;
|
| @@ -2352,20 +2346,20 @@ ocsp_CertStatusTemplateByType(ocspCertStatusType certStatusType)
|
| const SEC_ASN1Template *certStatusTemplate;
|
|
|
| switch (certStatusType) {
|
| - case ocspCertStatus_good:
|
| - certStatusTemplate = ocsp_CertStatusGoodTemplate;
|
| - break;
|
| - case ocspCertStatus_revoked:
|
| - certStatusTemplate = ocsp_CertStatusRevokedTemplate;
|
| - break;
|
| - case ocspCertStatus_unknown:
|
| - certStatusTemplate = ocsp_CertStatusUnknownTemplate;
|
| - break;
|
| - case ocspCertStatus_other:
|
| - default:
|
| - PORT_Assert(certStatusType == ocspCertStatus_other);
|
| - certStatusTemplate = ocsp_CertStatusOtherTemplate;
|
| - break;
|
| + case ocspCertStatus_good:
|
| + certStatusTemplate = ocsp_CertStatusGoodTemplate;
|
| + break;
|
| + case ocspCertStatus_revoked:
|
| + certStatusTemplate = ocsp_CertStatusRevokedTemplate;
|
| + break;
|
| + case ocspCertStatus_unknown:
|
| + certStatusTemplate = ocsp_CertStatusUnknownTemplate;
|
| + break;
|
| + case ocspCertStatus_other:
|
| + default:
|
| + PORT_Assert(certStatusType == ocspCertStatus_other);
|
| + certStatusTemplate = ocsp_CertStatusOtherTemplate;
|
| + break;
|
| }
|
|
|
| return certStatusTemplate;
|
| @@ -2381,18 +2375,18 @@ ocsp_CertStatusTypeByTag(int derTag)
|
| ocspCertStatusType certStatusType;
|
|
|
| switch (derTag) {
|
| - case 0:
|
| - certStatusType = ocspCertStatus_good;
|
| - break;
|
| - case 1:
|
| - certStatusType = ocspCertStatus_revoked;
|
| - break;
|
| - case 2:
|
| - certStatusType = ocspCertStatus_unknown;
|
| - break;
|
| - default:
|
| - certStatusType = ocspCertStatus_other;
|
| - break;
|
| + case 0:
|
| + certStatusType = ocspCertStatus_good;
|
| + break;
|
| + case 1:
|
| + certStatusType = ocspCertStatus_revoked;
|
| + break;
|
| + case 2:
|
| + certStatusType = ocspCertStatus_unknown;
|
| + break;
|
| + default:
|
| + certStatusType = ocspCertStatus_other;
|
| + break;
|
| }
|
|
|
| return certStatusType;
|
| @@ -2407,7 +2401,7 @@ ocsp_CertStatusTypeByTag(int derTag)
|
| */
|
| static SECStatus
|
| ocsp_FinishDecodingSingleResponses(PLArenaPool *reqArena,
|
| - CERTOCSPSingleResponse **responses)
|
| + CERTOCSPSingleResponse **responses)
|
| {
|
| ocspCertStatus *certStatus;
|
| ocspCertStatusType certStatusType;
|
| @@ -2421,39 +2415,39 @@ ocsp_FinishDecodingSingleResponses(PLArenaPool *reqArena,
|
| return SECFailure;
|
| }
|
|
|
| - if (responses == NULL) /* nothing to do */
|
| - return SECSuccess;
|
| + if (responses == NULL) /* nothing to do */
|
| + return SECSuccess;
|
|
|
| for (i = 0; responses[i] != NULL; i++) {
|
| - SECItem* newStatus;
|
| - /*
|
| + SECItem *newStatus;
|
| + /*
|
| * The following assert points out internal errors (problems in
|
| * the template definitions or in the ASN.1 decoder itself, etc.).
|
| */
|
| - PORT_Assert(responses[i]->derCertStatus.data != NULL);
|
| + PORT_Assert(responses[i]->derCertStatus.data != NULL);
|
|
|
| - derTag = responses[i]->derCertStatus.data[0] & SEC_ASN1_TAGNUM_MASK;
|
| - certStatusType = ocsp_CertStatusTypeByTag(derTag);
|
| - certStatusTemplate = ocsp_CertStatusTemplateByType(certStatusType);
|
| + derTag = responses[i]->derCertStatus.data[0] & SEC_ASN1_TAGNUM_MASK;
|
| + certStatusType = ocsp_CertStatusTypeByTag(derTag);
|
| + certStatusTemplate = ocsp_CertStatusTemplateByType(certStatusType);
|
|
|
| - certStatus = PORT_ArenaZAlloc(reqArena, sizeof(ocspCertStatus));
|
| - if (certStatus == NULL) {
|
| - goto loser;
|
| - }
|
| + certStatus = PORT_ArenaZAlloc(reqArena, sizeof(ocspCertStatus));
|
| + if (certStatus == NULL) {
|
| + goto loser;
|
| + }
|
| newStatus = SECITEM_ArenaDupItem(reqArena, &responses[i]->derCertStatus);
|
| if (!newStatus) {
|
| goto loser;
|
| }
|
| - rv = SEC_QuickDERDecodeItem(reqArena, certStatus, certStatusTemplate,
|
| - newStatus);
|
| - if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - goto loser;
|
| - }
|
| + rv = SEC_QuickDERDecodeItem(reqArena, certStatus, certStatusTemplate,
|
| + newStatus);
|
| + if (rv != SECSuccess) {
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + goto loser;
|
| + }
|
|
|
| - certStatus->certStatusType = certStatusType;
|
| - responses[i]->certStatus = certStatus;
|
| + certStatus->certStatusType = certStatusType;
|
| + responses[i]->certStatus = certStatus;
|
| }
|
|
|
| return SECSuccess;
|
| @@ -2472,15 +2466,15 @@ ocsp_ResponderIDTypeByTag(int derTag)
|
| CERTOCSPResponderIDType responderIDType;
|
|
|
| switch (derTag) {
|
| - case 1:
|
| - responderIDType = ocspResponderID_byName;
|
| - break;
|
| - case 2:
|
| - responderIDType = ocspResponderID_byKey;
|
| - break;
|
| - default:
|
| - responderIDType = ocspResponderID_other;
|
| - break;
|
| + case 1:
|
| + responderIDType = ocspResponderID_byName;
|
| + break;
|
| + case 2:
|
| + responderIDType = ocspResponderID_byKey;
|
| + break;
|
| + default:
|
| + responderIDType = ocspResponderID_other;
|
| + break;
|
| }
|
|
|
| return responderIDType;
|
| @@ -2506,22 +2500,22 @@ ocsp_DecodeBasicOCSPResponse(PLArenaPool *arena, SECItem *src)
|
|
|
| basicResponse = PORT_ArenaZAlloc(arena, sizeof(ocspBasicOCSPResponse));
|
| if (basicResponse == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| /* copy the DER into the arena, since Quick DER returns data that points
|
| into the DER input, which may get freed by the caller */
|
| rv = SECITEM_CopyItem(arena, &newsrc, src);
|
| - if ( rv != SECSuccess ) {
|
| - goto loser;
|
| + if (rv != SECSuccess) {
|
| + goto loser;
|
| }
|
|
|
| rv = SEC_QuickDERDecodeItem(arena, basicResponse,
|
| - ocsp_BasicOCSPResponseTemplate, &newsrc);
|
| + ocsp_BasicOCSPResponseTemplate, &newsrc);
|
| if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - goto loser;
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + goto loser;
|
| }
|
|
|
| responseData = basicResponse->tbsResponseData;
|
| @@ -2543,15 +2537,15 @@ ocsp_DecodeBasicOCSPResponse(PLArenaPool *arena, SECItem *src)
|
|
|
| responderID = PORT_ArenaZAlloc(arena, sizeof(ocspResponderID));
|
| if (responderID == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| rv = SEC_QuickDERDecodeItem(arena, responderID, responderIDTemplate,
|
| - &responseData->derResponderID);
|
| + &responseData->derResponderID);
|
| if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - goto loser;
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + goto loser;
|
| }
|
|
|
| responderID->responderIDType = responderIDType;
|
| @@ -2563,7 +2557,7 @@ ocsp_DecodeBasicOCSPResponse(PLArenaPool *arena, SECItem *src)
|
| */
|
| rv = ocsp_FinishDecodingSingleResponses(arena, responseData->responses);
|
| if (rv != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| PORT_ArenaUnmark(arena, mark);
|
| @@ -2574,7 +2568,6 @@ loser:
|
| return NULL;
|
| }
|
|
|
| -
|
| /*
|
| * Decode the responseBytes based on the responseType found in "rbytes",
|
| * leaving the resulting translated/decoded information in there as well.
|
| @@ -2583,38 +2576,35 @@ static SECStatus
|
| ocsp_DecodeResponseBytes(PLArenaPool *arena, ocspResponseBytes *rbytes)
|
| {
|
| if (rbytes == NULL) {
|
| - PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE);
|
| + return SECFailure;
|
| }
|
|
|
| rbytes->responseTypeTag = SECOID_FindOIDTag(&rbytes->responseType);
|
| switch (rbytes->responseTypeTag) {
|
| - case SEC_OID_PKIX_OCSP_BASIC_RESPONSE:
|
| - {
|
| - ocspBasicOCSPResponse *basicResponse;
|
| + case SEC_OID_PKIX_OCSP_BASIC_RESPONSE: {
|
| + ocspBasicOCSPResponse *basicResponse;
|
|
|
| - basicResponse = ocsp_DecodeBasicOCSPResponse(arena,
|
| - &rbytes->response);
|
| - if (basicResponse == NULL)
|
| - return SECFailure;
|
| + basicResponse = ocsp_DecodeBasicOCSPResponse(arena,
|
| + &rbytes->response);
|
| + if (basicResponse == NULL)
|
| + return SECFailure;
|
|
|
| - rbytes->decodedResponse.basic = basicResponse;
|
| - }
|
| - break;
|
| + rbytes->decodedResponse.basic = basicResponse;
|
| + } break;
|
|
|
| - /*
|
| + /*
|
| * Add new/future response types here.
|
| */
|
|
|
| - default:
|
| - PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE);
|
| - return SECFailure;
|
| + default:
|
| + PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE);
|
| + return SECFailure;
|
| }
|
|
|
| return SECSuccess;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DecodeOCSPResponse
|
| * Decode a DER encoded OCSP Response.
|
| @@ -2639,37 +2629,37 @@ CERT_DecodeOCSPResponse(const SECItem *src)
|
|
|
| arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| if (arena == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| - response = (CERTOCSPResponse *) PORT_ArenaZAlloc(arena,
|
| - sizeof(CERTOCSPResponse));
|
| + response = (CERTOCSPResponse *)PORT_ArenaZAlloc(arena,
|
| + sizeof(CERTOCSPResponse));
|
| if (response == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| response->arena = arena;
|
|
|
| /* copy the DER into the arena, since Quick DER returns data that points
|
| into the DER input, which may get freed by the caller */
|
| rv = SECITEM_CopyItem(arena, &newSrc, src);
|
| - if ( rv != SECSuccess ) {
|
| - goto loser;
|
| + if (rv != SECSuccess) {
|
| + goto loser;
|
| }
|
|
|
| rv = SEC_QuickDERDecodeItem(arena, response, ocsp_OCSPResponseTemplate, &newSrc);
|
| if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - goto loser;
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + goto loser;
|
| }
|
|
|
| - sv = (ocspResponseStatus) DER_GetInteger(&response->responseStatus);
|
| + sv = (ocspResponseStatus)DER_GetInteger(&response->responseStatus);
|
| response->statusValue = sv;
|
| if (sv != ocspResponse_successful) {
|
| - /*
|
| + /*
|
| * If the response status is anything but successful, then we
|
| * are all done with decoding; the status is all there is.
|
| */
|
| - return response;
|
| + return response;
|
| }
|
|
|
| /*
|
| @@ -2678,14 +2668,14 @@ CERT_DecodeOCSPResponse(const SECItem *src)
|
| */
|
| rv = ocsp_DecodeResponseBytes(arena, response->responseBytes);
|
| if (rv != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| return response;
|
|
|
| loser:
|
| if (arena != NULL) {
|
| - PORT_FreeArena(arena, PR_FALSE);
|
| + PORT_FreeArena(arena, PR_FALSE);
|
| }
|
| return NULL;
|
| }
|
| @@ -2711,7 +2701,7 @@ loser:
|
| *
|
| * FUNCTION: ocsp_GetResponseData
|
| * Returns ocspResponseData structure and a pointer to tbs response
|
| - * data DER from a valid ocsp response.
|
| + * data DER from a valid ocsp response.
|
| * INPUTS:
|
| * CERTOCSPResponse *response
|
| * structure of a valid ocsp response
|
| @@ -2729,8 +2719,8 @@ ocsp_GetResponseData(CERTOCSPResponse *response, SECItem **tbsResponseDataDER)
|
|
|
| PORT_Assert(response->responseBytes != NULL);
|
|
|
| - PORT_Assert(response->responseBytes->responseTypeTag
|
| - == SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
| + PORT_Assert(response->responseBytes->responseTypeTag ==
|
| + SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
|
|
| basic = response->responseBytes->decodedResponse.basic;
|
| PORT_Assert(basic != NULL);
|
| @@ -2761,8 +2751,8 @@ ocsp_GetResponseSignature(CERTOCSPResponse *response)
|
| if (NULL == response->responseBytes) {
|
| return NULL;
|
| }
|
| - if (response->responseBytes->responseTypeTag
|
| - != SEC_OID_PKIX_OCSP_BASIC_RESPONSE) {
|
| + if (response->responseBytes->responseTypeTag !=
|
| + SEC_OID_PKIX_OCSP_BASIC_RESPONSE) {
|
| return NULL;
|
| }
|
| basic = response->responseBytes->decodedResponse.basic;
|
| @@ -2771,7 +2761,6 @@ ocsp_GetResponseSignature(CERTOCSPResponse *response)
|
| return &(basic->responseSignature);
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DestroyOCSPResponse
|
| * Frees an OCSP Response structure.
|
| @@ -2785,28 +2774,26 @@ void
|
| CERT_DestroyOCSPResponse(CERTOCSPResponse *response)
|
| {
|
| if (response != NULL) {
|
| - ocspSignature *signature = ocsp_GetResponseSignature(response);
|
| - if (signature && signature->cert != NULL)
|
| - CERT_DestroyCertificate(signature->cert);
|
| + ocspSignature *signature = ocsp_GetResponseSignature(response);
|
| + if (signature && signature->cert != NULL)
|
| + CERT_DestroyCertificate(signature->cert);
|
|
|
| - /*
|
| + /*
|
| * We should actually never have a response without an arena,
|
| * but check just in case. (If there isn't one, there is not
|
| * much we can do about it...)
|
| */
|
| - PORT_Assert(response->arena != NULL);
|
| - if (response->arena != NULL) {
|
| - PORT_FreeArena(response->arena, PR_FALSE);
|
| - }
|
| + PORT_Assert(response->arena != NULL);
|
| + if (response->arena != NULL) {
|
| + PORT_FreeArena(response->arena, PR_FALSE);
|
| + }
|
| }
|
| }
|
|
|
| -
|
| /*
|
| * OVERALL OCSP CLIENT SUPPORT (make and send a request, verify a response):
|
| */
|
|
|
| -
|
| /*
|
| * Pick apart a URL, saving the important things in the passed-in pointers.
|
| *
|
| @@ -2822,7 +2809,7 @@ CERT_DestroyOCSPResponse(CERTOCSPResponse *response)
|
| static SECStatus
|
| ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| {
|
| - unsigned short port = 80; /* default, in case not in url */
|
| + unsigned short port = 80; /* default, in case not in url */
|
| char *hostname = NULL;
|
| char *path = NULL;
|
| const char *save;
|
| @@ -2830,25 +2817,25 @@ ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| int len;
|
|
|
| if (url == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| /*
|
| * Skip beginning whitespace.
|
| */
|
| c = *url;
|
| while ((c == ' ' || c == '\t') && c != '\0') {
|
| - url++;
|
| - c = *url;
|
| + url++;
|
| + c = *url;
|
| }
|
| if (c == '\0')
|
| - goto loser;
|
| + goto loser;
|
|
|
| /*
|
| * Confirm, then skip, protocol. (Since we only know how to do http,
|
| * that is all we will accept).
|
| */
|
| if (PORT_Strncasecmp(url, "http://", 7) != 0)
|
| - goto loser;
|
| + goto loser;
|
| url += 7;
|
|
|
| /*
|
| @@ -2866,13 +2853,13 @@ ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| save = url;
|
| c = *url;
|
| while (c != '/' && c != ':' && c != '\0' && c != ' ' && c != '\t') {
|
| - url++;
|
| - c = *url;
|
| + url++;
|
| + c = *url;
|
| }
|
| len = url - save;
|
| hostname = PORT_Alloc(len + 1);
|
| if (hostname == NULL)
|
| - goto loser;
|
| + goto loser;
|
| PORT_Memcpy(hostname, save, len);
|
| hostname[len] = '\0';
|
|
|
| @@ -2881,15 +2868,15 @@ ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| * If so, we need to parse it (as a number) and skip it.
|
| */
|
| if (c == ':') {
|
| - url++;
|
| - port = (unsigned short) PORT_Atoi(url);
|
| - c = *url;
|
| - while (c != '/' && c != '\0' && c != ' ' && c != '\t') {
|
| - if (c < '0' || c > '9')
|
| - goto loser;
|
| - url++;
|
| - c = *url;
|
| - }
|
| + url++;
|
| + port = (unsigned short)PORT_Atoi(url);
|
| + c = *url;
|
| + while (c != '/' && c != '\0' && c != ' ' && c != '\t') {
|
| + if (c < '0' || c > '9')
|
| + goto loser;
|
| + url++;
|
| + c = *url;
|
| + }
|
| }
|
|
|
| /*
|
| @@ -2897,21 +2884,21 @@ ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| * if nothing else -- but if there is not we provide one.
|
| */
|
| if (c == '/') {
|
| - save = url;
|
| - while (c != '\0' && c != ' ' && c != '\t') {
|
| - url++;
|
| - c = *url;
|
| - }
|
| - len = url - save;
|
| - path = PORT_Alloc(len + 1);
|
| - if (path == NULL)
|
| - goto loser;
|
| - PORT_Memcpy(path, save, len);
|
| - path[len] = '\0';
|
| + save = url;
|
| + while (c != '\0' && c != ' ' && c != '\t') {
|
| + url++;
|
| + c = *url;
|
| + }
|
| + len = url - save;
|
| + path = PORT_Alloc(len + 1);
|
| + if (path == NULL)
|
| + goto loser;
|
| + PORT_Memcpy(path, save, len);
|
| + path[len] = '\0';
|
| } else {
|
| - path = PORT_Strdup("/");
|
| - if (path == NULL)
|
| - goto loser;
|
| + path = PORT_Strdup("/");
|
| + if (path == NULL)
|
| + goto loser;
|
| }
|
|
|
| *pHostname = hostname;
|
| @@ -2921,7 +2908,7 @@ ocsp_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
|
|
| loser:
|
| if (hostname != NULL)
|
| - PORT_Free(hostname);
|
| + PORT_Free(hostname);
|
| PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| return SECFailure;
|
| }
|
| @@ -2940,7 +2927,7 @@ ocsp_ConnectToHost(const char *host, PRUint16 port)
|
|
|
| sock = PR_NewTCPSocket();
|
| if (sock == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| /* XXX Some day need a way to set (and get?) the following value */
|
| timeout = PR_SecondsToInterval(30);
|
| @@ -2954,42 +2941,42 @@ ocsp_ConnectToHost(const char *host, PRUint16 port)
|
| * valid numerical IP address from a hostname.
|
| */
|
| if (PR_StringToNetAddr(host, &addr) != PR_SUCCESS) {
|
| - PRIntn hostIndex;
|
| - PRHostEnt hostEntry;
|
| + PRIntn hostIndex;
|
| + PRHostEnt hostEntry;
|
|
|
| - netdbbuf = PORT_Alloc(PR_NETDB_BUF_SIZE);
|
| - if (netdbbuf == NULL)
|
| - goto loser;
|
| + netdbbuf = PORT_Alloc(PR_NETDB_BUF_SIZE);
|
| + if (netdbbuf == NULL)
|
| + goto loser;
|
|
|
| - if (PR_GetHostByName(host, netdbbuf, PR_NETDB_BUF_SIZE,
|
| - &hostEntry) != PR_SUCCESS)
|
| - goto loser;
|
| + if (PR_GetHostByName(host, netdbbuf, PR_NETDB_BUF_SIZE,
|
| + &hostEntry) != PR_SUCCESS)
|
| + goto loser;
|
|
|
| - hostIndex = 0;
|
| - do {
|
| - hostIndex = PR_EnumerateHostEnt(hostIndex, &hostEntry, port, &addr);
|
| - if (hostIndex <= 0)
|
| - goto loser;
|
| - } while (PR_Connect(sock, &addr, timeout) != PR_SUCCESS);
|
| + hostIndex = 0;
|
| + do {
|
| + hostIndex = PR_EnumerateHostEnt(hostIndex, &hostEntry, port, &addr);
|
| + if (hostIndex <= 0)
|
| + goto loser;
|
| + } while (PR_Connect(sock, &addr, timeout) != PR_SUCCESS);
|
|
|
| - PORT_Free(netdbbuf);
|
| + PORT_Free(netdbbuf);
|
| } else {
|
| - /*
|
| + /*
|
| * First put the port into the address, then connect.
|
| */
|
| - if (PR_InitializeNetAddr(PR_IpAddrNull, port, &addr) != PR_SUCCESS)
|
| - goto loser;
|
| - if (PR_Connect(sock, &addr, timeout) != PR_SUCCESS)
|
| - goto loser;
|
| + if (PR_InitializeNetAddr(PR_IpAddrNull, port, &addr) != PR_SUCCESS)
|
| + goto loser;
|
| + if (PR_Connect(sock, &addr, timeout) != PR_SUCCESS)
|
| + goto loser;
|
| }
|
|
|
| return sock;
|
|
|
| loser:
|
| if (sock != NULL)
|
| - PR_Close(sock);
|
| + PR_Close(sock);
|
| if (netdbbuf != NULL)
|
| - PORT_Free(netdbbuf);
|
| + PORT_Free(netdbbuf);
|
| return NULL;
|
| }
|
|
|
| @@ -3024,14 +3011,14 @@ ocsp_SendEncodedRequest(const char *location, const SECItem *encodedRequest)
|
| */
|
| rv = ocsp_ParseURL(location, &hostname, &port, &path);
|
| if (rv != SECSuccess)
|
| - goto loser;
|
| + goto loser;
|
|
|
| PORT_Assert(hostname != NULL);
|
| PORT_Assert(path != NULL);
|
|
|
| sock = ocsp_ConnectToHost(hostname, port);
|
| if (sock == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| portstr[0] = '\0';
|
| if (port != 80) {
|
| @@ -3039,38 +3026,37 @@ ocsp_SendEncodedRequest(const char *location, const SECItem *encodedRequest)
|
| }
|
|
|
| if (!encodedRequest) {
|
| - header = PR_smprintf("GET %s HTTP/1.0\r\n"
|
| - "Host: %s%s\r\n\r\n",
|
| - path, hostname, portstr);
|
| - if (header == NULL)
|
| - goto loser;
|
| -
|
| - /*
|
| - * The NSPR documentation promises that if it can, it will write the full
|
| - * amount; this will not return a partial value expecting us to loop.
|
| - */
|
| - if (PR_Write(sock, header, (PRInt32) PORT_Strlen(header)) < 0)
|
| - goto loser;
|
| - }
|
| - else {
|
| - header = PR_smprintf("POST %s HTTP/1.0\r\n"
|
| - "Host: %s%s\r\n"
|
| - "Content-Type: application/ocsp-request\r\n"
|
| - "Content-Length: %u\r\n\r\n",
|
| - path, hostname, portstr, encodedRequest->len);
|
| - if (header == NULL)
|
| - goto loser;
|
| -
|
| - /*
|
| - * The NSPR documentation promises that if it can, it will write the full
|
| - * amount; this will not return a partial value expecting us to loop.
|
| - */
|
| - if (PR_Write(sock, header, (PRInt32) PORT_Strlen(header)) < 0)
|
| - goto loser;
|
| -
|
| - if (PR_Write(sock, encodedRequest->data,
|
| - (PRInt32) encodedRequest->len) < 0)
|
| - goto loser;
|
| + header = PR_smprintf("GET %s HTTP/1.0\r\n"
|
| + "Host: %s%s\r\n\r\n",
|
| + path, hostname, portstr);
|
| + if (header == NULL)
|
| + goto loser;
|
| +
|
| + /*
|
| + * The NSPR documentation promises that if it can, it will write the full
|
| + * amount; this will not return a partial value expecting us to loop.
|
| + */
|
| + if (PR_Write(sock, header, (PRInt32)PORT_Strlen(header)) < 0)
|
| + goto loser;
|
| + } else {
|
| + header = PR_smprintf("POST %s HTTP/1.0\r\n"
|
| + "Host: %s%s\r\n"
|
| + "Content-Type: application/ocsp-request\r\n"
|
| + "Content-Length: %u\r\n\r\n",
|
| + path, hostname, portstr, encodedRequest->len);
|
| + if (header == NULL)
|
| + goto loser;
|
| +
|
| + /*
|
| + * The NSPR documentation promises that if it can, it will write the full
|
| + * amount; this will not return a partial value expecting us to loop.
|
| + */
|
| + if (PR_Write(sock, header, (PRInt32)PORT_Strlen(header)) < 0)
|
| + goto loser;
|
| +
|
| + if (PR_Write(sock, encodedRequest->data,
|
| + (PRInt32)encodedRequest->len) < 0)
|
| + goto loser;
|
| }
|
|
|
| returnSock = sock;
|
| @@ -3078,13 +3064,13 @@ ocsp_SendEncodedRequest(const char *location, const SECItem *encodedRequest)
|
|
|
| loser:
|
| if (header != NULL)
|
| - PORT_Free(header);
|
| + PORT_Free(header);
|
| if (sock != NULL)
|
| - PR_Close(sock);
|
| + PR_Close(sock);
|
| if (path != NULL)
|
| - PORT_Free(path);
|
| + PORT_Free(path);
|
| if (hostname != NULL)
|
| - PORT_Free(hostname);
|
| + PORT_Free(hostname);
|
|
|
| return returnSock;
|
| }
|
| @@ -3099,22 +3085,16 @@ ocsp_read(PRFileDesc *fd, char *buf, int toread, PRIntervalTime timeout)
|
| {
|
| int total = 0;
|
|
|
| - while (total < toread)
|
| - {
|
| + while (total < toread) {
|
| PRInt32 got;
|
|
|
| - got = PR_Recv(fd, buf + total, (PRInt32) (toread - total), 0, timeout);
|
| - if (got < 0)
|
| - {
|
| - if (0 == total)
|
| - {
|
| + got = PR_Recv(fd, buf + total, (PRInt32)(toread - total), 0, timeout);
|
| + if (got < 0) {
|
| + if (0 == total) {
|
| total = -1; /* report the error if we didn't read anything yet */
|
| }
|
| break;
|
| - }
|
| - else
|
| - if (got == 0)
|
| - { /* EOS */
|
| + } else if (got == 0) { /* EOS */
|
| break;
|
| }
|
|
|
| @@ -3126,14 +3106,13 @@ ocsp_read(PRFileDesc *fd, char *buf, int toread, PRIntervalTime timeout)
|
|
|
| #define OCSP_BUFSIZE 1024
|
|
|
| -#define AbortHttpDecode(error) \
|
| -{ \
|
| - if (inBuffer) \
|
| +#define AbortHttpDecode(error) \
|
| + { \
|
| + if (inBuffer) \
|
| PORT_Free(inBuffer); \
|
| - PORT_SetError(error); \
|
| - return NULL; \
|
| -}
|
| -
|
| + PORT_SetError(error); \
|
| + return NULL; \
|
| + }
|
|
|
| /*
|
| * Reads on the given socket and returns an encoded response when received.
|
| @@ -3148,92 +3127,81 @@ ocsp_GetEncodedResponse(PLArenaPool *arena, PRFileDesc *sock)
|
| {
|
| /* first read HTTP status line and headers */
|
|
|
| - char* inBuffer = NULL;
|
| + char *inBuffer = NULL;
|
| PRInt32 offset = 0;
|
| PRInt32 inBufsize = 0;
|
| - const PRInt32 bufSizeIncrement = OCSP_BUFSIZE; /* 1 KB at a time */
|
| - const PRInt32 maxBufSize = 8 * bufSizeIncrement ; /* 8 KB max */
|
| - const char* CRLF = "\r\n";
|
| + const PRInt32 bufSizeIncrement = OCSP_BUFSIZE; /* 1 KB at a time */
|
| + const PRInt32 maxBufSize = 8 * bufSizeIncrement; /* 8 KB max */
|
| + const char *CRLF = "\r\n";
|
| const PRInt32 CRLFlen = strlen(CRLF);
|
| - const char* headerEndMark = "\r\n\r\n";
|
| + const char *headerEndMark = "\r\n\r\n";
|
| const PRInt32 markLen = strlen(headerEndMark);
|
| const PRIntervalTime ocsptimeout =
|
| PR_SecondsToInterval(30); /* hardcoded to 30s for now */
|
| - char* headerEnd = NULL;
|
| + char *headerEnd = NULL;
|
| PRBool EOS = PR_FALSE;
|
| - const char* httpprotocol = "HTTP/";
|
| + const char *httpprotocol = "HTTP/";
|
| const PRInt32 httplen = strlen(httpprotocol);
|
| - const char* httpcode = NULL;
|
| - const char* contenttype = NULL;
|
| + const char *httpcode = NULL;
|
| + const char *contenttype = NULL;
|
| PRInt32 contentlength = 0;
|
| PRInt32 bytesRead = 0;
|
| - char* statusLineEnd = NULL;
|
| - char* space = NULL;
|
| - char* nextHeader = NULL;
|
| - SECItem* result = NULL;
|
| + char *statusLineEnd = NULL;
|
| + char *space = NULL;
|
| + char *nextHeader = NULL;
|
| + SECItem *result = NULL;
|
|
|
| /* read up to at least the end of the HTTP headers */
|
| - do
|
| - {
|
| + do {
|
| inBufsize += bufSizeIncrement;
|
| - inBuffer = PORT_Realloc(inBuffer, inBufsize+1);
|
| - if (NULL == inBuffer)
|
| - {
|
| + inBuffer = PORT_Realloc(inBuffer, inBufsize + 1);
|
| + if (NULL == inBuffer) {
|
| AbortHttpDecode(SEC_ERROR_NO_MEMORY);
|
| }
|
| bytesRead = ocsp_read(sock, inBuffer + offset, bufSizeIncrement,
|
| - ocsptimeout);
|
| - if (bytesRead > 0)
|
| - {
|
| - PRInt32 searchOffset = (offset - markLen) >0 ? offset-markLen : 0;
|
| + ocsptimeout);
|
| + if (bytesRead > 0) {
|
| + PRInt32 searchOffset = (offset - markLen) > 0 ? offset - markLen : 0;
|
| offset += bytesRead;
|
| *(inBuffer + offset) = '\0'; /* NULL termination */
|
| - headerEnd = strstr((const char*)inBuffer + searchOffset, headerEndMark);
|
| - if (bytesRead < bufSizeIncrement)
|
| - {
|
| + headerEnd = strstr((const char *)inBuffer + searchOffset, headerEndMark);
|
| + if (bytesRead < bufSizeIncrement) {
|
| /* we read less data than requested, therefore we are at
|
| EOS or there was a read error */
|
| EOS = PR_TRUE;
|
| }
|
| - }
|
| - else
|
| - {
|
| + } else {
|
| /* recv error or EOS */
|
| EOS = PR_TRUE;
|
| }
|
| - } while ( (!headerEnd) && (PR_FALSE == EOS) &&
|
| - (inBufsize < maxBufSize) );
|
| + } while ((!headerEnd) && (PR_FALSE == EOS) &&
|
| + (inBufsize < maxBufSize));
|
|
|
| - if (!headerEnd)
|
| - {
|
| + if (!headerEnd) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| /* parse the HTTP status line */
|
| - statusLineEnd = strstr((const char*)inBuffer, CRLF);
|
| - if (!statusLineEnd)
|
| - {
|
| + statusLineEnd = strstr((const char *)inBuffer, CRLF);
|
| + if (!statusLineEnd) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
| *statusLineEnd = '\0';
|
|
|
| /* check for HTTP/ response */
|
| - space = strchr((const char*)inBuffer, ' ');
|
| - if (!space || PORT_Strncasecmp((const char*)inBuffer, httpprotocol, httplen) != 0 )
|
| - {
|
| + space = strchr((const char *)inBuffer, ' ');
|
| + if (!space || PORT_Strncasecmp((const char *)inBuffer, httpprotocol, httplen) != 0) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| /* check the HTTP status code of 200 */
|
| - httpcode = space +1;
|
| + httpcode = space + 1;
|
| space = strchr(httpcode, ' ');
|
| - if (!space)
|
| - {
|
| + if (!space) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
| *space = 0;
|
| - if (0 != strcmp(httpcode, "200"))
|
| - {
|
| + if (0 != strcmp(httpcode, "200")) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| @@ -3243,14 +3211,12 @@ ocsp_GetEncodedResponse(PLArenaPool *arena, PRFileDesc *sock)
|
|
|
| nextHeader = statusLineEnd + CRLFlen;
|
| *headerEnd = '\0'; /* terminate */
|
| - do
|
| - {
|
| - char* thisHeaderEnd = NULL;
|
| - char* value = NULL;
|
| - char* colon = strchr(nextHeader, ':');
|
| -
|
| - if (!colon)
|
| - {
|
| + do {
|
| + char *thisHeaderEnd = NULL;
|
| + char *value = NULL;
|
| + char *colon = strchr(nextHeader, ':');
|
| +
|
| + if (!colon) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| @@ -3263,90 +3229,71 @@ ocsp_GetEncodedResponse(PLArenaPool *arena, PRFileDesc *sock)
|
| and should not be an issue, but it could become one in the
|
| future */
|
|
|
| - if (*value != ' ')
|
| - {
|
| + if (*value != ' ') {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| value++;
|
| - thisHeaderEnd = strstr(value, CRLF);
|
| - if (thisHeaderEnd )
|
| - {
|
| - *thisHeaderEnd = '\0';
|
| + thisHeaderEnd = strstr(value, CRLF);
|
| + if (thisHeaderEnd) {
|
| + *thisHeaderEnd = '\0';
|
| }
|
|
|
| - if (0 == PORT_Strcasecmp(nextHeader, "content-type"))
|
| - {
|
| + if (0 == PORT_Strcasecmp(nextHeader, "content-type")) {
|
| contenttype = value;
|
| - }
|
| - else
|
| - if (0 == PORT_Strcasecmp(nextHeader, "content-length"))
|
| - {
|
| + } else if (0 == PORT_Strcasecmp(nextHeader, "content-length")) {
|
| contentlength = atoi(value);
|
| }
|
|
|
| - if (thisHeaderEnd )
|
| - {
|
| + if (thisHeaderEnd) {
|
| nextHeader = thisHeaderEnd + CRLFlen;
|
| - }
|
| - else
|
| - {
|
| + } else {
|
| nextHeader = NULL;
|
| }
|
|
|
| - } while (nextHeader && (nextHeader < (headerEnd + CRLFlen) ) );
|
| + } while (nextHeader && (nextHeader < (headerEnd + CRLFlen)));
|
|
|
| /* check content-type */
|
| if (!contenttype ||
|
| - (0 != PORT_Strcasecmp(contenttype, "application/ocsp-response")) )
|
| - {
|
| + (0 != PORT_Strcasecmp(contenttype, "application/ocsp-response"))) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| /* read the body of the OCSP response */
|
| - offset = offset - (PRInt32) (headerEnd - (const char*)inBuffer) - markLen;
|
| - if (offset)
|
| - {
|
| + offset = offset - (PRInt32)(headerEnd - (const char *)inBuffer) - markLen;
|
| + if (offset) {
|
| /* move all data to the beginning of the buffer */
|
| PORT_Memmove(inBuffer, headerEnd + markLen, offset);
|
| }
|
|
|
| /* resize buffer to only what's needed to hold the current response */
|
| - inBufsize = (1 + (offset-1) / bufSizeIncrement ) * bufSizeIncrement ;
|
| + inBufsize = (1 + (offset - 1) / bufSizeIncrement) * bufSizeIncrement;
|
|
|
| - while ( (PR_FALSE == EOS) &&
|
| - ( (contentlength == 0) || (offset < contentlength) ) &&
|
| - (inBufsize < maxBufSize)
|
| - )
|
| - {
|
| + while ((PR_FALSE == EOS) &&
|
| + ((contentlength == 0) || (offset < contentlength)) &&
|
| + (inBufsize < maxBufSize)) {
|
| /* we still need to receive more body data */
|
| inBufsize += bufSizeIncrement;
|
| - inBuffer = PORT_Realloc(inBuffer, inBufsize+1);
|
| - if (NULL == inBuffer)
|
| - {
|
| + inBuffer = PORT_Realloc(inBuffer, inBufsize + 1);
|
| + if (NULL == inBuffer) {
|
| AbortHttpDecode(SEC_ERROR_NO_MEMORY);
|
| }
|
| bytesRead = ocsp_read(sock, inBuffer + offset, bufSizeIncrement,
|
| ocsptimeout);
|
| - if (bytesRead > 0)
|
| - {
|
| + if (bytesRead > 0) {
|
| offset += bytesRead;
|
| - if (bytesRead < bufSizeIncrement)
|
| - {
|
| + if (bytesRead < bufSizeIncrement) {
|
| /* we read less data than requested, therefore we are at
|
| EOS or there was a read error */
|
| EOS = PR_TRUE;
|
| }
|
| - }
|
| - else
|
| - {
|
| + } else {
|
| /* recv error or EOS */
|
| EOS = PR_TRUE;
|
| }
|
| }
|
|
|
| - if (0 == offset)
|
| - {
|
| + if (0 == offset) {
|
| AbortHttpDecode(SEC_ERROR_OCSP_BAD_HTTP_RESPONSE);
|
| }
|
|
|
| @@ -3354,14 +3301,13 @@ ocsp_GetEncodedResponse(PLArenaPool *arena, PRFileDesc *sock)
|
| * Now allocate the item to hold the data.
|
| */
|
| result = SECITEM_AllocItem(arena, NULL, offset);
|
| - if (NULL == result)
|
| - {
|
| + if (NULL == result) {
|
| AbortHttpDecode(SEC_ERROR_NO_MEMORY);
|
| }
|
|
|
| /*
|
| * And copy the data left in the buffer.
|
| - */
|
| + */
|
| PORT_Memcpy(result->data, inBuffer, offset);
|
|
|
| /* and free the temporary buffer */
|
| @@ -3378,7 +3324,7 @@ CERT_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| /*
|
| * Limit the size of http responses we are willing to accept.
|
| */
|
| -#define MAX_WANTED_OCSP_RESPONSE_LEN 64*1024
|
| +#define MAX_WANTED_OCSP_RESPONSE_LEN 64 * 1024
|
|
|
| /* if (encodedRequest == NULL)
|
| * then location MUST already include the full request,
|
| @@ -3388,9 +3334,9 @@ CERT_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath)
|
| * then the request will be sent with POST
|
| */
|
| static SECItem *
|
| -fetchOcspHttpClientV1(PLArenaPool *arena,
|
| - const SEC_HttpClientFcnV1 *hcv1,
|
| - const char *location,
|
| +fetchOcspHttpClientV1(PLArenaPool *arena,
|
| + const SEC_HttpClientFcnV1 *hcv1,
|
| + const char *location,
|
| const SECItem *encodedRequest)
|
| {
|
| char *hostname = NULL;
|
| @@ -3407,13 +3353,13 @@ fetchOcspHttpClientV1(PLArenaPool *arena,
|
| PORT_SetError(SEC_ERROR_OCSP_MALFORMED_REQUEST);
|
| goto loser;
|
| }
|
| -
|
| +
|
| PORT_Assert(hostname != NULL);
|
| PORT_Assert(path != NULL);
|
|
|
| if ((*hcv1->createSessionFcn)(
|
| - hostname,
|
| - port,
|
| + hostname,
|
| + port,
|
| &pServerSession) != SECSuccess) {
|
| PORT_SetError(SEC_ERROR_OCSP_SERVER_ERROR);
|
| goto loser;
|
| @@ -3439,8 +3385,8 @@ fetchOcspHttpClientV1(PLArenaPool *arena,
|
|
|
| if (encodedRequest &&
|
| (*hcv1->setPostDataFcn)(
|
| - pRequestSession,
|
| - (char*)encodedRequest->data,
|
| + pRequestSession,
|
| + (char *)encodedRequest->data,
|
| encodedRequest->len,
|
| "application/ocsp-request") != SECSuccess) {
|
| PORT_SetError(SEC_ERROR_OCSP_SERVER_ERROR);
|
| @@ -3453,7 +3399,7 @@ fetchOcspHttpClientV1(PLArenaPool *arena,
|
| OCSP_TRACE(("OCSP trySendAndReceive %s\n", location));
|
|
|
| if ((*hcv1->trySendAndReceiveFcn)(
|
| - pRequestSession,
|
| + pRequestSession,
|
| NULL,
|
| &myHttpResponseCode,
|
| NULL,
|
| @@ -3481,15 +3427,15 @@ fetchOcspHttpClientV1(PLArenaPool *arena,
|
| PORT_Memcpy(encodedResponse->data, myHttpResponseData, myHttpResponseDataLen);
|
|
|
| loser:
|
| - if (pRequestSession != NULL)
|
| + if (pRequestSession != NULL)
|
| (*hcv1->freeFcn)(pRequestSession);
|
| if (pServerSession != NULL)
|
| (*hcv1->freeSessionFcn)(pServerSession);
|
| if (path != NULL)
|
| - PORT_Free(path);
|
| + PORT_Free(path);
|
| if (hostname != NULL)
|
| - PORT_Free(hostname);
|
| -
|
| + PORT_Free(hostname);
|
| +
|
| return encodedResponse;
|
| }
|
|
|
| @@ -3518,7 +3464,7 @@ loser:
|
| * Additionals methods for http or other protocols might be added
|
| * in the future.
|
| * PRTime time
|
| - * Indicates the time for which the certificate status is to be
|
| + * Indicates the time for which the certificate status is to be
|
| * determined -- this may be used in the search for the cert's issuer
|
| * but has no other bearing on the operation.
|
| * PRBool addServiceLocator
|
| @@ -3546,10 +3492,10 @@ loser:
|
| */
|
| SECItem *
|
| CERT_GetEncodedOCSPResponseByMethod(PLArenaPool *arena, CERTCertList *certList,
|
| - const char *location, const char *method,
|
| - PRTime time, PRBool addServiceLocator,
|
| - CERTCertificate *signerCert, void *pwArg,
|
| - CERTOCSPRequest **pRequest)
|
| + const char *location, const char *method,
|
| + PRTime time, PRBool addServiceLocator,
|
| + CERTCertificate *signerCert, void *pwArg,
|
| + CERTOCSPRequest **pRequest)
|
| {
|
| CERTOCSPRequest *request;
|
| request = CERT_CreateOCSPRequest(certList, time, addServiceLocator,
|
| @@ -3571,25 +3517,25 @@ CERT_GetEncodedOCSPResponseByMethod(PLArenaPool *arena, CERTCertList *certList,
|
| */
|
| SECItem *
|
| CERT_GetEncodedOCSPResponse(PLArenaPool *arena, CERTCertList *certList,
|
| - const char *location, PRTime time,
|
| - PRBool addServiceLocator,
|
| - CERTCertificate *signerCert, void *pwArg,
|
| - CERTOCSPRequest **pRequest)
|
| + const char *location, PRTime time,
|
| + PRBool addServiceLocator,
|
| + CERTCertificate *signerCert, void *pwArg,
|
| + CERTOCSPRequest **pRequest)
|
| {
|
| return CERT_GetEncodedOCSPResponseByMethod(arena, certList, location,
|
| - "POST", time, addServiceLocator,
|
| - signerCert, pwArg, pRequest);
|
| + "POST", time, addServiceLocator,
|
| + signerCert, pwArg, pRequest);
|
| }
|
|
|
| /* URL encode a buffer that consists of base64-characters, only,
|
| * which means we can use a simple encoding logic.
|
| - *
|
| + *
|
| * No output buffer size checking is performed.
|
| * You should call the function twice, to calculate the required buffer size.
|
| - *
|
| - * If the outpufBuf parameter is NULL, the function will calculate the
|
| + *
|
| + * If the outpufBuf parameter is NULL, the function will calculate the
|
| * required size, including the trailing zero termination char.
|
| - *
|
| + *
|
| * The function returns the number of bytes calculated or produced.
|
| */
|
| size_t
|
| @@ -3598,44 +3544,44 @@ ocsp_UrlEncodeBase64Buf(const char *base64Buf, char *outputBuf)
|
| const char *walkInput = NULL;
|
| char *walkOutput = outputBuf;
|
| size_t count = 0;
|
| -
|
| - for (walkInput=base64Buf; *walkInput; ++walkInput) {
|
| - char c = *walkInput;
|
| - if (isspace(c))
|
| - continue;
|
| - switch (c) {
|
| - case '+':
|
| - if (outputBuf) {
|
| - strcpy(walkOutput, "%2B");
|
| - walkOutput += 3;
|
| - }
|
| - count += 3;
|
| - break;
|
| - case '/':
|
| - if (outputBuf) {
|
| - strcpy(walkOutput, "%2F");
|
| - walkOutput += 3;
|
| - }
|
| - count += 3;
|
| - break;
|
| - case '=':
|
| - if (outputBuf) {
|
| - strcpy(walkOutput, "%3D");
|
| - walkOutput += 3;
|
| - }
|
| - count += 3;
|
| - break;
|
| - default:
|
| - if (outputBuf) {
|
| - *walkOutput = *walkInput;
|
| - ++walkOutput;
|
| - }
|
| - ++count;
|
| - break;
|
| - }
|
| +
|
| + for (walkInput = base64Buf; *walkInput; ++walkInput) {
|
| + char c = *walkInput;
|
| + if (isspace(c))
|
| + continue;
|
| + switch (c) {
|
| + case '+':
|
| + if (outputBuf) {
|
| + strcpy(walkOutput, "%2B");
|
| + walkOutput += 3;
|
| + }
|
| + count += 3;
|
| + break;
|
| + case '/':
|
| + if (outputBuf) {
|
| + strcpy(walkOutput, "%2F");
|
| + walkOutput += 3;
|
| + }
|
| + count += 3;
|
| + break;
|
| + case '=':
|
| + if (outputBuf) {
|
| + strcpy(walkOutput, "%3D");
|
| + walkOutput += 3;
|
| + }
|
| + count += 3;
|
| + break;
|
| + default:
|
| + if (outputBuf) {
|
| + *walkOutput = *walkInput;
|
| + ++walkOutput;
|
| + }
|
| + ++count;
|
| + break;
|
| + }
|
| }
|
| if (outputBuf) {
|
| - *walkOutput = 0;
|
| + *walkOutput = 0;
|
| }
|
| ++count;
|
| return count;
|
| @@ -3644,15 +3590,15 @@ ocsp_UrlEncodeBase64Buf(const char *base64Buf, char *outputBuf)
|
| enum { max_get_request_size = 255 }; /* defined by RFC2560 */
|
|
|
| static SECItem *
|
| -cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
| +cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
| const SECItem *encodedRequest);
|
|
|
| static SECItem *
|
| ocsp_GetEncodedOCSPResponseFromRequest(PLArenaPool *arena,
|
| CERTOCSPRequest *request,
|
| const char *location,
|
| - const char *method,
|
| - PRTime time,
|
| + const char *method,
|
| + PRTime time,
|
| PRBool addServiceLocator,
|
| void *pwArg,
|
| CERTOCSPRequest **pRequest)
|
| @@ -3665,44 +3611,42 @@ ocsp_GetEncodedOCSPResponseFromRequest(PLArenaPool *arena,
|
| goto loser;
|
|
|
| rv = CERT_AddOCSPAcceptableResponses(request,
|
| - SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
| + SEC_OID_PKIX_OCSP_BASIC_RESPONSE);
|
| if (rv != SECSuccess)
|
| - goto loser;
|
| + goto loser;
|
|
|
| encodedRequest = CERT_EncodeOCSPRequest(NULL, request, pwArg);
|
| if (encodedRequest == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| if (!strcmp(method, "GET")) {
|
| encodedResponse = cert_GetOCSPResponse(arena, location, encodedRequest);
|
| - }
|
| - else if (!strcmp(method, "POST")) {
|
| + } else if (!strcmp(method, "POST")) {
|
| encodedResponse = CERT_PostOCSPRequest(arena, location, encodedRequest);
|
| - }
|
| - else {
|
| - goto loser;
|
| + } else {
|
| + goto loser;
|
| }
|
|
|
| if (encodedResponse != NULL && pRequest != NULL) {
|
| - *pRequest = request;
|
| - request = NULL; /* avoid destroying below */
|
| + *pRequest = request;
|
| + request = NULL; /* avoid destroying below */
|
| }
|
|
|
| loser:
|
| if (request != NULL)
|
| - CERT_DestroyOCSPRequest(request);
|
| + CERT_DestroyOCSPRequest(request);
|
| if (encodedRequest != NULL)
|
| - SECITEM_FreeItem(encodedRequest, PR_TRUE);
|
| + SECITEM_FreeItem(encodedRequest, PR_TRUE);
|
| return encodedResponse;
|
| }
|
|
|
| static SECItem *
|
| -cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
| +cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
| const SECItem *encodedRequest);
|
|
|
| /* using HTTP GET method */
|
| static SECItem *
|
| -cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
| +cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
| const SECItem *encodedRequest)
|
| {
|
| char *walkOutput = NULL;
|
| @@ -3710,49 +3654,49 @@ cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
| size_t pathLength;
|
| PRInt32 urlEncodedBufLength;
|
| size_t base64size;
|
| - char b64ReqBuf[max_get_request_size+1];
|
| + char b64ReqBuf[max_get_request_size + 1];
|
| size_t slashLengthIfNeeded = 0;
|
| size_t getURLLength;
|
| SECItem *item;
|
|
|
| if (!location || !*location) {
|
| - return NULL;
|
| + return NULL;
|
| }
|
| -
|
| +
|
| pathLength = strlen(location);
|
| - if (location[pathLength-1] != '/') {
|
| - slashLengthIfNeeded = 1;
|
| + if (location[pathLength - 1] != '/') {
|
| + slashLengthIfNeeded = 1;
|
| }
|
| -
|
| +
|
| /* Calculation as documented by PL_Base64Encode function.
|
| * Use integer conversion to avoid having to use function ceil().
|
| */
|
| - base64size = (((encodedRequest->len +2)/3) * 4);
|
| + base64size = (((encodedRequest->len + 2) / 3) * 4);
|
| if (base64size > max_get_request_size) {
|
| - return NULL;
|
| + return NULL;
|
| }
|
| memset(b64ReqBuf, 0, sizeof(b64ReqBuf));
|
| - PL_Base64Encode((const char*)encodedRequest->data, encodedRequest->len,
|
| - b64ReqBuf);
|
| + PL_Base64Encode((const char *)encodedRequest->data, encodedRequest->len,
|
| + b64ReqBuf);
|
|
|
| urlEncodedBufLength = ocsp_UrlEncodeBase64Buf(b64ReqBuf, NULL);
|
| getURLLength = pathLength + urlEncodedBufLength + slashLengthIfNeeded;
|
| -
|
| +
|
| /* urlEncodedBufLength already contains room for the zero terminator.
|
| * Add another if we must add the '/' char.
|
| */
|
| if (arena) {
|
| - fullGetPath = (char*)PORT_ArenaAlloc(arena, getURLLength);
|
| + fullGetPath = (char *)PORT_ArenaAlloc(arena, getURLLength);
|
| } else {
|
| - fullGetPath = (char*)PORT_Alloc(getURLLength);
|
| + fullGetPath = (char *)PORT_Alloc(getURLLength);
|
| }
|
| if (!fullGetPath) {
|
| - return NULL;
|
| + return NULL;
|
| }
|
| -
|
| +
|
| strcpy(fullGetPath, location);
|
| walkOutput = fullGetPath + pathLength;
|
| -
|
| +
|
| if (walkOutput > fullGetPath && slashLengthIfNeeded) {
|
| strcpy(walkOutput, "/");
|
| ++walkOutput;
|
| @@ -3761,20 +3705,20 @@ cert_GetOCSPResponse(PLArenaPool *arena, const char *location,
|
|
|
| item = cert_FetchOCSPResponse(arena, fullGetPath, NULL);
|
| if (!arena) {
|
| - PORT_Free(fullGetPath);
|
| + PORT_Free(fullGetPath);
|
| }
|
| return item;
|
| }
|
|
|
| SECItem *
|
| -CERT_PostOCSPRequest(PLArenaPool *arena, const char *location,
|
| +CERT_PostOCSPRequest(PLArenaPool *arena, const char *location,
|
| const SECItem *encodedRequest)
|
| {
|
| return cert_FetchOCSPResponse(arena, location, encodedRequest);
|
| }
|
|
|
| SECItem *
|
| -cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
| +cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
| const SECItem *encodedRequest)
|
| {
|
| const SEC_HttpClientFcn *registeredHttpClient;
|
| @@ -3784,10 +3728,10 @@ cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
|
|
| if (registeredHttpClient && registeredHttpClient->version == 1) {
|
| encodedResponse = fetchOcspHttpClientV1(
|
| - arena,
|
| - ®isteredHttpClient->fcnTable.ftable1,
|
| - location,
|
| - encodedRequest);
|
| + arena,
|
| + ®isteredHttpClient->fcnTable.ftable1,
|
| + location,
|
| + encodedRequest);
|
| } else {
|
| /* use internal http client */
|
| PRFileDesc *sock = ocsp_SendEncodedRequest(location, encodedRequest);
|
| @@ -3801,18 +3745,18 @@ cert_FetchOCSPResponse(PLArenaPool *arena, const char *location,
|
| }
|
|
|
| static SECItem *
|
| -ocsp_GetEncodedOCSPResponseForSingleCert(PLArenaPool *arena,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *singleCert,
|
| +ocsp_GetEncodedOCSPResponseForSingleCert(PLArenaPool *arena,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *singleCert,
|
| const char *location,
|
| - const char *method,
|
| - PRTime time,
|
| + const char *method,
|
| + PRTime time,
|
| PRBool addServiceLocator,
|
| void *pwArg,
|
| CERTOCSPRequest **pRequest)
|
| {
|
| CERTOCSPRequest *request;
|
| - request = cert_CreateSingleCertOCSPRequest(certID, singleCert, time,
|
| + request = cert_CreateSingleCertOCSPRequest(certID, singleCert, time,
|
| addServiceLocator, NULL);
|
| if (!request)
|
| return NULL;
|
| @@ -3833,29 +3777,28 @@ ocsp_CertIsOCSPDesignatedResponder(CERTCertificate *cert)
|
| PRBool retval;
|
| CERTOidSequence *oidSeq = NULL;
|
|
|
| -
|
| extItem.data = NULL;
|
| rv = CERT_FindCertExtension(cert, SEC_OID_X509_EXT_KEY_USAGE, &extItem);
|
| - if ( rv != SECSuccess ) {
|
| - goto loser;
|
| + if (rv != SECSuccess) {
|
| + goto loser;
|
| }
|
|
|
| oidSeq = CERT_DecodeOidSequence(&extItem);
|
| - if ( oidSeq == NULL ) {
|
| - goto loser;
|
| + if (oidSeq == NULL) {
|
| + goto loser;
|
| }
|
|
|
| oids = oidSeq->oids;
|
| - while ( *oids != NULL ) {
|
| - oid = *oids;
|
| -
|
| - oidTag = SECOID_FindOIDTag(oid);
|
| -
|
| - if ( oidTag == SEC_OID_OCSP_RESPONDER ) {
|
| - goto success;
|
| - }
|
| -
|
| - oids++;
|
| + while (*oids != NULL) {
|
| + oid = *oids;
|
| +
|
| + oidTag = SECOID_FindOIDTag(oid);
|
| +
|
| + if (oidTag == SEC_OID_OCSP_RESPONDER) {
|
| + goto success;
|
| + }
|
| +
|
| + oids++;
|
| }
|
|
|
| loser:
|
| @@ -3865,42 +3808,41 @@ loser:
|
| success:
|
| retval = PR_TRUE;
|
| done:
|
| - if ( extItem.data != NULL ) {
|
| - PORT_Free(extItem.data);
|
| + if (extItem.data != NULL) {
|
| + PORT_Free(extItem.data);
|
| }
|
| - if ( oidSeq != NULL ) {
|
| - CERT_DestroyOidSequence(oidSeq);
|
| + if (oidSeq != NULL) {
|
| + CERT_DestroyOidSequence(oidSeq);
|
| }
|
| -
|
| - return(retval);
|
| -}
|
|
|
| + return (retval);
|
| +}
|
|
|
| -#ifdef LATER /*
|
| - * XXX This function is not currently used, but will
|
| - * be needed later when we do revocation checking of
|
| - * the responder certificate. Of course, it may need
|
| - * revising then, if the cert extension interface has
|
| - * changed. (Hopefully it will!)
|
| - */
|
| +#ifdef LATER /*
|
| + * XXX This function is not currently used, but will
|
| + * be needed later when we do revocation checking of
|
| + * the responder certificate. Of course, it may need
|
| + * revising then, if the cert extension interface has
|
| + * changed. (Hopefully it will!)
|
| + */
|
|
|
| /* Checks a certificate to see if it has the OCSP no check extension. */
|
| static PRBool
|
| ocsp_CertHasNoCheckExtension(CERTCertificate *cert)
|
| {
|
| SECStatus rv;
|
| -
|
| - rv = CERT_FindCertExtension(cert, SEC_OID_PKIX_OCSP_NO_CHECK,
|
| - NULL);
|
| +
|
| + rv = CERT_FindCertExtension(cert, SEC_OID_PKIX_OCSP_NO_CHECK,
|
| + NULL);
|
| if (rv == SECSuccess) {
|
| - return PR_TRUE;
|
| + return PR_TRUE;
|
| }
|
| return PR_FALSE;
|
| }
|
| -#endif /* LATER */
|
| +#endif /* LATER */
|
|
|
| static PRBool
|
| -ocsp_matchcert(SECItem *certIndex,CERTCertificate *testCert)
|
| +ocsp_matchcert(SECItem *certIndex, CERTCertificate *testCert)
|
| {
|
| SECItem item;
|
| unsigned char buf[HASH_LENGTH_MAX];
|
| @@ -3908,33 +3850,33 @@ ocsp_matchcert(SECItem *certIndex,CERTCertificate *testCert)
|
| item.data = buf;
|
| item.len = SHA1_LENGTH;
|
|
|
| - if (CERT_GetSubjectPublicKeyDigest(NULL,testCert,SEC_OID_SHA1,
|
| - &item) == NULL) {
|
| - return PR_FALSE;
|
| + if (CERT_GetSubjectPublicKeyDigest(NULL, testCert, SEC_OID_SHA1,
|
| + &item) == NULL) {
|
| + return PR_FALSE;
|
| }
|
| - if (SECITEM_ItemsAreEqual(certIndex,&item)) {
|
| - return PR_TRUE;
|
| + if (SECITEM_ItemsAreEqual(certIndex, &item)) {
|
| + return PR_TRUE;
|
| }
|
| - if (CERT_GetSubjectPublicKeyDigest(NULL,testCert,SEC_OID_MD5,
|
| - &item) == NULL) {
|
| - return PR_FALSE;
|
| + if (CERT_GetSubjectPublicKeyDigest(NULL, testCert, SEC_OID_MD5,
|
| + &item) == NULL) {
|
| + return PR_FALSE;
|
| }
|
| - if (SECITEM_ItemsAreEqual(certIndex,&item)) {
|
| - return PR_TRUE;
|
| + if (SECITEM_ItemsAreEqual(certIndex, &item)) {
|
| + return PR_TRUE;
|
| }
|
| - if (CERT_GetSubjectPublicKeyDigest(NULL,testCert,SEC_OID_MD2,
|
| - &item) == NULL) {
|
| - return PR_FALSE;
|
| + if (CERT_GetSubjectPublicKeyDigest(NULL, testCert, SEC_OID_MD2,
|
| + &item) == NULL) {
|
| + return PR_FALSE;
|
| }
|
| - if (SECITEM_ItemsAreEqual(certIndex,&item)) {
|
| - return PR_TRUE;
|
| + if (SECITEM_ItemsAreEqual(certIndex, &item)) {
|
| + return PR_TRUE;
|
| }
|
|
|
| return PR_FALSE;
|
| }
|
|
|
| static CERTCertificate *
|
| -ocsp_CertGetDefaultResponder(CERTCertDBHandle *handle,CERTOCSPCertID *certID);
|
| +ocsp_CertGetDefaultResponder(CERTCertDBHandle *handle, CERTOCSPCertID *certID);
|
|
|
| CERTCertificate *
|
| ocsp_GetSignerCertificate(CERTCertDBHandle *handle, ocspResponseData *tbsData,
|
| @@ -3949,19 +3891,19 @@ ocsp_GetSignerCertificate(CERTCertDBHandle *handle, ocspResponseData *tbsData,
|
|
|
| PORT_Assert(tbsData->responderID != NULL);
|
| switch (tbsData->responderID->responderIDType) {
|
| - case ocspResponderID_byName:
|
| - lookupByName = PR_TRUE;
|
| - certIndex = &tbsData->derResponderID;
|
| - break;
|
| - case ocspResponderID_byKey:
|
| - lookupByName = PR_FALSE;
|
| - certIndex = &tbsData->responderID->responderIDValue.keyHash;
|
| - break;
|
| - case ocspResponderID_other:
|
| - default:
|
| - PORT_Assert(0);
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - return NULL;
|
| + case ocspResponderID_byName:
|
| + lookupByName = PR_TRUE;
|
| + certIndex = &tbsData->derResponderID;
|
| + break;
|
| + case ocspResponderID_byKey:
|
| + lookupByName = PR_FALSE;
|
| + certIndex = &tbsData->responderID->responderIDValue.keyHash;
|
| + break;
|
| + case ocspResponderID_other:
|
| + default:
|
| + PORT_Assert(0);
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + return NULL;
|
| }
|
|
|
| /*
|
| @@ -3972,14 +3914,14 @@ ocsp_GetSignerCertificate(CERTCertDBHandle *handle, ocspResponseData *tbsData,
|
| * to be destroyed.
|
| */
|
| if (signature->derCerts != NULL) {
|
| - for (; signature->derCerts[certCount] != NULL; certCount++) {
|
| - /* just counting */
|
| - }
|
| - rv = CERT_ImportCerts(handle, certUsageStatusResponder, certCount,
|
| - signature->derCerts, &certs,
|
| - PR_FALSE, PR_FALSE, NULL);
|
| - if (rv != SECSuccess)
|
| - goto finish;
|
| + for (; signature->derCerts[certCount] != NULL; certCount++) {
|
| + /* just counting */
|
| + }
|
| + rv = CERT_ImportCerts(handle, certUsageStatusResponder, certCount,
|
| + signature->derCerts, &certs,
|
| + PR_FALSE, PR_FALSE, NULL);
|
| + if (rv != SECSuccess)
|
| + goto finish;
|
| }
|
|
|
| /*
|
| @@ -3987,51 +3929,51 @@ ocsp_GetSignerCertificate(CERTCertDBHandle *handle, ocspResponseData *tbsData,
|
| * The signer can be specified either by name or by key hash.
|
| */
|
| if (lookupByName) {
|
| - SECItem *crIndex = (SECItem*)certIndex;
|
| - SECItem encodedName;
|
| - PLArenaPool *arena;
|
| -
|
| - arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| - if (arena != NULL) {
|
| -
|
| - rv = SEC_QuickDERDecodeItem(arena, &encodedName,
|
| - ocsp_ResponderIDDerNameTemplate,
|
| - crIndex);
|
| - if (rv != SECSuccess) {
|
| - if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - } else {
|
| - signerCert = CERT_FindCertByName(handle, &encodedName);
|
| - }
|
| - PORT_FreeArena(arena, PR_FALSE);
|
| - }
|
| + SECItem *crIndex = (SECItem *)certIndex;
|
| + SECItem encodedName;
|
| + PLArenaPool *arena;
|
| +
|
| + arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| + if (arena != NULL) {
|
| +
|
| + rv = SEC_QuickDERDecodeItem(arena, &encodedName,
|
| + ocsp_ResponderIDDerNameTemplate,
|
| + crIndex);
|
| + if (rv != SECSuccess) {
|
| + if (PORT_GetError() == SEC_ERROR_BAD_DER)
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + } else {
|
| + signerCert = CERT_FindCertByName(handle, &encodedName);
|
| + }
|
| + PORT_FreeArena(arena, PR_FALSE);
|
| + }
|
| } else {
|
| - /*
|
| - * The signer is either 1) a known issuer CA we passed in,
|
| - * 2) the default OCSP responder, or 3) an intermediate CA
|
| - * passed in the cert list to use. Figure out which it is.
|
| - */
|
| - int i;
|
| - CERTCertificate *responder =
|
| + /*
|
| + * The signer is either 1) a known issuer CA we passed in,
|
| + * 2) the default OCSP responder, or 3) an intermediate CA
|
| + * passed in the cert list to use. Figure out which it is.
|
| + */
|
| + int i;
|
| + CERTCertificate *responder =
|
| ocsp_CertGetDefaultResponder(handle, NULL);
|
| - if (responder && ocsp_matchcert(certIndex,responder)) {
|
| - signerCert = CERT_DupCertificate(responder);
|
| - } else if (issuer && ocsp_matchcert(certIndex,issuer)) {
|
| - signerCert = CERT_DupCertificate(issuer);
|
| - }
|
| - for (i=0; (signerCert == NULL) && (i < certCount); i++) {
|
| - if (ocsp_matchcert(certIndex,certs[i])) {
|
| - signerCert = CERT_DupCertificate(certs[i]);
|
| - }
|
| - }
|
| - if (signerCert == NULL) {
|
| - PORT_SetError(SEC_ERROR_UNKNOWN_CERT);
|
| - }
|
| + if (responder && ocsp_matchcert(certIndex, responder)) {
|
| + signerCert = CERT_DupCertificate(responder);
|
| + } else if (issuer && ocsp_matchcert(certIndex, issuer)) {
|
| + signerCert = CERT_DupCertificate(issuer);
|
| + }
|
| + for (i = 0; (signerCert == NULL) && (i < certCount); i++) {
|
| + if (ocsp_matchcert(certIndex, certs[i])) {
|
| + signerCert = CERT_DupCertificate(certs[i]);
|
| + }
|
| + }
|
| + if (signerCert == NULL) {
|
| + PORT_SetError(SEC_ERROR_UNKNOWN_CERT);
|
| + }
|
| }
|
|
|
| finish:
|
| if (certs != NULL) {
|
| - CERT_DestroyCertArray(certs, certCount);
|
| + CERT_DestroyCertArray(certs, certCount);
|
| }
|
|
|
| return signerCert;
|
| @@ -4067,7 +4009,7 @@ ocsp_VerifyResponseSignature(CERTCertificate *signerCert,
|
|
|
| rv = CERT_VerifySignedDataWithPublicKey(&signedData, signerKey, pwArg);
|
| if (rv != SECSuccess &&
|
| - (PORT_GetError() == SEC_ERROR_BAD_SIGNATURE ||
|
| + (PORT_GetError() == SEC_ERROR_BAD_SIGNATURE ||
|
| PORT_GetError() == SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED)) {
|
| PORT_SetError(SEC_ERROR_OCSP_BAD_SIGNATURE);
|
| }
|
| @@ -4079,7 +4021,6 @@ ocsp_VerifyResponseSignature(CERTCertificate *signerCert,
|
| return rv;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_VerifyOCSPResponseSignature
|
| * Check the signature on an OCSP Response. Will also perform a
|
| @@ -4110,10 +4051,10 @@ ocsp_VerifyResponseSignature(CERTCertificate *signerCert,
|
| * verifying the signer's cert, or low-level problems (no memory, etc.)
|
| */
|
| SECStatus
|
| -CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
|
| - CERTCertDBHandle *handle, void *pwArg,
|
| - CERTCertificate **pSignerCert,
|
| - CERTCertificate *issuer)
|
| +CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
|
| + CERTCertDBHandle *handle, void *pwArg,
|
| + CERTCertificate **pSignerCert,
|
| + CERTCertificate *issuer)
|
| {
|
| SECItem *tbsResponseDataDER;
|
| CERTCertificate *signerCert = NULL;
|
| @@ -4138,24 +4079,24 @@ CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
|
| * return the cached result.
|
| */
|
| if (signature->wasChecked) {
|
| - if (signature->status == SECSuccess) {
|
| - if (pSignerCert != NULL)
|
| - *pSignerCert = CERT_DupCertificate(signature->cert);
|
| - } else {
|
| - PORT_SetError(signature->failureReason);
|
| - }
|
| - return signature->status;
|
| + if (signature->status == SECSuccess) {
|
| + if (pSignerCert != NULL)
|
| + *pSignerCert = CERT_DupCertificate(signature->cert);
|
| + } else {
|
| + PORT_SetError(signature->failureReason);
|
| + }
|
| + return signature->status;
|
| }
|
|
|
| signerCert = ocsp_GetSignerCertificate(handle, tbsData,
|
| signature, issuer);
|
| if (signerCert == NULL) {
|
| - rv = SECFailure;
|
| - if (PORT_GetError() == SEC_ERROR_UNKNOWN_CERT) {
|
| - /* Make the error a little more specific. */
|
| - PORT_SetError(SEC_ERROR_OCSP_INVALID_SIGNING_CERT);
|
| - }
|
| - goto finish;
|
| + rv = SECFailure;
|
| + if (PORT_GetError() == SEC_ERROR_UNKNOWN_CERT) {
|
| + /* Make the error a little more specific. */
|
| + PORT_SetError(SEC_ERROR_OCSP_INVALID_SIGNING_CERT);
|
| + }
|
| + goto finish;
|
| }
|
|
|
| /*
|
| @@ -4204,24 +4145,24 @@ CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
|
|
|
| finish:
|
| if (signature->wasChecked)
|
| - signature->status = rv;
|
| + signature->status = rv;
|
|
|
| if (rv != SECSuccess) {
|
| - signature->failureReason = PORT_GetError();
|
| - if (signerCert != NULL)
|
| - CERT_DestroyCertificate(signerCert);
|
| + signature->failureReason = PORT_GetError();
|
| + if (signerCert != NULL)
|
| + CERT_DestroyCertificate(signerCert);
|
| } else {
|
| - /*
|
| - * Save signer's certificate in signature.
|
| - */
|
| - signature->cert = signerCert;
|
| - if (pSignerCert != NULL) {
|
| - /*
|
| - * Pass pointer to signer's certificate back to our caller,
|
| - * who is also now responsible for destroying it.
|
| - */
|
| - *pSignerCert = CERT_DupCertificate(signerCert);
|
| - }
|
| + /*
|
| + * Save signer's certificate in signature.
|
| + */
|
| + signature->cert = signerCert;
|
| + if (pSignerCert != NULL) {
|
| + /*
|
| + * Pass pointer to signer's certificate back to our caller,
|
| + * who is also now responsible for destroying it.
|
| + */
|
| + *pSignerCert = CERT_DupCertificate(signerCert);
|
| + }
|
| }
|
|
|
| return rv;
|
| @@ -4234,7 +4175,7 @@ finish:
|
| */
|
| static PRBool
|
| ocsp_CertIDsMatch(CERTOCSPCertID *requestCertID,
|
| - CERTOCSPCertID *responseCertID)
|
| + CERTOCSPCertID *responseCertID)
|
| {
|
| PRBool match = PR_FALSE;
|
| SECOidTag hashAlg;
|
| @@ -4248,8 +4189,8 @@ ocsp_CertIDsMatch(CERTOCSPCertID *requestCertID,
|
| * We just compare the easier things first.
|
| */
|
| if (SECITEM_CompareItem(&requestCertID->serialNumber,
|
| - &responseCertID->serialNumber) != SECEqual) {
|
| - goto done;
|
| + &responseCertID->serialNumber) != SECEqual) {
|
| + goto done;
|
| }
|
|
|
| /*
|
| @@ -4257,48 +4198,49 @@ ocsp_CertIDsMatch(CERTOCSPCertID *requestCertID,
|
| * requestCertID->hashAlgorithm, we don't need to check it.
|
| */
|
| if (responseCertID->hashAlgorithm.parameters.len > 2) {
|
| - goto done;
|
| + goto done;
|
| }
|
| if (SECITEM_CompareItem(&requestCertID->hashAlgorithm.algorithm,
|
| - &responseCertID->hashAlgorithm.algorithm) == SECEqual) {
|
| - /*
|
| - * If the hash algorithms match then we can do a simple compare
|
| - * of the hash values themselves.
|
| - */
|
| - if ((SECITEM_CompareItem(&requestCertID->issuerNameHash,
|
| - &responseCertID->issuerNameHash) == SECEqual)
|
| - && (SECITEM_CompareItem(&requestCertID->issuerKeyHash,
|
| - &responseCertID->issuerKeyHash) == SECEqual)) {
|
| - match = PR_TRUE;
|
| - }
|
| - goto done;
|
| + &responseCertID->hashAlgorithm.algorithm) ==
|
| + SECEqual) {
|
| + /*
|
| + * If the hash algorithms match then we can do a simple compare
|
| + * of the hash values themselves.
|
| + */
|
| + if ((SECITEM_CompareItem(&requestCertID->issuerNameHash,
|
| + &responseCertID->issuerNameHash) == SECEqual) &&
|
| + (SECITEM_CompareItem(&requestCertID->issuerKeyHash,
|
| + &responseCertID->issuerKeyHash) == SECEqual)) {
|
| + match = PR_TRUE;
|
| + }
|
| + goto done;
|
| }
|
|
|
| hashAlg = SECOID_FindOIDTag(&responseCertID->hashAlgorithm.algorithm);
|
| switch (hashAlg) {
|
| - case SEC_OID_SHA1:
|
| - keyHash = &requestCertID->issuerSHA1KeyHash;
|
| - nameHash = &requestCertID->issuerSHA1NameHash;
|
| - break;
|
| - case SEC_OID_MD5:
|
| - keyHash = &requestCertID->issuerMD5KeyHash;
|
| - nameHash = &requestCertID->issuerMD5NameHash;
|
| - break;
|
| - case SEC_OID_MD2:
|
| - keyHash = &requestCertID->issuerMD2KeyHash;
|
| - nameHash = &requestCertID->issuerMD2NameHash;
|
| - break;
|
| - default:
|
| - PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
|
| - return PR_FALSE;
|
| - }
|
| -
|
| - if ((keyHash != NULL)
|
| - && (SECITEM_CompareItem(nameHash,
|
| - &responseCertID->issuerNameHash) == SECEqual)
|
| - && (SECITEM_CompareItem(keyHash,
|
| - &responseCertID->issuerKeyHash) == SECEqual)) {
|
| - match = PR_TRUE;
|
| + case SEC_OID_SHA1:
|
| + keyHash = &requestCertID->issuerSHA1KeyHash;
|
| + nameHash = &requestCertID->issuerSHA1NameHash;
|
| + break;
|
| + case SEC_OID_MD5:
|
| + keyHash = &requestCertID->issuerMD5KeyHash;
|
| + nameHash = &requestCertID->issuerMD5NameHash;
|
| + break;
|
| + case SEC_OID_MD2:
|
| + keyHash = &requestCertID->issuerMD2KeyHash;
|
| + nameHash = &requestCertID->issuerMD2NameHash;
|
| + break;
|
| + default:
|
| + PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
|
| + return PR_FALSE;
|
| + }
|
| +
|
| + if ((keyHash != NULL) &&
|
| + (SECITEM_CompareItem(nameHash,
|
| + &responseCertID->issuerNameHash) == SECEqual) &&
|
| + (SECITEM_CompareItem(keyHash,
|
| + &responseCertID->issuerKeyHash) == SECEqual)) {
|
| + match = PR_TRUE;
|
| }
|
|
|
| done:
|
| @@ -4313,27 +4255,27 @@ done:
|
| */
|
| static CERTOCSPSingleResponse *
|
| ocsp_GetSingleResponseForCertID(CERTOCSPSingleResponse **responses,
|
| - CERTCertDBHandle *handle,
|
| - CERTOCSPCertID *certID)
|
| + CERTCertDBHandle *handle,
|
| + CERTOCSPCertID *certID)
|
| {
|
| CERTOCSPSingleResponse *single;
|
| int i;
|
|
|
| if (responses == NULL)
|
| - return NULL;
|
| + return NULL;
|
|
|
| for (i = 0; responses[i] != NULL; i++) {
|
| - single = responses[i];
|
| - if (ocsp_CertIDsMatch(certID, single->certID)) {
|
| - return single;
|
| - }
|
| + single = responses[i];
|
| + if (ocsp_CertIDsMatch(certID, single->certID)) {
|
| + return single;
|
| + }
|
| }
|
|
|
| /*
|
| * The OCSP server should have included a response even if it knew
|
| * nothing about the certificate in question. Since it did not,
|
| * this will make it look as if it had.
|
| - *
|
| + *
|
| * XXX Should we make this a separate error to notice the server's
|
| * bad behavior?
|
| */
|
| @@ -4349,19 +4291,19 @@ ocsp_GetCheckingContext(CERTCertDBHandle *handle)
|
|
|
| statusConfig = CERT_GetStatusConfig(handle);
|
| if (statusConfig != NULL) {
|
| - ocspcx = statusConfig->statusContext;
|
| + ocspcx = statusConfig->statusContext;
|
|
|
| - /*
|
| - * This is actually an internal error, because we should never
|
| - * have a good statusConfig without a good statusContext, too.
|
| - * For lack of anything better, though, we just assert and use
|
| - * the same error as if there were no statusConfig (set below).
|
| - */
|
| - PORT_Assert(ocspcx != NULL);
|
| + /*
|
| + * This is actually an internal error, because we should never
|
| + * have a good statusConfig without a good statusContext, too.
|
| + * For lack of anything better, though, we just assert and use
|
| + * the same error as if there were no statusConfig (set below).
|
| + */
|
| + PORT_Assert(ocspcx != NULL);
|
| }
|
|
|
| if (ocspcx == NULL)
|
| - PORT_SetError(SEC_ERROR_OCSP_NOT_ENABLED);
|
| + PORT_SetError(SEC_ERROR_OCSP_NOT_ENABLED);
|
|
|
| return ocspcx;
|
| }
|
| @@ -4377,19 +4319,19 @@ ocsp_CertGetDefaultResponder(CERTCertDBHandle *handle, CERTOCSPCertID *certID)
|
|
|
| ocspcx = ocsp_GetCheckingContext(handle);
|
| if (ocspcx == NULL)
|
| - goto loser;
|
| -
|
| - /*
|
| - * Right now we have only one default responder. It applies to
|
| - * all certs when it is used, so the check is simple and certID
|
| - * has no bearing on the answer. Someday in the future we may
|
| - * allow configuration of different responders for different
|
| - * issuers, and then we would have to use the issuer specified
|
| - * in certID to determine if signerCert is the right one.
|
| - */
|
| + goto loser;
|
| +
|
| + /*
|
| + * Right now we have only one default responder. It applies to
|
| + * all certs when it is used, so the check is simple and certID
|
| + * has no bearing on the answer. Someday in the future we may
|
| + * allow configuration of different responders for different
|
| + * issuers, and then we would have to use the issuer specified
|
| + * in certID to determine if signerCert is the right one.
|
| + */
|
| if (ocspcx->useDefaultResponder) {
|
| - PORT_Assert(ocspcx->defaultResponderCert != NULL);
|
| - return ocspcx->defaultResponderCert;
|
| + PORT_Assert(ocspcx->defaultResponderCert != NULL);
|
| + return ocspcx->defaultResponderCert;
|
| }
|
|
|
| loser:
|
| @@ -4407,19 +4349,19 @@ ocsp_CertIsOCSPDefaultResponder(CERTCertDBHandle *handle, CERTCertificate *cert)
|
|
|
| ocspcx = ocsp_GetCheckingContext(handle);
|
| if (ocspcx == NULL)
|
| - return PR_FALSE;
|
| -
|
| - /*
|
| - * Right now we have only one default responder. It applies to
|
| - * all certs when it is used, so the check is simple and certID
|
| - * has no bearing on the answer. Someday in the future we may
|
| - * allow configuration of different responders for different
|
| - * issuers, and then we would have to use the issuer specified
|
| - * in certID to determine if signerCert is the right one.
|
| - */
|
| + return PR_FALSE;
|
| +
|
| + /*
|
| + * Right now we have only one default responder. It applies to
|
| + * all certs when it is used, so the check is simple and certID
|
| + * has no bearing on the answer. Someday in the future we may
|
| + * allow configuration of different responders for different
|
| + * issuers, and then we would have to use the issuer specified
|
| + * in certID to determine if signerCert is the right one.
|
| + */
|
| if (ocspcx->useDefaultResponder &&
|
| CERT_CompareCerts(ocspcx->defaultResponderCert, cert)) {
|
| - return PR_TRUE;
|
| + return PR_TRUE;
|
| }
|
|
|
| return PR_FALSE;
|
| @@ -4444,9 +4386,9 @@ ocsp_CertIsOCSPDefaultResponder(CERTCertDBHandle *handle, CERTCertificate *cert)
|
| */
|
| static PRBool
|
| ocsp_AuthorizedResponderForCertID(CERTCertDBHandle *handle,
|
| - CERTCertificate *signerCert,
|
| - CERTOCSPCertID *certID,
|
| - PRTime thisUpdate)
|
| + CERTCertificate *signerCert,
|
| + CERTOCSPCertID *certID,
|
| + PRTime thisUpdate)
|
| {
|
| CERTCertificate *issuerCert = NULL, *defRespCert;
|
| SECItem *keyHash = NULL;
|
| @@ -4490,7 +4432,7 @@ ocsp_AuthorizedResponderForCertID(CERTCertDBHandle *handle,
|
| nameHashEQ =
|
| (SECITEM_CompareItem(nameHash,
|
| &certID->issuerNameHash) == SECEqual);
|
| -
|
| +
|
| SECITEM_FreeItem(nameHash, PR_TRUE);
|
| if (nameHashEQ) {
|
| /* The issuer of the cert is the the signer of the response */
|
| @@ -4498,7 +4440,6 @@ ocsp_AuthorizedResponderForCertID(CERTCertDBHandle *handle,
|
| }
|
| }
|
|
|
| -
|
| keyHashEQ = PR_FALSE;
|
| nameHashEQ = PR_FALSE;
|
|
|
| @@ -4529,7 +4470,7 @@ ocsp_AuthorizedResponderForCertID(CERTCertDBHandle *handle,
|
| CERT_DestroyCertificate(issuerCert);
|
|
|
| if (keyHash != NULL && nameHash != NULL) {
|
| - keyHashEQ =
|
| + keyHashEQ =
|
| (SECITEM_CompareItem(keyHash,
|
| &certID->issuerKeyHash) == SECEqual);
|
|
|
| @@ -4565,7 +4506,7 @@ ocsp_AuthorizedResponderForCertID(CERTCertDBHandle *handle,
|
| * want something from within the last 24 hours. This macro defines that
|
| * number in seconds.
|
| */
|
| -#define OCSP_ALLOWABLE_LAPSE_SECONDS (24L * 60L * 60L)
|
| +#define OCSP_ALLOWABLE_LAPSE_SECONDS (24L * 60L * 60L)
|
|
|
| static PRBool
|
| ocsp_TimeIsRecent(PRTime checkTime)
|
| @@ -4575,19 +4516,19 @@ ocsp_TimeIsRecent(PRTime checkTime)
|
|
|
| LL_I2L(lapse, OCSP_ALLOWABLE_LAPSE_SECONDS);
|
| LL_I2L(tmp, PR_USEC_PER_SEC);
|
| - LL_MUL(lapse, lapse, tmp); /* allowable lapse in microseconds */
|
| + LL_MUL(lapse, lapse, tmp); /* allowable lapse in microseconds */
|
|
|
| LL_ADD(checkTime, checkTime, lapse);
|
| if (LL_CMP(now, >, checkTime))
|
| - return PR_FALSE;
|
| + return PR_FALSE;
|
|
|
| return PR_TRUE;
|
| }
|
|
|
| -#define OCSP_SLOP (5L*60L) /* OCSP responses are allowed to be 5 minutes
|
| - in the future by default */
|
| +#define OCSP_SLOP (5L * 60L) /* OCSP responses are allowed to be 5 minutes \
|
| + in the future by default */
|
|
|
| -static PRUint32 ocspsloptime = OCSP_SLOP; /* seconds */
|
| +static PRUint32 ocspsloptime = OCSP_SLOP; /* seconds */
|
|
|
| /*
|
| * If an old response contains the revoked certificate status, we want
|
| @@ -4610,7 +4551,6 @@ ocsp_HandleOldSingleResponse(CERTOCSPSingleResponse *single, PRTime time)
|
| */
|
| return SECSuccess;
|
| }
|
| -
|
| }
|
| PORT_SetError(SEC_ERROR_OCSP_OLD_RESPONSE);
|
| return SECFailure;
|
| @@ -4638,19 +4578,19 @@ ocsp_HandleOldSingleResponse(CERTOCSPSingleResponse *single, PRTime time)
|
| * SEC_ERROR_OCSP_OLD_RESPONSE
|
| * SEC_ERROR_OCSP_UNAUTHORIZED_RESPONSE
|
| * Other errors are low-level problems (no memory, bad database, etc.).
|
| - */
|
| + */
|
| static SECStatus
|
| ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single,
|
| - CERTCertDBHandle *handle,
|
| - CERTCertificate *signerCert,
|
| - PRTime producedAt)
|
| + CERTCertDBHandle *handle,
|
| + CERTCertificate *signerCert,
|
| + PRTime producedAt)
|
| {
|
| CERTOCSPCertID *certID = single->certID;
|
| PRTime now, thisUpdate, nextUpdate, tmstamp, tmp;
|
| SECStatus rv;
|
|
|
| - OCSP_TRACE(("OCSP ocsp_VerifySingleResponse, nextUpdate: %d\n",
|
| - ((single->nextUpdate) != 0)));
|
| + OCSP_TRACE(("OCSP ocsp_VerifySingleResponse, nextUpdate: %d\n",
|
| + ((single->nextUpdate) != 0)));
|
| /*
|
| * If all the responder said was that the given cert was unknown to it,
|
| * that is a valid response. Not very interesting to us, of course,
|
| @@ -4659,7 +4599,7 @@ ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single,
|
| */
|
| PORT_Assert(single->certStatus != NULL);
|
| if (single->certStatus->certStatusType == ocspCertStatus_unknown)
|
| - return SECSuccess;
|
| + return SECSuccess;
|
|
|
| /*
|
| * We need to extract "thisUpdate" for use below and to pass along
|
| @@ -4668,14 +4608,14 @@ ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single,
|
| */
|
| rv = DER_GeneralizedTimeToTime(&thisUpdate, &single->thisUpdate);
|
| if (rv != SECSuccess)
|
| - return rv;
|
| + return rv;
|
|
|
| /*
|
| * First confirm that signerCert is authorized to give this status.
|
| */
|
| if (ocsp_AuthorizedResponderForCertID(handle, signerCert, certID,
|
| - thisUpdate) != PR_TRUE)
|
| - return SECFailure;
|
| + thisUpdate) != PR_TRUE)
|
| + return SECFailure;
|
|
|
| /*
|
| * Now check the time stuff, as described above.
|
| @@ -4688,25 +4628,24 @@ ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single,
|
| LL_ADD(tmstamp, tmp, now); /* add current time to it */
|
|
|
| if (LL_CMP(thisUpdate, >, tmstamp) || LL_CMP(producedAt, <, thisUpdate)) {
|
| - PORT_SetError(SEC_ERROR_OCSP_FUTURE_RESPONSE);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_OCSP_FUTURE_RESPONSE);
|
| + return SECFailure;
|
| }
|
| if (single->nextUpdate != NULL) {
|
| - rv = DER_GeneralizedTimeToTime(&nextUpdate, single->nextUpdate);
|
| - if (rv != SECSuccess)
|
| - return rv;
|
| + rv = DER_GeneralizedTimeToTime(&nextUpdate, single->nextUpdate);
|
| + if (rv != SECSuccess)
|
| + return rv;
|
|
|
| - LL_ADD(tmp, tmp, nextUpdate);
|
| - if (LL_CMP(tmp, <, now) || LL_CMP(producedAt, >, nextUpdate))
|
| - return ocsp_HandleOldSingleResponse(single, now);
|
| + LL_ADD(tmp, tmp, nextUpdate);
|
| + if (LL_CMP(tmp, <, now) || LL_CMP(producedAt, >, nextUpdate))
|
| + return ocsp_HandleOldSingleResponse(single, now);
|
| } else if (ocsp_TimeIsRecent(thisUpdate) != PR_TRUE) {
|
| - return ocsp_HandleOldSingleResponse(single, now);
|
| + return ocsp_HandleOldSingleResponse(single, now);
|
| }
|
|
|
| return SECSuccess;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_GetOCSPAuthorityInfoAccessLocation
|
| * Get the value of the URI of the OCSP responder for the given cert.
|
| @@ -4721,7 +4660,7 @@ ocsp_VerifySingleResponse(CERTOCSPSingleResponse *single,
|
| * extension is not present or it does not contain an entry for OCSP,
|
| * SEC_ERROR_CERT_BAD_ACCESS_LOCATION will be set and a NULL returned.
|
| * Any other error will also result in a NULL being returned.
|
| - *
|
| + *
|
| * This result should be freed (via PORT_Free) when no longer in use.
|
| */
|
| char *
|
| @@ -4743,13 +4682,13 @@ CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert)
|
| */
|
| encodedAuthInfoAccess = SECITEM_AllocItem(NULL, NULL, 0);
|
| if (encodedAuthInfoAccess == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| rv = CERT_FindCertExtension(cert, SEC_OID_X509_AUTH_INFO_ACCESS,
|
| - encodedAuthInfoAccess);
|
| + encodedAuthInfoAccess);
|
| if (rv == SECFailure) {
|
| - PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| - goto loser;
|
| + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| + goto loser;
|
| }
|
|
|
| /*
|
| @@ -4760,16 +4699,16 @@ CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert)
|
| */
|
| arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
|
| if (arena == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| authInfoAccess = CERT_DecodeAuthInfoAccessExtension(arena,
|
| - encodedAuthInfoAccess);
|
| + encodedAuthInfoAccess);
|
| if (authInfoAccess == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| for (i = 0; authInfoAccess[i] != NULL; i++) {
|
| - if (SECOID_FindOIDTag(&authInfoAccess[i]->method) == SEC_OID_PKIX_OCSP)
|
| - locname = authInfoAccess[i]->location;
|
| + if (SECOID_FindOIDTag(&authInfoAccess[i]->method) == SEC_OID_PKIX_OCSP)
|
| + locname = authInfoAccess[i]->location;
|
| }
|
|
|
| /*
|
| @@ -4780,8 +4719,8 @@ CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert)
|
| * not there at all.
|
| */
|
| if (locname == NULL) {
|
| - PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| - goto loser;
|
| + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| + goto loser;
|
| }
|
|
|
| /*
|
| @@ -4790,15 +4729,15 @@ CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert)
|
| */
|
| location = CERT_GetGeneralNameByType(locname, certURI, PR_FALSE);
|
| if (location == NULL) {
|
| - /*
|
| - * XXX Appears that CERT_GetGeneralNameByType does not set an
|
| - * error if there is no name by that type. For lack of anything
|
| - * better, act as if the extension was not found. In the future
|
| - * this should probably be something more like the extension was
|
| - * badly formed.
|
| - */
|
| - PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| - goto loser;
|
| + /*
|
| + * XXX Appears that CERT_GetGeneralNameByType does not set an
|
| + * error if there is no name by that type. For lack of anything
|
| + * better, act as if the extension was not found. In the future
|
| + * this should probably be something more like the extension was
|
| + * badly formed.
|
| + */
|
| + PORT_SetError(SEC_ERROR_CERT_BAD_ACCESS_LOCATION);
|
| + goto loser;
|
| }
|
|
|
| /*
|
| @@ -4809,22 +4748,21 @@ CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert)
|
| */
|
| locURI = PORT_Alloc(location->len + 1);
|
| if (locURI == NULL) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
| PORT_Memcpy(locURI, location->data, location->len);
|
| locURI[location->len] = '\0';
|
|
|
| loser:
|
| if (arena != NULL)
|
| - PORT_FreeArena(arena, PR_FALSE);
|
| + PORT_FreeArena(arena, PR_FALSE);
|
|
|
| if (encodedAuthInfoAccess != NULL)
|
| - SECITEM_FreeItem(encodedAuthInfoAccess, PR_TRUE);
|
| + SECITEM_FreeItem(encodedAuthInfoAccess, PR_TRUE);
|
|
|
| return locURI;
|
| }
|
|
|
| -
|
| /*
|
| * Figure out where we should go to find out the status of the given cert
|
| * via OCSP. If allowed to use a default responder uri and a default
|
| @@ -4840,7 +4778,7 @@ loser:
|
| */
|
| char *
|
| ocsp_GetResponderLocation(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| - PRBool canUseDefault, PRBool *isDefault)
|
| + PRBool canUseDefault, PRBool *isDefault)
|
| {
|
| ocspCheckingContext *ocspcx = NULL;
|
| char *ocspUrl = NULL;
|
| @@ -4849,15 +4787,15 @@ ocsp_GetResponderLocation(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| ocspcx = ocsp_GetCheckingContext(handle);
|
| }
|
| if (ocspcx != NULL && ocspcx->useDefaultResponder) {
|
| - /*
|
| - * A default responder wins out, if specified.
|
| - * XXX Someday this may be a more complicated determination based
|
| - * on the cert's issuer. (That is, we could have different default
|
| - * responders configured for different issuers.)
|
| - */
|
| - PORT_Assert(ocspcx->defaultResponderURI != NULL);
|
| - *isDefault = PR_TRUE;
|
| - return (PORT_Strdup(ocspcx->defaultResponderURI));
|
| + /*
|
| + * A default responder wins out, if specified.
|
| + * XXX Someday this may be a more complicated determination based
|
| + * on the cert's issuer. (That is, we could have different default
|
| + * responders configured for different issuers.)
|
| + */
|
| + PORT_Assert(ocspcx->defaultResponderURI != NULL);
|
| + *isDefault = PR_TRUE;
|
| + return (PORT_Strdup(ocspcx->defaultResponderURI));
|
| }
|
|
|
| /*
|
| @@ -4867,16 +4805,16 @@ ocsp_GetResponderLocation(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| *isDefault = PR_FALSE;
|
| ocspUrl = CERT_GetOCSPAuthorityInfoAccessLocation(cert);
|
| if (!ocspUrl) {
|
| - CERT_StringFromCertFcn altFcn;
|
| + CERT_StringFromCertFcn altFcn;
|
|
|
| - PR_EnterMonitor(OCSP_Global.monitor);
|
| - altFcn = OCSP_Global.alternateOCSPAIAFcn;
|
| - PR_ExitMonitor(OCSP_Global.monitor);
|
| - if (altFcn) {
|
| - ocspUrl = (*altFcn)(cert);
|
| - if (ocspUrl)
|
| - *isDefault = PR_TRUE;
|
| - }
|
| + PR_EnterMonitor(OCSP_Global.monitor);
|
| + altFcn = OCSP_Global.alternateOCSPAIAFcn;
|
| + PR_ExitMonitor(OCSP_Global.monitor);
|
| + if (altFcn) {
|
| + ocspUrl = (*altFcn)(cert);
|
| + if (ocspUrl)
|
| + *isDefault = PR_TRUE;
|
| + }
|
| }
|
| return ocspUrl;
|
| }
|
| @@ -4893,7 +4831,7 @@ ocsp_CertRevokedAfter(ocspRevokedInfo *revokedInfo, PRTime time)
|
|
|
| rv = DER_GeneralizedTimeToTime(&revokedTime, &revokedInfo->revocationTime);
|
| if (rv != SECSuccess)
|
| - return rv;
|
| + return rv;
|
|
|
| /*
|
| * Set the error even if we will return success; someone might care.
|
| @@ -4901,7 +4839,7 @@ ocsp_CertRevokedAfter(ocspRevokedInfo *revokedInfo, PRTime time)
|
| PORT_SetError(SEC_ERROR_REVOKED_CERTIFICATE);
|
|
|
| if (LL_CMP(revokedTime, >, time))
|
| - return SECSuccess;
|
| + return SECSuccess;
|
|
|
| return SECFailure;
|
| }
|
| @@ -4915,28 +4853,28 @@ ocsp_CertHasGoodStatus(ocspCertStatus *status, PRTime time)
|
| {
|
| SECStatus rv;
|
| switch (status->certStatusType) {
|
| - case ocspCertStatus_good:
|
| - rv = SECSuccess;
|
| - break;
|
| - case ocspCertStatus_revoked:
|
| - rv = ocsp_CertRevokedAfter(status->certStatusInfo.revokedInfo, time);
|
| - break;
|
| - case ocspCertStatus_unknown:
|
| - PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_CERT);
|
| - rv = SECFailure;
|
| - break;
|
| - case ocspCertStatus_other:
|
| - default:
|
| - PORT_Assert(0);
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| - rv = SECFailure;
|
| - break;
|
| + case ocspCertStatus_good:
|
| + rv = SECSuccess;
|
| + break;
|
| + case ocspCertStatus_revoked:
|
| + rv = ocsp_CertRevokedAfter(status->certStatusInfo.revokedInfo, time);
|
| + break;
|
| + case ocspCertStatus_unknown:
|
| + PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_CERT);
|
| + rv = SECFailure;
|
| + break;
|
| + case ocspCertStatus_other:
|
| + default:
|
| + PORT_Assert(0);
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_RESPONSE);
|
| + rv = SECFailure;
|
| + break;
|
| }
|
| return rv;
|
| }
|
|
|
| static SECStatus
|
| -ocsp_SingleResponseCertHasGoodStatus(CERTOCSPSingleResponse *single,
|
| +ocsp_SingleResponseCertHasGoodStatus(CERTOCSPSingleResponse *single,
|
| PRTime time)
|
| {
|
| return ocsp_CertHasGoodStatus(single->certStatus, time);
|
| @@ -4963,7 +4901,7 @@ ocsp_GetCachedOCSPResponseStatus(CERTOCSPCertID *certID,
|
| OCSPFreshness *cacheFreshness)
|
| {
|
| OCSPCacheItem *cacheItem = NULL;
|
| -
|
| +
|
| if (!certID || !missingResponseError || !rvOcsp || !cacheFreshness) {
|
| PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| return SECFailure;
|
| @@ -4971,7 +4909,7 @@ ocsp_GetCachedOCSPResponseStatus(CERTOCSPCertID *certID,
|
| *rvOcsp = SECFailure;
|
| *missingResponseError = 0;
|
| *cacheFreshness = ocspMissing;
|
| -
|
| +
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| cacheItem = ocsp_FindCacheEntry(&OCSP_Global.cache, certID);
|
| if (cacheItem) {
|
| @@ -4986,13 +4924,13 @@ ocsp_GetCachedOCSPResponseStatus(CERTOCSPCertID *certID,
|
| } else {
|
| /*
|
| * No status cached, the previous attempt failed.
|
| - * If OCSP is required, we never decide based on a failed attempt
|
| + * If OCSP is required, we never decide based on a failed attempt
|
| * However, if OCSP is optional, a recent OCSP failure is
|
| * an allowed good state.
|
| */
|
| if (*cacheFreshness == ocspFresh &&
|
| !ignoreGlobalOcspFailureSetting &&
|
| - OCSP_Global.ocspFailureMode ==
|
| + OCSP_Global.ocspFailureMode ==
|
| ocspMode_FailureIsNotAVerificationFailure) {
|
| *rvOcsp = SECSuccess;
|
| }
|
| @@ -5064,10 +5002,10 @@ ocsp_FetchingFailureIsVerificationFailure(void)
|
| * (e.g. SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_UNTRUSTED_ISSUER) when
|
| * verifying the signer's cert, or low-level problems (error allocating
|
| * memory, error performing ASN.1 decoding, etc.).
|
| - */
|
| -SECStatus
|
| + */
|
| +SECStatus
|
| CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| - PRTime time, void *pwArg)
|
| + PRTime time, void *pwArg)
|
| {
|
| CERTOCSPCertID *certID;
|
| PRBool certIDWasConsumed = PR_FALSE;
|
| @@ -5075,10 +5013,10 @@ CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| SECStatus rvOcsp;
|
| SECErrorCodes cachedErrorCode;
|
| OCSPFreshness cachedResponseFreshness;
|
| -
|
| +
|
| OCSP_TRACE_CERT(cert);
|
| OCSP_TRACE_TIME("## requested validity time:", time);
|
| -
|
| +
|
| certID = CERT_CreateOCSPCertID(cert, time);
|
| if (!certID)
|
| return SECFailure;
|
| @@ -5098,7 +5036,7 @@ CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| }
|
|
|
| rv = ocsp_GetOCSPStatusFromNetwork(handle, certID, cert, time, pwArg,
|
| - &certIDWasConsumed,
|
| + &certIDWasConsumed,
|
| &rvOcsp);
|
| if (rv != SECSuccess) {
|
| PRErrorCode err = PORT_GetError();
|
| @@ -5157,10 +5095,10 @@ CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
|
| */
|
| SECStatus
|
| CERT_CacheOCSPResponseFromSideChannel(CERTCertDBHandle *handle,
|
| - CERTCertificate *cert,
|
| - PRTime time,
|
| - const SECItem *encodedResponse,
|
| - void *pwArg)
|
| + CERTCertificate *cert,
|
| + PRTime time,
|
| + const SECItem *encodedResponse,
|
| + void *pwArg)
|
| {
|
| CERTOCSPCertID *certID = NULL;
|
| PRBool certIDWasConsumed = PR_FALSE;
|
| @@ -5235,17 +5173,17 @@ CERT_CacheOCSPResponseFromSideChannel(CERTCertDBHandle *handle,
|
| * ocsp_CacheSingleResponse. */
|
|
|
| rv = ocsp_GetDecodedVerifiedSingleResponseForID(handle, certID, cert,
|
| - time, pwArg,
|
| - encodedResponse,
|
| - &decodedResponse,
|
| - &singleResponse);
|
| + time, pwArg,
|
| + encodedResponse,
|
| + &decodedResponse,
|
| + &singleResponse);
|
| if (rv == SECSuccess) {
|
| - rvOcsp = ocsp_SingleResponseCertHasGoodStatus(singleResponse, time);
|
| - /* Cache any valid singleResponse, regardless of status. */
|
| - ocsp_CacheSingleResponse(certID, singleResponse, &certIDWasConsumed);
|
| + rvOcsp = ocsp_SingleResponseCertHasGoodStatus(singleResponse, time);
|
| + /* Cache any valid singleResponse, regardless of status. */
|
| + ocsp_CacheSingleResponse(certID, singleResponse, &certIDWasConsumed);
|
| }
|
| if (decodedResponse) {
|
| - CERT_DestroyOCSPResponse(decodedResponse);
|
| + CERT_DestroyOCSPResponse(decodedResponse);
|
| }
|
| if (!certIDWasConsumed) {
|
| CERT_DestroyOCSPCertID(certID);
|
| @@ -5254,13 +5192,13 @@ CERT_CacheOCSPResponseFromSideChannel(CERTCertDBHandle *handle,
|
| }
|
|
|
| /*
|
| - * Status in *certIDWasConsumed will always be correct, regardless of
|
| + * Status in *certIDWasConsumed will always be correct, regardless of
|
| * return value.
|
| */
|
| static SECStatus
|
| -ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *cert,
|
| +ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *cert,
|
| PRTime time,
|
| void *pwArg,
|
| PRBool *certIDWasConsumed,
|
| @@ -5274,7 +5212,8 @@ ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
|
|
| CERTOCSPResponse *decodedResponse = NULL;
|
| CERTOCSPSingleResponse *singleResponse = NULL;
|
| - enum { stageGET, stagePOST } currentStage;
|
| + enum { stageGET,
|
| + stagePOST } currentStage;
|
| PRBool retry = PR_FALSE;
|
|
|
| if (!certIDWasConsumed || !rv_ocsp) {
|
| @@ -5310,14 +5249,14 @@ ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| location = ocsp_GetResponderLocation(handle, cert, PR_TRUE,
|
| &locationIsDefault);
|
| if (location == NULL) {
|
| - int err = PORT_GetError();
|
| - if (err == SEC_ERROR_EXTENSION_NOT_FOUND ||
|
| - err == SEC_ERROR_CERT_BAD_ACCESS_LOCATION) {
|
| - PORT_SetError(0);
|
| - *rv_ocsp = SECSuccess;
|
| - return SECSuccess;
|
| - }
|
| - return SECFailure;
|
| + int err = PORT_GetError();
|
| + if (err == SEC_ERROR_EXTENSION_NOT_FOUND ||
|
| + err == SEC_ERROR_CERT_BAD_ACCESS_LOCATION) {
|
| + PORT_SetError(0);
|
| + *rv_ocsp = SECSuccess;
|
| + return SECSuccess;
|
| + }
|
| + return SECFailure;
|
| }
|
|
|
| /*
|
| @@ -5343,75 +5282,75 @@ ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| */
|
|
|
| do {
|
| - const char *method;
|
| - PRBool validResponseWithAccurateInfo = PR_FALSE;
|
| - retry = PR_FALSE;
|
| - *rv_ocsp = SECFailure;
|
| -
|
| - if (currentStage == stageGET) {
|
| - method = "GET";
|
| - } else {
|
| - PORT_Assert(currentStage == stagePOST);
|
| - method = "POST";
|
| - }
|
| -
|
| - encodedResponse =
|
| - ocsp_GetEncodedOCSPResponseForSingleCert(NULL, certID, cert,
|
| - location, method,
|
| - time, locationIsDefault,
|
| - pwArg, &request);
|
| -
|
| - if (encodedResponse) {
|
| - rv = ocsp_GetDecodedVerifiedSingleResponseForID(handle, certID, cert,
|
| - time, pwArg,
|
| - encodedResponse,
|
| - &decodedResponse,
|
| - &singleResponse);
|
| - if (rv == SECSuccess) {
|
| - switch (singleResponse->certStatus->certStatusType) {
|
| - case ocspCertStatus_good:
|
| - case ocspCertStatus_revoked:
|
| - validResponseWithAccurateInfo = PR_TRUE;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - *rv_ocsp = ocsp_SingleResponseCertHasGoodStatus(singleResponse, time);
|
| - }
|
| - }
|
| -
|
| - if (currentStage == stageGET) {
|
| - /* only accept GET response if good or revoked */
|
| - if (validResponseWithAccurateInfo) {
|
| - ocsp_CacheSingleResponse(certID, singleResponse,
|
| - certIDWasConsumed);
|
| - } else {
|
| - retry = PR_TRUE;
|
| - currentStage = stagePOST;
|
| - }
|
| - } else {
|
| - /* cache the POST respone, regardless of status */
|
| - if (!singleResponse) {
|
| - cert_RememberOCSPProcessingFailure(certID, certIDWasConsumed);
|
| - } else {
|
| - ocsp_CacheSingleResponse(certID, singleResponse,
|
| - certIDWasConsumed);
|
| - }
|
| - }
|
| -
|
| - if (encodedResponse) {
|
| - SECITEM_FreeItem(encodedResponse, PR_TRUE);
|
| - encodedResponse = NULL;
|
| - }
|
| - if (request) {
|
| - CERT_DestroyOCSPRequest(request);
|
| - request = NULL;
|
| - }
|
| - if (decodedResponse) {
|
| - CERT_DestroyOCSPResponse(decodedResponse);
|
| - decodedResponse = NULL;
|
| - }
|
| - singleResponse = NULL;
|
| + const char *method;
|
| + PRBool validResponseWithAccurateInfo = PR_FALSE;
|
| + retry = PR_FALSE;
|
| + *rv_ocsp = SECFailure;
|
| +
|
| + if (currentStage == stageGET) {
|
| + method = "GET";
|
| + } else {
|
| + PORT_Assert(currentStage == stagePOST);
|
| + method = "POST";
|
| + }
|
| +
|
| + encodedResponse =
|
| + ocsp_GetEncodedOCSPResponseForSingleCert(NULL, certID, cert,
|
| + location, method,
|
| + time, locationIsDefault,
|
| + pwArg, &request);
|
| +
|
| + if (encodedResponse) {
|
| + rv = ocsp_GetDecodedVerifiedSingleResponseForID(handle, certID, cert,
|
| + time, pwArg,
|
| + encodedResponse,
|
| + &decodedResponse,
|
| + &singleResponse);
|
| + if (rv == SECSuccess) {
|
| + switch (singleResponse->certStatus->certStatusType) {
|
| + case ocspCertStatus_good:
|
| + case ocspCertStatus_revoked:
|
| + validResponseWithAccurateInfo = PR_TRUE;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + *rv_ocsp = ocsp_SingleResponseCertHasGoodStatus(singleResponse, time);
|
| + }
|
| + }
|
| +
|
| + if (currentStage == stageGET) {
|
| + /* only accept GET response if good or revoked */
|
| + if (validResponseWithAccurateInfo) {
|
| + ocsp_CacheSingleResponse(certID, singleResponse,
|
| + certIDWasConsumed);
|
| + } else {
|
| + retry = PR_TRUE;
|
| + currentStage = stagePOST;
|
| + }
|
| + } else {
|
| + /* cache the POST respone, regardless of status */
|
| + if (!singleResponse) {
|
| + cert_RememberOCSPProcessingFailure(certID, certIDWasConsumed);
|
| + } else {
|
| + ocsp_CacheSingleResponse(certID, singleResponse,
|
| + certIDWasConsumed);
|
| + }
|
| + }
|
| +
|
| + if (encodedResponse) {
|
| + SECITEM_FreeItem(encodedResponse, PR_TRUE);
|
| + encodedResponse = NULL;
|
| + }
|
| + if (request) {
|
| + CERT_DestroyOCSPRequest(request);
|
| + request = NULL;
|
| + }
|
| + if (decodedResponse) {
|
| + CERT_DestroyOCSPResponse(decodedResponse);
|
| + decodedResponse = NULL;
|
| + }
|
| + singleResponse = NULL;
|
|
|
| } while (retry);
|
|
|
| @@ -5454,25 +5393,25 @@ ocsp_GetOCSPStatusFromNetwork(CERTCertDBHandle *handle,
|
| */
|
| static SECStatus
|
| ocsp_GetDecodedVerifiedSingleResponseForID(CERTCertDBHandle *handle,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *cert,
|
| - PRTime time,
|
| - void *pwArg,
|
| - const SECItem *encodedResponse,
|
| - CERTOCSPResponse **pDecodedResponse,
|
| - CERTOCSPSingleResponse **pSingle)
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *cert,
|
| + PRTime time,
|
| + void *pwArg,
|
| + const SECItem *encodedResponse,
|
| + CERTOCSPResponse **pDecodedResponse,
|
| + CERTOCSPSingleResponse **pSingle)
|
| {
|
| CERTCertificate *signerCert = NULL;
|
| CERTCertificate *issuerCert = NULL;
|
| SECStatus rv = SECFailure;
|
|
|
| if (!pSingle || !pDecodedResponse) {
|
| - return SECFailure;
|
| + return SECFailure;
|
| }
|
| *pSingle = NULL;
|
| *pDecodedResponse = CERT_DecodeOCSPResponse(encodedResponse);
|
| if (!*pDecodedResponse) {
|
| - return SECFailure;
|
| + return SECFailure;
|
| }
|
|
|
| /*
|
| @@ -5485,7 +5424,7 @@ ocsp_GetDecodedVerifiedSingleResponseForID(CERTCertDBHandle *handle,
|
| * in the response.
|
| */
|
| if (CERT_GetOCSPResponseStatus(*pDecodedResponse) != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| /*
|
| @@ -5496,32 +5435,32 @@ ocsp_GetDecodedVerifiedSingleResponseForID(CERTCertDBHandle *handle,
|
| rv = CERT_VerifyOCSPResponseSignature(*pDecodedResponse, handle, pwArg,
|
| &signerCert, issuerCert);
|
| if (rv != SECSuccess) {
|
| - goto loser;
|
| + goto loser;
|
| }
|
|
|
| - PORT_Assert(signerCert != NULL); /* internal consistency check */
|
| + PORT_Assert(signerCert != NULL); /* internal consistency check */
|
| /* XXX probably should set error, return failure if signerCert is null */
|
|
|
| /*
|
| * Again, we are only doing one request for one cert.
|
| * XXX When we handle cert chains, the following code will obviously
|
| * have to be modified, in coordation with the code above that will
|
| - * have to determine how to make multiple requests, etc.
|
| + * have to determine how to make multiple requests, etc.
|
| */
|
| - rv = ocsp_GetVerifiedSingleResponseForCertID(handle, *pDecodedResponse, certID,
|
| + rv = ocsp_GetVerifiedSingleResponseForCertID(handle, *pDecodedResponse, certID,
|
| signerCert, time, pSingle);
|
| loser:
|
| if (issuerCert != NULL)
|
| - CERT_DestroyCertificate(issuerCert);
|
| + CERT_DestroyCertificate(issuerCert);
|
| if (signerCert != NULL)
|
| - CERT_DestroyCertificate(signerCert);
|
| + CERT_DestroyCertificate(signerCert);
|
| return rv;
|
| }
|
|
|
| /*
|
| * FUNCTION: ocsp_CacheSingleResponse
|
| * This function requires that the caller has checked that the response
|
| - * is valid and verified.
|
| + * is valid and verified.
|
| * The (positive or negative) valid response will be used to update the cache.
|
| * INPUTS:
|
| * CERTOCSPCertID *certID
|
| @@ -5532,27 +5471,27 @@ loser:
|
| */
|
| void
|
| ocsp_CacheSingleResponse(CERTOCSPCertID *certID,
|
| - CERTOCSPSingleResponse *single,
|
| - PRBool *certIDWasConsumed)
|
| + CERTOCSPSingleResponse *single,
|
| + PRBool *certIDWasConsumed)
|
| {
|
| if (single != NULL) {
|
| - PR_EnterMonitor(OCSP_Global.monitor);
|
| - if (OCSP_Global.maxCacheEntries >= 0) {
|
| - ocsp_CreateOrUpdateCacheEntry(&OCSP_Global.cache, certID, single,
|
| - certIDWasConsumed);
|
| - /* ignore cache update failures */
|
| - }
|
| - PR_ExitMonitor(OCSP_Global.monitor);
|
| + PR_EnterMonitor(OCSP_Global.monitor);
|
| + if (OCSP_Global.maxCacheEntries >= 0) {
|
| + ocsp_CreateOrUpdateCacheEntry(&OCSP_Global.cache, certID, single,
|
| + certIDWasConsumed);
|
| + /* ignore cache update failures */
|
| + }
|
| + PR_ExitMonitor(OCSP_Global.monitor);
|
| }
|
| }
|
|
|
| SECStatus
|
| -ocsp_GetVerifiedSingleResponseForCertID(CERTCertDBHandle *handle,
|
| - CERTOCSPResponse *response,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *signerCert,
|
| - PRTime time,
|
| - CERTOCSPSingleResponse
|
| +ocsp_GetVerifiedSingleResponseForCertID(CERTCertDBHandle *handle,
|
| + CERTOCSPResponse *response,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *signerCert,
|
| + PRTime time,
|
| + CERTOCSPSingleResponse
|
| **pSingleResponse)
|
| {
|
| SECStatus rv;
|
| @@ -5596,11 +5535,11 @@ loser:
|
| }
|
|
|
| SECStatus
|
| -CERT_GetOCSPStatusForCertID(CERTCertDBHandle *handle,
|
| - CERTOCSPResponse *response,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *signerCert,
|
| - PRTime time)
|
| +CERT_GetOCSPStatusForCertID(CERTCertDBHandle *handle,
|
| + CERTOCSPResponse *response,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *signerCert,
|
| + PRTime time)
|
| {
|
| /*
|
| * We do not update the cache, because:
|
| @@ -5612,17 +5551,17 @@ CERT_GetOCSPStatusForCertID(CERTCertDBHandle *handle,
|
| * requires the ability to transfer ownership of the the given certID to
|
| * the cache. The external API doesn't allow us to prevent the caller from
|
| * destroying the certID. We don't have the original certificate available,
|
| - * therefore we are unable to produce another certID object (that could
|
| + * therefore we are unable to produce another certID object (that could
|
| * be stored in the cache).
|
| *
|
| * Should we ever implement code to produce a deep copy of certID,
|
| * then this could be changed to allow updating the cache.
|
| - * The duplication would have to be done in
|
| + * The duplication would have to be done in
|
| * cert_ProcessOCSPResponse, if the out parameter to indicate
|
| * a transfer of ownership is NULL.
|
| */
|
| - return cert_ProcessOCSPResponse(handle, response, certID,
|
| - signerCert, time,
|
| + return cert_ProcessOCSPResponse(handle, response, certID,
|
| + signerCert, time,
|
| NULL, NULL);
|
| }
|
|
|
| @@ -5630,23 +5569,23 @@ CERT_GetOCSPStatusForCertID(CERTCertDBHandle *handle,
|
| * The first 5 parameters match the definition of CERT_GetOCSPStatusForCertID.
|
| */
|
| SECStatus
|
| -cert_ProcessOCSPResponse(CERTCertDBHandle *handle,
|
| - CERTOCSPResponse *response,
|
| - CERTOCSPCertID *certID,
|
| - CERTCertificate *signerCert,
|
| - PRTime time,
|
| - PRBool *certIDWasConsumed,
|
| - SECStatus *cacheUpdateStatus)
|
| +cert_ProcessOCSPResponse(CERTCertDBHandle *handle,
|
| + CERTOCSPResponse *response,
|
| + CERTOCSPCertID *certID,
|
| + CERTCertificate *signerCert,
|
| + PRTime time,
|
| + PRBool *certIDWasConsumed,
|
| + SECStatus *cacheUpdateStatus)
|
| {
|
| SECStatus rv;
|
| SECStatus rv_cache = SECSuccess;
|
| CERTOCSPSingleResponse *single = NULL;
|
|
|
| - rv = ocsp_GetVerifiedSingleResponseForCertID(handle, response, certID,
|
| + rv = ocsp_GetVerifiedSingleResponseForCertID(handle, response, certID,
|
| signerCert, time, &single);
|
| if (rv == SECSuccess) {
|
| /*
|
| - * Check whether the status says revoked, and if so
|
| + * Check whether the status says revoked, and if so
|
| * how that compares to the time value passed into this routine.
|
| */
|
| rv = ocsp_SingleResponseCertHasGoodStatus(single, time);
|
| @@ -5654,15 +5593,15 @@ cert_ProcessOCSPResponse(CERTCertDBHandle *handle,
|
|
|
| if (certIDWasConsumed) {
|
| /*
|
| - * We don't have copy-of-certid implemented. In order to update
|
| - * the cache, the caller must supply an out variable
|
| + * We don't have copy-of-certid implemented. In order to update
|
| + * the cache, the caller must supply an out variable
|
| * certIDWasConsumed, allowing us to return ownership status.
|
| */
|
| -
|
| +
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| if (OCSP_Global.maxCacheEntries >= 0) {
|
| /* single == NULL means: remember response failure */
|
| - rv_cache =
|
| + rv_cache =
|
| ocsp_CreateOrUpdateCacheEntry(&OCSP_Global.cache, certID,
|
| single, certIDWasConsumed);
|
| }
|
| @@ -5677,12 +5616,12 @@ cert_ProcessOCSPResponse(CERTCertDBHandle *handle,
|
|
|
| SECStatus
|
| cert_RememberOCSPProcessingFailure(CERTOCSPCertID *certID,
|
| - PRBool *certIDWasConsumed)
|
| + PRBool *certIDWasConsumed)
|
| {
|
| SECStatus rv = SECSuccess;
|
| PR_EnterMonitor(OCSP_Global.monitor);
|
| if (OCSP_Global.maxCacheEntries >= 0) {
|
| - rv = ocsp_CreateOrUpdateCacheEntry(&OCSP_Global.cache, certID, NULL,
|
| + rv = ocsp_CreateOrUpdateCacheEntry(&OCSP_Global.cache, certID, NULL,
|
| certIDWasConsumed);
|
| }
|
| PR_ExitMonitor(OCSP_Global.monitor);
|
| @@ -5705,12 +5644,12 @@ ocsp_DestroyStatusChecking(CERTStatusConfig *statusConfig)
|
| statusContext = statusConfig->statusContext;
|
| PORT_Assert(statusContext != NULL);
|
| if (statusContext == NULL)
|
| - return SECFailure;
|
| + return SECFailure;
|
|
|
| if (statusContext->defaultResponderURI != NULL)
|
| - PORT_Free(statusContext->defaultResponderURI);
|
| + PORT_Free(statusContext->defaultResponderURI);
|
| if (statusContext->defaultResponderNickname != NULL)
|
| - PORT_Free(statusContext->defaultResponderNickname);
|
| + PORT_Free(statusContext->defaultResponderNickname);
|
|
|
| PORT_Free(statusContext);
|
| statusConfig->statusContext = NULL;
|
| @@ -5720,7 +5659,6 @@ ocsp_DestroyStatusChecking(CERTStatusConfig *statusConfig)
|
| return SECSuccess;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DisableOCSPChecking
|
| * Turns off OCSP checking for the given certificate database.
|
| @@ -5743,22 +5681,22 @@ CERT_DisableOCSPChecking(CERTCertDBHandle *handle)
|
| ocspCheckingContext *statusContext;
|
|
|
| if (handle == NULL) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| statusConfig = CERT_GetStatusConfig(handle);
|
| statusContext = ocsp_GetCheckingContext(handle);
|
| if (statusContext == NULL)
|
| - return SECFailure;
|
| + return SECFailure;
|
|
|
| if (statusConfig->statusChecker != CERT_CheckOCSPStatus) {
|
| - /*
|
| - * Status configuration is present, but either not currently
|
| - * enabled or not for OCSP.
|
| - */
|
| - PORT_SetError(SEC_ERROR_OCSP_NOT_ENABLED);
|
| - return SECFailure;
|
| + /*
|
| + * Status configuration is present, but either not currently
|
| + * enabled or not for OCSP.
|
| + */
|
| + PORT_SetError(SEC_ERROR_OCSP_NOT_ENABLED);
|
| + return SECFailure;
|
| }
|
|
|
| /* cache no longer necessary */
|
| @@ -5786,17 +5724,17 @@ ocsp_InitStatusChecking(CERTCertDBHandle *handle)
|
|
|
| PORT_Assert(CERT_GetStatusConfig(handle) == NULL);
|
| if (CERT_GetStatusConfig(handle) != NULL) {
|
| - /* XXX or call statusConfig->statusDestroy and continue? */
|
| - return SECFailure;
|
| + /* XXX or call statusConfig->statusDestroy and continue? */
|
| + return SECFailure;
|
| }
|
|
|
| statusConfig = PORT_ZNew(CERTStatusConfig);
|
| if (statusConfig == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| statusContext = PORT_ZNew(ocspCheckingContext);
|
| if (statusContext == NULL)
|
| - goto loser;
|
| + goto loser;
|
|
|
| statusConfig->statusDestroy = ocsp_DestroyStatusChecking;
|
| statusConfig->statusContext = statusContext;
|
| @@ -5807,11 +5745,10 @@ ocsp_InitStatusChecking(CERTCertDBHandle *handle)
|
|
|
| loser:
|
| if (statusConfig != NULL)
|
| - PORT_Free(statusConfig);
|
| + PORT_Free(statusConfig);
|
| return SECFailure;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_EnableOCSPChecking
|
| * Turns on OCSP checking for the given certificate database.
|
| @@ -5826,23 +5763,23 @@ SECStatus
|
| CERT_EnableOCSPChecking(CERTCertDBHandle *handle)
|
| {
|
| CERTStatusConfig *statusConfig;
|
| -
|
| +
|
| SECStatus rv;
|
|
|
| if (handle == NULL) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| statusConfig = CERT_GetStatusConfig(handle);
|
| if (statusConfig == NULL) {
|
| - rv = ocsp_InitStatusChecking(handle);
|
| - if (rv != SECSuccess)
|
| - return rv;
|
| + rv = ocsp_InitStatusChecking(handle);
|
| + if (rv != SECSuccess)
|
| + return rv;
|
|
|
| - /* Get newly established value */
|
| - statusConfig = CERT_GetStatusConfig(handle);
|
| - PORT_Assert(statusConfig != NULL);
|
| + /* Get newly established value */
|
| + statusConfig = CERT_GetStatusConfig(handle);
|
| + PORT_Assert(statusConfig != NULL);
|
| }
|
|
|
| /*
|
| @@ -5854,7 +5791,6 @@ CERT_EnableOCSPChecking(CERTCertDBHandle *handle)
|
| return SECSuccess;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_SetOCSPDefaultResponder
|
| * Specify the location and cert of the default responder.
|
| @@ -5881,7 +5817,7 @@ CERT_EnableOCSPChecking(CERTCertDBHandle *handle)
|
| */
|
| SECStatus
|
| CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| - const char *url, const char *name)
|
| + const char *url, const char *name)
|
| {
|
| CERTCertificate *cert;
|
| ocspCheckingContext *statusContext;
|
| @@ -5890,12 +5826,12 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| SECStatus rv;
|
|
|
| if (handle == NULL || url == NULL || name == NULL) {
|
| - /*
|
| - * XXX When interface is exported, probably want better errors;
|
| - * perhaps different one for each parameter.
|
| - */
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + /*
|
| + * XXX When interface is exported, probably want better errors;
|
| + * perhaps different one for each parameter.
|
| + */
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| /*
|
| @@ -5905,15 +5841,15 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| * XXX Shouldn't need that cast if the FindCertByNickname interface
|
| * used const to convey that it does not modify the name. Maybe someday.
|
| */
|
| - cert = CERT_FindCertByNickname(handle, (char *) name);
|
| + cert = CERT_FindCertByNickname(handle, (char *)name);
|
| if (cert == NULL) {
|
| - /*
|
| - * look for the cert on an external token.
|
| - */
|
| - cert = PK11_FindCertFromNickname((char *)name, NULL);
|
| + /*
|
| + * look for the cert on an external token.
|
| + */
|
| + cert = PK11_FindCertFromNickname((char *)name, NULL);
|
| }
|
| if (cert == NULL)
|
| - return SECFailure;
|
| + return SECFailure;
|
|
|
| /*
|
| * Make a copy of the url and nickname.
|
| @@ -5921,8 +5857,8 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| url_copy = PORT_Strdup(url);
|
| name_copy = PORT_Strdup(name);
|
| if (url_copy == NULL || name_copy == NULL) {
|
| - rv = SECFailure;
|
| - goto loser;
|
| + rv = SECFailure;
|
| + goto loser;
|
| }
|
|
|
| statusContext = ocsp_GetCheckingContext(handle);
|
| @@ -5931,12 +5867,12 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| * Allocate and init the context if it doesn't already exist.
|
| */
|
| if (statusContext == NULL) {
|
| - rv = ocsp_InitStatusChecking(handle);
|
| - if (rv != SECSuccess)
|
| - goto loser;
|
| + rv = ocsp_InitStatusChecking(handle);
|
| + if (rv != SECSuccess)
|
| + goto loser;
|
|
|
| - statusContext = ocsp_GetCheckingContext(handle);
|
| - PORT_Assert(statusContext != NULL); /* extreme paranoia */
|
| + statusContext = ocsp_GetCheckingContext(handle);
|
| + PORT_Assert(statusContext != NULL); /* extreme paranoia */
|
| }
|
|
|
| /*
|
| @@ -5949,9 +5885,9 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| * Get rid of old url and name if there.
|
| */
|
| if (statusContext->defaultResponderNickname != NULL)
|
| - PORT_Free(statusContext->defaultResponderNickname);
|
| + PORT_Free(statusContext->defaultResponderNickname);
|
| if (statusContext->defaultResponderURI != NULL)
|
| - PORT_Free(statusContext->defaultResponderURI);
|
| + PORT_Free(statusContext->defaultResponderURI);
|
|
|
| /*
|
| * And replace them with the new ones.
|
| @@ -5966,13 +5902,13 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| * enabled.
|
| */
|
| if (statusContext->defaultResponderCert != NULL) {
|
| - CERT_DestroyCertificate(statusContext->defaultResponderCert);
|
| - statusContext->defaultResponderCert = cert;
|
| + CERT_DestroyCertificate(statusContext->defaultResponderCert);
|
| + statusContext->defaultResponderCert = cert;
|
| /*OCSP enabled, switching responder: clear cache*/
|
| CERT_ClearOCSPCache();
|
| } else {
|
| - PORT_Assert(statusContext->useDefaultResponder == PR_FALSE);
|
| - CERT_DestroyCertificate(cert);
|
| + PORT_Assert(statusContext->useDefaultResponder == PR_FALSE);
|
| + CERT_DestroyCertificate(cert);
|
| /*OCSP currently not enabled, no need to clear cache*/
|
| }
|
|
|
| @@ -5981,13 +5917,12 @@ CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
|
| loser:
|
| CERT_DestroyCertificate(cert);
|
| if (url_copy != NULL)
|
| - PORT_Free(url_copy);
|
| + PORT_Free(url_copy);
|
| if (name_copy != NULL)
|
| - PORT_Free(name_copy);
|
| + PORT_Free(name_copy);
|
| return rv;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_EnableOCSPDefaultResponder
|
| * Turns on use of a default responder when OCSP checking.
|
| @@ -6014,36 +5949,36 @@ CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle)
|
| SECCertificateUsage usage;
|
|
|
| if (handle == NULL) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| statusContext = ocsp_GetCheckingContext(handle);
|
|
|
| if (statusContext == NULL) {
|
| - /*
|
| - * Strictly speaking, the error already set is "correct",
|
| - * but cover over it with one more helpful in this context.
|
| - */
|
| - PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| - return SECFailure;
|
| + /*
|
| + * Strictly speaking, the error already set is "correct",
|
| + * but cover over it with one more helpful in this context.
|
| + */
|
| + PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| + return SECFailure;
|
| }
|
|
|
| if (statusContext->defaultResponderURI == NULL) {
|
| - PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| + return SECFailure;
|
| }
|
|
|
| if (statusContext->defaultResponderNickname == NULL) {
|
| - PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER);
|
| + return SECFailure;
|
| }
|
|
|
| /*
|
| * Find the cert for the nickname.
|
| */
|
| cert = CERT_FindCertByNickname(handle,
|
| - statusContext->defaultResponderNickname);
|
| + statusContext->defaultResponderNickname);
|
| if (cert == NULL) {
|
| cert = PK11_FindCertFromNickname(statusContext->defaultResponderNickname,
|
| NULL);
|
| @@ -6054,13 +5989,13 @@ CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle)
|
| */
|
| PORT_Assert(cert != NULL);
|
| if (cert == NULL)
|
| - return SECFailure;
|
| + return SECFailure;
|
|
|
| - /*
|
| - * Supplied cert should at least have a signing capability in order for us
|
| - * to use it as a trusted responder cert. Ability to sign is guaranteed if
|
| - * cert is validated to have any set of the usages below.
|
| - */
|
| + /*
|
| + * Supplied cert should at least have a signing capability in order for us
|
| + * to use it as a trusted responder cert. Ability to sign is guaranteed if
|
| + * cert is validated to have any set of the usages below.
|
| + */
|
| rv = CERT_VerifyCertificateNow(handle, cert, PR_TRUE,
|
| certificateUsageCheckAllUsages,
|
| NULL, &usage);
|
| @@ -6071,8 +6006,8 @@ CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle)
|
| certificateUsageObjectSigner |
|
| certificateUsageStatusResponder |
|
| certificateUsageSSLCA)) == 0) {
|
| - PORT_SetError(SEC_ERROR_OCSP_RESPONDER_CERT_INVALID);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_OCSP_RESPONDER_CERT_INVALID);
|
| + return SECFailure;
|
| }
|
|
|
| /*
|
| @@ -6090,7 +6025,6 @@ CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle)
|
| return SECSuccess;
|
| }
|
|
|
| -
|
| /*
|
| * FUNCTION: CERT_DisableOCSPDefaultResponder
|
| * Turns off use of a default responder when OCSP checking.
|
| @@ -6111,23 +6045,23 @@ CERT_DisableOCSPDefaultResponder(CERTCertDBHandle *handle)
|
| CERTCertificate *tmpCert;
|
|
|
| if (handle == NULL) {
|
| - PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| - return SECFailure;
|
| + PORT_SetError(SEC_ERROR_INVALID_ARGS);
|
| + return SECFailure;
|
| }
|
|
|
| statusConfig = CERT_GetStatusConfig(handle);
|
| if (statusConfig == NULL)
|
| - return SECSuccess;
|
| + return SECSuccess;
|
|
|
| statusContext = ocsp_GetCheckingContext(handle);
|
| PORT_Assert(statusContext != NULL);
|
| if (statusContext == NULL)
|
| - return SECFailure;
|
| + return SECFailure;
|
|
|
| tmpCert = statusContext->defaultResponderCert;
|
| if (tmpCert) {
|
| - statusContext->defaultResponderCert = NULL;
|
| - CERT_DestroyCertificate(tmpCert);
|
| + statusContext->defaultResponderCert = NULL;
|
| + CERT_DestroyCertificate(tmpCert);
|
| /* we don't allow a mix of cache entries from different responders */
|
| CERT_ClearOCSPCache();
|
| }
|
| @@ -6159,29 +6093,29 @@ CERT_GetOCSPResponseStatus(CERTOCSPResponse *response)
|
| {
|
| PORT_Assert(response);
|
| if (response->statusValue == ocspResponse_successful)
|
| - return SECSuccess;
|
| + return SECSuccess;
|
|
|
| switch (response->statusValue) {
|
| - case ocspResponse_malformedRequest:
|
| - PORT_SetError(SEC_ERROR_OCSP_MALFORMED_REQUEST);
|
| - break;
|
| - case ocspResponse_internalError:
|
| - PORT_SetError(SEC_ERROR_OCSP_SERVER_ERROR);
|
| - break;
|
| - case ocspResponse_tryLater:
|
| - PORT_SetError(SEC_ERROR_OCSP_TRY_SERVER_LATER);
|
| - break;
|
| - case ocspResponse_sigRequired:
|
| - /* XXX We *should* retry with a signature, if possible. */
|
| - PORT_SetError(SEC_ERROR_OCSP_REQUEST_NEEDS_SIG);
|
| - break;
|
| - case ocspResponse_unauthorized:
|
| - PORT_SetError(SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST);
|
| - break;
|
| - case ocspResponse_unused:
|
| - default:
|
| - PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS);
|
| - break;
|
| + case ocspResponse_malformedRequest:
|
| + PORT_SetError(SEC_ERROR_OCSP_MALFORMED_REQUEST);
|
| + break;
|
| + case ocspResponse_internalError:
|
| + PORT_SetError(SEC_ERROR_OCSP_SERVER_ERROR);
|
| + break;
|
| + case ocspResponse_tryLater:
|
| + PORT_SetError(SEC_ERROR_OCSP_TRY_SERVER_LATER);
|
| + break;
|
| + case ocspResponse_sigRequired:
|
| + /* XXX We *should* retry with a signature, if possible. */
|
| + PORT_SetError(SEC_ERROR_OCSP_REQUEST_NEEDS_SIG);
|
| + break;
|
| + case ocspResponse_unauthorized:
|
| + PORT_SetError(SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST);
|
| + break;
|
| + case ocspResponse_unused:
|
| + default:
|
| + PORT_SetError(SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS);
|
| + break;
|
| }
|
| return SECFailure;
|
| }
|
|
|