void handle_md4(array_t *out, bio_t *in) { md4_ctx_t ctx; char hex[sizeof(ctx.hash) * 2]; size_t r; md4_init(&ctx); do { r = bio_feed(in); md4_update(&ctx, BIO_PEEK(in), r); BIO_SEEK(in, r); } while (r > 0); md4_finish(&ctx); array_append(out, hex, fmt_hex_pad(hex, ctx.hash, sizeof(ctx.hash))); array_append_null(out); }
static void md4_finish_wrap( void *ctx, unsigned char *output ) { md4_finish( (md4_context *) ctx, output ); }
int main() { md4_ctx_t ctx; char hex_str[33]; char digest[16]; int i; uint32_t vector[][4] = { { 0x31d6cfe0, 0xd16ae931, 0xb73c59d7, 0xe0c089c0 }, { 0xbde52cb3, 0x1de33e46, 0x245e05fb, 0xdbd6fb24 }, { 0xa448017a, 0xaf21d852, 0x5fc10ae8, 0x7aa6729d }, { 0xd9130a81, 0x64549fe8, 0x18874806, 0xe1c7014b }, { 0xd79e1c30, 0x8aa5bbcd, 0xeea8ed63, 0xdf412da9 }, { 0x043f8582, 0xf241db35, 0x1ce627e1, 0x53e7f0e4 }, { 0xe33b4ddc, 0x9c38f219, 0x9c3e7b16, 0x4fcc0536 }, { 0xe33b4ddc, 0x9c38f219, 0x9c3e7b16, 0x4fcc0536 } }; md4s(&ctx, ""); for (i = 0; i < 4; i++) { if (vector[0][i] != be32toh(ctx.hash[i])) return 1; } md4s(&ctx, "a"); for (i = 0; i < 4; i++) { if (vector[1][i] != be32toh(ctx.hash[i])) return 2; } md4s(&ctx, "abc"); for (i = 0; i < 4; i++) { if (vector[2][i] != be32toh(ctx.hash[i])) return 3; } md4s(&ctx, "message digest"); for (i = 0; i < 4; i++) { if (vector[3][i] != be32toh(ctx.hash[i])) return 4; } md4s(&ctx, "abcdefghijklmnopqrstuvwxyz"); for (i = 0; i < 4; i++) { if (vector[4][i] != be32toh(ctx.hash[i])) return 5; } md4s(&ctx, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); for (i = 0; i < 4; i++) { if (vector[5][i] != be32toh(ctx.hash[i])) return 6; } md4s(&ctx, "12345678901234567890123456789012345678901234567890123456789012345678901234567890"); for (i = 0; i < 4; i++) { if (vector[6][i] != be32toh(ctx.hash[i])) return 7; } md4_init(&ctx); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_update(&ctx, "1234567890", 10); md4_finish(&ctx); for (i = 0; i < 4; i++) { if (vector[7][i] != be32toh(ctx.hash[i])) return 8; } return 0; }