使用OpenSSL的HMAC时发生访问冲突

时间:2019-09-19 11:23:49

标签: c openssl hmac

我正在尝试使用OpenSSL对某些数据进行HMAC-SHA512处理。执行以下代码时出现“ Exception thrown at 0x... (libcrypto-1_1-x64.dll) in Program.exe: 0xC0000005: Access violation writing location 0x...”错误:

int main(int argc, char** argv)
{
  uint8_t* data[] = { 0x14, 0xf7, 0xbd, 0x95, 0x57, 0x9a, 0x7e, 0xa1, 0x5c, 0xf7, 0x27, 0x91, 0x0d, 0x61, 0x58, 0x01, 0xa3, 0x12, 0x17, 0x54, 0x0b, 0x2e, 0xb4, 0xc5, 0xb1, 0xeb, 0xab, 0xe0, 0x43, 0x9b, 0x8e, 0x1f, 0x39, 0x7d, 0x85, 0x1a, 0x3a, 0x4b, 0x9c, 0xf4, 0xbf, 0x31, 0x55, 0x72, 0x41, 0xf5, 0xdb, 0xcb, 0xb3, 0xa6, 0xb5, 0xb8, 0x82, 0xe5, 0xef, 0x18, 0x72, 0xa0, 0x59, 0x08, 0x9b, 0xfa, 0x17, 0xa3 };
  uint8_t* key = "some_rand_pw";
  uint8_t* result = malloc(64);
  memset(result, 0, 64);
  HMAC(EVP_sha512(), key, 12, data, 64, result, (unsigned int)64); //ERROR
}

我会使用uint8_t* result = HMAC(EVP_sha512(), key, 12, data, 64, NULL, NULL),但是它不是线程安全的,它将是一个多线程程序。有人知道我在这里做错了什么吗?

我正在使用Visual Studio 2017和针对Windows预先构建的64位OpenSSL。

1 个答案:

答案 0 :(得分:0)

您的代码错误。 data必须是uint8的数组,但是您将其声明为指向uint8的指针的数组。

此外,HMAC的最后一个参数必须是unsigned int pointer ,但是您提供了unsigned int,这就是崩溃的原因。

您的编译器应该已经警告您。用-Wall编译。

更正(未经测试)的代码:

int main(int argc, char** argv)
{
  uint8_t data[] = { 0x14, 0xf7, 0xbd, 0x95, 0x57, 0x9a, 0x7e, 0xa1, 0x5c, 0xf7, 0x27, 0x91, 0x0d, 0x61, 0x58, 0x01, 0xa3, 0x12, 0x17, 0x54, 0x0b, 0x2e, 0xb4, 0xc5, 0xb1, 0xeb, 0xab, 0xe0, 0x43, 0x9b, 0x8e, 0x1f, 0x39, 0x7d, 0x85, 0x1a, 0x3a, 0x4b, 0x9c, 0xf4, 0xbf, 0x31, 0x55, 0x72, 0x41, 0xf5, 0xdb, 0xcb, 0xb3, 0xa6, 0xb5, 0xb8, 0x82, 0xe5, 0xef, 0x18, 0x72, 0xa0, 0x59, 0x08, 0x9b, 0xfa, 0x17, 0xa3 };
  uint8_t* key = "some_rand_pw";
  uint8_t* result = malloc(64);
  unsigned int len;
  memset(result, 0, 64);
  HMAC(EVP_sha512(), key, 12, data, 64, result, &len);
}

虽然仍有改进的空间。