iossecurity-framework

SecKeyGeneratePair returns errSecUnimplemented


Im attempting to implement an RSA encryption algorithm into my iOS app, but when I attempt to generate a public and private key pair, the function returns me the errSecUnimplemented error. I am using the 5.1 SDK and targeting 5.1 at the moment.

Can I not use this function, or did I set up something wrong in attempting to generate the pair?

Here is my code for the key generation:

SecKeyRef publicKey, privateKey;
CFDictionaryRef parameters;
const void* keys[] = {kSecAttrKeyType, kSecAttrKeyTypeRSA};
int keySize = 1024;
const void *values[] = {kSecAttrKeySizeInBits, &keySize};

parameters = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 2, NULL, NULL);
OSStatus ret = SecKeyGeneratePair(parameters, &publicKey, &privateKey);
if ( ret == errSecSuccess )
{
    NSLog(@"Key success!");
}
else 
{
    NSLog(@"Key Failure! %li", ret);
}

Solution

  • I've revised it to just complete the solution for you. 1) You need to use a CFNumberRef and not a pointer to an int for the numerical value. 2) The values need to be the values, the keys need to be the keys - you were mixing a key and value in each of "keys" and "values".

    SInt32 iKeySize = 1024;
    CFNumberRef keySize = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &iKeySize);
    const void* values[] = { kSecAttrKeyTypeRSA, keySize };
    const void* keys[] = { kSecAttrKeyType, kSecAttrKeySizeInBits };
    CFDictionaryRef parameters = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 2, NULL, NULL);
    
    SecKeyRef publicKey, privateKey;
    OSStatus ret = SecKeyGeneratePair(parameters, &publicKey, &privateKey);
    if ( ret == errSecSuccess )
        NSLog(@"Key success!");
    else 
        NSLog(@"Key Failure! %li", ret);