2

this is my code to generate a new keypair

    //Create RSA Key Pair
CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(
                                                              kCFAllocatorDefault,
                                                              0,
                                                              &kCFTypeDictionaryKeyCallBacks,
                                                              &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeRSA);

int32_t rawnum = 2048;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,
                                 kCFNumberIntType, &rawnum);
CFDictionarySetValue(parameters,
                     kSecAttrKeySizeInBits,
                     num);
publicKey = NULL;
privateKey = NULL;

SecKeyGeneratePair(parameters, &publicKey, &privateKey);

and i've tried to get the data using this method

- (NSData *)getRSAKeyBitsFromKey:(SecKeyRef)givenKey {

    static const uint8_t publicKeyIdentifier[] = "com.company";
    NSData *publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];

    OSStatus sanityCheck = noErr;
    NSData * publicKeyBits = nil;

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
    //[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];

    // Temporarily add key to the Keychain, return as data:
    NSMutableDictionary * attributes = [queryPublicKey mutableCopy];
    [attributes setObject:(__bridge id)givenKey forKey:(__bridge id)kSecValueRef];
    [attributes setObject:@YES forKey:(__bridge id)kSecReturnData];
    CFTypeRef result;
    sanityCheck = SecItemAdd((__bridge CFDictionaryRef) attributes, &result);
    if (sanityCheck == errSecSuccess) {
        publicKeyBits = CFBridgingRelease(result);

        // Remove from Keychain again:
        (void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey);
    }

    return publicKeyBits;
}

I know that probably i didn't set the PublicKeyIdentifier and the other attributes (should i had to?).

John Bassos
  • 308
  • 1
  • 10

0 Answers0