Pedido assinado no Facebook para iOS (HMAC SHA256)

Eu tenho tentado gerar HMAC SHA256 para Facebook assinado pedido no iOS há semanas agora. Eu estou desesperadamente precisando de ajuda.

As solicitações assinadas do Facebook têm duas partes separadas por um período. A primeira parte é um HMAC256 da carga útil, enquanto a segunda parte é uma string codificada em Base64 da carga útil. Eu só consegui recriar a segunda parte.

vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsIjAiOiJwYXlsb2FkIn0

Eu tenho usado o seguinte código que todo mundo usa, mas está gerando um hash diferente:

#import <CommonCrypto/CommonHMAC.h>
#import "NSData+Base64.h"

+(NSString*) hmacForSecret:(NSString*)secret data:(NSString*)data {

     const char *cKey  = [secret cStringUsingEncoding:NSASCIIStringEncoding];
     const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];
     unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

     CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
     NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

     return [HMAC base64EncodedString];
}

De acordo com documentos do Facebook:https://developers.facebook.com/docs/authentication/signed_request/

Saída correta do HMAC256 deve ser ao usar "segredo"como a chave:

 vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso

A carga a ser codificada:

 {
     "algorithm": "HMAC-SHA256",
     "0": "payload"
 }

NOTA: Você pode Base64 decodificar a segunda parte da solicitação assinada para obter essa carga útil.