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 で説明されているように、Security Transforms を使用してそれを実行しています。 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. Security Framework の iOS では、パディングを設定するkSecPaddingPKCS1SHA256ためのSHA256の定義があります。OSX には がないので、何を使用する必要がありますか? SHA256 のパディングを設定する必要があります。

ありがとう!

4

1 に答える 1

1

PKCS1これはテストされていない実験的なコードですが、パディングを指定する必要があり、SHA-2ダイジェスト タイプを使用していて、サイズは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 に答える