Last active
December 26, 2015 15:29
-
-
Save lgfa29/7173488 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define KEY_LENGTH 2048 | |
static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0"; | |
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0"; | |
NSData * publicTag; | |
NSData * privateTag; | |
+ (void)generateKeyPairPlease { | |
OSStatus status = noErr; | |
NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init]; | |
NSMutableDictionary *publicKeyAttr = [[NSMutableDictionary alloc] init]; | |
NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init]; | |
// 2 | |
publicTag = [NSData dataWithBytes:publicKeyIdentifier | |
length:strlen((const char *)publicKeyIdentifier)]; | |
privateTag = [NSData dataWithBytes:privateKeyIdentifier | |
length:strlen((const char *)privateKeyIdentifier)]; | |
// 3 | |
SecKeyRef publicKey = NULL; | |
SecKeyRef privateKey = NULL; // 4 | |
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA | |
forKey:(__bridge id)kSecAttrKeyType]; // 5 | |
[keyPairAttr setObject:[NSNumber numberWithInt:KEY_LENGTH] | |
forKey:(__bridge id)kSecAttrKeySizeInBits]; // 6 | |
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] | |
forKey:(__bridge id)kSecAttrIsPermanent]; // 7 | |
[privateKeyAttr setObject:privateTag | |
forKey:(__bridge id)kSecAttrApplicationTag]; // 8 | |
[publicKeyAttr setObject:[NSNumber numberWithBool:YES] | |
forKey:(__bridge id)kSecAttrIsPermanent]; // 9 | |
[publicKeyAttr setObject:publicTag | |
forKey:(__bridge id)kSecAttrApplicationTag]; // 10 | |
[keyPairAttr setObject:privateKeyAttr | |
forKey:(__bridge id)kSecPrivateKeyAttrs]; // 11 | |
[keyPairAttr setObject:publicKeyAttr | |
forKey:(__bridge id)kSecPublicKeyAttrs]; // 12 | |
status = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, | |
&publicKey, &privateKey); // 13 | |
// error handling... | |
if(publicKey) CFRelease(publicKey); | |
if(privateKey) CFRelease(privateKey); // 14 | |
} | |
+ (NSData *)getPublicKeyBits { | |
OSStatus sanityCheck = noErr; | |
NSData * publicKeyBits = nil; | |
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; | |
// Set the public key query dictionary. | |
[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]; | |
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; | |
CFDictionaryRef cfquery = (__bridge_retained CFDictionaryRef)queryPublicKey; | |
CFTypeRef cfresult = (__bridge CFTypeRef)publicKeyBits; | |
// Get the key bits. | |
sanityCheck = SecItemCopyMatching(cfquery, (CFTypeRef *)&cfresult); | |
CFRelease(cfquery); | |
publicKeyBits = (__bridge NSData *)cfresult; | |
if (sanityCheck != noErr) { | |
publicKeyBits = nil; | |
} | |
return publicKeyBits; | |
} | |
+ (NSString *)getPublicKeyBase64 { | |
return [[RSAKeys getPublicKeyBits] base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment