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 )