Нарушение доступа при использовании OpenSSL HMAC - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь сделать HMAC-SHA512 для некоторых данных, используя OpenSSL.Я получаю ошибку "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 с 64-битным OpenSSL, предварительно созданным для Windows.

1 Ответ

0 голосов
/ 19 сентября 2019

Ваш код неверный.data должен быть массивом uint8, но вы объявили его как массив указателей на uint8.

Кроме того, последний параметр HMAC должен быть указателем на unsigned int, но вы указали 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);
}

Хотя еще есть возможности для улучшения.

...