2017-02-28 1 views
0

J'essaie de calculer un HMAC avec SHA512 à l'intérieur d'une enclave Intel SGX. J'ai obtenu le code pour fonctionner mais recevoir les mauvais résultats. J'ai un exemple qui utilise une clé et une clé prédéfinies statiques à partir desquelles le HMAC est calculé, mais lors de la vérification du résultat reçu, celui-ci ne correspond pas au bon.SGX calcul HMAC à l'intérieur de l'enclave

apparantely il y a deux variantes différentes pour calculer le HMAC (selon ce enter link description here, je l'ai essayé à la fois

est ici la fonction de l'enclave.

int calculateHMAC(uint8_t *key, uint8_t *nonce, uint8_t *res_hmac) { 
    IppsHMACState *ctx; 
    IppStatus status; 
    int psize = 0; 

    //VARIANT 1 
    status = ippsHMAC_GetSize(&psize); 

    if (status == ippStsNullPtrErr) 
     return 1; 

    ctx = (IppsHMACState*) malloc(psize); 
    status = ippsHMAC_Init(key, 16, ctx, ippHashAlg_SHA512); 

    if (status != ippStsNoErr) 
     return 1; 

    status = ippsHMAC_Update(nonce, 16, ctx); 

    if (status != ippStsNoErr) 
     return 1; 

    uint8_t hmac[64]; 
    memset(hmac, '\0', 64); 
    status = ippsHMAC_Final(hmac, 64, ctx); 

    if (status != ippStsNoErr) 
     return 1; 

    memcpy(res_hmac, hmac, 64); 

    //VARIANT 2 
// uint8_t test_hmac[HMAC_LENGTH]; 
// status = ippsHMAC_Message(nonce, 16, key, 16, test_hmac, 64, ippHashAlg_SHA512); 

// if (status != ippStsNoErr) 
//  return 1; 

// memcpy(res_hmac, test_hmac, 64); 

    return 0; 

} 

est ici l'appel MISE À JOUR :

uint8_t ba_nonce[16] = { 
    0x7d, 0x93, 0x09, 0x9f, 0x7f, 0xed, 0x16, 0x21, 
    0x58, 0x36, 0xf7, 0xba, 0xd4, 0xdb, 0x0e, 0x48 
}; 

uint8_t ba_key[16] = { 
    0xa5, 0xb1, 0x15, 0x53, 0x6d, 0x5b, 0xf3, 0x50, 
    0xc5, 0xb0, 0xfa, 0x6f, 0x69, 0x24, 0x2f, 0x18 
}; 

uint8_t t_hmac[64]; 
memset(t_hmac, '\0', 64); 

int error = calculateHMAC(ba_key, ba_nonce, t_hmac); 

je ne vois pas ce que je fais mal !?

Cela se traduira par 7d2f2e3d57c84a58945b9016fb37e2df03afdde313c9d79c31ec1e6612d6d6b20456a8fcf799ef74d16f60c7f283e621400004422885f33fb3d2bb7ae7a1daa3

qui est faux selon cette calculatrice here

Répondre

1

Votre question est strtol(). Il attend une chaîne. Dans C une chaîne est une séquence arbitraire de caractères terminée par un NULL octet. Cependant, il est fourni un pointeur vers un tableau de taille 2 où la dernière entrée n'est pas NULL. Par conséquent, strtol() analyse également les octets derrière votre tableau tmp.

Puisque, tmp est stocké sur la pile, nous ne pouvons pas supposer que les octets suivants sont toujours les mêmes pour différentes invocations. Ainsi, vous obtenez des résultats aléatoires.

Solution: Soit, vous augmentez la taille de tmp et ajouter un NULL octet en dernier lieu ou - ce qui est probablement la meilleure solution - vous initialisez directement nonce et key avec ce que vous avez besoin (voir aussi this après):

uint8_t ba_nonce[16] = { 
    0x7d, 0x93, 0x09, 0x9f, 0x7f, 0xed, 0x16, 0x21, 
    0x58, 0x36, 0xf7, 0xba, 0xd4, 0xdb, 0x0e, 0x48 
}; 

uint8_t ba_key[16] = { 
    0xa5, 0xb1, 0x15, 0x53, 0x6d, 0x5b, 0xf3, 0x50, 
    0xc5, 0xb0, 0xfa, 0x6f, 0x69, 0x24, 0x2f, 0x18 
}; 
+0

Je l'ai essayé avec votre suggestion, maintenant je reçois le même résultat pour chaque itération, ce qui est mieux; mais le résultat est toujours faux? – wasp256

+0

Le résultat que le code mis à jour vous donne est correct. Le vérificateur en ligne interprète vos entrées comme des chaînes. Par conséquent, vous obtenez un hachage différent. J'ai reproduit les deux sorties, la bonne que donne le code mis à jour ainsi que celle que le vérificateur en ligne produit, avec Python: https://gist.github.com/fzgregor/db6b25ff9cb712a3c93face3b10672cd – fzgregor

+0

Je l'ai revalidé maintenant et c'était l'erreur, merci Pour votre aide! – wasp256