Подписание и проверка в iOS swift с использованием SHA256 с помощью ECDSA - PullRequest
0 голосов
/ 08 марта 2019

Нужна одна помощь, для создания подписи и проверки ключа с использованием 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
}
...