我正在尝试为MacOSX(> 10.6)创建一个与iOS SecKeyRawVerify
(验证数字签名)相同的功能,但到目前为止我无法这样做。我想知道为什么Apple会为iOS提供这样的功能而没有其他人为OSX做同样的工作?
任何帮助都很重要,我整天都在苦苦挣扎。
iOS功能的简要说明:
SecKeyRawVerify
验证数字签名。
OSStatus SecKeyRawVerify ( SecKeyRef key, SecPadding padding, const uint8_t *signedData, size_t signedDataLen, const uint8_t *sig, size_t sigLen );
参数
key
用于验证数据的公钥。
padding
使用的填充类型。 “数字签名填充类型”中列出了可能的值。如果要使用摘要类型的DER编码验证PKCS1样式签名,并且签名数据是实际数据的SHA1摘要,请使用kSecPaddingPKCS1SHA1。如果没有使用填充,请指定kSecPaddingNone。
signedData
正在验证签名的数据。通常,签署实际数据的摘要。
signedDataLen
signedData缓冲区中数据的字节长度。
sig
要验证的数字签名。
sigLen
sig缓冲区中的数据长度。返回值结果代码。请参阅“证书,密钥和信任” 服务结果代码。“
状况
适用于iOS 2.0及更高版本。
答案 0 :(得分:0)
在OS X上,您必须使用安全性转换,例如:
CFErrorRef error;
SecTransformRef verifier = SecVerifyTransformCreate(publicKey,
(CFDataRef)signature,
&error);
if (error) { CFShow(error); exit(-1); }
SecTransformSetAttribute(verifier,
kSecPaddingKey,
kSecPaddingPKCS1Key,
&error);
if (error) { CFShow(error); exit(-1); }
/* Specify digest type */
SecTransformSetAttribute(verifier,
kSecDigestTypeAttribute,
kSecDigestSHA1,
&error);
if (error) { CFShow(error); exit(-1); }
/* Raw data */
SecTransformSetAttribute(verifier,
kSecTransformInputAttributeName,
dataWithoutSignature,
&error);
CFTypeRef result = SecTransformExecute(verifier, &error);
if (error) {
CFShow(error);
exit(-1);
}
if (result == kCFBooleanTrue)
{
NSLog(@"VERIFY: success.");
}
else
{
NSLog(@"VERIFY: failure, again...");
}