3

非常に基本的なバージョンの SecKeySign() を動作させるのに問題があります (つまり、動作する OSX SecSignTransformCreate()/SecTransformSetAttribute()/SecTransformExecute() を iOS に移植する):

コードはhttp://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.htmlとほぼ同じですが、さらに単純化されています。

最初に - セットアップ - 上記のリンクに従ってください。変更はありません。

const char someData[] = "No one loves pain itself, but those who seek...";

NSData * blob = [NSData dataWithBytes:someData length:sizeof(someData)];
assert(blob);

SecKeyRef publicKeyRef, privateKeyRef;
int keySize = 2048;

OSStatus sanityCheck = noErr;
NSMutableDictionary * privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * keyPairAttr = [[NSMutableDictionary alloc] init];

// attribute dictionaries for 2048 bit RSA key pair.
//
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(__bridge id)kSecAttrKeySizeInBits];
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
[keyPairAttr setObject:privateKeyAttr forKey:(__bridge id)kSecPrivateKeyAttrs];
[keyPairAttr setObject:publicKeyAttr forKey:(__bridge id)kSecPublicKeyAttrs];

実際の作業は、鍵ペアの生成から始まります。

sanityCheck = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, &publicKeyRef, &privateKeyRef);
assert(sanityCheck == noErr);

NSLog(@"Pub/Priv: %@/%@", publicKeyRef, privateKeyRef);

私が見る限り、これは見事に機能します。

問題は、それらを使用して署名することです。またはむしろ署名:

// Zero-ed Buffer for the signature.
//
size_t signatureBytesSize = SecKeyGetBlockSize(privateKeyRef);
assert(signatureBytesSize == keySize / 8);

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

// Sign the binary blob; with type 1 padding.
//
sanityCheck = SecKeyRawSign(privateKeyRef,
                            kSecPaddingPKCS1,
                            (const uint8_t *)[blob bytes], [blob length],
                            (uint8_t *)signatureBytes, &signatureBytesSize
                            );
assert(sanityCheck == noErr);

これは常に -50/errSecParam を返します (関数に渡された 1 つ以上のパラメーターが無効でした)。

助言がありますか ?これは実際のiPhone上ですか?

ありがとう、

Dw。

4

2 に答える 2

0

私が解決できる限り、SecKeyRawSign() の唯一の受け入れ可能な入力は、SHA_DIGEST_LEN のデータ ブロックです。それ以外は拒否されます。

SHA1 ハッシュはこの関数によって計算されるため、必要なスペースのみを渡す必要があります。

SHA2 やその他のハッシュを指定する方法をまだ見つけていません。

Dw

于 2012-05-19T09:53:30.900 に答える