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

person drew    schedule 25.05.2012    source источник


Ответы (2)


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

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

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

Я обнаружил, что происходит. Вызов SecKeyRawVerify принимает дайджест ваших данных в качестве входных данных, а не сами данные. Приведенный ниже код работает — и, кстати, если подпись не проверена из-за изменения базовых данных, то возвращается статус -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)
                          );
person drew    schedule 27.05.2012
comment
Дело не в том, что SecKeyRawVerify ожидает хэш ваших данных. Дело в том, что все, что вы использовали для создания подписи, в первую очередь создало подпись на основе хэша ваших данных. - person Greg; 23.05.2014