需要一个帮助,以使用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
}