5

Apple の例から Security.Framework SecKeyRawVerify iOS 関数を実装しようとすると、プログラムが不正なポインター エラー (EXC_BAD_ACCESS コード = 2) で停止します。ヘルプや提案をいただければ幸いです。

これが私のコードです:

- (BOOL)verifySignature:(NSData *)plainText signature:(NSData *)sig {
    size_t signedHashBytesSize = 0;

    OSStatus sanityCheck = noErr;
    SecKeyRef publicKeyA = NULL;

    NSMutableDictionary * queryPublicKeyA = [[NSMutableDictionary alloc] init];
    NSData * publicTag = [NSData dataWithBytes:publicKeyAIdentifier length:strlen((const char *)publicKeyAIdentifier)]; // 

    // Set the public key query dictionary.
    [queryPublicKeyA setObject:(id)kSecClassKey forKey:(id)kSecClass];
    [queryPublicKeyA setObject:publicTag forKey:(id)kSecAttrApplicationTag];
    [queryPublicKeyA setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [queryPublicKeyA setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];

    // Get the key bits.
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKeyA, (CFTypeRef *)&publicKeyA);

    if (sanityCheck == noErr) {       
        // Get the size of the assymetric block.
        signedHashBytesSize = SecKeyGetBlockSize(publicKeyA); // Halts here
        sanityCheck = SecKeyRawVerify(publicKeyA, 
                                  kSecPaddingPKCS1SHA1, 
                                  (const uint8_t *)[[self getHashBytes:plainText] bytes],
                                  CC_SHA1_DIGEST_LENGTH,
                                  (const uint8_t *)[sig bytes],
                                  signedHashBytesSize
                                  ); // And here
    }
    if(publicKeyA) CFRelease(publicKeyA);
    if(queryPublicKeyA) [queryPublicKeyA release]; 

    return (sanityCheck == noErr) ? YES : NO;
}

Apple CryptoExcersize へのリンク: http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008019-Intro-DontLinkElementID_2

4

0 に答える 0