xref: /freebsd/contrib/ntp/sntp/tests/packetHandling.c (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
1276da39aSCy Schubert #include "config.h"
2276da39aSCy Schubert #include "ntp_debug.h"
3276da39aSCy Schubert #include "ntp_stdlib.h"
4276da39aSCy Schubert #include "ntp_types.h"
5276da39aSCy Schubert 
6276da39aSCy Schubert #include "sntptest.h"
7276da39aSCy Schubert 
8276da39aSCy Schubert #include "kod_management.h"
9276da39aSCy Schubert #include "main.h"
10276da39aSCy Schubert #include "networking.h"
11276da39aSCy Schubert #include "ntp.h"
12276da39aSCy Schubert 
13276da39aSCy Schubert #include "unity.h"
14276da39aSCy Schubert 
159034852cSGleb Smirnoff void setUp(void);
169034852cSGleb Smirnoff int LfpEquality(const l_fp expected, const l_fp actual);
179034852cSGleb Smirnoff void test_GenerateUnauthenticatedPacket(void);
189034852cSGleb Smirnoff void test_GenerateAuthenticatedPacket(void);
199034852cSGleb Smirnoff void test_OffsetCalculationPositiveOffset(void);
209034852cSGleb Smirnoff void test_OffsetCalculationNegativeOffset(void);
219034852cSGleb Smirnoff void test_HandleUnusableServer(void);
229034852cSGleb Smirnoff void test_HandleUnusablePacket(void);
239034852cSGleb Smirnoff void test_HandleServerAuthenticationFailure(void);
249034852cSGleb Smirnoff void test_HandleKodDemobilize(void);
259034852cSGleb Smirnoff void test_HandleKodRate(void);
269034852cSGleb Smirnoff void test_HandleCorrectPacket(void);
27276da39aSCy Schubert 
28276da39aSCy Schubert 
299034852cSGleb Smirnoff void
3068ba7e87SXin LI setUp(void)
3168ba7e87SXin LI {
32276da39aSCy Schubert 	init_lib();
33276da39aSCy Schubert }
34276da39aSCy Schubert 
35276da39aSCy Schubert 
369034852cSGleb Smirnoff int
3768ba7e87SXin LI LfpEquality(
3868ba7e87SXin LI 	const l_fp	expected,
3968ba7e87SXin LI 	const l_fp 	actual
4068ba7e87SXin LI 	)
4168ba7e87SXin LI {
4268ba7e87SXin LI 	return !!(L_ISEQU(&expected, &actual));
43276da39aSCy Schubert }
44276da39aSCy Schubert 
459034852cSGleb Smirnoff 
469034852cSGleb Smirnoff void
4768ba7e87SXin LI test_GenerateUnauthenticatedPacket(void)
4868ba7e87SXin LI {
49276da39aSCy Schubert 	struct pkt	testpkt;
50276da39aSCy Schubert 	struct timeval	xmt;
5168ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
5268ba7e87SXin LI 
53276da39aSCy Schubert 	GETTIMEOFDAY(&xmt, NULL);
54276da39aSCy Schubert 	xmt.tv_sec += JAN_1970;
55276da39aSCy Schubert 
56276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
57276da39aSCy Schubert 			  generate_pkt(&testpkt, &xmt, 0, NULL));
58276da39aSCy Schubert 
59276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
60276da39aSCy Schubert 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
61276da39aSCy Schubert 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
62276da39aSCy Schubert 
63276da39aSCy Schubert 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
64276da39aSCy Schubert 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
65276da39aSCy Schubert 
66276da39aSCy Schubert 	TVTOTS(&xmt, &expected_xmt);
67276da39aSCy Schubert 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
68276da39aSCy Schubert 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
69276da39aSCy Schubert }
70276da39aSCy Schubert 
719034852cSGleb Smirnoff 
729034852cSGleb Smirnoff void
7368ba7e87SXin LI test_GenerateAuthenticatedPacket(void)
7468ba7e87SXin LI {
75*f5f40dd6SCy Schubert #ifdef OPENSSL
76*f5f40dd6SCy Schubert 
77*f5f40dd6SCy Schubert 	const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_SHAKE128_LEN;
7868ba7e87SXin LI 
79276da39aSCy Schubert 	struct key	testkey;
8068ba7e87SXin LI 	struct pkt	testpkt;
8168ba7e87SXin LI 	struct timeval	xmt;
8268ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
83*f5f40dd6SCy Schubert 	const char key[] = "123456789";
84*f5f40dd6SCy Schubert 	size_t		mac_sz;
85*f5f40dd6SCy Schubert 	const u_char 	expected_mac[] = {
86*f5f40dd6SCy Schubert 				0x46, 0x79, 0x81, 0x6b,
87*f5f40dd6SCy Schubert 				0x22, 0xe3, 0xa7, 0xaf,
88*f5f40dd6SCy Schubert 				0x1d, 0x63, 0x20, 0xfb,
89*f5f40dd6SCy Schubert 				0xc7, 0xd6, 0x87, 0x2c
90*f5f40dd6SCy Schubert 			};
9168ba7e87SXin LI 
92276da39aSCy Schubert 	testkey.next = NULL;
93276da39aSCy Schubert 	testkey.key_id = 30;
94*f5f40dd6SCy Schubert 	strlcpy(testkey.key_seq, key, sizeof(testkey.key_seq));
95*f5f40dd6SCy Schubert 	testkey.key_len = strlen(testkey.key_seq);
96*f5f40dd6SCy Schubert 	strlcpy(testkey.typen, "SHAKE128", sizeof(testkey.typen));
9709100258SXin LI 	testkey.typei = keytype_from_text(testkey.typen, NULL);
98276da39aSCy Schubert 
99*f5f40dd6SCy Schubert 	xmt.tv_sec = JAN_1970;
100*f5f40dd6SCy Schubert 	xmt.tv_usec = 0;
101276da39aSCy Schubert 
102276da39aSCy Schubert 	TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
103*f5f40dd6SCy Schubert 			  generate_pkt(&testpkt, &xmt, testkey.key_id,
104*f5f40dd6SCy Schubert 			  &testkey));
105276da39aSCy Schubert 
106276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
107276da39aSCy Schubert 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
108276da39aSCy Schubert 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
109276da39aSCy Schubert 
110276da39aSCy Schubert 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
111276da39aSCy Schubert 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
112276da39aSCy Schubert 
113276da39aSCy Schubert 	TVTOTS(&xmt, &expected_xmt);
114276da39aSCy Schubert 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
115276da39aSCy Schubert 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
116276da39aSCy Schubert 
117276da39aSCy Schubert 	TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
118276da39aSCy Schubert 
119*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL(sizeof(expected_mac), SHAKE128_LENGTH);
120*f5f40dd6SCy Schubert  	mac_sz = make_mac(&testpkt, LEN_PKT_NOMAC, &testkey,
121*f5f40dd6SCy Schubert 			  &testpkt.exten[1], MAX_MDG_LEN);
122*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL(mac_sz, SHAKE128_LENGTH);
123*f5f40dd6SCy Schubert 
124*f5f40dd6SCy Schubert 	TEST_ASSERT_EQUAL_MEMORY(expected_mac, (void *)&testpkt.exten[1],
125*f5f40dd6SCy Schubert 				 SHAKE128_LENGTH);
126*f5f40dd6SCy Schubert 
127*f5f40dd6SCy Schubert #else	/* !OPENSSL follows */
128*f5f40dd6SCy Schubert 
129*f5f40dd6SCy Schubert 	TEST_IGNORE_MESSAGE("OpenSSL not found, skipping...");
130*f5f40dd6SCy Schubert 
131*f5f40dd6SCy Schubert #endif
132276da39aSCy Schubert }
133276da39aSCy Schubert 
1349034852cSGleb Smirnoff 
1359034852cSGleb Smirnoff void
13668ba7e87SXin LI test_OffsetCalculationPositiveOffset(void)
13768ba7e87SXin LI {
138276da39aSCy Schubert 	struct pkt	rpkt;
13968ba7e87SXin LI 	l_fp		reftime, tmp;
14068ba7e87SXin LI 	struct timeval	dst;
14168ba7e87SXin LI 	double		offset, precision, synch_distance;
142276da39aSCy Schubert 
14368ba7e87SXin LI 	rpkt.precision = -16; /* 0,000015259 */
144276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
145276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
14668ba7e87SXin LI 
14768ba7e87SXin LI 	/* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
148276da39aSCy Schubert 	get_systime(&reftime);
149276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
150276da39aSCy Schubert 
15168ba7e87SXin LI 	/* T1 - Originate timestamp */
152276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
153276da39aSCy Schubert 	tmp.l_uf = 0UL;
154276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
155276da39aSCy Schubert 
15668ba7e87SXin LI 	/* T2 - Receive timestamp */
157276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
158276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
159276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
160276da39aSCy Schubert 
16168ba7e87SXin LI 	/* T3 - Transmit timestamp */
162276da39aSCy Schubert 	tmp.l_ui = 1000000002UL;
163276da39aSCy Schubert 	tmp.l_uf = 0UL;
164276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
165276da39aSCy Schubert 
16668ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
167276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
168276da39aSCy Schubert 	tmp.l_uf = 0UL;
169276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
170276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
171276da39aSCy Schubert 
172276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
173276da39aSCy Schubert 
1749034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
1759034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
17668ba7e87SXin LI 	/* 1.1250150000000001 ? */
1779034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
178276da39aSCy Schubert }
179276da39aSCy Schubert 
1809034852cSGleb Smirnoff 
1819034852cSGleb Smirnoff void
18268ba7e87SXin LI test_OffsetCalculationNegativeOffset(void)
18368ba7e87SXin LI {
184276da39aSCy Schubert 	struct pkt	rpkt;
18568ba7e87SXin LI 	l_fp		reftime, tmp;
18668ba7e87SXin LI 	struct timeval	dst;
18768ba7e87SXin LI 	double		offset, precision, synch_distance;
188276da39aSCy Schubert 
189276da39aSCy Schubert 	rpkt.precision = -1;
190276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
191276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
19268ba7e87SXin LI 
19368ba7e87SXin LI 	/* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
194276da39aSCy Schubert 	get_systime(&reftime);
195276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
196276da39aSCy Schubert 
19768ba7e87SXin LI 	/* T1 - Originate timestamp */
198276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
199276da39aSCy Schubert 	tmp.l_uf = 0UL;
200276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
201276da39aSCy Schubert 
20268ba7e87SXin LI 	/* T2 - Receive timestamp */
203276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
204276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
205276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
206276da39aSCy Schubert 
20768ba7e87SXin LI 	/*/ T3 - Transmit timestamp */
208276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
209276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
210276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
211276da39aSCy Schubert 
21268ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
213276da39aSCy Schubert 	tmp.l_ui = 1000000003UL;
214276da39aSCy Schubert 	tmp.l_uf = 0UL;
21568ba7e87SXin LI 
216276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
217276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
218276da39aSCy Schubert 
219276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
220276da39aSCy Schubert 
2219034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
2229034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
2239034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
224276da39aSCy Schubert }
225276da39aSCy Schubert 
2269034852cSGleb Smirnoff 
2279034852cSGleb Smirnoff void
22868ba7e87SXin LI test_HandleUnusableServer(void)
22968ba7e87SXin LI {
230276da39aSCy Schubert 	struct pkt	rpkt;
231276da39aSCy Schubert 	sockaddr_u	host;
232276da39aSCy Schubert 	int		rpktl;
233276da39aSCy Schubert 
234276da39aSCy Schubert 	ZERO(rpkt);
235276da39aSCy Schubert 	ZERO(host);
236276da39aSCy Schubert 	rpktl = SERVER_UNUSEABLE;
237276da39aSCy Schubert 	TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
238276da39aSCy Schubert }
239276da39aSCy Schubert 
2409034852cSGleb Smirnoff 
2419034852cSGleb Smirnoff void
24268ba7e87SXin LI test_HandleUnusablePacket(void)
24368ba7e87SXin LI {
244276da39aSCy Schubert 	struct pkt	rpkt;
245276da39aSCy Schubert 	sockaddr_u	host;
246276da39aSCy Schubert 	int		rpktl;
247276da39aSCy Schubert 
248276da39aSCy Schubert 	ZERO(rpkt);
249276da39aSCy Schubert 	ZERO(host);
250276da39aSCy Schubert 	rpktl = PACKET_UNUSEABLE;
251276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
252276da39aSCy Schubert }
253276da39aSCy Schubert 
2549034852cSGleb Smirnoff 
2559034852cSGleb Smirnoff void
25668ba7e87SXin LI test_HandleServerAuthenticationFailure(void)
25768ba7e87SXin LI {
258276da39aSCy Schubert 	struct pkt	rpkt;
259276da39aSCy Schubert 	sockaddr_u	host;
260276da39aSCy Schubert 	int		rpktl;
261276da39aSCy Schubert 
262276da39aSCy Schubert 	ZERO(rpkt);
263276da39aSCy Schubert 	ZERO(host);
264276da39aSCy Schubert 	rpktl = SERVER_AUTH_FAIL;
265276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
266276da39aSCy Schubert }
267276da39aSCy Schubert 
2689034852cSGleb Smirnoff 
2699034852cSGleb Smirnoff void
27068ba7e87SXin LI test_HandleKodDemobilize(void)
27168ba7e87SXin LI {
27268ba7e87SXin LI 	static const char *	HOSTNAME = "192.0.2.1";
27368ba7e87SXin LI 	static const char *	REASON = "DENY";
274276da39aSCy Schubert 	struct pkt		rpkt;
275276da39aSCy Schubert 	sockaddr_u		host;
276276da39aSCy Schubert 	int			rpktl;
277276da39aSCy Schubert 	struct kod_entry *	entry;
278276da39aSCy Schubert 
279276da39aSCy Schubert 	rpktl = KOD_DEMOBILIZE;
280276da39aSCy Schubert 	ZERO(rpkt);
281276da39aSCy Schubert 	memcpy(&rpkt.refid, REASON, 4);
282276da39aSCy Schubert 	ZERO(host);
283276da39aSCy Schubert 	host.sa4.sin_family = AF_INET;
284276da39aSCy Schubert 	host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
285276da39aSCy Schubert 
28668ba7e87SXin LI 	/* Test that the KOD-entry is added to the database. */
287276da39aSCy Schubert 	kod_init_kod_db("/dev/null", TRUE);
288276da39aSCy Schubert 
289276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
290276da39aSCy Schubert 
291276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
2929034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
293276da39aSCy Schubert }
294276da39aSCy Schubert 
2959034852cSGleb Smirnoff 
2969034852cSGleb Smirnoff void
29768ba7e87SXin LI test_HandleKodRate(void)
29868ba7e87SXin LI {
299276da39aSCy Schubert 	struct 	pkt	rpkt;
300276da39aSCy Schubert 	sockaddr_u	host;
301276da39aSCy Schubert 	int		rpktl;
302276da39aSCy Schubert 
303276da39aSCy Schubert 	ZERO(rpkt);
304276da39aSCy Schubert 	ZERO(host);
305276da39aSCy Schubert 	rpktl = KOD_RATE;
306276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
307276da39aSCy Schubert }
308276da39aSCy Schubert 
3099034852cSGleb Smirnoff 
3109034852cSGleb Smirnoff void
31168ba7e87SXin LI test_HandleCorrectPacket(void)
31268ba7e87SXin LI {
313276da39aSCy Schubert 	struct pkt	rpkt;
314276da39aSCy Schubert 	sockaddr_u	host;
315276da39aSCy Schubert 	int		rpktl;
316276da39aSCy Schubert 	l_fp		now;
317276da39aSCy Schubert 
31868ba7e87SXin LI 	/* We don't want our testing code to actually change the system clock. */
319276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
320276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
321276da39aSCy Schubert 
322276da39aSCy Schubert 	get_systime(&now);
323276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.reftime);
324276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.org);
325276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.rec);
326276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.xmt);
327276da39aSCy Schubert 	rpktl = LEN_PKT_NOMAC;
328276da39aSCy Schubert 	ZERO(host);
329276da39aSCy Schubert 	AF(&host) = AF_INET;
330276da39aSCy Schubert 
331276da39aSCy Schubert 	TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
332276da39aSCy Schubert }
333276da39aSCy Schubert 
334276da39aSCy Schubert /* packetHandling.c */
335