Index: mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c |
=================================================================== |
--- mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c (revision 191424) |
+++ mozilla/security/nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_crlentry.c (working copy) |
@@ -1,880 +0,0 @@ |
-/* This Source Code Form is subject to the terms of the Mozilla Public |
- * License, v. 2.0. If a copy of the MPL was not distributed with this |
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
-/* |
- * pkix_pl_crlentry.c |
- * |
- * CRLENTRY Function Definitions |
- * |
- */ |
- |
-#include "pkix_pl_crlentry.h" |
- |
-/* --Private-CRLEntry-Functions------------------------------------- */ |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_Destroy |
- * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_Destroy( |
- PKIX_PL_Object *object, |
- void *plContext) |
-{ |
- PKIX_PL_CRLEntry *crlEntry = NULL; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Destroy"); |
- PKIX_NULLCHECK_ONE(object); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_CRLENTRY_TYPE, plContext), |
- PKIX_OBJECTNOTCRLENTRY); |
- |
- crlEntry = (PKIX_PL_CRLEntry*)object; |
- |
- /* crlEntry->nssCrlEntry is freed by NSS when freeing CRL */ |
- crlEntry->userReasonCode = 0; |
- crlEntry->userReasonCodeAbsent = PKIX_FALSE; |
- crlEntry->nssCrlEntry = NULL; |
- PKIX_DECREF(crlEntry->serialNumber); |
- PKIX_DECREF(crlEntry->critExtOids); |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_ToString_Helper |
- * |
- * DESCRIPTION: |
- * Helper function that creates a string representation of the CRLEntry |
- * pointed to by "crlEntry" and stores it at "pString". |
- * |
- * PARAMETERS |
- * "crlEntry" |
- * Address of CRLEntry whose string representation is desired. |
- * Must be non-NULL. |
- * "pString" |
- * Address where object pointer will be stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a CRLEntry Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_pl_CRLEntry_ToString_Helper( |
- PKIX_PL_CRLEntry *crlEntry, |
- PKIX_PL_String **pString, |
- void *plContext) |
-{ |
- char *asciiFormat = NULL; |
- PKIX_List *critExtOIDs = NULL; |
- PKIX_PL_String *crlEntryString = NULL; |
- PKIX_PL_String *formatString = NULL; |
- PKIX_PL_String *crlSerialNumberString = NULL; |
- PKIX_PL_String *crlRevocationDateString = NULL; |
- PKIX_PL_String *critExtOIDsString = NULL; |
- PKIX_Int32 reasonCode = 0; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_ToString_Helper"); |
- PKIX_NULLCHECK_FOUR |
- (crlEntry, |
- crlEntry->serialNumber, |
- crlEntry->nssCrlEntry, |
- pString); |
- |
- asciiFormat = |
- "\n\t[\n" |
- "\tSerialNumber: %s\n" |
- "\tReasonCode: %d\n" |
- "\tRevocationDate: %s\n" |
- "\tCritExtOIDs: %s\n" |
- "\t]\n\t"; |
- |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- asciiFormat, |
- 0, |
- &formatString, |
- plContext), |
- PKIX_STRINGCREATEFAILED); |
- |
- /* SerialNumber */ |
- PKIX_CHECK(PKIX_PL_Object_ToString |
- ((PKIX_PL_Object *)crlEntry->serialNumber, |
- &crlSerialNumberString, |
- plContext), |
- PKIX_BIGINTTOSTRINGHELPERFAILED); |
- |
- /* RevocationDate - No Date object created, use nss data directly */ |
- PKIX_CHECK(pkix_pl_Date_ToString_Helper |
- (&(crlEntry->nssCrlEntry->revocationDate), |
- &crlRevocationDateString, |
- plContext), |
- PKIX_DATETOSTRINGHELPERFAILED); |
- |
- /* CriticalExtensionOIDs */ |
- PKIX_CHECK(PKIX_PL_CRLEntry_GetCriticalExtensionOIDs |
- (crlEntry, &critExtOIDs, plContext), |
- PKIX_CRLENTRYGETCRITICALEXTENSIONOIDSFAILED); |
- |
- PKIX_TOSTRING(critExtOIDs, &critExtOIDsString, plContext, |
- PKIX_LISTTOSTRINGFAILED); |
- |
- /* Revocation Reason Code */ |
- PKIX_CHECK(PKIX_PL_CRLEntry_GetCRLEntryReasonCode |
- (crlEntry, &reasonCode, plContext), |
- PKIX_CRLENTRYGETCRLENTRYREASONCODEFAILED); |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&crlEntryString, |
- plContext, |
- formatString, |
- crlSerialNumberString, |
- reasonCode, |
- crlRevocationDateString, |
- critExtOIDsString), |
- PKIX_SPRINTFFAILED); |
- |
- *pString = crlEntryString; |
- |
-cleanup: |
- |
- PKIX_DECREF(critExtOIDs); |
- PKIX_DECREF(crlSerialNumberString); |
- PKIX_DECREF(crlRevocationDateString); |
- PKIX_DECREF(critExtOIDsString); |
- PKIX_DECREF(formatString); |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_ToString |
- * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_ToString( |
- PKIX_PL_Object *object, |
- PKIX_PL_String **pString, |
- void *plContext) |
-{ |
- PKIX_PL_String *crlEntryString = NULL; |
- PKIX_PL_CRLEntry *crlEntry = NULL; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_ToString"); |
- PKIX_NULLCHECK_TWO(object, pString); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_CRLENTRY_TYPE, plContext), |
- PKIX_OBJECTNOTCRLENTRY); |
- |
- crlEntry = (PKIX_PL_CRLEntry *) object; |
- |
- PKIX_CHECK(pkix_pl_CRLEntry_ToString_Helper |
- (crlEntry, &crlEntryString, plContext), |
- PKIX_CRLENTRYTOSTRINGHELPERFAILED); |
- |
- *pString = crlEntryString; |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_Extensions_Hashcode |
- * DESCRIPTION: |
- * |
- * For each CRL Entry extension stored at NSS structure CERTCertExtension, |
- * get its derbyte data and do the hash. |
- * |
- * PARAMETERS |
- * "extensions" |
- * Address of arrray of CERTCertExtension whose hash value is desired. |
- * Must be non-NULL. |
- * "pHashValue" |
- * Address where the final hash value is returned. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditional Thread Safe |
- * Though the value of extensions once created is not supposed to change, |
- * it may be de-allocated while we are accessing it. But since we are |
- * validating the object, it is unlikely we or someone is de-allocating |
- * at the moment. |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns an OID Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_Extensions_Hashcode( |
- CERTCertExtension **extensions, |
- PKIX_UInt32 *pHashValue, |
- void *plContext) |
-{ |
- CERTCertExtension *extension = NULL; |
- PRArenaPool *arena = NULL; |
- PKIX_UInt32 extHash = 0; |
- PKIX_UInt32 hashValue = 0; |
- SECItem *derBytes = NULL; |
- SECItem *resultSecItem = NULL; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Extensions_Hashcode"); |
- PKIX_NULLCHECK_TWO(extensions, pHashValue); |
- |
- if (extensions) { |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_NewArena\n"); |
- arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
- if (arena == NULL) { |
- PKIX_ERROR(PKIX_OUTOFMEMORY); |
- } |
- |
- while (*extensions) { |
- |
- extension = *extensions++; |
- |
- PKIX_NULLCHECK_ONE(extension); |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_ArenaZNew\n"); |
- derBytes = PORT_ArenaZNew(arena, SECItem); |
- if (derBytes == NULL) { |
- PKIX_ERROR(PKIX_PORTARENAALLOCFAILED); |
- } |
- |
- PKIX_CRLENTRY_DEBUG |
- ("\t\tCalling SEC_ASN1EncodeItem\n"); |
- resultSecItem = SEC_ASN1EncodeItem |
- (arena, |
- derBytes, |
- extension, |
- CERT_CertExtensionTemplate); |
- |
- if (resultSecItem == NULL){ |
- PKIX_ERROR(PKIX_SECASN1ENCODEITEMFAILED); |
- } |
- |
- PKIX_CHECK(pkix_hash |
- (derBytes->data, |
- derBytes->len, |
- &extHash, |
- plContext), |
- PKIX_HASHFAILED); |
- |
- hashValue += (extHash << 7); |
- |
- } |
- } |
- |
- *pHashValue = hashValue; |
- |
-cleanup: |
- |
- if (arena){ |
- /* Note that freeing the arena also frees derBytes */ |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_FreeArena\n"); |
- PORT_FreeArena(arena, PR_FALSE); |
- arena = NULL; |
- } |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_Hashcode |
- * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_Hashcode( |
- PKIX_PL_Object *object, |
- PKIX_UInt32 *pHashcode, |
- void *plContext) |
-{ |
- SECItem *nssDate = NULL; |
- PKIX_PL_CRLEntry *crlEntry = NULL; |
- PKIX_UInt32 crlEntryHash; |
- PKIX_UInt32 hashValue; |
- PKIX_Int32 reasonCode = 0; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Hashcode"); |
- PKIX_NULLCHECK_TWO(object, pHashcode); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_CRLENTRY_TYPE, plContext), |
- PKIX_OBJECTNOTCRLENTRY); |
- |
- crlEntry = (PKIX_PL_CRLEntry *)object; |
- |
- PKIX_NULLCHECK_ONE(crlEntry->nssCrlEntry); |
- nssDate = &(crlEntry->nssCrlEntry->revocationDate); |
- |
- PKIX_NULLCHECK_ONE(nssDate->data); |
- |
- PKIX_CHECK(pkix_hash |
- ((const unsigned char *)nssDate->data, |
- nssDate->len, |
- &crlEntryHash, |
- plContext), |
- PKIX_ERRORGETTINGHASHCODE); |
- |
- PKIX_CHECK(PKIX_PL_Object_Hashcode |
- ((PKIX_PL_Object *)crlEntry->serialNumber, |
- &hashValue, |
- plContext), |
- PKIX_OBJECTHASHCODEFAILED); |
- |
- crlEntryHash += (hashValue << 7); |
- |
- hashValue = 0; |
- |
- if (crlEntry->nssCrlEntry->extensions) { |
- |
- PKIX_CHECK(pkix_pl_CRLEntry_Extensions_Hashcode |
- (crlEntry->nssCrlEntry->extensions, &hashValue, plContext), |
- PKIX_CRLENTRYEXTENSIONSHASHCODEFAILED); |
- } |
- |
- crlEntryHash += (hashValue << 7); |
- |
- PKIX_CHECK(PKIX_PL_CRLEntry_GetCRLEntryReasonCode |
- (crlEntry, &reasonCode, plContext), |
- PKIX_CRLENTRYGETCRLENTRYREASONCODEFAILED); |
- |
- crlEntryHash += (reasonCode + 777) << 3; |
- |
- *pHashcode = crlEntryHash; |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLENTRY_Extensions_Equals |
- * DESCRIPTION: |
- * |
- * Compare each extension's DERbyte data in "firstExtensions" with extension |
- * in "secondExtensions" in sequential order and store the result in |
- * "pResult". |
- * |
- * PARAMETERS |
- * "firstExtensions" |
- * Address of first NSS structure CERTCertExtension to be compared. |
- * Must be non-NULL. |
- * "secondExtensions" |
- * Address of second NSS structure CERTCertExtension to be compared. |
- * Must be non-NULL. |
- * "pResult" |
- * Address where the comparison result is returned. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * Though the value of extensions once created is not supposed to change, |
- * it may be de-allocated while we are accessing it. But since we are |
- * validating the object, it is unlikely we or someone is de-allocating |
- * at the moment. |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns an OID Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_Extensions_Equals( |
- CERTCertExtension **extensions1, |
- CERTCertExtension **extensions2, |
- PKIX_Boolean *pResult, |
- void *plContext) |
-{ |
- CERTCertExtension **firstExtensions; |
- CERTCertExtension **secondExtensions; |
- CERTCertExtension *firstExtension = NULL; |
- CERTCertExtension *secondExtension = NULL; |
- PRArenaPool *arena = NULL; |
- PKIX_Boolean cmpResult = PKIX_FALSE; |
- SECItem *firstDerBytes = NULL; |
- SECItem *secondDerBytes = NULL; |
- SECItem *firstResultSecItem = NULL; |
- SECItem *secondResultSecItem = NULL; |
- PKIX_UInt32 firstNumExt = 0; |
- PKIX_UInt32 secondNumExt = 0; |
- SECComparison secResult; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Extensions_Equals"); |
- PKIX_NULLCHECK_THREE(extensions1, extensions2, pResult); |
- |
- firstExtensions = extensions1; |
- secondExtensions = extensions2; |
- |
- if (firstExtensions) { |
- while (*firstExtensions) { |
- firstExtension = *firstExtensions++; |
- firstNumExt++; |
- } |
- } |
- |
- if (secondExtensions) { |
- while (*secondExtensions) { |
- secondExtension = *secondExtensions++; |
- secondNumExt++; |
- } |
- } |
- |
- if (firstNumExt != secondNumExt) { |
- *pResult = PKIX_FALSE; |
- goto cleanup; |
- } |
- |
- if (firstNumExt == 0 && secondNumExt == 0) { |
- *pResult = PKIX_TRUE; |
- goto cleanup; |
- } |
- |
- /* now have equal number, but non-zero extension items to compare */ |
- |
- firstExtensions = extensions1; |
- secondExtensions = extensions2; |
- |
- cmpResult = PKIX_TRUE; |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_NewArena\n"); |
- arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE*2); |
- if (arena == NULL) { |
- PKIX_ERROR(PKIX_OUTOFMEMORY); |
- } |
- |
- while (firstNumExt--) { |
- |
- firstExtension = *firstExtensions++; |
- secondExtension = *secondExtensions++; |
- |
- PKIX_NULLCHECK_TWO(firstExtension, secondExtension); |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_ArenaZNew\n"); |
- firstDerBytes = PORT_ArenaZNew(arena, SECItem); |
- if (firstDerBytes == NULL) { |
- PKIX_ERROR(PKIX_PORTARENAALLOCFAILED); |
- } |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_ArenaZNew\n"); |
- secondDerBytes = PORT_ArenaZNew(arena, SECItem); |
- if (secondDerBytes == NULL) { |
- PKIX_ERROR(PKIX_PORTARENAALLOCFAILED); |
- } |
- |
- PKIX_CRLENTRY_DEBUG |
- ("\t\tCalling SEC_ASN1EncodeItem\n"); |
- firstResultSecItem = SEC_ASN1EncodeItem |
- (arena, |
- firstDerBytes, |
- firstExtension, |
- CERT_CertExtensionTemplate); |
- |
- if (firstResultSecItem == NULL){ |
- PKIX_ERROR(PKIX_SECASN1ENCODEITEMFAILED); |
- } |
- |
- PKIX_CRLENTRY_DEBUG |
- ("\t\tCalling SEC_ASN1EncodeItem\n"); |
- secondResultSecItem = SEC_ASN1EncodeItem |
- (arena, |
- secondDerBytes, |
- secondExtension, |
- CERT_CertExtensionTemplate); |
- |
- if (secondResultSecItem == NULL){ |
- PKIX_ERROR(PKIX_SECASN1ENCODEITEMFAILED); |
- } |
- |
- PKIX_CRLENTRY_DEBUG("\t\tCalling SECITEM_CompareItem\n"); |
- secResult = SECITEM_CompareItem |
- (firstResultSecItem, secondResultSecItem); |
- |
- if (secResult != SECEqual) { |
- cmpResult = PKIX_FALSE; |
- break; |
- } |
- |
- } |
- |
- *pResult = cmpResult; |
- |
-cleanup: |
- |
- if (arena){ |
- /* Note that freeing the arena also frees derBytes */ |
- PKIX_CRLENTRY_DEBUG("\t\tCalling PORT_FreeArena\n"); |
- PORT_FreeArena(arena, PR_FALSE); |
- arena = NULL; |
- } |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_Equals |
- * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_Equals( |
- PKIX_PL_Object *firstObject, |
- PKIX_PL_Object *secondObject, |
- PKIX_Boolean *pResult, |
- void *plContext) |
-{ |
- PKIX_PL_CRLEntry *firstCrlEntry = NULL; |
- PKIX_PL_CRLEntry *secondCrlEntry = NULL; |
- PKIX_UInt32 secondType; |
- PKIX_Boolean cmpResult = PKIX_FALSE; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Equals"); |
- PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); |
- |
- /* test that firstObject is a CRLEntry */ |
- PKIX_CHECK(pkix_CheckType(firstObject, PKIX_CRLENTRY_TYPE, plContext), |
- PKIX_FIRSTOBJECTNOTCRLENTRY); |
- |
- firstCrlEntry = (PKIX_PL_CRLEntry *)firstObject; |
- secondCrlEntry = (PKIX_PL_CRLEntry *)secondObject; |
- |
- PKIX_NULLCHECK_TWO |
- (firstCrlEntry->nssCrlEntry, secondCrlEntry->nssCrlEntry); |
- |
- /* |
- * Since we know firstObject is a CRLEntry, if both references are |
- * identical, they must be equal |
- */ |
- if (firstCrlEntry == secondCrlEntry){ |
- *pResult = PKIX_TRUE; |
- goto cleanup; |
- } |
- |
- /* |
- * If secondCrlEntry isn't a CRL Entry, we don't throw an error. |
- * We simply return a Boolean result of FALSE |
- */ |
- *pResult = PKIX_FALSE; |
- PKIX_CHECK(PKIX_PL_Object_GetType |
- ((PKIX_PL_Object *)secondCrlEntry, &secondType, plContext), |
- PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); |
- if (secondType != PKIX_CRLENTRY_TYPE) goto cleanup; |
- |
- /* Compare userSerialNumber */ |
- PKIX_CRLENTRY_DEBUG("\t\tCalling SECITEM_CompareItem\n"); |
- if (SECITEM_CompareItem( |
- &(((PKIX_PL_CRLEntry *)firstCrlEntry)->nssCrlEntry->serialNumber), |
- &(((PKIX_PL_CRLEntry *)secondCrlEntry)->nssCrlEntry->serialNumber)) |
- != SECEqual) { |
- *pResult = PKIX_FALSE; |
- goto cleanup; |
- } |
- |
- /* Compare revocationDate */ |
- PKIX_CRLENTRY_DEBUG("\t\tCalling SECITEM_CompareItem\n"); |
- if (SECITEM_CompareItem |
- (&(((PKIX_PL_CRLEntry *)firstCrlEntry)->nssCrlEntry-> |
- revocationDate), |
- &(((PKIX_PL_CRLEntry *)secondCrlEntry)->nssCrlEntry-> |
- revocationDate)) |
- != SECEqual) { |
- *pResult = PKIX_FALSE; |
- goto cleanup; |
- } |
- |
- /* Compare Critical Extension List */ |
- PKIX_CHECK(pkix_pl_CRLEntry_Extensions_Equals |
- (firstCrlEntry->nssCrlEntry->extensions, |
- secondCrlEntry->nssCrlEntry->extensions, |
- &cmpResult, |
- plContext), |
- PKIX_CRLENTRYEXTENSIONSEQUALSFAILED); |
- |
- if (cmpResult != PKIX_TRUE){ |
- *pResult = PKIX_FALSE; |
- goto cleanup; |
- } |
- |
- cmpResult = (firstCrlEntry->userReasonCode == |
- secondCrlEntry->userReasonCode); |
- |
- *pResult = cmpResult; |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_RegisterSelf |
- * DESCRIPTION: |
- * Registers PKIX_CRLEntry_TYPE and its related functions with systemClasses[] |
- * THREAD SAFETY: |
- * Not Thread Safe - for performance and complexity reasons |
- * |
- * Since this function is only called by PKIX_PL_Initialize, which should |
- * only be called once, it is acceptable that this function is not |
- * thread-safe. |
- */ |
-PKIX_Error * |
-pkix_pl_CRLEntry_RegisterSelf(void *plContext) |
-{ |
- |
- extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
- pkix_ClassTable_Entry entry; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_RegisterSelf"); |
- |
- entry.description = "CRLEntry"; |
- entry.objCounter = 0; |
- entry.typeObjectSize = sizeof(PKIX_PL_CRLEntry); |
- entry.destructor = pkix_pl_CRLEntry_Destroy; |
- entry.equalsFunction = pkix_pl_CRLEntry_Equals; |
- entry.hashcodeFunction = pkix_pl_CRLEntry_Hashcode; |
- entry.toStringFunction = pkix_pl_CRLEntry_ToString; |
- entry.comparator = NULL; |
- entry.duplicateFunction = pkix_duplicateImmutable; |
- |
- systemClasses[PKIX_CRLENTRY_TYPE] = entry; |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_CreateEntry |
- * DESCRIPTION: |
- * |
- * Creates a new CRLEntry using the CertCrlEntry pointed to by "nssCrlEntry" |
- * and stores it at "pCrlEntry". Once created, a CRLEntry is immutable. |
- * |
- * revokedCertificates SEQUENCE OF SEQUENCE { |
- * userCertificate CertificateSerialNumber, |
- * revocationDate Time, |
- * crlEntryExtensions Extensions OPTIONAL |
- * -- if present, MUST be v2 |
- * |
- * PARAMETERS: |
- * "nssCrlEntry" |
- * Address of CERTCrlEntry representing an NSS CRL entry. |
- * Must be non-NULL. |
- * "pCrlEntry" |
- * Address where object pointer will be stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a CRLEntry Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_pl_CRLEntry_CreateEntry( |
- CERTCrlEntry *nssCrlEntry, /* entry data to be created from */ |
- PKIX_PL_CRLEntry **pCrlEntry, |
- void *plContext) |
-{ |
- PKIX_PL_CRLEntry *crlEntry = NULL; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_CreateEntry"); |
- PKIX_NULLCHECK_TWO(nssCrlEntry, pCrlEntry); |
- |
- PKIX_CHECK(PKIX_PL_Object_Alloc |
- (PKIX_CRLENTRY_TYPE, |
- sizeof (PKIX_PL_CRLEntry), |
- (PKIX_PL_Object **)&crlEntry, |
- plContext), |
- PKIX_COULDNOTCREATECRLENTRYOBJECT); |
- |
- crlEntry->nssCrlEntry = nssCrlEntry; |
- crlEntry->serialNumber = NULL; |
- crlEntry->critExtOids = NULL; |
- crlEntry->userReasonCode = 0; |
- crlEntry->userReasonCodeAbsent = PKIX_FALSE; |
- |
- *pCrlEntry = crlEntry; |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_CRLEntry_Create |
- * DESCRIPTION: |
- * |
- * Creates a List of CRLEntries using the array of CERTCrlEntries pointed to |
- * by "nssCrlEntries" and stores it at "pCrlEntryList". If "nssCrlEntries" is |
- * NULL, this function stores an empty List at "pCrlEntryList". |
- * } |
- * PARAMETERS: |
- * "nssCrlEntries" |
- * Address of array of CERTCrlEntries representing NSS CRL entries. |
- * Can be NULL if CRL has no NSS CRL entries. |
- * "pCrlEntryList" |
- * Address where object pointer will be stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a CRLEntry Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_pl_CRLEntry_Create( |
- CERTCrlEntry **nssCrlEntries, /* head of entry list */ |
- PKIX_List **pCrlEntryList, |
- void *plContext) |
-{ |
- PKIX_List *entryList = NULL; |
- PKIX_PL_CRLEntry *crlEntry = NULL; |
- CERTCrlEntry **entries = NULL; |
- SECItem serialNumberItem; |
- PKIX_PL_BigInt *serialNumber; |
- char *bytes = NULL; |
- PKIX_UInt32 length; |
- |
- PKIX_ENTER(CRLENTRY, "pkix_pl_CRLEntry_Create"); |
- PKIX_NULLCHECK_ONE(pCrlEntryList); |
- |
- entries = nssCrlEntries; |
- |
- PKIX_CHECK(PKIX_List_Create(&entryList, plContext), |
- PKIX_LISTCREATEFAILED); |
- |
- if (entries) { |
- while (*entries){ |
- PKIX_CHECK(pkix_pl_CRLEntry_CreateEntry |
- (*entries, &crlEntry, plContext), |
- PKIX_COULDNOTCREATECRLENTRYOBJECT); |
- |
- /* Get Serial Number */ |
- serialNumberItem = (*entries)->serialNumber; |
- length = serialNumberItem.len; |
- bytes = (char *)serialNumberItem.data; |
- |
- PKIX_CHECK(pkix_pl_BigInt_CreateWithBytes |
- (bytes, length, &serialNumber, plContext), |
- PKIX_BIGINTCREATEWITHBYTESFAILED); |
- |
- crlEntry->serialNumber = serialNumber; |
- crlEntry->nssCrlEntry = *entries; |
- |
- PKIX_CHECK(PKIX_List_AppendItem |
- (entryList, (PKIX_PL_Object *)crlEntry, plContext), |
- PKIX_LISTAPPENDITEMFAILED); |
- |
- PKIX_DECREF(crlEntry); |
- |
- entries++; |
- } |
- } |
- |
- *pCrlEntryList = entryList; |
- |
-cleanup: |
- PKIX_DECREF(crlEntry); |
- |
- if (PKIX_ERROR_RECEIVED){ |
- PKIX_DECREF(entryList); |
- } |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* --Public-CRLENTRY-Functions------------------------------------- */ |
- |
-/* |
- * FUNCTION: PKIX_PL_CRLEntry_GetCRLEntryReasonCode |
- * (see comments in pkix_pl_pki.h) |
- */ |
-PKIX_Error * |
-PKIX_PL_CRLEntry_GetCRLEntryReasonCode ( |
- PKIX_PL_CRLEntry *crlEntry, |
- PKIX_Int32 *pReason, |
- void *plContext) |
-{ |
- SECStatus status; |
- CERTCRLEntryReasonCode nssReasonCode; |
- |
- PKIX_ENTER(CRLENTRY, "PKIX_PL_CRLEntry_GetCRLEntryReasonCode"); |
- PKIX_NULLCHECK_TWO(crlEntry, pReason); |
- |
- if (!crlEntry->userReasonCodeAbsent && crlEntry->userReasonCode == 0) { |
- |
- PKIX_OBJECT_LOCK(crlEntry); |
- |
- if (!crlEntry->userReasonCodeAbsent && |
- crlEntry->userReasonCode == 0) { |
- |
- /* reason code has not been cached in */ |
- PKIX_CRLENTRY_DEBUG("\t\tCERT_FindCRLEntryReasonExten.\n"); |
- status = CERT_FindCRLEntryReasonExten |
- (crlEntry->nssCrlEntry, &nssReasonCode); |
- |
- if (status == SECSuccess) { |
- crlEntry->userReasonCode = (PKIX_Int32) nssReasonCode; |
- } else { |
- crlEntry->userReasonCodeAbsent = PKIX_TRUE; |
- } |
- } |
- |
- PKIX_OBJECT_UNLOCK(crlEntry); |
- |
- } |
- |
- *pReason = crlEntry->userReasonCode; |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |
- |
-/* |
- * FUNCTION: PKIX_PL_CRLEntry_GetCriticalExtensionOIDs |
- * (see comments in pkix_pl_pki.h) |
- */ |
-PKIX_Error * |
-PKIX_PL_CRLEntry_GetCriticalExtensionOIDs ( |
- PKIX_PL_CRLEntry *crlEntry, |
- PKIX_List **pList, /* list of PKIX_PL_OID */ |
- void *plContext) |
-{ |
- PKIX_List *oidsList = NULL; |
- CERTCertExtension **extensions; |
- |
- PKIX_ENTER(CRLENTRY, "PKIX_PL_CRLEntry_GetCriticalExtensionOIDs"); |
- PKIX_NULLCHECK_THREE(crlEntry, crlEntry->nssCrlEntry, pList); |
- |
- /* if we don't have a cached copy from before, we create one */ |
- if (crlEntry->critExtOids == NULL) { |
- |
- PKIX_OBJECT_LOCK(crlEntry); |
- |
- if (crlEntry->critExtOids == NULL) { |
- |
- extensions = crlEntry->nssCrlEntry->extensions; |
- |
- PKIX_CHECK(pkix_pl_OID_GetCriticalExtensionOIDs |
- (extensions, &oidsList, plContext), |
- PKIX_GETCRITICALEXTENSIONOIDSFAILED); |
- |
- crlEntry->critExtOids = oidsList; |
- } |
- |
- PKIX_OBJECT_UNLOCK(crlEntry); |
- |
- } |
- |
- /* We should return a copy of the List since this list changes */ |
- PKIX_DUPLICATE(crlEntry->critExtOids, pList, plContext, |
- PKIX_OBJECTDUPLICATELISTFAILED); |
- |
-cleanup: |
- |
- PKIX_RETURN(CRLENTRY); |
-} |