Initial import.
[create_hmac.git] / hmac_test / hmac_test.cpp
1 #include "create_hmac.h"\r
2 #include "hmac_testcases.h"\r
3 \r
4 #include <tchar.h>\r
5 #include <stdlib.h>\r
6 #include <stdio.h>\r
7 #include <assert.h>\r
8 \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
13 {\r
14         HCRYPTHASH hmac_hash = 0;\r
15         HCRYPTKEY hmac_key = 0;\r
16         BYTE output[1024];\r
17         DWORD output_size = 1024;\r
18         BOOL status;\r
19 \r
20         status = CreateHMAC (hProv, Algid,\r
21                 key, key_size,\r
22                 /* flags = */ 0,\r
23                 /* phHash = */ &hmac_hash, /* phKey = */ &hmac_key);\r
24         if (!status)\r
25         {\r
26                 fprintf (stderr, "CreateHMAC failed with status %#x.\n",\r
27                         GetLastError ());\r
28                 return (-1);\r
29         }\r
30 \r
31         status = CryptHashData (hmac_hash,\r
32                 data, data_size,\r
33                 /* flags = */ 0);\r
34         if (!status)\r
35         {\r
36                 fprintf (stderr, "CryptHashData failed with status %#x.\n",\r
37                         GetLastError ());\r
38                 CryptDestroyHash (hmac_hash);\r
39                 CryptDestroyKey (hmac_key);\r
40                 return (-1);\r
41         }\r
42 \r
43         memset (output, 0, sizeof (output));\r
44         status = CryptGetHashParam (hmac_hash, HP_HASHVAL,\r
45                 output, &output_size, /* flags = */ 0);\r
46         if (!status)\r
47         {\r
48                 fprintf (stderr, "CryptHashData failed with status %#x.\n",\r
49                         GetLastError ());\r
50                 CryptDestroyHash (hmac_hash);\r
51                 CryptDestroyKey (hmac_key);\r
52                 return (-1);\r
53         }\r
54 \r
55         CryptDestroyHash (hmac_hash);\r
56         CryptDestroyKey (hmac_key);\r
57 \r
58         if (output_size != hash_size)\r
59         {\r
60                 fprintf (stderr, "Hash size mismatch: Got %lu, expected %lu.\n",\r
61                         output_size, hash_size);\r
62                 return (-1);\r
63         }\r
64 \r
65         if (memcmp (output, hash, hash_size) != 0)\r
66         {\r
67                 fprintf (stderr, "Hash sum mismatch.\n");\r
68                 return (-1);\r
69         }\r
70         else\r
71         {\r
72                 printf ("    Success!\n");\r
73         }\r
74 \r
75         return (0);\r
76 } /* int run_single_test */\r
77 \r
78 static int run_testcase (HCRYPTPROV hProv,\r
79                                                  const testcase_t *tc)\r
80 {\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
86         printf ("\n");\r
87 \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
93         printf ("\n");\r
94 \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
100         printf ("\n");\r
101 \r
102         return (0);\r
103 } /* int run_testcase */\r
104 \r
105 int _tmain(int argc, _TCHAR* argv[])\r
106 {\r
107         HCRYPTPROV cry_provider;\r
108         BOOL status;\r
109 \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
115         if (!status)\r
116         {\r
117                 fprintf (stderr, "CryptAcquireContext failed: %#x\n", GetLastError ());\r
118                 exit (EXIT_FAILURE);\r
119         }\r
120 \r
121         printf ("Testcase 1\n");\r
122         printf ("----------\n");\r
123         run_testcase (cry_provider, &testcase1);\r
124         printf ("\n");\r
125 \r
126         printf ("Testcase 2\n");\r
127         printf ("----------\n");\r
128         run_testcase (cry_provider, &testcase2);\r
129         printf ("\n");\r
130 \r
131         printf ("Testcase 3\n");\r
132         printf ("----------\n");\r
133         run_testcase (cry_provider, &testcase3);\r
134         printf ("\n");\r
135 \r
136         printf ("Testcase 6\n");\r
137         printf ("----------\n");\r
138         run_testcase (cry_provider, &testcase6);\r
139         printf ("\n");\r
140 \r
141         CryptReleaseContext (cry_provider, /* flags = */ 0);\r
142 \r
143         return 0;\r
144 }\r
145 \r