2009-07-27 11 views
5

Próbuję uzyskać atrybuty elementu z pęku kluczy. Ten kod powinien wyszukać wszystkie dostępne atrybuty, a następnie wydrukować ich tagi i zawartość.Uzyskiwanie atrybutów przedmiotów z pęku kluczy

Powinienem zobaczyć znaczniki, takie jak "cdat", ale zamiast tego po prostu wyglądają jak indeks (tj. Pierwszy znacznik to 0, następny to 1). To czyni go całkiem bezużytecznym, ponieważ nie mogę stwierdzić, który atrybut jest tym, którego szukam.

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); 

Odpowiedz

1

Myślę, że dokumentacja prowadzi do trochę zamieszania.

Wyświetlane liczby to keychain item attribute constants for keys.

Jednak SecKeychainItemCopyAttributesAndData zwraca strukturę SecKeychainAttributeList, która zawiera tablicę SecKeychainAttributes. Od TFD:

tag 4-bajtowy znacznik atrybutu. Zobacz "Stałe atrybutów pozycji w pęku kluczy", aby zobaczyć prawidłowe typy atrybutów.

Stałe atrybutu (odmiany "dla kluczy") to 4-char wartości, które spodziewałem się zobaczyć.

3

Są dwie rzeczy, które powinieneś tu robić. Po pierwsze, trzeba obsłużyć „rodzajowe” itemClasses przed wywołaniem 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 
} 

Po drugie, trzeba przekonwertować attr.tag z FourCharCode do łańcucha, tj

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]]); 

Zauważ, że również wyprowadzam dane jako ciąg znaków - prawie zawsze jest to zakodowane dane UTF8.

+0

Dzięki za wyjaśnienie, jak obsługiwać ogólne klasy przedmiotów. Dokumentacja dla 'SecKeychainAttributeInfoForItemID' pozostawia wiele do życzenia. –

Powiązane problemy