CFDataRef SecDigestCreate(CFAllocatorRef allocator, const SecAsn1Oid *algorithm, const SecAsn1Item *params, const UInt8 *data, CFIndex length) { unsigned char *(*digestFcn)(const void *data, CC_LONG len, unsigned char *md); CFIndex digestLen; if (length > INT32_MAX) return NULL; if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA1)) { digestFcn = CC_SHA1; digestLen = CC_SHA1_DIGEST_LENGTH; } else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA224)) { digestFcn = CC_SHA224; digestLen = CC_SHA224_DIGEST_LENGTH; } else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA256)) { digestFcn = CC_SHA256; digestLen = CC_SHA256_DIGEST_LENGTH; } else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA384)) { digestFcn = CC_SHA384; digestLen = CC_SHA384_DIGEST_LENGTH; } else if (SecAsn1OidCompare(algorithm, &CSSMOID_SHA512)) { digestFcn = CC_SHA512; digestLen = CC_SHA512_DIGEST_LENGTH; } else { return NULL; } CFMutableDataRef digest = CFDataCreateMutable(allocator, digestLen); CFDataSetLength(digest, digestLen); digestFcn(data, (CC_LONG)length, CFDataGetMutableBytePtr(digest)); return digest; }
SecKeyRef SecKeyCreatePublicFromDER(CFAllocatorRef allocator, const SecAsn1Oid *oid, const SecAsn1Item *params, const SecAsn1Item *keyData) { SecKeyRef publicKey = NULL; if (SecAsn1OidCompare(oid, &CSSMOID_RSA)) { /* pkcs1 1 */ publicKey = SecKeyCreateRSAPublicKey(kCFAllocatorDefault, keyData->Data, keyData->Length, kSecKeyEncodingPkcs1); } else if (SecAsn1OidCompare(oid, &CSSMOID_ecPublicKey)) { SecDERKey derKey = { .oid = oid->Data, .oidLength = oid->Length, .key = keyData->Data, .keyLength = keyData->Length, }; if (params) { derKey.parameters = params->Data; derKey.parametersLength = params->Length; } publicKey = SecKeyCreateECPublicKey(kCFAllocatorDefault, (const uint8_t *)&derKey, sizeof(derKey), kSecDERKeyEncoding); } else {