0

我正在尝试在英特尔 SGX 飞地内使用 SHA512 计算 HMAC。我让代码工作,但收到错误的结果。我有一个使用静态预定义密钥和随机数计算 HMAC 的示例,但是在验证接收到的结果时,它与正确的结果不匹配。

显然有两种不同的变体来计算 HMAC(根据这里的输入链接描述,我都试过了。

这是飞地的功能:

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

我看不出我做错了什么!?

这将导致 7d2f2e3d57c84a58945b9016fb37e2df03afdde313c9d79c31ec1e6612d6d6b20456a8fcf799ef74d16f60c7f283e621400004422885f33fb3d2bb7ae7a1daa3

根据这个计算器这里是错误的

4

1 回答 1

1

你的问题是strtol()。它需要一个字符串。在 C 中,字符串是一个以NULL-byte 结尾的任意字符序列。但是,它提供了一个指向大小为 2 的数组的指针,其中最后一个条目不是NULL。因此,还要分析数组strtol()后面的字节。tmp

因为,tmp存储在堆栈中,我们不能假设后续字节对于不同的调用总是相同的。因此,您会得到随机结果。

解决方案:要么增加大小并在最后tmp添加一个字节,要么 - 这可能是更好的解决方案 - 你直接初始化并使用你需要的东西(另见这篇文章):NULLnoncekey

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
};
于 2017-03-03T12:42:06.637 回答