2012-05-25 4 views
5

Ich verwende digitale Zertifikate zum Signieren von Dateien in meiner App. Das folgende Codefragment schlägt fehl, wenn der Aufruf von SecKeyRawVerify mit -9809 zurückkehrt. Dies läuft auf einem iPhone. Ich kann nicht einmal genau identifizieren, was dieser Fehlercode bedeutetSecKeyRawVerify und OSError -9809

Das vorherige Security Framework Aufrufe zum Laden und Erstellen der SecTrustRef, von denen der öffentliche Schlüssel erhalten scheint gut - keine Fehler. Das einzige kleine Problem ist, dass der Anruf an SecTrustEvaluate eine kSecTrustResultUnspecified zurückgibt, aber ich nehme an, dass, weil die Politik, die ich benutze, das Boilerplate ist, das durch den SecPolicyCreateBasicX509 Aufruf zurückgegeben wird.

Jede Hilfe oder Einsicht würde sehr geschätzt werden.

Dank

SecKeyRef keyRef = SecTrustCopyPublicKey (trustRef); 

fileURL = [[NSBundle mainBundle] URLForResource:@"data" withExtension:@"txt"]; 
NSData *data = [NSData dataWithContentsOfURL:fileURL]; 

fileURL = [[NSBundle mainBundle] URLForResource:@"data" withExtension:@"sgn"]; 
NSData *signature = [NSData dataWithContentsOfURL:fileURL]; 

NSLog(@"Hash block size = %zu",SecKeyGetBlockSize(keyRef)); 

status = SecKeyRawVerify (keyRef, 
          kSecPaddingPKCS1SHA1, 
          (const uint8_t *)[data bytes], 
          (size_t)[data length], 
          (const uint8_t *)[signature bytes], 
          (size_t)[signature length] 
         ); 

Antwort

1

Ich habe entdeckt, was passiert. Der Aufruf SecKeyRawVerify nimmt den Digest Ihrer Daten als Eingabe und nicht die Daten selbst. Der folgende Code funktioniert - und wenn die Signatur nicht überprüft wird, weil sich die zugrunde liegenden Daten geändert haben, lautet der Status-Return-Wert -9809.

Dank

CC_SHA1((const void *)[data bytes], [data length], (unsigned char *)hash); 

status = SecKeyRawVerify (keyRef, 
          kSecPaddingPKCS1SHA1, 
          hash, 
          20, 
          (const uint8_t *)[signature bytes], 
          SecKeyGetBlockSize(keyRef) 
         ); 
+1

Es ist nicht so, dass 'SecKeyRawVerify' den Hash Ihrer Daten erwartet. Es ist das, was auch immer Sie verwendet haben, um die Signatur an erster Stelle zu erzeugen, die eine Unterschrift basiert auf dem Hasch Ihrer Daten. – Greg

3

Dieser Fehler definiert ist (zusammen mit anderen verwandten sind) in /System/Library/Frameworks/Security.framework/Headers/SecureTransport.h als errSSLCrypto. Der Kommentar nennt es "zugrundeliegender kryptographischer Fehler", was keine besonders beschreibende Beschreibung ist. Ein Gedanke: kSecTrustResultUnspecified bedeutet, dass die Vertrauensstufe der Standardsystemrichtlinie entspricht. Sind alle Zertifikate in der Kette vertrauenswürdig?

+0

Ich bin nicht 100% sicher. Das Stammzertifikat für die Kette ist selbstsigniert, und das Signaturzertifikat wird von diesem Stammzeichen signiert, sodass die Kette selbst gut ist, obwohl auf Systemebene kein Vertrauen in das Stammverzeichnis besteht. Die Zertifikate werden nicht in den Schlüsselbund geladen - der TrustRef wird dynamisch mit den Zertifikaten erstellt, die aus einem pkcs12-Blob geladen werden – drew

Verwandte Themen