Вопрос по objective-c, ios – SecKeyRawVerify и OSError -9809

5

Я использую цифровые сертификаты для подписи файлов данных в моем приложении. Приведенный ниже фрагмент кода завершается ошибкойSecKeyRawVerify возвращается с -9809. Это работает на iPhone. Я даже не могу точно определить, что означает этот код ошибки

Предыдущие вызовы Security Framework для загрузки и создания SecTrustRef, из которых получен открытый ключ, выглядят нормально - ошибок нет. Единственная небольшая проблема заключается в том, что призыв кSecTrustEvaluate возвращаетkSecTrustResultUnspecified, но я предполагаю, что это потому, что политика, которую я использую, является образцом, возвращеннымSecPolicyCreateBasicX509 вызов.

Любая помощь или понимание будет очень цениться.

Спасибо

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

Ваш Ответ

2   ответа
3

/System/Library/Frameworks/Security.framework/Headers/SecureTransport.h какerrSSLCrypto, Этот комментарий называет это «скрытой криптографической ошибкой», что не является особенно описательным описанием.

Одна мысль:kSecTrustResultUnspecified означает, что уровень доверия равен системной политике по умолчанию. Доверяют ли все сертификаты в цепочке?

Я не уверен на 100%. Корневой сертификат для цепочки самоподписан, и сертификат подписи подписан этим корнем, поэтому сама цепочка является хорошей, хотя на системном уровне нет доверия к корню. Сертификаты не загружаются в цепочку для ключей - trustRef создается динамически с использованием сертификатов, загруженных из BLB-объекта pkcs12. drew
1

SecKeyRawVerify call принимает в качестве входных данных дайджест ваших данных, а не сами данные. Приведенный ниже код работает - и, кстати, если подпись не проверена из-за изменения базовых данных, возвращаемое состояние равно -9809.

Спасибо

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

status = SecKeyRawVerify (keyRef,
                          kSecPaddingPKCS1SHA1,
                          hash,
                          20,
                          (const uint8_t *)[signature bytes],
                          SecKeyGetBlockSize(keyRef)
                          );
Это не такSecKeyRawVerify ожидает хеш ваших данных. Это означает, что все, что вы использовали для генерации подписи, в первую очередь создавало подпись на основе хеша ваших данных.

Похожие вопросы