使用SHA256withECDSA在iOS Swift中签名和验证

时间:2019-03-08 06:19:02

标签: ios swift sha256

需要一个帮助,以使用SHA256withECDSA创建签名和密钥验证。

我已经尝试过此解决方案https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/signing_and_verifying 但是在这里,我很难将String publicKey / privateKey(从API获取)转换为SecKey。

以下我到目前为止所完成的代码,请帮助我做到这一点。 另外,请确认我在正确的位置,或者需要使用SHA256withECDSA对签名和验证密钥进行一些更改

/// Method to verify signiture
///
/// - Parameters:
///   - qrCode: qrCode string
///   - publicKey: public key fetched from isvaeVerified api
/// - Returns: boolen value
func signedQRVerification(qrCode: String, publicKey: String) -> Bool {

    let bhimReceivedURL = qrCode.components(separatedBy: "&sign=")

    if #available(iOS 10.0, *) {
        let secKey = stringToSecKey(keyToConvert: publicKey)
        let originalData = bhimReceivedURL[0].data(using: .utf8)! as CFData
        let signData = bhimReceivedURL[1].data(using: .utf8)! as CFData
        return SecKeyVerifySignature(secKey, .ecdsaSignatureDigestX962SHA256, originalData, signData, nil)
    } else {
        // Fallback on earlier versions
    }
    return false
}

/// Method to convert string to SecKey
///
/// - Parameter keyToConvert: string need to convert in SecKey
/// - Returns: SecKey
func stringToSecKey(keyToConvert: String) -> SecKey {

    var secKey: SecKey!
    let data2 = keyToConvert.data(using: .utf8)
    let keyDict:[NSObject:NSObject] = [
        kSecAttrKeyType: kSecAttrKeyTypeEC,
        kSecAttrKeyClass: kSecAttrKeyClassPublic,
        kSecAttrKeySizeInBits: NSNumber(value: 256),
        kSecReturnPersistentRef: true as NSObject
    ]

    if #available(iOS 10.0, *) {
        if let publicKey = SecKeyCreateWithData(data2! as CFData, keyDict as CFDictionary, nil) {

            secKey = publicKey
        }
    } else {
        // Fallback on earlier versions
    }
    print("secKey: \(secKey)")
    return secKey
}

/// Method to sign qr code string.
///
/// - Parameters:
///   - qrCode: qr code string
///   - key: private key to sign qr code
/// - Returns: signed qr string
func signQrCode(qrCode: String, privateKey: String) -> String {

    let dataToSign = qrCode.data(using: .utf8)! as CFData
    var signiture = ""
    if #available(iOS 10.0, *) {
        let secKey = stringToSecKey(keyToConvert: privateKey)
        signiture = SecKeyCreateSignature(secKey, .ecdsaSignatureDigestX962SHA224, dataToSign, nil) as! String
    } else {
        // Fallback on earlier versions
    }

    return signiture
}

0 个答案:

没有答案