#include #include #include #include int main(void) { uint8_t tmp1[EVP_MAX_MD_SIZE]; uint8_t tmp2[EVP_MAX_MD_SIZE]; char key[256]; char data[4096]; unsigned int tmp1len; size_t tmp2len; void *e1; int e2; int stop = 0; const void *evps[] = { EVP_md2(), EVP_md4(), EVP_md5(), EVP_ripemd160(), EVP_sha1(), EVP_sha224(), EVP_sha256(), EVP_sha384(), EVP_sha512(), }; const char *names[] = { "md2", "md4", "md5", "rmd160", "sha1", "sha224", "sha256", "sha384", "sha512", }; for (size_t k = 0; k < sizeof(key); k++) key[k] = k; for (size_t d = 0; d < sizeof(data); d++) data[d] = arc4random() % 256; for (size_t t = 0; t < __arraycount(names); t++) for (size_t i = 1; i < sizeof(key); i += 9) for (size_t j = 3; j < sizeof(data); j += 111) { printf("%s: keysize = %zu datasize = %zu\n", names[t], i, j); memset(tmp1, 0, sizeof(tmp1)); memset(tmp2, 0, sizeof(tmp2)); e1 = HMAC(evps[t], key, i, data, j, tmp1, &tmp1len); e2 = hmac(names[t], key, i, data, j, tmp2, &tmp2len); // printf("%p %d\n", e1, e2); printf("tmplen = %u %zu\n", tmp1len, tmp2len); for (size_t k = 0; k < tmp2len; k++) if (tmp1[k] != tmp2[k]) { stop = 1; printf("%zu %.2x %.2x\n", k, tmp1[k], tmp2[k]); } if (stop) return 0; } return 0; }