2011-09-19 10 views

Respuesta

7

libcrypto es parte de OpenSSL, que no ha cambiado mucho. No va a desaparecer, pero Apple recomienda que los desarrolladores utilicen su biblioteca CDSA (Common Data Security Architecture) en lugar de usar OpenSSL directamente.

+0

Gracias :) Eso me llevó a Security/SecKey.h y funciones relacionadas que parecen que hacen exactamente lo que necesito. – yarpa

+0

En realidad, SecKey es solo la mitad de la solución. Maneja la generación de claves, pero no parece ser compatible con ninguna operación de cifrado real (aunque parece que la versión de iOS sí lo hace, pero estoy mirando a Lion). CDSA está en desuso en Lion, por lo que la pregunta original sigue abierta. (Consulte Security.framework/cssmtype.h para obtener un aviso de obsolescencia). La caza continúa. – yarpa

3

Ok, respondiendo mi propia pregunta aquí.

10,7 introducido se transforma en Security.framework, que está estrechamente relacionado con SecKey. Las transformaciones le permiten hacer muchas cosas, incluida la codificación (por ejemplo, base64), resúmenes, firma/verificación y cifrado.

Aquí hay un ejemplo de cómo firmar algunos datos. Todas las transformaciones siguen el mismo patrón básico; si miras en el marco Headers for Security, verás un encabezado para cada tipo de transformación. Estos son de SecTransformReadTransform.hy SecSignVerifyTransform.h. Estoy omitiendo cualquier código de comprobación o limpieza de errores aquí por simplicidad.

NSData *dataToBeSigned = ;// Get this from somewhere. We set sha1 attributes down below, so this should be a sha1 digest 
    SecKeyRef *key = ;// Get this from somewhere; keychain or SecItemImport 
    SecGroupTransformRef group = SecTransformCreateGroupTransform(); 
    CFReadStreamRef readStream = NULL; 
    SecTransformRef readTransform = NULL; 
    SecTransformRef signingTransform = NULL; 

    // Setup our input stream as well as an input transform 
    readStream = CFReadStreamCreateWithBytesNoCopy(kCFAllocatorDefault, 
                [dataToBeSigned bytes], 
                [dataToBeSigned length], 
                kCFAllocatorNull); // Pass Null allocator so it doesn't free NSData's bytes 

    readTransform = SecTransformCreateReadTransformWithReadStream(readStream); 

    // Setup a signing transform 
    signingTransform = SecSignTransformCreate(key, NULL); 
    SecTransformSetAttribute(signingTransform, kSecInputIsDigest, kCFBooleanTrue, NULL); 
    SecTransformSetAttribute(signingTransform, kSecDigestTypeAttribute, kSecDigestSHA1, NULL); 

    // Connect read and signing transform; Have read pass its data to the signer 
    SecTransformConnectTransforms(readTransform, kSecTransformOutputAttributeName, 
            self.signingTransformRef, kSecTransformInputAttributeName, 
            group, NULL); 

    // Execute the sequence of transforms (group) 
    // The last one in the connected sequence is the return value 
    NSData *signature = SecTransformExecute(group, NULL); 
7

En caso de que usted sabe lo que está haciendo y lo que desea es deshacerse de estas advertencias, una forma es añadir

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

a las cabeceras pertinentes - en mi caso/usr/include/openssl/crypto.h y /usr/include/openssl/md5.h.

+1

Es mejor agregarlo donde realmente usa openssl, en lugar de parchear los encabezados del sistema –