Can I get the modulus or exponent from a SecKeyRef object in Swift?

后端 未结 9 2035
灰色年华
灰色年华 2020-12-05 13:34

In Swift, I created a SecKeyRef object by calling SecTrustCopyPublicKey on some raw X509 certificate data. This is what this SecKeyRef object looks like.

<
9条回答
  •  -上瘾入骨i
    2020-12-05 14:12

    I wrote this one base on some other's answer in stackoverflow. Currently I am using it in my production but I am happy to use another solution that doesn't require to write into keychain.

    - (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey host:(NSString*)host {
        NSString *tag = [NSString stringWithFormat:@"%@.%@",[[NSBundle mainBundle] bundleIdentifier], host];
        const char* publicKeyIdentifier = [tag cStringUsingEncoding:NSUTF8StringEncoding];
        NSData *publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:strlen(publicKeyIdentifier) * sizeof(char)];
    
        OSStatus sanityCheck = noErr;
    //    NSData * publicKeyBits = nil;
        CFTypeRef publicKeyBits;
    
        NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
    
        // Set the public key query dictionary.
        [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
        [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
        [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
        [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
        [queryPublicKey setObject:(__bridge id)givenKey forKey:(__bridge id)kSecValueRef];
    
        // Get the key bits.
        NSData *data = nil;
        sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, &publicKeyBits);
        if (sanityCheck == errSecSuccess) {
            data = CFBridgingRelease(publicKeyBits);
            //I don't want to leak this information
            (void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey);
        }else {
            sanityCheck = SecItemAdd((CFDictionaryRef)queryPublicKey, &publicKeyBits);
            if (sanityCheck == errSecSuccess)
            {
                data = CFBridgingRelease(publicKeyBits);
                (void)SecItemDelete((__bridge CFDictionaryRef) queryPublicKey);
            }
        }
    
        return data;
    }
    

提交回复
热议问题