2012-05-25 31 views
5

我正在使用数字证书在我的应用程序中签署数据文件。当对SecKeyRawVerify的调用返回-9809时,下面的代码片段失败。这是在iPhone上运行。我什至不能确切地确定这个错误代码意味着什么SecKeyRawVerify和OSError -9809

以前的安全框架调用来加载和创建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] 
         ); 

回答

1

我发现了所发生的事情。 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) 
         ); 
+1

并不是说SecKeyRawVerify预计数据的散列。这就是说,无论您用什么来生成签名,首先都会根据数据的散列创建签名。 – Greg

3

即误差在/System/Library/Frameworks/Security.framework/Headers/SecureTransport.h定义(连同其它相关的)作为​​。那里的评论称它为“底层密码错误”,这不是一个特别描述性的描述。

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

+0

我不是100%肯定。链的根证书是自签名的,签名证书是由该根签名的,所以链本身是好的,尽管在系统级别上根不存在信任。证书未加载到钥匙串中 - trustRef是使用从pkcs12 blob加载的证书动态创建的 – drew