1 #include "create_hmac.h"
\r
2 #include "hmac_testcases.h"
\r
9 static int run_single_test (HCRYPTPROV hProv, ALG_ID Algid,
\r
10 BYTE *data, DWORD data_size,
\r
11 BYTE *key, DWORD key_size,
\r
12 const BYTE *hash, DWORD hash_size)
\r
14 HCRYPTHASH hmac_hash = 0;
\r
15 HCRYPTKEY hmac_key = 0;
\r
17 DWORD output_size = 1024;
\r
20 status = CreateHMAC (hProv, Algid,
\r
23 /* phHash = */ &hmac_hash, /* phKey = */ &hmac_key);
\r
26 fprintf (stderr, "CreateHMAC failed with status %#x.\n",
\r
31 status = CryptHashData (hmac_hash,
\r
36 fprintf (stderr, "CryptHashData failed with status %#x.\n",
\r
38 CryptDestroyHash (hmac_hash);
\r
39 CryptDestroyKey (hmac_key);
\r
43 memset (output, 0, sizeof (output));
\r
44 status = CryptGetHashParam (hmac_hash, HP_HASHVAL,
\r
45 output, &output_size, /* flags = */ 0);
\r
48 fprintf (stderr, "CryptHashData failed with status %#x.\n",
\r
50 CryptDestroyHash (hmac_hash);
\r
51 CryptDestroyKey (hmac_key);
\r
55 CryptDestroyHash (hmac_hash);
\r
56 CryptDestroyKey (hmac_key);
\r
58 if (output_size != hash_size)
\r
60 fprintf (stderr, "Hash size mismatch: Got %lu, expected %lu.\n",
\r
61 output_size, hash_size);
\r
65 if (memcmp (output, hash, hash_size) != 0)
\r
67 fprintf (stderr, "Hash sum mismatch.\n");
\r
72 printf (" Success!\n");
\r
76 } /* int run_single_test */
\r
78 static int run_testcase (HCRYPTPROV hProv,
\r
79 const testcase_t *tc)
\r
81 printf (" SHA-256:\n");
\r
82 run_single_test (hProv, CALG_SHA_256,
\r
83 tc->data, tc->data_size,
\r
84 tc->key, tc->key_size,
\r
85 tc->sha256, sizeof (tc->sha256));
\r
88 printf (" SHA-384:\n");
\r
89 run_single_test (hProv, CALG_SHA_384,
\r
90 tc->data, tc->data_size,
\r
91 tc->key, tc->key_size,
\r
92 tc->sha384, sizeof (tc->sha384));
\r
95 printf (" SHA-512:\n");
\r
96 run_single_test (hProv, CALG_SHA_512,
\r
97 tc->data, tc->data_size,
\r
98 tc->key, tc->key_size,
\r
99 tc->sha512, sizeof (tc->sha512));
\r
103 } /* int run_testcase */
\r
105 int _tmain(int argc, _TCHAR* argv[])
\r
107 HCRYPTPROV cry_provider;
\r
110 status = CryptAcquireContext (&cry_provider,
\r
111 /* szContainer = */ NULL,
\r
112 /* CSP name = */ NULL,
\r
113 /* provider type = */ PROV_RSA_AES,
\r
114 /* flags = */ CRYPT_VERIFYCONTEXT);
\r
117 fprintf (stderr, "CryptAcquireContext failed: %#x\n", GetLastError ());
\r
118 exit (EXIT_FAILURE);
\r
121 printf ("Testcase 1\n");
\r
122 printf ("----------\n");
\r
123 run_testcase (cry_provider, &testcase1);
\r
126 printf ("Testcase 2\n");
\r
127 printf ("----------\n");
\r
128 run_testcase (cry_provider, &testcase2);
\r
131 printf ("Testcase 3\n");
\r
132 printf ("----------\n");
\r
133 run_testcase (cry_provider, &testcase3);
\r
136 printf ("Testcase 6\n");
\r
137 printf ("----------\n");
\r
138 run_testcase (cry_provider, &testcase6);
\r
141 CryptReleaseContext (cry_provider, /* flags = */ 0);
\r