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

后端 未结 9 2068
灰色年华
灰色年华 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条回答
  •  孤街浪徒
    2020-12-05 14:14

    From How do I encode an unmanaged to base64 to send to another server? :

    func convertSecKeyToBase64(inputKey: SecKey) ->String? {
        // Add to keychain
        let tempTag = "net.example." + NSUUID().UUIDString
        let addParameters :[String:AnyObject] = [
            String(kSecClass): kSecClassKey,
            String(kSecAttrApplicationTag): tempTag,
            String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
            String(kSecValueRef): inputKey,
            String(kSecReturnData):kCFBooleanTrue
        ]
    
        var result: String?
        var keyPtr: AnyObject?
        if (SecItemAdd(addParameters, &keyPtr) == noErr) {
            let data = keyPtr! as! NSData
            result = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
        }
        // Remove from Keychain:
        SecItemDelete(addParameters)
        return result
    }
    

    But if you want to avoid adding to keychain, you can use Mirror:

    let mirrorKey = Mirror(reflecting: secKey)
    let exponent = mirrorKey.descendant("exponent")
    let modulus = mirrorKey.descendant("modulus");
    

    [edit: Mirror not working according to Josh]

提交回复
热议问题