Firma OAuth con RSA-SHA1 en iOS

Necesito ayuda para crear una firma RSA-SHA1 que se utilizará en una implementación OAuth de 3 patas en iOS.

Pude hacer esto usando HMAC-SHA1 usando CommonCrypto.h, pero esta biblioteca no parece ser compatible con RSA-SHA1.

¿Alguno de ustedes ha implementado las firmas de OAuth con RSA? ¿Podría apuntarme a algunos resources donde puedo encontrar más información?

Gracias.

La respuesta de Erik Villegas fue también la solución para mí. Pero hay un error en el código publicado que encontré al usar esta solución: secretFile se abrió con fopen() , por lo que debe cerrarse con fclose()

 - (NSString *)RSASHA1HashForString:(NSString *)source { NSLog(@"encrypting %@", source); if (source == nil) return nil; OpenSSL_add_all_algorithms(); NSString *signature = nil; // make a SHA-1 digest of the source string const char* sourceChars = [source UTF8String]; unsigned char digest[SHA_DIGEST_LENGTH]; SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest); NSString *path = [[NSBundle mainBundle] pathForResource:@"privatekey" ofType:@"pem"]; const char *pathCString = [path cStringUsingEncoding:NSUTF8StringEncoding]; FILE *secretFile = fopen(pathCString, "r"); RSA *rsa = NULL; PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL); if (rsa != NULL) { unsigned int sigLen = 0; unsigned char *sigBuff = malloc(RSA_size(rsa)); int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest), sigBuff, &sigLen, rsa); if (result != 0) { NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen]; signature = [self base64forData:sigData]; } free(sigBuff); RSA_free(rsa); } fclose(secretFile); NSLog(@"generated signature: %@", signature); return signature; } 

Finalmente encontré la solución. Aquí hay un método que searchá un file privatekey.pem en su package y creará una firma RSA-SHA1 utilizando la cadena que se pasa. Deberá agregar la biblioteca openssl. Puede usar este proyecto como reference: https://github.com/x2on/OpenSSL-for-iPhone

 - (NSString *)RSASHA1HashForString:(NSString *)source { NSLog(@"encrypting %@", source); if (source == nil) return nil; OpenSSL_add_all_algorithms(); NSString *signature = nil; // make a SHA-1 digest of the source string const char* sourceChars = [source UTF8String]; unsigned char digest[SHA_DIGEST_LENGTH]; SHA1((const unsigned char *)sourceChars, strlen(sourceChars), digest); NSString *path = [[NSBundle mainBundle] pathForResource:@"privatekey" ofType:@"pem"]; const char *pathCString = [path cStringUsingEncoding:NSUTF8StringEncoding]; FILE *secretFile = fopen(pathCString, "r"); RSA *rsa = NULL; PEM_read_RSAPrivateKey(secretFile, &rsa, NULL, NULL); if (rsa != NULL) { unsigned int sigLen = 0; unsigned char *sigBuff = malloc(RSA_size(rsa)); int result = RSA_sign(NID_sha1, digest, (unsigned int) sizeof(digest), sigBuff, &sigLen, rsa); if (result != 0) { NSData *sigData = [NSData dataWithBytes:sigBuff length:sigLen]; signature = [self base64forData:sigData]; } free(sigBuff); RSA_free(rsa); } NSLog(@"generated signature: %@", signature); return signature; } 

Si está implementando OAuth, necesitará pasar la base de firma a este método. Se puede encontrar más información aquí: http://oauth.net/core/1.0a/#anchor13