0

在 iOS 中有SecKeyRawSign()生成签名的方法,可以让你指定填充类型。

OSStatus SecKeyRawSign (
   SecKeyRef key,
   SecPadding padding,
   const uint8_t *dataToSign,
   size_t dataToSignLen,
   uint8_t *sig,
   size_t *sigLen
);

在 OSX 上它不会以这种方式工作,我正在使用安全转换来做到这一点,如此处所述https://developer.apple.com/library/mac/#documentation/Security/Conceptual/SecTransformPG/SigningandVerifying/SigningandVerifying。 html#//apple_ref/doc/uid/TP40010801-CH4-SW3

  /* Create the transform objects */
    signer = SecSignTransformCreate(privatekey, &error);
    if (error) { CFShow(error); exit(-1); }


    SecTransformSetAttribute(
                             signer,
                             kSecTransformInputAttributeName,
                             sourceData,
                             &error);
    if (error) { CFShow(error); exit(-1); }

  signature = SecTransformExecute(signer, &error);
    if (error) { CFShow(error); exit(-1); }

    if (!signature) {
        fprintf(stderr, "Signature is NULL!\n");
        exit(-1);
    }
  1. 有没有办法在这里设置填充?如果可能,请提供示例。

  2. 在 iOS 的 Security Framework 中,定义kSecPaddingPKCS1SHA256SHA256来设置填充。在 OSX 上没有,那么应该等同于使用什么?我需要为 SHA256 设置填充。

谢谢!

4

1 回答 1

1

这是未经测试的实验性代码,但您需要指定PKCS1填充,您使用的是SHA-2Digest 类型,并且大小为256

SecTransformSetAttribute(
                     signer,
                     kSecPaddingKey,
                     kSecPaddingPKCS1Key,
                     &error);
if (error) { CFShow(error); exit(-1); }

SecTransformSetAttribute(
                     signer,
                     kSecDigestTypeAttribute,
                     kSecDigestSHA2,
                     &error);
if (error) { CFShow(error); exit(-1); }

int digestLength = 256;
CFNumberRef dLen = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &digestLength);
Boolean set = SecTransformSetAttribute(
                     signer,
                     kSecDigestLengthAttribute,
                     dLen,
                     &error);
CFRelease(dLen);
if (!set || error) { CFShow(error); exit(-1); }
于 2013-04-07T14:26:18.617 回答