在Mac OS X上相当于SecKeyRawVerify的功能?

时间:2014-02-25 04:46:10

标签: macos cryptography digital-signature

我正在尝试为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及更高版本。

1 个答案:

答案 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...");
}