/* * FUNCTION: pkix_pl_CollectionCertStoreContext_CreateCRL * DESCRIPTION: * * Creates CRL using data file path name pointed to by "crlFileName" and * stores it at "pCrl". If the CRL can not be decoded, NULL is stored * at "pCrl". * * PARAMETERS * "crlFileName" - Address of CRL data file path name. Must be non-NULL. * "pCrl" - 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 CollectionCertStoreContext 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_CollectionCertStoreContext_CreateCRL( const char *crlFileName, PKIX_PL_CRL **pCrl, void *plContext) { PKIX_PL_ByteArray *byteArray = NULL; PKIX_PL_CRL *crl = NULL; PRFileDesc *inFile = NULL; SECItem crlDER; void *buf = NULL; PKIX_UInt32 len; SECStatus rv; PKIX_ENTER(COLLECTIONCERTSTORECONTEXT, "pkix_pl_CollectionCertStoreContext_CreateCRL"); PKIX_NULLCHECK_TWO(crlFileName, pCrl); *pCrl = NULL; crlDER.data = NULL; PKIX_COLLECTIONCERTSTORECONTEXT_DEBUG("\t\t Calling PR_Open.\n"); inFile = PR_Open(crlFileName, PR_RDONLY, 0); if (!inFile){ PKIX_ERROR(PKIX_UNABLETOOPENCRLFILE); } else { PKIX_COLLECTIONCERTSTORECONTEXT_DEBUG ("\t\t Calling SECU_ReadDerFromFile.\n"); rv = SECU_ReadDERFromFile(&crlDER, inFile, PR_FALSE); if (!rv){ buf = (void *)crlDER.data; len = crlDER.len; PKIX_CHECK(PKIX_PL_ByteArray_Create (buf, len, &byteArray, plContext), PKIX_BYTEARRAYCREATEFAILED); PKIX_CHECK(PKIX_PL_CRL_Create (byteArray, &crl, plContext), PKIX_CRLCREATEFAILED); PKIX_COLLECTIONCERTSTORECONTEXT_DEBUG ("\t\t Calling SECITEM_FreeItem.\n"); SECITEM_FreeItem(&crlDER, PR_FALSE); } else { PKIX_ERROR(PKIX_UNABLETOREADDERFROMCRLFILE); } } *pCrl = crl; cleanup: if (inFile){ PKIX_COLLECTIONCERTSTORECONTEXT_DEBUG ("\t\t Calling PR_CloseDir.\n"); PR_Close(inFile); } if (PKIX_ERROR_RECEIVED){ PKIX_COLLECTIONCERTSTORECONTEXT_DEBUG ("\t\t Calling SECITEM_FreeItem).\n"); SECITEM_FreeItem(&crlDER, PR_FALSE); PKIX_DECREF(crl); if (crlDER.data != NULL) { SECITEM_FreeItem(&crlDER, PR_FALSE); } } PKIX_DECREF(byteArray); PKIX_RETURN(COLLECTIONCERTSTORECONTEXT); }
PKIX_PL_CRL * createCRL( char *dirName, char *crlFileName, void *plContext) { PKIX_PL_ByteArray *byteArray = NULL; PKIX_PL_CRL *crl = NULL; PKIX_Error *error = NULL; PRFileDesc *inFile = NULL; SECItem crlDER; void *buf = NULL; PKIX_UInt32 len; SECStatus rv; char *pathName = NULL; PKIX_TEST_STD_VARS(); crlDER.data = NULL; pathName = catDirName(dirName, crlFileName, plContext); inFile = PR_Open(pathName, PR_RDONLY, 0); if (!inFile){ pkixTestErrorMsg = "Unable to open crl file"; goto cleanup; } else { rv = SECU_ReadDERFromFile(&crlDER, inFile, PR_FALSE); if (!rv){ buf = (void *)crlDER.data; len = crlDER.len; error = PKIX_PL_ByteArray_Create (buf, len, &byteArray, plContext); if (error){ pkixTestErrorMsg = "PKIX_PL_ByteArray_Create failed"; goto cleanup; } error = PKIX_PL_CRL_Create(byteArray, &crl, plContext); if (error){ pkixTestErrorMsg = "PKIX_PL_Crl_Create failed"; goto cleanup; } SECITEM_FreeItem(&crlDER, PR_FALSE); } else { pkixTestErrorMsg = "Unable to read DER from crl file"; goto cleanup; } } cleanup: PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(pathName, plContext)); if (inFile){ PR_Close(inFile); } if (error){ SECITEM_FreeItem(&crlDER, PR_FALSE); } PKIX_TEST_DECREF_AC(byteArray); PKIX_TEST_RETURN(); return (crl); }