2009-07-27 24 views
5

Estoy tratando de obtener los atributos de un elemento de llavero. Este código debe buscar todos los atributos disponibles, luego imprimir sus etiquetas y contenidos.Cómo obtener atributos de elementos de llavero

Según the docs debería ver etiquetas como 'cdat', pero en su lugar solo parecen un índice (es decir, la primera etiqueta es 0, la siguiente es 1). Esto lo hace bastante inútil ya que no puedo decir qué atributo es el que estoy buscando.

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

Respuesta

1

Creo que la documentación lleva a un poco de confusión.

Los números que estoy viendo parecen ser keychain item attribute constants for keys.

Sin embargo, SecKeychainItemCopyAttributesAndData devuelve una estructura SecKeychainAttributeList, que contiene una matriz de SecKeychainAttributes. De TFD:

etiqueta Una etiqueta de atributo de 4 bytes. Consulte "Constantes de atributos de elementos de llavero" para conocer los tipos de atributos válidos.

Las constantes de atributo (de la variedad que no es "for keys") son los valores de 4 caracteres que esperaba ver.

3

Hay dos cosas que debe hacer aquí. En primer lugar, usted necesita para manejar itemClasses "genéricas" antes de la llamada a 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 
} 

En segundo lugar, es necesario convertir la attr.tag de un FourCharCode en una cadena, es decir

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

Tenga en cuenta que también he generado los datos como una cadena; casi siempre son datos codificados en UTF8.

+0

Gracias por explicar cómo manejar las clases de elementos genéricos. La documentación para 'SecKeychainAttributeInfoForItemID' deja mucho que desear. –

Cuestiones relacionadas