/* * * SecCspHandleForAlgorithm * @@@ This function should get more parameters like keysize and operation required and use mds. * */ CSSM_CSP_HANDLE SecCspHandleForAlgorithm(CSSM_ALGORITHMS algorithm) { if (!gCsp) { CSSM_VERSION version = { 2, 0 }; CSSM_RETURN rv; if (!gCssmInitialized) { CSSM_GUID myGuid = { 0xFADE, 0, 0, { 1, 2, 3, 4, 5, 6, 7, 0 } }; CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; rv = CSSM_Init (&version, CSSM_PRIVILEGE_SCOPE_NONE, &myGuid, CSSM_KEY_HIERARCHY_NONE, &pvcPolicy, NULL); if (rv) goto loser; gCssmInitialized = 1; } rv = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, NULL); if (rv) goto loser; rv = CSSM_ModuleAttach(&gGuidAppleCSP, &version, &memFuncs, 0, CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE, NULL, 0, NULL, &gCsp); } loser: return gCsp; }
CSSM_CSP_HANDLE _hc_get_cdsa_csphandle(void) { CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; CSSM_RETURN ret; if (cspHandle) return cspHandle; ret = CSSM_Init(&vers, CSSM_PRIVILEGE_SCOPE_NONE, &guid, CSSM_KEY_HIERARCHY_NONE, &pvcPolicy, NULL); if (ret != CSSM_OK) abort(); ret = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, NULL); if (ret) abort(); ret = CSSM_ModuleAttach(&gGuidAppleCSP, &vers, &cssm_memory_funcs, 0, CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE, NULL, 0, NULL, &cspHandle); if (ret) abort(); return cspHandle; }
CSSM_RETURN cdsaInit(void) { if (cdsaInitialized) return CSSM_OK; CSSM_RETURN crtn; CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; /* Initialize CSSM. */ crtn = CSSM_Init(&cspversion, CSSM_PRIVILEGE_SCOPE_PROCESS, &guid, CSSM_KEY_HIERARCHY_NONE, &pvcPolicy, /*reserved*/NULL); if (crtn) return crtn; /* Load the CSP bundle into this app's memory space */ crtn = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, // eventHandler NULL); // AppNotifyCallbackCtx if (crtn) return crtn; /* Obtain a handle which will be used to refer to the CSP */ crtn = CSSM_ModuleAttach(&gGuidAppleCSP, &cspversion, &memFuncs, // memFuncs 0, // SubserviceID CSSM_SERVICE_CSP, 0, // AttachFlags CSSM_KEY_HIERARCHY_NONE, NULL, // FunctionTable 0, // NumFuncTable NULL, // reserved &cspHandle); if (crtn) return crtn; cdsaInitialized = 1; return CSSM_OK; }
static CSSM_BOOL cuCssmStartup() { CSSM_RETURN crtn; CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; if(cssmInitd) { return CSSM_TRUE; } crtn = CSSM_Init (&vers, CSSM_PRIVILEGE_SCOPE_NONE, &testGuid, CSSM_KEY_HIERARCHY_NONE, &pvcPolicy, NULL /* reserved */); if(crtn != CSSM_OK) { return CSSM_FALSE; } else { cssmInitd = CSSM_TRUE; return CSSM_TRUE; } }
CryptoX_Result CryptoMac_LoadPublicKey(const unsigned char* aCertData, CryptoX_PublicKey* aPublicKey) { if (!aCertData || !aPublicKey) { return CryptoX_Error; } *aPublicKey = NULL; if (!OnLionOrLater()) { if (!sCspHandle) { CSSM_RETURN rv; if (!sCssmInitialized) { CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE; rv = CSSM_Init(&sCssmVersion, CSSM_PRIVILEGE_SCOPE_PROCESS, &sMozCssmGuid, CSSM_KEY_HIERARCHY_NONE, &pvcPolicy, NULL); if (rv != CSSM_OK) { return CryptoX_Error; } sCssmInitialized = true; } rv = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, NULL); if (rv != CSSM_OK) { return CryptoX_Error; } CSSM_CSP_HANDLE cspHandle; rv = CSSM_ModuleAttach(&gGuidAppleCSP, &sCssmVersion, &cssmMemFuncs, 0, CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE, NULL, 0, NULL, &cspHandle); if (rv != CSSM_OK) { return CryptoX_Error; } sCspHandle = cspHandle; } FILE* certFile = NULL; long certFileSize = 0; uint8* certBuffer = NULL; certFile = fopen((char*)aCertData, "rb"); if (!certFile) { return CryptoX_Error; } if (fseek(certFile, 0, SEEK_END)) { fclose(certFile); return CryptoX_Error; } certFileSize = ftell(certFile); if (certFileSize < 0) { fclose(certFile); return CryptoX_Error; } certBuffer = (uint8*)malloc(certFileSize); if (fseek(certFile, 0, SEEK_SET)) { free(certBuffer); fclose(certFile); return CryptoX_Error; } uint readResult = fread(certBuffer, sizeof(uint8), certFileSize, certFile); if (readResult != certFileSize) { free(certBuffer); fclose(certFile); return CryptoX_Error; } fclose(certFile); CFDataRef certData = CFDataCreate(kCFAllocatorDefault, certBuffer, certFileSize); free(certBuffer); if (!certData) { return CryptoX_Error; } SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, certData); CFRelease(certData); if (!cert) { return CryptoX_Error; } SecKeyRef publicKey; OSStatus status = SecCertificateCopyPublicKey(cert, (SecKeyRef*)&publicKey); CFRelease(cert); if (status) { return CryptoX_Error; } *aPublicKey = (void*)publicKey; return CryptoX_Success; } CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, aCertData, strlen((char*)aCertData), false); if (!url) { return CryptoX_Error; } CFReadStreamRef stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url); if (!stream) { CFRelease(url); return CryptoX_Error; } SecTransformRef readTransform = SecTransformCreateReadTransformWithReadStreamPtr(stream); if (!readTransform) { CFRelease(url); CFRelease(stream); return CryptoX_Error; } CFErrorRef error; CFDataRef tempCertData = (CFDataRef)SecTransformExecutePtr(readTransform, &error); if (!tempCertData || error) { CFRelease(url); CFRelease(stream); CFRelease(readTransform); return CryptoX_Error; } SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, tempCertData); if (!cert) { CFRelease(url); CFRelease(stream); CFRelease(readTransform); CFRelease(tempCertData); return CryptoX_Error; } CryptoX_Result result = CryptoX_Error; OSStatus status = SecCertificateCopyPublicKey(cert, (SecKeyRef*)aPublicKey); if (status == 0) { result = CryptoX_Success; } CFRelease(url); CFRelease(stream); CFRelease(readTransform); CFRelease(tempCertData); CFRelease(cert); return result; }