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
означает, что уровень доверия равен системной политике по умолчанию. Доверяют ли все сертификаты в цепочке?