I have a function that get import RSA keys.
+ (SecKeyRef)addKeyWithData:(NSData *)data asPublic:(BOOL)public tag:(NSString *)tag type:(NSString *)type error:(NSError *__autoreleasing*)error; { NSString *keyClass = (__bridge NSString *)(public ? kSecAttrKeyClassPublic : kSecAttrKeyClassPrivate); NSInteger sizeInBits = data.length; NSDictionary *attributes = @{ (__bridge NSString*)kSecAttrKeyType : type, (__bridge NSString*)kSecAttrKeyClass : keyClass, (__bridge NSString*)kSecAttrKeySizeInBits : @(sizeInBits) }; if (SecKeyCreateWithData != NULL) { CFErrorRef createError = NULL; SecKeyRef key = SecKeyCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)attributes, &createError); if (error && createError != nil) { *error = (__bridge NSError*)createError; } return key; } / else { CFTypeRef result = NULL; NSData *tagData = [tag dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *commonAttributes = @{ (__bridge NSString*)kSecClass: (__bridge NSString*)kSecClassKey, (__bridge NSString*)kSecAttrApplicationTag: tagData, (__bridge NSString*)kSecAttrAccessible: (__bridge NSString*)kSecAttrAccessibleWhenUnlocked }; NSDictionary *addItemAttributes = @{ (__bridge NSString*)kSecValueData: data, (__bridge NSString*)kSecReturnPersistentRef: @(YES), }; OSStatus addItemStatus = SecItemAdd((__bridge CFDictionaryRef)[self dictionaryByCombiningDictionaries:@[attributes, commonAttributes, addItemAttributes]], &result); if (addItemStatus != errSecSuccess && addItemStatus != errSecDuplicateItem) { / / return NULL; } NSDictionary *copyAttributes = @{ (__bridge NSString*)kSecReturnRef: @(YES), }; CFTypeRef key = NULL; / OSStatus copyItemStatus = errSecSuccess; SecItemCopyMatching((__bridge CFDictionaryRef)[self dictionaryByCombiningDictionaries:@[attributes, commonAttributes, copyAttributes]], &key); if (key == NULL) { / } return (SecKeyRef)key; } return NULL; }
I try to adjust it to get kSecAttrKeyTypeECSECPrimeRandom keys.
Input data is base64 data:
-----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAr+WbDE5VtIDGhtYMxvEc6cMsDBc /DX1wuhIMu8dQzOLSt0tpqK9MVfXbVfrKdayVFgoWzs8MilcYq0QIhKx/w== -----END PUBLIC KEY-----
Here data is
NSString *urlEncodedString = @"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAr+WbDE5VtIDGhtYMxvEc6cMsDBc/DX1wuhIMu8dQzOLSt0tpqK9MVfXbVfrKdayVFgoWzs8MilcYq0QIhKx/w=="; NSData *data = [[NSData alloc] initWithBase64EncodedString:urlEncodedString options:0];
For private key:
-----BEGIN EC PARAMETERS----- BggqhkjOPQMBBw== -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIJmVse5uPfj6B4TcXrUAvf9/8pJh+KrKKYLNcmOnp/vPoAoGCCqGSM49 AwEHoUQDQgAEAr+WbDE5VtIDGhtYMxvEc6cMsDBc/DX1wuhIMu8dQzOLSt0tpqK9 MVfXbVfrKdayVFgoWzs8MilcYq0QIhKx/w== -----END EC PRIVATE KEY-----
Data is
NSString *urlEncodedString = @" MHcCAQEEIJmVse5uPfj6B4TcXrUAvf9/8pJh+KrKKYLNcmOnp/vPoAoGCCqGSM49AwEHoUQDQgAEAr+WbDE5VtIDGhtYMxvEc6cMsDBc/DX1wuhIMu8dQzOLSt0tpqK9MVfXbVfrKdayVFgoWzs8MilcYq0QIhKx/w=="; NSData *data = [[NSData alloc] initWithBase64EncodedString:urlEncodedString options:0];
Function invocation is
NSData *data = [self getKeyFromPemFile]; BOOL public = public; // YES or NO NSString *tag = (__bridge NSString*)kSecAttrKeyTypeECSECPrimeRandom; NSError *error = nil; NSString *tag = [NSUUID UUID].UUIDString; [self addKeyWithData:(NSData *)data asPublic:(BOOL)public tag:tag type:type error:error;
And error is
Error Domain=NSOSStatusErrorDomain Code=-50 "EC public key creation from data failed" UserInfo={NSDescription=EC public key creation from data failed}
( Error occures on mac/iOS simulator )