xref: /freebsd-src/contrib/ntp/sntp/tests/crypto.c (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
1276da39aSCy Schubert #include "config.h"
2276da39aSCy Schubert #include "unity.h"
3276da39aSCy Schubert #include "ntp_types.h"
4276da39aSCy Schubert 
5276da39aSCy Schubert #include "sntptest.h"
6276da39aSCy Schubert #include "crypto.h"
7276da39aSCy Schubert 
809100258SXin LI #define CMAC "AES128CMAC"
909100258SXin LI 
10276da39aSCy Schubert #define SHA1_LENGTH 20
1109100258SXin LI #define CMAC_LENGTH 16
12276da39aSCy Schubert 
139034852cSGleb Smirnoff 
14*f5f40dd6SCy Schubert void test_MakeSHAKE128Mac(void);
159034852cSGleb Smirnoff void test_MakeSHA1Mac(void);
1609100258SXin LI void test_MakeCMac(void);
17*f5f40dd6SCy Schubert void test_VerifySHAKE128(void);
189034852cSGleb Smirnoff void test_VerifySHA1(void);
1909100258SXin LI void test_VerifyCMAC(void);
209034852cSGleb Smirnoff void test_VerifyFailure(void);
219034852cSGleb Smirnoff void test_PacketSizeNotMultipleOfFourBytes(void);
229034852cSGleb Smirnoff 
2309100258SXin LI void VerifyLocalCMAC(struct key *cmac);
2409100258SXin LI void VerifyOpenSSLCMAC(struct key *cmac);
2509100258SXin LI 
269034852cSGleb Smirnoff 
279034852cSGleb Smirnoff void
test_MakeSHAKE128Mac(void)28*f5f40dd6SCy Schubert test_MakeSHAKE128Mac(void)
2968ba7e87SXin LI {
30*f5f40dd6SCy Schubert #ifdef OPENSSL
31276da39aSCy Schubert 
32*f5f40dd6SCy Schubert 	const char KEY[] = "SHAKE128 unit test key";
33*f5f40dd6SCy Schubert 	const u_char PAYLOAD[] = "packettestdata16";
34*f5f40dd6SCy Schubert 	const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1;
35*f5f40dd6SCy Schubert 	const u_char EXPECTED_DIGEST[] =
36*f5f40dd6SCy Schubert 		"\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6"
37*f5f40dd6SCy Schubert 		"\x73\x62\x68\x8D\x11\xB8\x42\xBB";
38*f5f40dd6SCy Schubert 	u_char actual[sizeof(EXPECTED_DIGEST) - 1];
39*f5f40dd6SCy Schubert 	struct key sk;
40276da39aSCy Schubert 
41*f5f40dd6SCy Schubert 	sk.next = NULL;
42*f5f40dd6SCy Schubert 	sk.key_id = 10;
43*f5f40dd6SCy Schubert 	sk.key_len = sizeof(KEY) - 1;
44*f5f40dd6SCy Schubert 	memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len));
45*f5f40dd6SCy Schubert 	strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen));
46*f5f40dd6SCy Schubert 	sk.typei = keytype_from_text(sk.typen, NULL);
47276da39aSCy Schubert 
48*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL(sizeof(actual),
49*f5f40dd6SCy Schubert 			  make_mac(PAYLOAD, PAYLOAD_LEN, &sk, actual,
50*f5f40dd6SCy Schubert 				   sizeof(actual)));
51*f5f40dd6SCy Schubert 
52*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL_HEX8_ARRAY(EXPECTED_DIGEST, actual, sizeof(actual));
53*f5f40dd6SCy Schubert #else
54*f5f40dd6SCy Schubert 
55*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
56*f5f40dd6SCy Schubert 
57*f5f40dd6SCy Schubert #endif	/* OPENSSL */
58276da39aSCy Schubert }
59276da39aSCy Schubert 
60276da39aSCy Schubert 
619034852cSGleb Smirnoff void
test_MakeSHA1Mac(void)6268ba7e87SXin LI test_MakeSHA1Mac(void)
6368ba7e87SXin LI {
64276da39aSCy Schubert #ifdef OPENSSL
6568ba7e87SXin LI 
66276da39aSCy Schubert 	const char* PKT_DATA = "abcdefgh0123";
67276da39aSCy Schubert 	const int PKT_LEN = strlen(PKT_DATA);
68276da39aSCy Schubert 	const char* EXPECTED_DIGEST =
69276da39aSCy Schubert 		"\x17\xaa\x82\x97\xc7\x17\x13\x6a\x9b\xa9"
70276da39aSCy Schubert 		"\x63\x85\xb4\xce\xbe\x94\xa0\x97\x16\x1d";
71276da39aSCy Schubert 	char actual[SHA1_LENGTH];
72276da39aSCy Schubert 
73276da39aSCy Schubert 	struct key sha1;
74276da39aSCy Schubert 	sha1.next = NULL;
75276da39aSCy Schubert 	sha1.key_id = 20;
76276da39aSCy Schubert 	sha1.key_len = 7;
77276da39aSCy Schubert 	memcpy(&sha1.key_seq, "sha1seq", sha1.key_len);
7809100258SXin LI 	strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen));
7909100258SXin LI 	sha1.typei = keytype_from_text(sha1.typen, NULL);
80276da39aSCy Schubert 
81276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SHA1_LENGTH,
82*f5f40dd6SCy Schubert 			  make_mac(PKT_DATA, PKT_LEN, &sha1, actual,
83*f5f40dd6SCy Schubert 				   SHA1_LENGTH));
84276da39aSCy Schubert 
859034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, SHA1_LENGTH);
8668ba7e87SXin LI 
87276da39aSCy Schubert #else
8868ba7e87SXin LI 
89276da39aSCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
9068ba7e87SXin LI 
91276da39aSCy Schubert #endif	/* OPENSSL */
92276da39aSCy Schubert }
93276da39aSCy Schubert 
94276da39aSCy Schubert 
959034852cSGleb Smirnoff void
test_MakeCMac(void)9609100258SXin LI test_MakeCMac(void)
9709100258SXin LI {
984e1ef62aSXin LI #if defined(OPENSSL) && defined(ENABLE_CMAC)
9909100258SXin LI 
10009100258SXin LI 	const char* PKT_DATA = "abcdefgh0123";
10109100258SXin LI 	const int PKT_LEN = strlen(PKT_DATA);
10209100258SXin LI 	const char* EXPECTED_DIGEST =
10309100258SXin LI 		"\xdd\x35\xd5\xf5\x14\x23\xd9\xd6"
10409100258SXin LI 		"\x38\x5d\x29\x80\xfe\x51\xb9\x6b";
10509100258SXin LI 	char actual[CMAC_LENGTH];
10609100258SXin LI 	struct key cmac;
107*f5f40dd6SCy Schubert 
10809100258SXin LI 	cmac.next = NULL;
10909100258SXin LI 	cmac.key_id = 30;
11009100258SXin LI 	cmac.key_len = CMAC_LENGTH;
11109100258SXin LI 	memcpy(&cmac.key_seq, "aes-128-cmac-seq", cmac.key_len);
11209100258SXin LI 	memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1);
11309100258SXin LI 
11409100258SXin LI 	TEST_ASSERT_EQUAL(CMAC_LENGTH,
115*f5f40dd6SCy Schubert 		    make_mac(PKT_DATA, PKT_LEN, &cmac, actual, CMAC_LENGTH));
11609100258SXin LI 
11709100258SXin LI 	TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, CMAC_LENGTH);
11809100258SXin LI 
11909100258SXin LI #else
12009100258SXin LI 
121*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("CMAC not enabled, skipping...");
12209100258SXin LI 
12309100258SXin LI #endif	/* OPENSSL */
12409100258SXin LI }
12509100258SXin LI 
12609100258SXin LI 
12709100258SXin LI void
test_VerifySHAKE128(void)128*f5f40dd6SCy Schubert test_VerifySHAKE128(void)
12968ba7e87SXin LI {
130*f5f40dd6SCy Schubert #ifdef OPENSSL
131*f5f40dd6SCy Schubert 	const char KEY[] = "SHAKE128 unit test key";
132*f5f40dd6SCy Schubert 	const u_char PAYLOAD[] = "packettestdata16";
133*f5f40dd6SCy Schubert 	const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1;
134*f5f40dd6SCy Schubert 	const u_char EXPECTED_DIGEST[] =
135*f5f40dd6SCy Schubert 		"\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6"
136*f5f40dd6SCy Schubert 		"\x73\x62\x68\x8D\x11\xB8\x42\xBB";
137*f5f40dd6SCy Schubert 	const size_t DIGEST_LEN = sizeof(EXPECTED_DIGEST) - 1;
138*f5f40dd6SCy Schubert 	struct key sk;
139*f5f40dd6SCy Schubert 	u_char PKT_DATA[  PAYLOAD_LEN + sizeof(sk.key_id)
140*f5f40dd6SCy Schubert 			+ DIGEST_LEN];
141*f5f40dd6SCy Schubert 	u_char *p;
142276da39aSCy Schubert 
143*f5f40dd6SCy Schubert 	sk.next = NULL;
144*f5f40dd6SCy Schubert 	sk.key_id = 0;
145*f5f40dd6SCy Schubert 	sk.key_len = sizeof(KEY) - 1;
146*f5f40dd6SCy Schubert 	memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len));
147*f5f40dd6SCy Schubert 	strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen));
148*f5f40dd6SCy Schubert 	sk.typei = keytype_from_text(sk.typen, NULL);
149276da39aSCy Schubert 
150*f5f40dd6SCy Schubert 	p = PKT_DATA;
151*f5f40dd6SCy Schubert 	memcpy(p, PAYLOAD, PAYLOAD_LEN);	  p += PAYLOAD_LEN;
152*f5f40dd6SCy Schubert 	memcpy(p, &sk.key_id, sizeof(sk.key_id)); p += sizeof(sk.key_id);
153*f5f40dd6SCy Schubert 	memcpy(p, EXPECTED_DIGEST, DIGEST_LEN);	  p += DIGEST_LEN;
154*f5f40dd6SCy Schubert 	TEST_ASSERT_TRUE(sizeof(PKT_DATA) == p - PKT_DATA);
155*f5f40dd6SCy Schubert 
156*f5f40dd6SCy Schubert 	TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PAYLOAD_LEN, DIGEST_LEN, &sk));
157*f5f40dd6SCy Schubert #else
158*f5f40dd6SCy Schubert 
159*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
160*f5f40dd6SCy Schubert 
161*f5f40dd6SCy Schubert #endif	/* OPENSSL */
162276da39aSCy Schubert }
163276da39aSCy Schubert 
164276da39aSCy Schubert 
1659034852cSGleb Smirnoff void
test_VerifySHA1(void)16668ba7e87SXin LI test_VerifySHA1(void)
16768ba7e87SXin LI {
168276da39aSCy Schubert #ifdef OPENSSL
16968ba7e87SXin LI 
170276da39aSCy Schubert 	const char* PKT_DATA =
17168ba7e87SXin LI 	    "sometestdata"				/* Data */
17268ba7e87SXin LI 	    "\0\0\0\0"					/* Key-ID (unused) */
17368ba7e87SXin LI 	    "\xad\x07\xde\x36\x39\xa6\x77\xfa\x5b\xce"	/* MAC */
174276da39aSCy Schubert 	    "\x2d\x8a\x7d\x06\x96\xe6\x0c\xbc\xed\xe1";
175276da39aSCy Schubert 	const int PKT_LEN = 12;
176276da39aSCy Schubert 	struct key sha1;
177*f5f40dd6SCy Schubert 
178276da39aSCy Schubert 	sha1.next = NULL;
179276da39aSCy Schubert 	sha1.key_id = 0;
180276da39aSCy Schubert 	sha1.key_len = 7;
181276da39aSCy Schubert 	memcpy(&sha1.key_seq, "sha1key", sha1.key_len);
18209100258SXin LI 	strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen));
18309100258SXin LI 	sha1.typei = keytype_from_text(sha1.typen, NULL);
184276da39aSCy Schubert 
18568ba7e87SXin LI 	TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1));
18668ba7e87SXin LI 
187276da39aSCy Schubert #else
18868ba7e87SXin LI 
189276da39aSCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
19068ba7e87SXin LI 
191276da39aSCy Schubert #endif	/* OPENSSL */
192276da39aSCy Schubert }
193276da39aSCy Schubert 
19409100258SXin LI 
19509100258SXin LI void
test_VerifyCMAC(void)19609100258SXin LI test_VerifyCMAC(void)
19709100258SXin LI {
19809100258SXin LI 	struct key cmac;
19909100258SXin LI 
20009100258SXin LI 	cmac.next = NULL;
20109100258SXin LI 	cmac.key_id = 0;
20209100258SXin LI 	cmac.key_len = CMAC_LENGTH;
20309100258SXin LI 	memcpy(&cmac.key_seq, "aes-128-cmac-key", cmac.key_len);
20409100258SXin LI 	memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1);
20509100258SXin LI 
20609100258SXin LI 	VerifyOpenSSLCMAC(&cmac);
20709100258SXin LI 	VerifyLocalCMAC(&cmac);
20809100258SXin LI }
20909100258SXin LI 
21009100258SXin LI 
21109100258SXin LI void
VerifyOpenSSLCMAC(struct key * cmac)21209100258SXin LI VerifyOpenSSLCMAC(struct key *cmac)
21309100258SXin LI {
2144e1ef62aSXin LI #if defined(OPENSSL) && defined(ENABLE_CMAC)
21509100258SXin LI 
21609100258SXin LI 	/* XXX: HMS: auth_md5 must be renamed/incorrect. */
21709100258SXin LI 	// TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac));
21809100258SXin LI 	TEST_IGNORE_MESSAGE("VerifyOpenSSLCMAC needs to be implemented, skipping...");
21909100258SXin LI 
22009100258SXin LI #else
22109100258SXin LI 
222*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("CMAC not enabled, skipping...");
22309100258SXin LI 
22409100258SXin LI #endif	/* OPENSSL */
22509100258SXin LI 	return;
22609100258SXin LI }
22709100258SXin LI 
22809100258SXin LI 
22909100258SXin LI void
VerifyLocalCMAC(struct key * cmac)23009100258SXin LI VerifyLocalCMAC(struct key *cmac)
23109100258SXin LI {
23209100258SXin LI 
23309100258SXin LI 	/* XXX: HMS: auth_md5 must be renamed/incorrect. */
23409100258SXin LI 	// TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac));
23509100258SXin LI 
23609100258SXin LI 	TEST_IGNORE_MESSAGE("Hook in the local AES-128-CMAC check!");
23709100258SXin LI 
23809100258SXin LI 	return;
23909100258SXin LI }
24009100258SXin LI 
24109100258SXin LI 
2429034852cSGleb Smirnoff void
test_VerifyFailure(void)24368ba7e87SXin LI test_VerifyFailure(void)
24468ba7e87SXin LI {
245*f5f40dd6SCy Schubert 	/*
246*f5f40dd6SCy Schubert 	 * We use a copy of test_VerifySHAKE128(), but modify the
247*f5f40dd6SCy Schubert 	 * last packet octet to make sure verification fails.
24868ba7e87SXin LI 	 */
249*f5f40dd6SCy Schubert #ifdef OPENSSL
250*f5f40dd6SCy Schubert 	const char KEY[] = "SHAKE128 unit test key";
251*f5f40dd6SCy Schubert 	const u_char PAYLOAD[] = "packettestdata1_";
252*f5f40dd6SCy Schubert 				/* last packet byte different */
253*f5f40dd6SCy Schubert 	const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1;
254*f5f40dd6SCy Schubert 	const u_char EXPECTED_DIGEST[] =
255*f5f40dd6SCy Schubert 		"\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6"
256*f5f40dd6SCy Schubert 		"\x73\x62\x68\x8D\x11\xB8\x42\xBB";
257*f5f40dd6SCy Schubert 	const size_t DIGEST_LEN = sizeof(EXPECTED_DIGEST) - 1;
258*f5f40dd6SCy Schubert 	struct key sk;
259*f5f40dd6SCy Schubert 	u_char PKT_DATA[  PAYLOAD_LEN + sizeof(sk.key_id)
260*f5f40dd6SCy Schubert 			+ DIGEST_LEN];
261*f5f40dd6SCy Schubert 	u_char *p;
262276da39aSCy Schubert 
263*f5f40dd6SCy Schubert 	sk.next = NULL;
264*f5f40dd6SCy Schubert 	sk.key_id = 0;
265*f5f40dd6SCy Schubert 	sk.key_len = sizeof(KEY) - 1;
266*f5f40dd6SCy Schubert 	memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len));
267*f5f40dd6SCy Schubert 	strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen));
268*f5f40dd6SCy Schubert 	sk.typei = keytype_from_text(sk.typen, NULL);
269276da39aSCy Schubert 
270*f5f40dd6SCy Schubert 	p = PKT_DATA;
271*f5f40dd6SCy Schubert 	memcpy(p, PAYLOAD, PAYLOAD_LEN);	  p += PAYLOAD_LEN;
272*f5f40dd6SCy Schubert 	memcpy(p, &sk.key_id, sizeof(sk.key_id)); p += sizeof(sk.key_id);
273*f5f40dd6SCy Schubert 	memcpy(p, EXPECTED_DIGEST, DIGEST_LEN);	  p += DIGEST_LEN;
274*f5f40dd6SCy Schubert 	TEST_ASSERT_TRUE(sizeof(PKT_DATA) == p - PKT_DATA);
275*f5f40dd6SCy Schubert 
276*f5f40dd6SCy Schubert 	TEST_ASSERT_FALSE(auth_md5(PKT_DATA, PAYLOAD_LEN, DIGEST_LEN, &sk));
277*f5f40dd6SCy Schubert #else
278*f5f40dd6SCy Schubert 
279*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
280*f5f40dd6SCy Schubert 
281*f5f40dd6SCy Schubert #endif	/* OPENSSL */
282276da39aSCy Schubert }
283276da39aSCy Schubert 
2849034852cSGleb Smirnoff 
2859034852cSGleb Smirnoff void
test_PacketSizeNotMultipleOfFourBytes(void)28668ba7e87SXin LI test_PacketSizeNotMultipleOfFourBytes(void)
28768ba7e87SXin LI {
288*f5f40dd6SCy Schubert 	/*
289*f5f40dd6SCy Schubert 	 * We use a copy of test_MakeSHAKE128Mac(), but modify
290*f5f40dd6SCy Schubert 	 * the packet length to 17.
291*f5f40dd6SCy Schubert 	 */
292*f5f40dd6SCy Schubert #ifdef OPENSSL
293276da39aSCy Schubert 
294*f5f40dd6SCy Schubert 	const char KEY[] = "SHAKE128 unit test key";
295*f5f40dd6SCy Schubert 	const u_char PAYLOAD[] = "packettestdata_17";
296*f5f40dd6SCy Schubert 	const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1;
297*f5f40dd6SCy Schubert 	const u_char EXPECTED_DIGEST[] =
298*f5f40dd6SCy Schubert 		"\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6"
299*f5f40dd6SCy Schubert 		"\x73\x62\x68\x8D\x11\xB8\x42\xBB";
300*f5f40dd6SCy Schubert 	u_char actual[sizeof(EXPECTED_DIGEST) - 1];
301*f5f40dd6SCy Schubert 	struct key sk;
302276da39aSCy Schubert 
303*f5f40dd6SCy Schubert 	sk.next = NULL;
304*f5f40dd6SCy Schubert 	sk.key_id = 10;
305*f5f40dd6SCy Schubert 	sk.key_len = sizeof(KEY) - 1;
306*f5f40dd6SCy Schubert 	memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len));
307*f5f40dd6SCy Schubert 	strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen));
308*f5f40dd6SCy Schubert 	sk.typei = keytype_from_text(sk.typen, NULL);
309*f5f40dd6SCy Schubert 
310*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL(0,
311*f5f40dd6SCy Schubert 			  make_mac(PAYLOAD, PAYLOAD_LEN, &sk, actual,
312*f5f40dd6SCy Schubert 				   sizeof(actual)));
313*f5f40dd6SCy Schubert #else
314*f5f40dd6SCy Schubert 
315*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
316*f5f40dd6SCy Schubert 
317*f5f40dd6SCy Schubert #endif	/* OPENSSL */
318276da39aSCy Schubert }
319