2012-05-25 11 views
5

estoy usando certificados digitales para firmar los archivos de datos en mi aplicación. El siguiente fragmento de código falla cuando la llamada a SecKeyRawVerify regresa con -9809. Esto se ejecuta en un iPhone. Ni siquiera puedo identificar exactamente qué significa este código de errorSecKeyRawVerify y OSError -9809

El Marco de Seguridad antes de escala para cargar y crear el SecTrustRef a partir del cual se obtiene la clave pública parecen estar bien - no hay errores. El único problema es que la llamada a SecTrustEvaluate devuelve un kSecTrustResultUnspecified, pero supongo que se debe a la política que estoy usando es el repetitivo devuelto por la llamada SecPolicyCreateBasicX509.

Cualquier ayuda o penetración sería muy apreciado.

Gracias

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] 
         ); 

Respuesta

1

he descubierto lo que está pasando. La llamada SecKeyRawVerify toma el resumen de sus datos como entrada, no los datos en sí. El siguiente código funciona, y de paso, si la firma no se verifica porque los datos subyacentes han cambiado, entonces el estado devuelto es -9809.

Gracias

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

. No es que 'SecKeyRawVerify' espera el hash de sus datos. Es que cualquier cosa que utilizó para generar la firma en primer lugar creó una firma basada en el hash de sus datos. – Greg

3

Ese error se define (junto con otras relacionadas) en /System/Library/Frameworks/Security.framework/Headers/SecureTransport.h como errSSLCrypto. El comentario allí lo llama "error criptográfico subyacente", que no es una descripción particularmente descriptiva.

Un pensamiento: kSecTrustResultUnspecified significa que el nivel de confianza es igual a la regla predeterminada del sistema. ¿Son confiables todos los certificados de la cadena?

+0

no estoy 100% seguro. El certificado de raíz para la cadena está autofirmado y el certificado de firma está firmado por esa raíz, por lo que la cadena en sí es buena, aunque a nivel de sistema no hay confianza en la raíz. Los certs no se cargan en el llavero: el trustRef se crea dinámicamente utilizando los certs cargados desde un blob pkcs12 – drew

Cuestiones relacionadas