static SecKeyRef ccec2SecKey(ccec_full_ctx_t fk) { size_t export_size = ccec_x963_export_size(1, fk); uint8_t export_keybytes[export_size]; ccec_x963_export(1, export_keybytes, fk); CFDataRef exportedkey = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, export_keybytes, export_size, kCFAllocatorNull); CFDictionaryRef keyattributes = CFDictionaryCreateForCFTypes(kCFAllocatorDefault, kSecValueData, exportedkey, kSecAttrKeyType, kSecAttrKeyTypeEC, kSecAttrKeyClass, kSecAttrKeyClassPrivate, NULL); SecKeyRef retval = SecKeyCreateFromAttributeDictionary(keyattributes); CFRelease(keyattributes); CFRelease(exportedkey); bzero(export_keybytes, 0); return retval; }
CFReleaseNull(cert); CFReleaseNull(key); } else { refDictionary = NULL; } return refDictionary; } static CFTypeRef SecItemCreateFromAttributeDictionary(CFDictionaryRef refAttributes) { CFTypeRef ref = NULL; CFStringRef class = CFDictionaryGetValue(refAttributes, kSecClass); if (CFEqual(class, kSecClassCertificate)) { ref = SecCertificateCreateFromAttributeDictionary(refAttributes); } else if (CFEqual(class, kSecClassKey)) { ref = SecKeyCreateFromAttributeDictionary(refAttributes); } else if (CFEqual(class, kSecClassIdentity)) { CFAllocatorRef allocator = NULL; CFDataRef data = CFDictionaryGetValue(refAttributes, CFSTR(CERTIFICATE_DATA_COLUMN_LABEL)); SecCertificateRef cert = SecCertificateCreateWithData(allocator, data); SecKeyRef key = SecKeyCreateFromAttributeDictionary(refAttributes); if (key && cert) ref = SecIdentityCreate(allocator, cert, key); CFReleaseSafe(cert); CFReleaseSafe(key); #if 0 /* We don't support SecKeychainItemRefs yet. */ } else if (CFEqual(class, kSecClassGenericPassword)) { } else if (CFEqual(class, kSecClassInternetPassword)) { } else if (CFEqual(class, kSecClassAppleSharePassword)) { #endif