2017-07-12 4 views
1

Ich generierte ein Paar aus privatem und öffentlichem Schlüssel mit elliptischen Kurven auf iOS und speicherte sie im Schlüsselbund innerhalb der sicheren Enklave.So signieren/verifizieren Sie mithilfe von SecKeyRawSign mit elliptischem Kurvenschlüssel

Ich möchte eine Nachricht mit diesen Schlüsseln signieren/verifizieren.

Also, hier ist mein Code zum Signieren einer Nachricht mit SecKeyCreateSignature.

var error: Unmanaged<CFError>? 
let signature = SecKeyCreateSignature(myPrivateKey, 
             .ecdsaSignatureMessageX962SHA512, 
             plainData as CFData, 
             &error) 

Es funktioniert gut, aber SecKeyCreateSignature ist nur in iOS 10.

I Kompatibilität 9 zumindest mit iOS halten möchten. Also habe ich den alternativen Weg gesucht, um eine Nachricht zu signieren, und ich fand SecKeyRawSign, die ähnlich wie die obige Funktion aussehen.

Jedoch scheint SecKeyRawSign nicht wie elliptischen Kurvenschlüssel zu unterstützen.

Wie kann ich SecKeyRawSign oder alternative Möglichkeiten zum Signieren/Verifizieren einer Nachricht verwenden, die dem obigen Code entspricht oder ähnlich ist?

Antwort

0

Für die Kompatibilität können Sie SecKeyRawSign ähnlich wie SecKeyCreateSignature verwenden.

In diesem Fall sind sie nicht äquivalent, da der Algorithmus zum Erstellen der Signatur unterschiedlich ist. Aber sie können wie üblich signieren/verifizieren.


func signCompat(privateKey: SecKey, rawData: Data) -> Data? { 
    if #available(iOS 10.0, *) { 
     return sign_iOS_10(privateKey: privateKey, rawData: rawData) 
    } else { 
     return sign_iOS_9(privateKey: privateKey, rawData: rawData) 
    } 
} 


@available(iOS 10.0, *) 
func sign_iOS_10(privateKey: SecKey, rawData: Data) -> Data? { 
    let algorithm = SecKeyAlgorithm.ecdsaSignatureMessageX962SHA512 
    return SecKeyCreateSignature(privateKey, algorithm, rawData as CFData, nil) as Data? 
} 

func sign_iOS_9(privateKey: SecKey, rawData: Data) -> Data? { 

    let sha512digestedData = rawData.sha512() 
    var raw_signature_length = 512 
    let raw_signature_bytes = UnsafeMutablePointer<UInt8>.allocate(capacity: 512) 

    let osStatus = SecKeyRawSign(privateKey, 
            .PKCS1SHA512, 
            [UInt8](sha512digestedData), 
            Int(CC_SHA512_DIGEST_LENGTH), 
            raw_signature_bytes, 
            &raw_signature_length) 

    guard osStatus == errSecSuccess else { return nil } 
    return Data(bytes: raw_signature_bytes, count: raw_signature_length) 
} 

// The same logic is applied to verify 
// 
func verifyCompat(privateKey: SecKey, rawData: Data) -> Data? { ... } 

@available(iOS 10.0, *) 
func verify_iOS_10(privateKey: SecKey, rawData: Data) -> Data? { ... } 

func verify_iOS_9(privateKey: SecKey, rawData: Data) -> Data? { ... } 

Sie für Richtigkeit mit diesen openssl Befehle überprüfen können.

// Sign 
openssl dgst -sha512 -sign private.pem <test.pdf> signature.bin 

// Verify 
openssl dgst -sha512 -verify public.pem -signature signature.bin test.pdf 
Verwandte Themen