andre@0: /* This Source Code Form is subject to the terms of the Mozilla Public andre@0: * License, v. 2.0. If a copy of the MPL was not distributed with this andre@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ andre@0: /* andre@0: * pkix_store.c andre@0: * andre@0: * CertStore Function Definitions andre@0: * andre@0: */ andre@0: andre@0: #include "pkix_store.h" andre@0: andre@0: /* --CertStore-Private-Functions----------------------------------------- */ andre@0: andre@0: /* andre@0: * FUNCTION: pkix_CertStore_Destroy andre@0: * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) andre@0: */ andre@0: static PKIX_Error * andre@0: pkix_CertStore_Destroy( andre@0: PKIX_PL_Object *object, andre@0: void *plContext) andre@0: { andre@0: PKIX_CertStore *certStore = NULL; andre@0: andre@0: PKIX_ENTER(CERTSTORE, "pkix_CertStore_Destroy"); andre@0: PKIX_NULLCHECK_ONE(object); andre@0: andre@0: /* Check that this object is a CertStore object */ andre@0: PKIX_CHECK(pkix_CheckType(object, PKIX_CERTSTORE_TYPE, plContext), andre@0: PKIX_OBJECTNOTCERTSTORE); andre@0: andre@0: certStore = (PKIX_CertStore *)object; andre@0: andre@0: certStore->certCallback = NULL; andre@0: certStore->crlCallback = NULL; andre@0: certStore->certContinue = NULL; andre@0: certStore->crlContinue = NULL; andre@0: certStore->trustCallback = NULL; andre@0: andre@0: PKIX_DECREF(certStore->certStoreContext); andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: pkix_CertStore_Hashcode andre@0: * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) andre@0: */ andre@0: static PKIX_Error * andre@0: pkix_CertStore_Hashcode( andre@0: PKIX_PL_Object *object, andre@0: PKIX_UInt32 *pHashcode, andre@0: void *plContext) andre@0: { andre@0: PKIX_CertStore *certStore = NULL; andre@0: PKIX_UInt32 tempHash = 0; andre@0: andre@0: PKIX_ENTER(CERTSTORE, "pkix_CertStore_Hashcode"); andre@0: PKIX_NULLCHECK_TWO(object, pHashcode); andre@0: andre@0: PKIX_CHECK(pkix_CheckType(object, PKIX_CERTSTORE_TYPE, plContext), andre@0: PKIX_OBJECTNOTCERTSTORE); andre@0: andre@0: certStore = (PKIX_CertStore *)object; andre@0: andre@0: if (certStore->certStoreContext) { andre@0: PKIX_CHECK(PKIX_PL_Object_Hashcode andre@0: ((PKIX_PL_Object *) certStore->certStoreContext, andre@0: &tempHash, andre@0: plContext), andre@0: PKIX_CERTSTOREHASHCODEFAILED); andre@0: } andre@0: andre@0: *pHashcode = (PKIX_UInt32) certStore->certCallback + andre@0: (PKIX_UInt32) certStore->crlCallback + andre@0: (PKIX_UInt32) certStore->certContinue + andre@0: (PKIX_UInt32) certStore->crlContinue + andre@0: (PKIX_UInt32) certStore->trustCallback + andre@0: (tempHash << 7); andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: pkix_CertStore_Equals andre@0: * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h) andre@0: */ andre@0: static PKIX_Error * andre@0: pkix_CertStore_Equals( andre@0: PKIX_PL_Object *firstObject, andre@0: PKIX_PL_Object *secondObject, andre@0: PKIX_Int32 *pResult, andre@0: void *plContext) andre@0: { andre@0: PKIX_CertStore *firstCS = NULL; andre@0: PKIX_CertStore *secondCS = NULL; andre@0: PKIX_Boolean cmpResult = PKIX_FALSE; andre@0: andre@0: PKIX_ENTER(CERTSTORE, "pkix_CertStore_Equals"); andre@0: PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); andre@0: andre@0: PKIX_CHECK(pkix_CheckTypes andre@0: (firstObject, secondObject, PKIX_CERTSTORE_TYPE, plContext), andre@0: PKIX_ARGUMENTSNOTDATES); andre@0: andre@0: firstCS = (PKIX_CertStore *)firstObject; andre@0: secondCS = (PKIX_CertStore *)secondObject; andre@0: andre@0: cmpResult = (firstCS->certCallback == secondCS->certCallback) && andre@0: (firstCS->crlCallback == secondCS->crlCallback) && andre@0: (firstCS->certContinue == secondCS->certContinue) && andre@0: (firstCS->crlContinue == secondCS->crlContinue) && andre@0: (firstCS->trustCallback == secondCS->trustCallback); andre@0: andre@0: if (cmpResult && andre@0: (firstCS->certStoreContext != secondCS->certStoreContext)) { andre@0: andre@0: PKIX_CHECK(PKIX_PL_Object_Equals andre@0: ((PKIX_PL_Object *) firstCS->certStoreContext, andre@0: (PKIX_PL_Object *) secondCS->certStoreContext, andre@0: &cmpResult, andre@0: plContext), andre@0: PKIX_CERTSTOREEQUALSFAILED); andre@0: } andre@0: andre@0: *pResult = cmpResult; andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: pkix_CertStore_RegisterSelf andre@0: * DESCRIPTION: andre@0: * Registers PKIX_CERTSTORE_TYPE and its related functions with andre@0: * systemClasses[] andre@0: * THREAD SAFETY: andre@0: * Not Thread Safe - for performance and complexity reasons andre@0: * andre@0: * Since this function is only called by PKIX_PL_Initialize, which should andre@0: * only be called once, it is acceptable that this function is not andre@0: * thread-safe. andre@0: */ andre@0: PKIX_Error * andre@0: pkix_CertStore_RegisterSelf(void *plContext) andre@0: { andre@0: extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; andre@0: pkix_ClassTable_Entry entry; andre@0: andre@0: PKIX_ENTER(CERTSTORE, "pkix_CertStore_RegisterSelf"); andre@0: andre@0: entry.description = "CertStore"; andre@0: entry.objCounter = 0; andre@0: entry.typeObjectSize = sizeof(PKIX_CertStore); andre@0: entry.destructor = pkix_CertStore_Destroy; andre@0: entry.equalsFunction = pkix_CertStore_Equals; andre@0: entry.hashcodeFunction = pkix_CertStore_Hashcode; andre@0: entry.toStringFunction = NULL; andre@0: entry.comparator = NULL; andre@0: entry.duplicateFunction = pkix_duplicateImmutable; andre@0: andre@0: systemClasses[PKIX_CERTSTORE_TYPE] = entry; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* --CertStore-Public-Functions------------------------------------------ */ andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_Create (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_Create( andre@0: PKIX_CertStore_CertCallback certCallback, andre@0: PKIX_CertStore_CRLCallback crlCallback, andre@0: PKIX_CertStore_CertContinueFunction certContinue, andre@0: PKIX_CertStore_CrlContinueFunction crlContinue, andre@0: PKIX_CertStore_CheckTrustCallback trustCallback, andre@0: PKIX_CertStore_ImportCrlCallback importCrlCallback, andre@0: PKIX_CertStore_CheckRevokationByCrlCallback checkRevByCrlCallback, andre@0: PKIX_PL_Object *certStoreContext, andre@0: PKIX_Boolean cacheFlag, andre@0: PKIX_Boolean localFlag, andre@0: PKIX_CertStore **pStore, andre@0: void *plContext) andre@0: { andre@0: PKIX_CertStore *certStore = NULL; andre@0: andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_Create"); andre@0: PKIX_NULLCHECK_THREE(certCallback, crlCallback, pStore); andre@0: andre@0: PKIX_CHECK(PKIX_PL_Object_Alloc andre@0: (PKIX_CERTSTORE_TYPE, andre@0: sizeof (PKIX_CertStore), andre@0: (PKIX_PL_Object **)&certStore, andre@0: plContext), andre@0: PKIX_COULDNOTCREATECERTSTOREOBJECT); andre@0: andre@0: certStore->certCallback = certCallback; andre@0: certStore->crlCallback = crlCallback; andre@0: certStore->certContinue = certContinue; andre@0: certStore->crlContinue = crlContinue; andre@0: certStore->trustCallback = trustCallback; andre@0: certStore->importCrlCallback = importCrlCallback; andre@0: certStore->checkRevByCrlCallback = checkRevByCrlCallback; andre@0: certStore->cacheFlag = cacheFlag; andre@0: certStore->localFlag = localFlag; andre@0: andre@0: PKIX_INCREF(certStoreContext); andre@0: certStore->certStoreContext = certStoreContext; andre@0: andre@0: *pStore = certStore; andre@0: certStore = NULL; andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_DECREF(certStore); andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetCertCallback (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetCertCallback( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertStore_CertCallback *pCallback, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertCallback"); andre@0: PKIX_NULLCHECK_TWO(store, pCallback); andre@0: andre@0: *pCallback = store->certCallback; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetCRLCallback (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetCRLCallback( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertStore_CRLCallback *pCallback, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCRLCallback"); andre@0: PKIX_NULLCHECK_TWO(store, pCallback); andre@0: andre@0: *pCallback = store->crlCallback; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_CertContinue (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_CertContinue( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertSelector *selector, andre@0: PKIX_VerifyNode *verifyNode, andre@0: void **pNBIOContext, andre@0: PKIX_List **pCertList, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_CertContinue"); andre@0: PKIX_NULLCHECK_FOUR(store, selector, pNBIOContext, pCertList); andre@0: andre@0: PKIX_CHECK(store->certContinue andre@0: (store, selector, verifyNode, andre@0: pNBIOContext, pCertList, plContext), andre@0: PKIX_CERTSTORECERTCONTINUEFUNCTIONFAILED); andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_CrlContinue (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_CrlContinue( andre@0: PKIX_CertStore *store, andre@0: PKIX_CRLSelector *selector, andre@0: void **pNBIOContext, andre@0: PKIX_List **pCrlList, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_CrlContinue"); andre@0: PKIX_NULLCHECK_FOUR(store, selector, pNBIOContext, pCrlList); andre@0: andre@0: PKIX_CHECK(store->crlContinue andre@0: (store, selector, pNBIOContext, pCrlList, plContext), andre@0: PKIX_CERTSTORECRLCONTINUEFAILED); andre@0: andre@0: cleanup: andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetTrustCallback (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetTrustCallback( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertStore_CheckTrustCallback *pCallback, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); andre@0: PKIX_NULLCHECK_TWO(store, pCallback); andre@0: andre@0: *pCallback = store->trustCallback; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetImportCrlCallback (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetImportCrlCallback( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertStore_ImportCrlCallback *pCallback, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); andre@0: PKIX_NULLCHECK_TWO(store, pCallback); andre@0: andre@0: *pCallback = store->importCrlCallback; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetCheckRevByCrl (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetCrlCheckerFn( andre@0: PKIX_CertStore *store, andre@0: PKIX_CertStore_CheckRevokationByCrlCallback *pCallback, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); andre@0: PKIX_NULLCHECK_TWO(store, pCallback); andre@0: andre@0: *pCallback = store->checkRevByCrlCallback; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetCertStoreContext andre@0: * (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetCertStoreContext( andre@0: PKIX_CertStore *store, andre@0: PKIX_PL_Object **pCertStoreContext, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertStoreContext"); andre@0: PKIX_NULLCHECK_TWO(store, pCertStoreContext); andre@0: andre@0: PKIX_INCREF(store->certStoreContext); andre@0: *pCertStoreContext = store->certStoreContext; andre@0: andre@0: cleanup: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetCertStoreCacheFlag andre@0: * (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetCertStoreCacheFlag( andre@0: PKIX_CertStore *store, andre@0: PKIX_Boolean *pCacheFlag, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertStoreCacheFlag"); andre@0: PKIX_NULLCHECK_TWO(store, pCacheFlag); andre@0: andre@0: *pCacheFlag = store->cacheFlag; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: } andre@0: andre@0: /* andre@0: * FUNCTION: PKIX_CertStore_GetLocalFlag andre@0: * (see comments in pkix_certstore.h) andre@0: */ andre@0: PKIX_Error * andre@0: PKIX_CertStore_GetLocalFlag( andre@0: PKIX_CertStore *store, andre@0: PKIX_Boolean *pLocalFlag, andre@0: void *plContext) andre@0: { andre@0: PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetLocalFlag"); andre@0: PKIX_NULLCHECK_TWO(store, pLocalFlag); andre@0: andre@0: *pLocalFlag = store->localFlag; andre@0: andre@0: PKIX_RETURN(CERTSTORE); andre@0: }