xref: /netbsd-src/external/bsd/ntp/dist/sntp/tests/crypto.c (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1 /*	$NetBSD: crypto.c,v 1.3 2018/09/29 21:52:35 christos Exp $	*/
2 
3 #include "config.h"
4 #include "unity.h"
5 #include "ntp_types.h"
6 
7 #include "sntptest.h"
8 #include "crypto.h"
9 
10 #define CMAC "AES128CMAC"
11 
12 #define MD5_LENGTH 16
13 #define SHA1_LENGTH 20
14 #define CMAC_LENGTH 16
15 
16 
17 void test_MakeMd5Mac(void);
18 void test_MakeSHA1Mac(void);
19 void test_MakeCMac(void);
20 void test_VerifyCorrectMD5(void);
21 void test_VerifySHA1(void);
22 void test_VerifyCMAC(void);
23 void test_VerifyFailure(void);
24 void test_PacketSizeNotMultipleOfFourBytes(void);
25 
26 void VerifyLocalCMAC(struct key *cmac);
27 void VerifyOpenSSLCMAC(struct key *cmac);
28 
29 
30 void
31 test_MakeMd5Mac(void)
32 {
33 	const char* PKT_DATA = "abcdefgh0123";
34 	const int PKT_LEN = strlen(PKT_DATA);
35 	const char* EXPECTED_DIGEST =
36 		"\x52\x6c\xb8\x38\xaf\x06\x5a\xfb\x6c\x98\xbb\xc0\x9b\x0a\x7a\x1b";
37 	char actual[MD5_LENGTH];
38 
39 	struct key md5;
40 	md5.next = NULL;
41 	md5.key_id = 10;
42 	md5.key_len = 6;
43 	memcpy(&md5.key_seq, "md5seq", md5.key_len);
44 	strlcpy(md5.typen, "MD5", sizeof(md5.typen));
45 	md5.typei = keytype_from_text(md5.typen, NULL);
46 
47 	TEST_ASSERT_EQUAL(MD5_LENGTH,
48 			  make_mac(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5, actual));
49 
50 	TEST_ASSERT_TRUE(memcmp(EXPECTED_DIGEST, actual, MD5_LENGTH) == 0);
51 }
52 
53 
54 void
55 test_MakeSHA1Mac(void)
56 {
57 #ifdef OPENSSL
58 
59 	const char* PKT_DATA = "abcdefgh0123";
60 	const int PKT_LEN = strlen(PKT_DATA);
61 	const char* EXPECTED_DIGEST =
62 		"\x17\xaa\x82\x97\xc7\x17\x13\x6a\x9b\xa9"
63 		"\x63\x85\xb4\xce\xbe\x94\xa0\x97\x16\x1d";
64 	char actual[SHA1_LENGTH];
65 
66 	struct key sha1;
67 	sha1.next = NULL;
68 	sha1.key_id = 20;
69 	sha1.key_len = 7;
70 	memcpy(&sha1.key_seq, "sha1seq", sha1.key_len);
71 	strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen));
72 	sha1.typei = keytype_from_text(sha1.typen, NULL);
73 
74 	TEST_ASSERT_EQUAL(SHA1_LENGTH,
75 			  make_mac(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1, actual));
76 
77 	TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, SHA1_LENGTH);
78 
79 #else
80 
81 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
82 
83 #endif	/* OPENSSL */
84 }
85 
86 
87 void
88 test_MakeCMac(void)
89 {
90 #if defined(OPENSSL) && defined(ENABLE_CMAC)
91 
92 	const char* PKT_DATA = "abcdefgh0123";
93 	const int PKT_LEN = strlen(PKT_DATA);
94 	const char* EXPECTED_DIGEST =
95 		"\xdd\x35\xd5\xf5\x14\x23\xd9\xd6"
96 		"\x38\x5d\x29\x80\xfe\x51\xb9\x6b";
97 	char actual[CMAC_LENGTH];
98 
99 	struct key cmac;
100 	cmac.next = NULL;
101 	cmac.key_id = 30;
102 	cmac.key_len = CMAC_LENGTH;
103 	memcpy(&cmac.key_seq, "aes-128-cmac-seq", cmac.key_len);
104 	memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1);
105 
106 	TEST_ASSERT_EQUAL(CMAC_LENGTH,
107 		    make_mac(PKT_DATA, PKT_LEN, CMAC_LENGTH, &cmac, actual));
108 
109 	TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, CMAC_LENGTH);
110 
111 #else
112 
113 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
114 
115 #endif	/* OPENSSL */
116 }
117 
118 
119 void
120 test_VerifyCorrectMD5(void)
121 {
122 	const char* PKT_DATA =
123 	    "sometestdata"			/* Data */
124 	    "\0\0\0\0"				/* Key-ID (unused) */
125 	    "\xc7\x58\x99\xdd\x99\x32\x0f\x71"	/* MAC */
126 	    "\x2b\x7b\xfe\x4f\xa2\x32\xcf\xac";
127 	const int PKT_LEN = 12;
128 
129 	struct key md5;
130 	md5.next = NULL;
131 	md5.key_id = 0;
132 	md5.key_len = 6;
133 	memcpy(&md5.key_seq, "md5key", md5.key_len);
134 	strlcpy(md5.typen, "MD5", sizeof(md5.typen));
135 	md5.typei = keytype_from_text(md5.typen, NULL);
136 
137 	TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5));
138 }
139 
140 
141 void
142 test_VerifySHA1(void)
143 {
144 #ifdef OPENSSL
145 
146 	const char* PKT_DATA =
147 	    "sometestdata"				/* Data */
148 	    "\0\0\0\0"					/* Key-ID (unused) */
149 	    "\xad\x07\xde\x36\x39\xa6\x77\xfa\x5b\xce"	/* MAC */
150 	    "\x2d\x8a\x7d\x06\x96\xe6\x0c\xbc\xed\xe1";
151 	const int PKT_LEN = 12;
152 
153 	struct key sha1;
154 	sha1.next = NULL;
155 	sha1.key_id = 0;
156 	sha1.key_len = 7;
157 	memcpy(&sha1.key_seq, "sha1key", sha1.key_len);
158 	strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen));
159 	sha1.typei = keytype_from_text(sha1.typen, NULL);
160 
161 	TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1));
162 
163 #else
164 
165 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
166 
167 #endif	/* OPENSSL */
168 }
169 
170 
171 void
172 test_VerifyCMAC(void)
173 {
174 	const char* PKT_DATA =
175 	    "sometestdata"				/* Data */
176 	    "\0\0\0\0"					/* Key-ID (unused) */
177 	    "\x4e\x0c\xf0\xe2\xc7\x8e\xbb\xbf"		/* MAC */
178 	    "\x79\xfc\x87\xc7\x8b\xb7\x4a\x0b";
179 	const int PKT_LEN = 12;
180 	struct key cmac;
181 
182 	cmac.next = NULL;
183 	cmac.key_id = 0;
184 	cmac.key_len = CMAC_LENGTH;
185 	memcpy(&cmac.key_seq, "aes-128-cmac-key", cmac.key_len);
186 	memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1);
187 
188 	VerifyOpenSSLCMAC(&cmac);
189 	VerifyLocalCMAC(&cmac);
190 }
191 
192 
193 void
194 VerifyOpenSSLCMAC(struct key *cmac)
195 {
196 #if defined(OPENSSL) && defined(ENABLE_CMAC)
197 
198 	/* XXX: HMS: auth_md5 must be renamed/incorrect. */
199 	// TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac));
200 	TEST_IGNORE_MESSAGE("VerifyOpenSSLCMAC needs to be implemented, skipping...");
201 
202 #else
203 
204 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
205 
206 #endif	/* OPENSSL */
207 	return;
208 }
209 
210 
211 void
212 VerifyLocalCMAC(struct key *cmac)
213 {
214 
215 	/* XXX: HMS: auth_md5 must be renamed/incorrect. */
216 	// TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac));
217 
218 	TEST_IGNORE_MESSAGE("Hook in the local AES-128-CMAC check!");
219 
220 	return;
221 }
222 
223 
224 void
225 test_VerifyFailure(void)
226 {
227 	/* We use a copy of the MD5 verification code, but modify the
228 	 * last bit to make sure verification fails.
229 	 */
230 	const char* PKT_DATA =
231 	    "sometestdata"			/* Data */
232 	    "\0\0\0\0"				/* Key-ID (unused) */
233 	    "\xc7\x58\x99\xdd\x99\x32\x0f\x71"	/* MAC */
234 	    "\x2b\x7b\xfe\x4f\xa2\x32\xcf\x00"; /* Last byte is wrong! */
235 	const int PKT_LEN = 12;
236 
237 	struct key md5;
238 	md5.next = NULL;
239 	md5.key_id = 0;
240 	md5.key_len = 6;
241 	memcpy(&md5.key_seq, "md5key", md5.key_len);
242 	strlcpy(md5.typen, "MD5", sizeof(md5.typen));
243 	md5.typei = keytype_from_text(md5.typen, NULL);
244 
245 	TEST_ASSERT_FALSE(auth_md5(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5));
246 }
247 
248 
249 void
250 test_PacketSizeNotMultipleOfFourBytes(void)
251 {
252 	const char* PKT_DATA = "123456";
253 	const int PKT_LEN = 6;
254 	char actual[MD5_LENGTH];
255 
256 	struct key md5;
257 	md5.next = NULL;
258 	md5.key_id = 10;
259 	md5.key_len = 6;
260 	memcpy(&md5.key_seq, "md5seq", md5.key_len);
261 	strlcpy(md5.typen, "MD5", sizeof(md5.typen));
262 	md5.typei = keytype_from_text(md5.typen, NULL);
263 
264 	TEST_ASSERT_EQUAL(0, make_mac(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5, actual));
265 }
266