/** * @file tests/crypt_hmac_md5.c * Test hmac_md5 using rfc2104(errata rfc6151) * @todo use test library and verify against expected digest */ #include #include #include #include #include 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; }