Нужна одна помощь, для создания подписи и проверки ключа с использованием SHA256 с ECDSA.
Я пробовал с этим решением https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/signing_and_verifying Но здесь у меня проблемы с преобразованием String publicKey / privateKey (которыйэто выборка из API.) в SecKey.
Ниже код, который я сделал до сих пор, пожалуйста, помогите мне сделать это.Кроме того, пожалуйста, убедитесь, что я нахожусь на правильном пути или нуждаюсь в некоторых изменениях ключа подписи и проверки с помощью SHA256 с ECDSA
/// 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
}