Проблема с вашим первоначальным предложением, как сказал Мартин, в том, что вам нужно инициализировать ДВИГАТЕЛЬ. Проблема с вашим отредактированным кодом заключалась в том, что вы выполняли ENGINE_new, который дает вам совершенно новый собственный ENGINE, который вам затем нужно предоставить с помощью методов шифрования, методов дайджеста и т. Д. Фактически, для того, что вы хотите (и что почти каждый хочет), просто полный игнорирование всего материала ENGINE - это правильный выбор.
Некоторые дополнительные проблемы:
- ваши строки были шестнадцатеричными, но вам нужно было \ x на символ, чтобы фактически получить этот шестнадцатеричный байт в той позиции в строке, что, я подозреваю, было тем, что вы хотели.
- вы пытались хэшировать 40 байтов от «данных», что было не так долго (фактический эффект: в результате вы бы частично хэшировали строку результата)
- Ваш ожидаемый результат был (насколько я могу судить) неверным
- вы бы распечатывали случайные символы на терминале, поскольку функция HMAC будет генерировать 32 байта случайных двоичных данных, а не печатных материалов.
Следующий код компилирует, работает и проходит тест. Он немного отличается от примера кода, который вы нашли (поскольку он по-прежнему использует отдельные функции HMAC_ * - полезно, если вы хотите выполнять хеширование по битам, используя HMAC_Update):
#include <openssl/engine.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
unsigned char* key = (unsigned char*) "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
unsigned char* data = (unsigned char*) "\x48\x69\x20\x54\x68\x65\x72\x65";
unsigned char* expected = (unsigned char*) "\x49\x2c\xe0\x20\xfe\x25\x34\xa5\x78\x9d\xc3\x84\x88\x06\xc7\x8f\x4f\x67\x11\x39\x7f\x08\xe7\xe7\xa1\x2c\xa5\xa4\x48\x3c\x8a\xa6";
unsigned char* result;
unsigned int result_len = 32;
int i;
HMAC_CTX ctx;
result = (unsigned char*) malloc(sizeof(char) * result_len);
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), NULL);
HMAC_Update(&ctx, data, 8);
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
for (i=0; i!=result_len; i++)
{
if (expected[i]!=result[i])
{
printf("Got %02X instead of %02X at byte %d!\n", result[i], expected[i], i);
break;
}
}
if (i==result_len)
{
printf("Test ok!\n");
}
return 0;
}
Конечно, он не отвечает на ваш первоначальный вопрос о том, как инициализировать ДВИГАТЕЛИ, но на самом деле нет правильного ответа на это, если у вас нет большего контекста, причем этот контекст оказывается неуместным в вашей ситуации ...