SecKeyRawVerify и OSError -9809

Я использую цифровые сертификаты для подписи файлов данных в моем приложении. Приведенный ниже фрагмент кода завершается ошибкой при вызове 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 ответа

Решение

Я обнаружил, что происходит. 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)
                          );

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

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

Другие вопросы по тегам