3

どのステータスからもエラーが発生していないにもかかわらず、SecKeyRef は常に null です。最初はアークの問題だと思っていましたが、キャストは問題ないようです。どんな助けでも大歓迎です。

+ (SecKeyRef)addPublicKey:(NSString *)key withTag:(NSString *)tag
    {
        // This will be base64 encoded, decode it.
        NSData *d_key = [key dataUsingEncoding:NSUTF8StringEncoding];

        if (d_key == nil) return (FALSE);

        NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];

        // Delete any old lingering key with the same tag
        NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
        [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
        [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
        [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
        SecItemDelete((__bridge CFDictionaryRef)publicKey);

        CFTypeRef persistKey = nil;

        // Add persistent version of the key to system keychain
        [publicKey setObject:d_key forKey:(__bridge id)kSecValueData];
        [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)kSecAttrKeyClass];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef];

        OSStatus secStatus = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);

        NSLog(@"OSStatus = %ld", secStatus);  // Always returns no error = 0

        if (persistKey != nil) CFRelease(persistKey);

        if ((secStatus != noErr) && (secStatus != errSecDuplicateItem)) {
            return nil;
        }

        // Now fetch the SecKeyRef version of the key
        SecKeyRef keyRef;

        [publicKey removeObjectForKey:(__bridge id)kSecValueData];
        [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
        [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
        [publicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];


        secStatus = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);

        NSLog(@"secStatus = %ld", secStatus); // Always returns no error = 0

        return keyRef; // Always null!
    }
4

3 に答える 3

0

私は似たようなことに取り組んでいて、この投稿に出くわしました。私はあなたのコードを試しました、そしてそれは私にとってうまくいきました、それで私はそれが正しいと思います。キーデータが間違っているのではないかと思います。この方法で不正なキーデータをフィードしようとしましたが、あなたが述べたようにnull参照が返されました。これを使用して、モジュラスと指数から公開鍵(ASN.1 DER)を構築しています-

https://github.com/meinside/iphonelib/blob/master/security/CryptoUtil.m#L67

保留中のプルリクエストがいくつかあることに注意してください。

おそらく、.cerファイルを試すか、opensslでrsaキーを生成し、CryptoUtilでモジュラスと指数を使用する必要があると思います。

于 2012-07-15T20:57:02.573 に答える