SGX计算飞地内的HMAC

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;

我试图计算一个在Intel SGX飞地内使用SHA512的HMAC。 我得到的代码工作,但收到错误的结果。我有一个例子,使用静态预定义键和nonce计算HMAC,但在验证接收到的结果时,它与正确的结果不匹配

显然,有两种不同的变量来计算HMAC(根据这一点,我两种都试过了)

以下是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;

}
以下是最新的呼叫:

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
};