SecKeyRawVerify和OSERROR -9809(SecKeyRawVerify and

2019-06-24 19:09发布

我使用数字证书在我的应用程序对数据进行签名的文件。 当调用下面的代码片段失败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]
                          );

Answer 1:

中定义的错误(以及其他相关的) /System/Library/Frameworks/Security.framework/Headers/SecureTransport.herrSSLCrypto 。 注释有称之为“底层加密错误”,这不是一个特别的描述性说明。

一个念头: kSecTrustResultUnspecified意味着信任级别等于默认的系统策略。 在链中的所有证书是否可信?



Answer 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 and OSError -9809