SGX计算飞地内的HMAC
我试图计算一个在Intel SGX飞地内使用SHA512的HMAC。 我得到的代码工作,但收到错误的结果。我有一个例子,使用静态预定义键和nonce计算HMAC,但在验证接收到的结果时,它与正确的结果不匹配 显然,有两种不同的变量来计算HMAC(根据这一点,我两种都试过了) 以下是enclave的功能:SGX计算飞地内的HMAC,hmac,sgx,Hmac,Sgx,我试图计算一个在Intel SGX飞地内使用SHA512的HMAC。 我得到的代码工作,但收到错误的结果。我有一个例子,使用静态预定义键和nonce计算HMAC,但在验证接收到的结果时,它与正确的结果不匹配 显然,有两种不同的变量来计算HMAC(根据这一点,我两种都试过了) 以下是enclave的功能: int calculateHMAC(uint8_t *key, uint8_t *nonce, uint8_t *res_hmac) { IppsHMACState *ctx;
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;
}
以下是最新的呼叫:
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);
我不知道我做错了什么
这将导致
7D2F2E3D57C84A58945B9016FB37E2DF03AFDDE313C9D79C31EC1E6612D6B20456A8FCF799EF74D16F60C7F283E621400422885F33FB3D2BB7AE7A1DAA3
根据这个计算器,这是错误的。您的问题是strtol()
。它需要一个字符串。在C中,字符串是以NULL
-字节结尾的任意字符序列。但是,它提供了一个指向大小为2的数组的指针,其中最后一个条目不是NULL
。因此,strtol()
还要分析tmp
数组后面的字节
因为,tmp
存储在堆栈上,所以我们不能假设不同调用的后续字节总是相同的。因此,您会得到随机结果
解决方案:或者,您可以增加tmp
的大小,并在最后一个位置添加NULL
字节,或者-这可能是更好的解决方案-您可以根据需要直接初始化nonce
和key
(另请参见post):
我尝试过你的建议,现在每次迭代都会得到相同的结果,这更好;但结果仍然是错误的!?更新后的代码给出的结果是正确的。在线检查器将你的输入解释为字符串。因此,你会得到不同的哈希值。我复制了两个输出,更新后的代码也给出了正确的输出正如在线检查器使用Python生成的一样:我现在重新验证了它,这就是错误所在,感谢您的帮助!
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
};