2

SecKeyRawSignPDF の SHA ダイジェストにデジタル署名するために使用し、 SecKeyRawSignOSStatus = noErr を報告しますが、プロジェクトを実行するたびにランダムな署名オブジェクトを取得します。

privateKey は常に同じです (キーチェーンに保存されます)。ドキュメントダイジェストが同じであることも確認しました(base64に変換し、hexdumpも使用)

したがって、問題は次のとおりです。同じ入力が与えられた場合、SecKeyRawSign は status = noErr を報告しますが、出力は異なります。

これは私が使用しているコードです:

NSData *hashData = [self getHashData];
SecKeyRef privateKey = [self getPrivateKeyFromKeychain];

size_t signatureBytesSize = SecKeyGetBlockSize(privateKey); 
uint8_t *signatureBytes = malloc(signatureBytesSize * sizeof(uint8_t));
memset((void *)signatureBytes, 0x0, signatureBytesSize);

OSStatus status = noErr;
status = SecKeyRawSign(privateKey, kSecPaddingSHA1, (const unsigned char *)hashData.bytes, SecKeyGetBlockSize(privateKey), signatureBytes, &signatureBytesSize);

if (status == noErr) {
    NSLog(@"Signing OK");
    NSLog(@"Signature: \"%s\"", signatureBytes);
} else {
    NSLog(@"Error signing data: result code: %d", (int)status);
}

私は常にstatus = noErr、「Signing OK」を取得しますが、signatureBytesはランダムでランダムなサイズです。

別のパディングで試しました。また、署名バッファ サイズをキー サイズ - 11 に設定します (ドキュメントに従って)。

ドキュメントを調べたところ、署名オブジェクト タイプ (sig) に関する詳細を見つけることができませんでした。Base64に変換できるのは生のバイトだと思います。

どんな助けでも大歓迎です.... e

4

1 に答える 1

3

私は問題を発見し、PDF ハッシュに署名して署名を検証することができました。の変数のSecKeyGetBlockSize(privateKey)代わりに使用していましたhashData.lengthdataToSignLenSecKeyRawSign

size_t signatureBytesSize = SecKeyGetBlockSize(privateKey);
uint8_t *signatureBytes = malloc(signatureBytesSize * sizeof(uint8_t));
memset((void *)signatureBytes, 0x0, signatureBytesSize);
OSStatus signStatus = SecKeyRawSign(directPrivateKey, kSecPaddingPKCS1SHA1, (const unsigned char *)hashData.bytes, hashData.length, signatureBytes, &signatureBytesSize);
于 2015-02-12T17:50:04.320 に答える