SecKeyRawVerify et OSError -9809

J'utilise des certificates numériques pour signer des files de données dans mon application. Le fragment de code ci-dessous échoue lorsque l'appel à SecKeyRawVerify renvoie avec -9809. Cela fonctionne sur un iPhone. Je ne peux même pas identifier exactement ce que ce code d'erreur signifie

Les appels antérieurs du Framework de security pour charger et créer le SecTrustRef à partir duquel la key publique est obtenue semblent corrects – pas d'erreurs. Le seul SecTrustEvaluate problème est que l'appel à SecTrustEvaluate renvoie un kSecTrustResultUnspecified , mais je suppose que c'est parce que la politique que j'utilise est celle renvoyée par l'appel SecPolicyCreateBasicX509 .

Toute aide ou compréhension serait très appréciée.

Merci

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

Cette erreur est définie (ainsi que d'autres connexes) dans /System/Library/Frameworks/Security.framework/Headers/SecureTransport.h sous errSSLCrypto . Le commentaire y appelle "erreur cryptographique sous-jacente", ce qui n'est pas une description particulièrement descriptive.

Une pensée: kSecTrustResultUnspecified signifie que le niveau de confiance est égal à la politique système par défaut. Tous les certificates de la string sont-ils approuvés?

J'ai découvert ce qui se passe. L'appel SecKeyRawVerify prend le résumé de vos données comme input, pas datatables elles-mêmes. Le code ci-dessous fonctionne – et accessoirement, si la signature n'est pas vérifiée parce que datatables sous-jacentes ont changé, alors le return d'état est -9809.

Merci

 CC_SHA1((const void *)[data bytes], [data length], (unsigned char *)hash); status = SecKeyRawVerify (keyRef, kSecPaddingPKCS1SHA1, hash, 20, (const uint8_t *)[signature bytes], SecKeyGetBlockSize(keyRef) );