Thanks for the reply. Here is my code about the these for PeerPublicKey when generating peerKeyRef from SecItemCopyMatching becomes nil:
+ (SecKeyRef) addPeerPublicKey:(NSString *) peerName withPublicKey:(NSData *) publicKey {
OSStatus sanityCheck = noErr;
SecKeyRef peerKeyRef = NULL;
CFTypeRef persistPeer = NULL;
NSData * peerTag = [[NSData alloc] initWithBytes:(const void *)[peerName UTF8String] length:[peerName length]];
NSMutableDictionary * peerPublicKeyAttr = [[NSMutableDictionary alloc] init];
[peerPublicKeyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[peerPublicKeyAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[peerPublicKeyAttr setObject:peerTag forKey:(__bridge id)kSecAttrApplicationTag];
[peerPublicKeyAttr setObject:publicKey forKey:(__bridge id)kSecValueData];
[peerPublicKeyAttr setObject:[NSNumber numberWithUnsignedInteger:2048] forKey:(__bridge id)kSecAttrKeySizeInBits];
sanityCheck = SecItemAdd((__bridge CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer);
if (persistPeer) {
peerKeyRef = (SecKeyRef)[self getPersistentKeyRefWithKeyRef:persistPeer];
} else {
[peerPublicKeyAttr removeObjectForKey:(__bridge id)kSecValueData];
[peerPublicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&peerKeyRef);
}
if (persistPeer) CFRelease(persistPeer);
return peerKeyRef;
}
Here is my code for generating public key from modulus and exponent:
func encryption(password: String) -> String
{
let pubKeyModData = Base64.decode(modulusPublickKey)
let pubKeyExpData = Base64.decode(exponentPublicKey)
let testArray = NSMutableArray()
testArray.addObject(pubKeyModData)
testArray.addObject(pubKeyExpData)
let testPubKey = testArray.berData()
var publicKey: SecKeyRef
let dataToCipher = password.dataUsingEncoding(NSUTF8StringEncoding)
publicKey = SecKeyEncryption.addPeerPublicKey("***.publickey", withPublicKey: testPubKey).takeRetainedValue()
let cipherData = SecKeyEncryption.wrapSymmetricKey(dataToCipher, keyRef: publicKey)
let newStr = cipherData.base64EncodedString()
return newStr
}
And I used BasicEncodingRules for creating testPubKey:
- (NSData*)berData
{
NSMutableData *berData = [[NSMutableData alloc] init];
[berData appendData:[self berHeader]];
[berData appendData:[self berContents]];
return berData;
}
- (NSData*)berHeader
{
NSMutableData *berHeader = [[NSMutableData alloc] init];
[berHeader appendBytes:[self berTag] length:1];
[berHeader appendData:[self lengthStorageData]];
return berHeader;
}
- (NSData*)berContents {
[self raiseUnimplemented];
return nil;
}
- (void)raiseUnimplemented {
[NSException
raise:@"Invalid BER translation"
format:@"unimplemented for this type"];
}
Please help what's wrong in my code.