src.dualinventive.com/fw/libdi_fw-tests/libdi/tests/crypt_hmac_md5.c

150 lines
3.7 KiB
C

/**
* @file tests/crypt_hmac_md5.c
* Test hmac_md5 using rfc2104(errata rfc6151)
* @todo use test library and verify against expected digest
*/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <di/crypt/hmac_md5.h>
#include <di/misc/hexstr.h>
void di_crypt_hmac_md5_print_digest(const uint8_t *digest, size_t len)
{
for (size_t i = 0; i < len; i++)
printf("%02x", digest[i]);
printf("\n");
}
void hmac_md5_test_rfc2104_case_1(void)
{
char *key_str = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b";
char *digest_str = "9294727a3638bb1c13f48ef8158bfc9d";
uint8_t key[16];
uint16_t key_len = 16;
uint8_t data[] = "Hi There";
uint32_t data_len = 8;
uint8_t digest[16] = { 0 };
uint8_t digest_out[16] = { 0 };
printf("=== %s ===\n", __func__);
printf("key: 0x");
di_hexstr_to_bin(key, key_len, (void *)key_str, strlen(key_str));
di_crypt_hmac_md5_print_digest(key, key_len);
printf("msg: \"%s\" (len %u)\n", data, data_len);
di_crypt_hmac_md5(digest_out, (uint8_t *)key, key_len, data, data_len);
printf("exp: 0x");
di_hexstr_to_bin((void *)digest, 16, (void *)digest_str, strlen(digest_str));
di_crypt_hmac_md5_print_digest(digest, 16);
printf("got: 0x");
di_crypt_hmac_md5_print_digest(digest_out, 16);
}
void hmac_md5_test_rfc2104_case_2(void)
{
uint8_t key[] = "Jefe";
uint16_t key_len = 4;
uint8_t data[] = "what do ya want for nothing?";
uint32_t data_len = 28;
char *digest_str = "750c783e6ab0b503eaa86e310a5db738";
uint8_t digest[16] = { 0 };
uint8_t digest_out[16] = { 0 };
printf("=== %s ===\n", __func__);
printf("key: \"%s\" \n", key);
printf("msg: \"%s\" (len %u)\n", data, data_len);
di_crypt_hmac_md5(digest_out, (uint8_t *)key, key_len, data, data_len);
printf("exp: 0x");
di_hexstr_to_bin((void *)digest, 16,(void *)digest_str, strlen(digest_str));
di_crypt_hmac_md5_print_digest(digest, 16);
printf("got: 0x");
di_crypt_hmac_md5_print_digest(digest_out, 16);
}
void hmac_md5_test_rfc2104_case_3(void)
{
char *key_str = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
char *digest_str = "56be34521d144c88dbb8c733f0e8b3f6";
uint8_t key[16];
uint16_t key_len = 16;
uint8_t data[50];
uint32_t data_len = 50;
uint8_t digest[16] = { 0 };
uint8_t digest_out[16] = { 0 };
printf("=== %s ===\n", __func__);
printf("key: 0x");
di_hexstr_to_bin(key, key_len, (void *)key_str, strlen(key_str));
di_crypt_hmac_md5_print_digest(key, key_len);
memset(data, 0xdd, data_len);
printf("msg: 0x%02x .. %02x (len %u)\n", data[0], data[49], data_len);
di_crypt_hmac_md5(digest_out, (uint8_t *)key, key_len, (const uint8_t *)data, data_len);
printf("exp: 0x");
di_hexstr_to_bin((void *)digest, 16,(void *)digest_str, strlen(digest_str));
di_crypt_hmac_md5_print_digest(digest, 16);
printf("got: 0x");
di_crypt_hmac_md5_print_digest(digest_out, 16);
}
void hmac_md5_test_di(void)
{
char *key_str = "a255fe8f";
char *data = "you-are-awesome";
char *digest_str = "2992ccb1cd4122b64d5b0416fa265125";
uint8_t key[4];
uint16_t key_len = 4;
uint32_t data_len = 15;
uint8_t digest[16] = { 0 };
uint8_t digest_out[16] = { 0 };
printf("=== %s ===\n", __func__);
printf("key: 0x");
di_hexstr_to_bin(key, key_len, (void *)key_str, strlen(key_str));
di_crypt_hmac_md5_print_digest(key, key_len);
printf("msg: \"%s\" (len %u)\n", data, data_len);
di_crypt_hmac_md5(digest_out, (uint8_t *)key, key_len, (const uint8_t *)data, data_len);
printf("exp: 0x");
di_hexstr_to_bin((void *)digest, 16, (void *)digest_str, strlen(digest_str));
di_crypt_hmac_md5_print_digest(digest, 16);
printf("got: 0x");
di_crypt_hmac_md5_print_digest(digest_out, 16);
}
int
main(void)
{
hmac_md5_test_rfc2104_case_1();
hmac_md5_test_rfc2104_case_2();
hmac_md5_test_rfc2104_case_3();
hmac_md5_test_di();
return 0;
}