- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
- #include <wincrypt.h>
- #include "md5.h"
-
- static HANDLE Console = NULL;
-
- VOID print(PTSTR Format, ...) {
- va_list Arguments;
- va_start(Arguments, Format);
- PTSTR Message = NULL;
- WriteConsole(Console, Message, FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, Format, 0, 0, (PTSTR) &Message, 0, &Arguments), NULL, NULL);
- LocalFree(Message);
- va_end(Arguments);
- }
-
- INT main(INT argc, PTSTR argv[]) {
- Console = GetStdHandle(STD_OUTPUT_HANDLE);
-
- if (argc != 2) {
- print("Usage: %1!s! \"text to hash\"%n", argv[0]);
- return 0;
- }
-
- LARGE_INTEGER x;
- LARGE_INTEGER y;
- LARGE_INTEGER freq;
- QueryPerformanceFrequency(&freq);
-
- INT n = lstrlen(argv[1]);
-
- print("Hashing with MD5 builtin ... ");
- QueryPerformanceCounter(&x);
- md5_state_t state;
- md5_byte_t digest[16];
- md5_init(&state);
- md5_append(&state, argv[1], n);
- md5_finish(&state, digest);
- QueryPerformanceCounter(&y);
- print("done (%1!10llu! ticks)%n", (y.QuadPart - x.QuadPart) % freq.QuadPart);
-
- INT i = 0;
- print("Result: `");
- while (i < 16) print("%1!02x!", digest[i++]);
- print("'%n%n");
-
- HCRYPTPROV Provider = 0;
- CryptAcquireContext(&Provider, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
- print("Hashing with WinCryptAPI ... ");
- QueryPerformanceCounter(&x);
- HCRYPTHASH Hash = 0;
- CryptCreateHash(Provider, CALG_MD5, 0, 0, &Hash);
- CryptHashData(Hash, argv[1], n, 0);
- BYTE digest2[16];
- DWORD size = sizeof(digest2);
- CryptGetHashParam(Hash, HP_HASHVAL, digest2, &size, 0);
- CryptDestroyHash(Hash);
- QueryPerformanceCounter(&y);
- print("done (%1!10llu! ticks)%n", (y.QuadPart - x.QuadPart) % freq.QuadPart);
- CryptReleaseContext(Provider, 0) != 0;
-
- i = 0;
- print("Result: `");
- while (i < 16) print("%1!02x!", digest2[i++]);
- print("'%n");
-
- return 0;
- }
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <wincrypt.h>
#include "md5.h"
static HANDLE Console = NULL;
VOID print(PTSTR Format, ...) {
va_list Arguments;
va_start(Arguments, Format);
PTSTR Message = NULL;
WriteConsole(Console, Message, FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, Format, 0, 0, (PTSTR) &Message, 0, &Arguments), NULL, NULL);
LocalFree(Message);
va_end(Arguments);
}
INT main(INT argc, PTSTR argv[]) {
Console = GetStdHandle(STD_OUTPUT_HANDLE);
if (argc != 2) {
print("Usage: %1!s! \"text to hash\"%n", argv[0]);
return 0;
}
LARGE_INTEGER x;
LARGE_INTEGER y;
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
INT n = lstrlen(argv[1]);
print("Hashing with MD5 builtin ... ");
QueryPerformanceCounter(&x);
md5_state_t state;
md5_byte_t digest[16];
md5_init(&state);
md5_append(&state, argv[1], n);
md5_finish(&state, digest);
QueryPerformanceCounter(&y);
print("done (%1!10llu! ticks)%n", (y.QuadPart - x.QuadPart) % freq.QuadPart);
INT i = 0;
print("Result: `");
while (i < 16) print("%1!02x!", digest[i++]);
print("'%n%n");
HCRYPTPROV Provider = 0;
CryptAcquireContext(&Provider, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
print("Hashing with WinCryptAPI ... ");
QueryPerformanceCounter(&x);
HCRYPTHASH Hash = 0;
CryptCreateHash(Provider, CALG_MD5, 0, 0, &Hash);
CryptHashData(Hash, argv[1], n, 0);
BYTE digest2[16];
DWORD size = sizeof(digest2);
CryptGetHashParam(Hash, HP_HASHVAL, digest2, &size, 0);
CryptDestroyHash(Hash);
QueryPerformanceCounter(&y);
print("done (%1!10llu! ticks)%n", (y.QuadPart - x.QuadPart) % freq.QuadPart);
CryptReleaseContext(Provider, 0) != 0;
i = 0;
print("Result: `");
while (i < 16) print("%1!02x!", digest2[i++]);
print("'%n");
return 0;
}