【问题标题】:SecKeyRawVerify and OSError -9809SecKeyRawVerify 和 OSError -9809
【发布时间】:2012-05-25 15:17:03
【问题描述】:

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

先前的安全框架调用来加载和创建从中获取公钥的 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]
                          );

【问题讨论】:

    标签: ios objective-c security-framework


    【解决方案1】:

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

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

    【讨论】:

    • 我不是 100% 确定的。链的根证书是自签名的,并且签名证书是由该根签名的,因此链本身是好的,尽管在系统级别对根没有信任。证书未加载到钥匙串中 - trustRef 是使用从 pkcs12 blob 加载的证书动态创建的
    【解决方案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)
                              );
    

    【讨论】:

    • SecKeyRawVerify 并不需要你的数据的哈希值。就是你最初用来生成签名的任何东西都会根据你的数据哈希创建一个签名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多