xref: /freebsd/contrib/ntp/sntp/tests/packetProcessing.c (revision 091002585974d17c9533f943ec351c13a69788ab)
1276da39aSCy Schubert #include "config.h"
268ba7e87SXin LI 
3276da39aSCy Schubert #include "sntptest.h"
4276da39aSCy Schubert #include "networking.h"
5276da39aSCy Schubert #include "ntp_stdlib.h"
6276da39aSCy Schubert #include "unity.h"
7276da39aSCy Schubert 
8*09100258SXin LI #define CMAC		"AES128CMAC"
9*09100258SXin LI #define CMAC_LENGTH	16
10*09100258SXin LI 
119034852cSGleb Smirnoff 
12276da39aSCy Schubert const char * Version = "stub unit test Version string";
13276da39aSCy Schubert 
14f391d6bcSXin LI /* Hacks into the key database. */
15276da39aSCy Schubert extern struct key* key_ptr;
16276da39aSCy Schubert extern int key_cnt;
17276da39aSCy Schubert 
18276da39aSCy Schubert 
199034852cSGleb Smirnoff void PrepareAuthenticationTest(int key_id,int key_len,const char* type,const void* key_seq);
209034852cSGleb Smirnoff void PrepareAuthenticationTestMD5(int key_id,int key_len,const void* key_seq);
219034852cSGleb Smirnoff void setUp(void);
229034852cSGleb Smirnoff void tearDown(void);
239034852cSGleb Smirnoff void test_TooShortLength(void);
249034852cSGleb Smirnoff void test_LengthNotMultipleOfFour(void);
259034852cSGleb Smirnoff void test_TooShortExtensionFieldLength(void);
269034852cSGleb Smirnoff void test_UnauthenticatedPacketReject(void);
279034852cSGleb Smirnoff void test_CryptoNAKPacketReject(void);
289034852cSGleb Smirnoff void test_AuthenticatedPacketInvalid(void);
299034852cSGleb Smirnoff void test_AuthenticatedPacketUnknownKey(void);
309034852cSGleb Smirnoff void test_ServerVersionTooOld(void);
319034852cSGleb Smirnoff void test_ServerVersionTooNew(void);
329034852cSGleb Smirnoff void test_NonWantedMode(void);
339034852cSGleb Smirnoff void test_KoDRate(void);
349034852cSGleb Smirnoff void test_KoDDeny(void);
359034852cSGleb Smirnoff void test_RejectUnsyncedServer(void);
369034852cSGleb Smirnoff void test_RejectWrongResponseServerMode(void);
379034852cSGleb Smirnoff void test_AcceptNoSentPacketBroadcastMode(void);
389034852cSGleb Smirnoff void test_CorrectUnauthenticatedPacket(void);
399034852cSGleb Smirnoff void test_CorrectAuthenticatedPacketMD5(void);
409034852cSGleb Smirnoff void test_CorrectAuthenticatedPacketSHA1(void);
41*09100258SXin LI void test_CorrectAuthenticatedPacketCMAC(void);
429034852cSGleb Smirnoff 
43f391d6bcSXin LI /* [Bug 2998] There are some issues whith the definition of 'struct pkt'
44f391d6bcSXin LI  * when AUTOKEY is undefined -- the formal struct is too small to hold
45f391d6bcSXin LI  * all the extension fields that are going to be tested. We have to make
46f391d6bcSXin LI  * sure we have the extra bytes, or the test yield undefined results due
47f391d6bcSXin LI  * to buffer overrun.
48f391d6bcSXin LI  */
49f391d6bcSXin LI #ifndef AUTOKEY
50f391d6bcSXin LI # define EXTRA_BUFSIZE 256
51f391d6bcSXin LI #else
52f391d6bcSXin LI # define EXTRA_BUFSIZE 0
53f391d6bcSXin LI #endif
549034852cSGleb Smirnoff 
55f391d6bcSXin LI union tpkt {
56f391d6bcSXin LI 	struct pkt p;
57f391d6bcSXin LI 	u_char     b[sizeof(struct pkt) + EXTRA_BUFSIZE];
58f391d6bcSXin LI };
59f391d6bcSXin LI 
60f391d6bcSXin LI static union tpkt testpkt;
61f391d6bcSXin LI static union tpkt testspkt;
62276da39aSCy Schubert static sockaddr_u testsock;
63276da39aSCy Schubert bool restoreKeyDb;
64276da39aSCy Schubert 
659034852cSGleb Smirnoff 
669034852cSGleb Smirnoff void
6768ba7e87SXin LI PrepareAuthenticationTest(
6868ba7e87SXin LI 	int		key_id,
69276da39aSCy Schubert 	int		key_len,
70276da39aSCy Schubert 	const char *	type,
7168ba7e87SXin LI 	const void *	key_seq
7268ba7e87SXin LI 	)
7368ba7e87SXin LI {
74276da39aSCy Schubert 	char str[25];
759034852cSGleb Smirnoff 	snprintf(str, 25, "%d", key_id);
76276da39aSCy Schubert 	ActivateOption("-a", str);
77276da39aSCy Schubert 
78276da39aSCy Schubert 	key_cnt = 1;
799034852cSGleb Smirnoff 	key_ptr = emalloc(sizeof(struct key));
80276da39aSCy Schubert 	key_ptr->next = NULL;
81276da39aSCy Schubert 	key_ptr->key_id = key_id;
82276da39aSCy Schubert 	key_ptr->key_len = key_len;
83*09100258SXin LI 	memcpy(key_ptr->typen, type, strlen(type) + 1);
84276da39aSCy Schubert 
85276da39aSCy Schubert 	TEST_ASSERT_TRUE(key_len < sizeof(key_ptr->key_seq));
86276da39aSCy Schubert 
87276da39aSCy Schubert 	memcpy(key_ptr->key_seq, key_seq, key_ptr->key_len);
88276da39aSCy Schubert 	restoreKeyDb = true;
89276da39aSCy Schubert }
90276da39aSCy Schubert 
919034852cSGleb Smirnoff 
929034852cSGleb Smirnoff void
9368ba7e87SXin LI PrepareAuthenticationTestMD5(
9468ba7e87SXin LI 	int 		key_id,
95276da39aSCy Schubert 	int 		key_len,
9668ba7e87SXin LI 	const void *	key_seq
9768ba7e87SXin LI 	)
9868ba7e87SXin LI {
99276da39aSCy Schubert 	PrepareAuthenticationTest(key_id, key_len, "MD5", key_seq);
100276da39aSCy Schubert }
101276da39aSCy Schubert 
1029034852cSGleb Smirnoff 
1039034852cSGleb Smirnoff void
10468ba7e87SXin LI setUp(void)
10568ba7e87SXin LI {
106276da39aSCy Schubert 
107276da39aSCy Schubert 	sntptest();
108276da39aSCy Schubert 	restoreKeyDb = false;
109276da39aSCy Schubert 
110276da39aSCy Schubert 	/* Initialize the test packet and socket,
11168ba7e87SXin LI 	 * so they contain at least some valid data.
11268ba7e87SXin LI 	 */
113f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING, NTP_VERSION,
114276da39aSCy Schubert 										MODE_SERVER);
115f391d6bcSXin LI 	testpkt.p.stratum = STRATUM_REFCLOCK;
116f391d6bcSXin LI 	memcpy(&testpkt.p.refid, "GPS\0", 4);
117276da39aSCy Schubert 
118276da39aSCy Schubert 	/* Set the origin timestamp of the received packet to the
11968ba7e87SXin LI 	 * same value as the transmit timestamp of the sent packet.
12068ba7e87SXin LI 	 */
121276da39aSCy Schubert 	l_fp tmp;
122276da39aSCy Schubert 	tmp.l_ui = 1000UL;
123276da39aSCy Schubert 	tmp.l_uf = 0UL;
124276da39aSCy Schubert 
125f391d6bcSXin LI 	HTONL_FP(&tmp, &testpkt.p.org);
126f391d6bcSXin LI 	HTONL_FP(&tmp, &testspkt.p.xmt);
127276da39aSCy Schubert }
128276da39aSCy Schubert 
1299034852cSGleb Smirnoff 
1309034852cSGleb Smirnoff void
13168ba7e87SXin LI tearDown(void)
13268ba7e87SXin LI {
133276da39aSCy Schubert 	if (restoreKeyDb) {
134276da39aSCy Schubert 		key_cnt = 0;
135276da39aSCy Schubert 		free(key_ptr);
136276da39aSCy Schubert 		key_ptr = NULL;
137276da39aSCy Schubert 	}
138276da39aSCy Schubert 
13968ba7e87SXin LI 	sntptest_destroy(); /* only on the final test!! if counter == 0 etc... */
140276da39aSCy Schubert }
141276da39aSCy Schubert 
142276da39aSCy Schubert 
1439034852cSGleb Smirnoff void
14468ba7e87SXin LI test_TooShortLength(void)
14568ba7e87SXin LI {
146276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
147f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC - 1,
148f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
149276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
150f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC - 1,
151f391d6bcSXin LI 				      MODE_BROADCAST, &testspkt.p, "UnitTest"));
152276da39aSCy Schubert }
153276da39aSCy Schubert 
1549034852cSGleb Smirnoff 
1559034852cSGleb Smirnoff void
15668ba7e87SXin LI test_LengthNotMultipleOfFour(void)
15768ba7e87SXin LI {
158276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
159f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC + 6,
160f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
161276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
162f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC + 3,
163f391d6bcSXin LI 				      MODE_BROADCAST, &testspkt.p, "UnitTest"));
164276da39aSCy Schubert }
165276da39aSCy Schubert 
1669034852cSGleb Smirnoff 
1679034852cSGleb Smirnoff void
16868ba7e87SXin LI test_TooShortExtensionFieldLength(void)
16968ba7e87SXin LI {
170f391d6bcSXin LI 	/* [Bug 2998] We have to get around the formal specification of
171f391d6bcSXin LI 	 * the extension field if AUTOKEY is undefined. (At least CLANG
172f391d6bcSXin LI 	 * issues a warning in this case. It's just a warning, but
173f391d6bcSXin LI 	 * still...
174f391d6bcSXin LI 	 */
175f391d6bcSXin LI 	uint32_t * pe = testpkt.p.exten + 7;
176f391d6bcSXin LI 
177276da39aSCy Schubert 	/* The lower 16-bits are the length of the extension field.
178276da39aSCy Schubert 	 * This lengths must be multiples of 4 bytes, which gives
17968ba7e87SXin LI 	 * a minimum of 4 byte extension field length.
18068ba7e87SXin LI 	 */
181f391d6bcSXin LI 	*pe = htonl(3); /* 3 bytes is too short. */
182276da39aSCy Schubert 
183276da39aSCy Schubert 	/* We send in a pkt_len of header size + 4 byte extension
184276da39aSCy Schubert 	 * header + 24 byte MAC, this prevents the length error to
18568ba7e87SXin LI 	 * be caught at an earlier stage
18668ba7e87SXin LI 	 */
187276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC + 4 + 24;
188276da39aSCy Schubert 
189276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
190f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
191f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
192276da39aSCy Schubert }
193276da39aSCy Schubert 
1949034852cSGleb Smirnoff 
1959034852cSGleb Smirnoff void
19668ba7e87SXin LI test_UnauthenticatedPacketReject(void)
19768ba7e87SXin LI {
19868ba7e87SXin LI 	/* Activate authentication option */
199276da39aSCy Schubert 	ActivateOption("-a", "123");
200276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
201276da39aSCy Schubert 
202276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
203276da39aSCy Schubert 
20468ba7e87SXin LI 	/* We demand authentication, but no MAC header is present. */
205276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
206f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
207f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
208276da39aSCy Schubert }
209276da39aSCy Schubert 
2109034852cSGleb Smirnoff 
2119034852cSGleb Smirnoff void
21268ba7e87SXin LI test_CryptoNAKPacketReject(void)
21368ba7e87SXin LI {
21468ba7e87SXin LI 	/* Activate authentication option */
215276da39aSCy Schubert 	ActivateOption("-a", "123");
216276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
217276da39aSCy Schubert 
21868ba7e87SXin LI 	int pkt_len = LEN_PKT_NOMAC + 4; /* + 4 byte MAC = Crypto-NAK */
219276da39aSCy Schubert 
220276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
221f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
222f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
223276da39aSCy Schubert }
224276da39aSCy Schubert 
2259034852cSGleb Smirnoff 
2269034852cSGleb Smirnoff void
22768ba7e87SXin LI test_AuthenticatedPacketInvalid(void)
22868ba7e87SXin LI {
22968ba7e87SXin LI 	/* Activate authentication option */
230276da39aSCy Schubert 	PrepareAuthenticationTestMD5(50, 9, "123456789");
231276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
232276da39aSCy Schubert 
23368ba7e87SXin LI 	/* Prepare the packet. */
234276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
235276da39aSCy Schubert 
236f391d6bcSXin LI 	testpkt.p.exten[0] = htonl(50);
237f391d6bcSXin LI 	int mac_len = make_mac(&testpkt.p, pkt_len,
238*09100258SXin LI 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
239f391d6bcSXin LI 			       &testpkt.p.exten[1]);
240276da39aSCy Schubert 
241276da39aSCy Schubert 	pkt_len += 4 + mac_len;
242276da39aSCy Schubert 
24368ba7e87SXin LI 	/* Now, alter the MAC so it becomes invalid. */
244f391d6bcSXin LI 	testpkt.p.exten[1] += 1;
245276da39aSCy Schubert 
246276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
247f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
248f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
249276da39aSCy Schubert }
250276da39aSCy Schubert 
2519034852cSGleb Smirnoff 
2529034852cSGleb Smirnoff void
25368ba7e87SXin LI test_AuthenticatedPacketUnknownKey(void)
25468ba7e87SXin LI {
25568ba7e87SXin LI 	/* Activate authentication option */
256276da39aSCy Schubert 	PrepareAuthenticationTestMD5(30, 9, "123456789");
257276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
258276da39aSCy Schubert 
25968ba7e87SXin LI 	/* Prepare the packet. Note that the Key-ID expected is 30, but
26068ba7e87SXin LI 	 * the packet has a key id of 50.
26168ba7e87SXin LI 	 */
262276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
263276da39aSCy Schubert 
264f391d6bcSXin LI 	testpkt.p.exten[0] = htonl(50);
265f391d6bcSXin LI 	int mac_len = make_mac(&testpkt.p, pkt_len,
266*09100258SXin LI 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
267f391d6bcSXin LI 			       &testpkt.p.exten[1]);
268*09100258SXin LI 	pkt_len += KEY_MAC_LEN + mac_len;
269276da39aSCy Schubert 
270276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
271f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
272f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
273276da39aSCy Schubert }
274276da39aSCy Schubert 
2759034852cSGleb Smirnoff 
2769034852cSGleb Smirnoff void
27768ba7e87SXin LI test_ServerVersionTooOld(void)
27868ba7e87SXin LI {
279276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
280276da39aSCy Schubert 
281f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
282276da39aSCy Schubert 					      NTP_OLDVERSION - 1,
283276da39aSCy Schubert 					      MODE_CLIENT);
284f391d6bcSXin LI 	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.p.li_vn_mode) < NTP_OLDVERSION);
285276da39aSCy Schubert 
286276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
287276da39aSCy Schubert 
288276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
289f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
290f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
291276da39aSCy Schubert }
292276da39aSCy Schubert 
2939034852cSGleb Smirnoff 
2949034852cSGleb Smirnoff void
29568ba7e87SXin LI test_ServerVersionTooNew(void)
29668ba7e87SXin LI {
297276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
298276da39aSCy Schubert 
299f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
300276da39aSCy Schubert 					      NTP_VERSION + 1,
301276da39aSCy Schubert 					      MODE_CLIENT);
302f391d6bcSXin LI 	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.p.li_vn_mode) > NTP_VERSION);
303276da39aSCy Schubert 
304276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
305276da39aSCy Schubert 
306276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
307f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
308f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
309276da39aSCy Schubert }
310276da39aSCy Schubert 
3119034852cSGleb Smirnoff 
3129034852cSGleb Smirnoff void
31368ba7e87SXin LI test_NonWantedMode(void)
31468ba7e87SXin LI {
315276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
316276da39aSCy Schubert 
317f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
318276da39aSCy Schubert 					      NTP_VERSION,
319276da39aSCy Schubert 					      MODE_CLIENT);
320276da39aSCy Schubert 
32168ba7e87SXin LI 	/* The packet has a mode of MODE_CLIENT, but process_pkt expects
32268ba7e87SXin LI 	 * MODE_SERVER
32368ba7e87SXin LI 	 */
324276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
325f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
326f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
327276da39aSCy Schubert }
328276da39aSCy Schubert 
3299034852cSGleb Smirnoff 
330276da39aSCy Schubert /* Tests bug 1597 */
3319034852cSGleb Smirnoff void
33268ba7e87SXin LI test_KoDRate(void)
33368ba7e87SXin LI {
334276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
335276da39aSCy Schubert 
336f391d6bcSXin LI 	testpkt.p.stratum = STRATUM_PKT_UNSPEC;
337f391d6bcSXin LI 	memcpy(&testpkt.p.refid, "RATE", 4);
338276da39aSCy Schubert 
339276da39aSCy Schubert 	TEST_ASSERT_EQUAL(KOD_RATE,
340f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
341f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
342276da39aSCy Schubert }
343276da39aSCy Schubert 
3449034852cSGleb Smirnoff 
3459034852cSGleb Smirnoff void
34668ba7e87SXin LI test_KoDDeny(void)
34768ba7e87SXin LI {
348276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
349276da39aSCy Schubert 
350f391d6bcSXin LI 	testpkt.p.stratum = STRATUM_PKT_UNSPEC;
351f391d6bcSXin LI 	memcpy(&testpkt.p.refid, "DENY", 4);
352276da39aSCy Schubert 
353276da39aSCy Schubert 	TEST_ASSERT_EQUAL(KOD_DEMOBILIZE,
354f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
355f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
356276da39aSCy Schubert }
357276da39aSCy Schubert 
3589034852cSGleb Smirnoff 
3599034852cSGleb Smirnoff void
36068ba7e87SXin LI test_RejectUnsyncedServer(void)
36168ba7e87SXin LI {
362276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
363276da39aSCy Schubert 
364f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
365276da39aSCy Schubert 					      NTP_VERSION,
366276da39aSCy Schubert 					      MODE_SERVER);
367276da39aSCy Schubert 
368276da39aSCy Schubert 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
369f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
370f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
371276da39aSCy Schubert }
372276da39aSCy Schubert 
3739034852cSGleb Smirnoff 
3749034852cSGleb Smirnoff void
37568ba7e87SXin LI test_RejectWrongResponseServerMode(void)
37668ba7e87SXin LI {
377276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
378276da39aSCy Schubert 
379276da39aSCy Schubert 	l_fp tmp;
380276da39aSCy Schubert 	tmp.l_ui = 1000UL;
381276da39aSCy Schubert 	tmp.l_uf = 0UL;
382f391d6bcSXin LI 	HTONL_FP(&tmp, &testpkt.p.org);
383276da39aSCy Schubert 
384276da39aSCy Schubert 	tmp.l_ui = 2000UL;
385276da39aSCy Schubert 	tmp.l_uf = 0UL;
386f391d6bcSXin LI 	HTONL_FP(&tmp, &testspkt.p.xmt);
387276da39aSCy Schubert 
388276da39aSCy Schubert 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
389f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
390f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
391276da39aSCy Schubert }
392276da39aSCy Schubert 
3939034852cSGleb Smirnoff 
3949034852cSGleb Smirnoff void
39568ba7e87SXin LI test_AcceptNoSentPacketBroadcastMode(void)
39668ba7e87SXin LI {
397276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
398276da39aSCy Schubert 
399f391d6bcSXin LI 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
400276da39aSCy Schubert 					      NTP_VERSION,
401276da39aSCy Schubert 					      MODE_BROADCAST);
402276da39aSCy Schubert 
403276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
404f391d6bcSXin LI 		  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
405276da39aSCy Schubert 			      MODE_BROADCAST, NULL, "UnitTest"));
406276da39aSCy Schubert }
407276da39aSCy Schubert 
4089034852cSGleb Smirnoff 
4099034852cSGleb Smirnoff void
41068ba7e87SXin LI test_CorrectUnauthenticatedPacket(void)
41168ba7e87SXin LI {
412276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
413276da39aSCy Schubert 
414276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
415f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
416f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
417276da39aSCy Schubert }
418276da39aSCy Schubert 
4199034852cSGleb Smirnoff 
4209034852cSGleb Smirnoff void
42168ba7e87SXin LI test_CorrectAuthenticatedPacketMD5(void)
42268ba7e87SXin LI {
423276da39aSCy Schubert 	PrepareAuthenticationTestMD5(10, 15, "123456789abcdef");
424276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
425276da39aSCy Schubert 
426276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
427276da39aSCy Schubert 
42868ba7e87SXin LI 	/* Prepare the packet. */
429f391d6bcSXin LI 	testpkt.p.exten[0] = htonl(10);
430f391d6bcSXin LI 	int mac_len = make_mac(&testpkt.p, pkt_len,
431*09100258SXin LI 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
432f391d6bcSXin LI 			       &testpkt.p.exten[1]);
433276da39aSCy Schubert 
434*09100258SXin LI 	pkt_len += KEY_MAC_LEN + mac_len;
435276da39aSCy Schubert 
436276da39aSCy Schubert 	TEST_ASSERT_EQUAL(pkt_len,
437f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
438f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
439276da39aSCy Schubert }
440276da39aSCy Schubert 
4419034852cSGleb Smirnoff 
4429034852cSGleb Smirnoff void
44368ba7e87SXin LI test_CorrectAuthenticatedPacketSHA1(void)
44468ba7e87SXin LI {
445276da39aSCy Schubert 	PrepareAuthenticationTest(20, 15, "SHA1", "abcdefghijklmno");
446276da39aSCy Schubert 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
447276da39aSCy Schubert 
448276da39aSCy Schubert 	int pkt_len = LEN_PKT_NOMAC;
449276da39aSCy Schubert 
45068ba7e87SXin LI 	/* Prepare the packet. */
451f391d6bcSXin LI 	testpkt.p.exten[0] = htonl(20);
452f391d6bcSXin LI 	int mac_len = make_mac(&testpkt.p, pkt_len,
453*09100258SXin LI 			       MAX_MDG_LEN, key_ptr,
454*09100258SXin LI 			       &testpkt.p.exten[1]);
455*09100258SXin LI 
456*09100258SXin LI 	pkt_len += KEY_MAC_LEN + mac_len;
457*09100258SXin LI 
458*09100258SXin LI 	TEST_ASSERT_EQUAL(pkt_len,
459*09100258SXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
460*09100258SXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
461*09100258SXin LI }
462*09100258SXin LI 
463*09100258SXin LI 
464*09100258SXin LI void
465*09100258SXin LI test_CorrectAuthenticatedPacketCMAC(void)
466*09100258SXin LI {
467*09100258SXin LI 	PrepareAuthenticationTest(30, CMAC_LENGTH, CMAC, "abcdefghijklmnop");
468*09100258SXin LI 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
469*09100258SXin LI 
470*09100258SXin LI 	int pkt_len = LEN_PKT_NOMAC;
471*09100258SXin LI 
472*09100258SXin LI 	/* Prepare the packet. */
473*09100258SXin LI 	testpkt.p.exten[0] = htonl(30);
474*09100258SXin LI 	int mac_len = make_mac(&testpkt.p, pkt_len,
475276da39aSCy Schubert 			       MAX_MAC_LEN, key_ptr,
476f391d6bcSXin LI 			       &testpkt.p.exten[1]);
477276da39aSCy Schubert 
478276da39aSCy Schubert 	pkt_len += 4 + mac_len;
479276da39aSCy Schubert 
480276da39aSCy Schubert 	TEST_ASSERT_EQUAL(pkt_len,
481f391d6bcSXin LI 			  process_pkt(&testpkt.p, &testsock, pkt_len,
482f391d6bcSXin LI 				      MODE_SERVER, &testspkt.p, "UnitTest"));
483276da39aSCy Schubert }
484*09100258SXin LI 
485