7

我正在使用数字证书对我的应用程序中的数据文件进行签名。当调用SecKeyRawVerify返回 -9809 时,下面的代码片段失败。这是在 iPhone 上运行的。我什至无法准确识别此错误代码的含义

先前的安全框架调用来加载和创建从中获取公钥的 SecTrustRef 似乎很好 - 没有错误。唯一的小问题是调用SecTrustEvaluate返回 a 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]
                          );
4

2 回答 2

3

/System/Library/Frameworks/Security.framework/Headers/SecureTransport.h该错误在as中定义(以及其他相关错误)errSSLCrypto。那里的评论称其为“潜在的密码错误”,这不是一个特别描述性的描述。

一种想法:kSecTrustResultUnspecified意味着信任级别等于默认系统策略。链中的所有证书都受信任吗?

于 2012-05-26T01:58:36.987 回答
2

我发现了发生了什么。该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)
                          );
于 2012-05-27T07:30:09.367 回答