2009-07-27 23 views
5

キーチェーンアイテムの属性を取得しようとしています。このコードは利用可能なすべての属性を検索し、タグと内容を印刷します。キーチェーンアイテムの属性の取得

the docsによると、「cdat」のようなタグが表示されるはずですが、インデックスのように見えます(つまり、最初のタグは0、次に1です)。これは、私が探している属性がどれであるかわからないので、かなり役に立たなくなります。

SecItemClass itemClass; 
    SecKeychainItemCopyAttributesAndData(itemRef, NULL, &itemClass, NULL, NULL, NULL); 

    SecKeychainRef keychainRef; 
    SecKeychainItemCopyKeychain(itemRef, &keychainRef); 

    SecKeychainAttributeInfo *attrInfo; 
    SecKeychainAttributeInfoForItemID(keychainRef, itemClass, &attrInfo); 

    SecKeychainAttributeList *attributes; 
    SecKeychainItemCopyAttributesAndData(itemRef, attrInfo, NULL, &attributes, 0, NULL); 

    for (int i = 0; i < attributes->count; i ++) 
    { 
     SecKeychainAttribute attr = attributes->attr[i]; 
     NSLog(@"%08x %@", attr.tag, [NSData dataWithBytes:attr.data length:attr.length]); 
    } 

    SecKeychainFreeAttributeInfo(attrInfo); 
    SecKeychainItemFreeAttributesAndData(attributes, NULL); 
    CFRelease(itemRef); 
    CFRelease(keychainRef); 

答えて

1

私はドキュメントがちょっと混乱していると思います。

私が見ている数字はkeychain item attribute constants for keysと思われます。

しかし、SecKeychainItemCopyAttributesAndDataはSecKeychainAttributesの配列を含んSecKeychainAttributeList構造体を返します。 TFDから:

タグ 4バイトの属性タグ。有効な属性タイプについては、「Keychain Item Attribute Constants」を参照してください。

( "for keys"以外の)属性定数は、私が見たいと思った4文字の値です。

3

ここでは2つのことを行う必要があります。まず、あなたは... SecKeychainAttributeInfoForItemIDへの呼び出しの前に

switch (itemClass) 
{ 
    case kSecInternetPasswordItemClass: 
     itemClass = CSSM_DL_DB_RECORD_INTERNET_PASSWORD; 
     break; 
    case kSecGenericPasswordItemClass: 
     itemClass = CSSM_DL_DB_RECORD_GENERIC_PASSWORD; 
     break; 
    case kSecAppleSharePasswordItemClass: 
     itemClass = CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD; 
     break; 
    default: 
     // No action required 
} 

セカンドの「ジェネリック」itemClassesを処理する必要がある、あなたはすなわち、文字列にFourCharCodeから

NSLog(@"%c%c%c%c %@", 
    ((char *)&attr.tag)[3], 
    ((char *)&attr.tag)[2], 
    ((char *)&attr.tag)[1], 
    ((char *)&attr.tag)[0], 
    [[[NSString alloc] 
     initWithData:[NSData dataWithBytes:attr.data length:attr.length] 
     encoding:NSUTF8StringEncoding] 
    autorelease]]); 

をattr.tagを変換する必要がありますデータを文字列として出力したことに注目してください。ほとんどの場合、UTF8でエンコードされたデータです。

+0

一般的なアイテムクラスを処理する方法を説明してくれてありがとうございます。 SecKeychainAttributeInfoForItemID' 'のドキュメントを希望する多くの葉。 –

関連する問題