packetProcessing.c revision 294569
11573Srgrimes#include "config.h"
21573Srgrimes
31573Srgrimes/* need autokey for some of the tests, or the will create buffer overruns. */
41573Srgrimes#ifndef AUTOKEY
51573Srgrimes# define AUTOKEY 1
61573Srgrimes#endif
71573Srgrimes
81573Srgrimes#include "sntptest.h"
91573Srgrimes#include "networking.h"
101573Srgrimes#include "ntp_stdlib.h"
111573Srgrimes#include "unity.h"
121573Srgrimes
131573Srgrimes
141573Srgrimesconst char * Version = "stub unit test Version string";
151573Srgrimes
161573Srgrimes// Hacks into the key database.
171573Srgrimesextern struct key* key_ptr;
181573Srgrimesextern int key_cnt;
191573Srgrimes
201573Srgrimes
211573Srgrimesvoid PrepareAuthenticationTest(int key_id,int key_len,const char* type,const void* key_seq);
221573Srgrimesvoid PrepareAuthenticationTestMD5(int key_id,int key_len,const void* key_seq);
231573Srgrimesvoid setUp(void);
241573Srgrimesvoid tearDown(void);
251573Srgrimesvoid test_TooShortLength(void);
261573Srgrimesvoid test_LengthNotMultipleOfFour(void);
271573Srgrimesvoid test_TooShortExtensionFieldLength(void);
2823660Spetervoid test_UnauthenticatedPacketReject(void);
2950476Spetervoid test_CryptoNAKPacketReject(void);
301573Srgrimesvoid test_AuthenticatedPacketInvalid(void);
31249166Sgnnvoid test_AuthenticatedPacketUnknownKey(void);
321573Srgrimesvoid test_ServerVersionTooOld(void);
3379531Sruvoid test_ServerVersionTooNew(void);
341573Srgrimesvoid test_NonWantedMode(void);
351573Srgrimesvoid test_KoDRate(void);
361573Srgrimesvoid test_KoDDeny(void);
371573Srgrimesvoid test_RejectUnsyncedServer(void);
3859460Sphantomvoid test_RejectWrongResponseServerMode(void);
3959460Sphantomvoid test_AcceptNoSentPacketBroadcastMode(void);
401573Srgrimesvoid test_CorrectUnauthenticatedPacket(void);
4184306Sruvoid test_CorrectAuthenticatedPacketMD5(void);
4284306Sruvoid test_CorrectAuthenticatedPacketSHA1(void);
431573Srgrimes
44123814Salfred
451573Srgrimesstatic struct pkt testpkt;
4653678Sphkstatic struct pkt testspkt;
471573Srgrimesstatic sockaddr_u testsock;
48108028Srubool restoreKeyDb;
49108028Sru
501573Srgrimes
511573Srgrimesvoid
52108028SruPrepareAuthenticationTest(
531573Srgrimes	int		key_id,
541573Srgrimes	int		key_len,
55131504Sru	const char *	type,
56131504Sru	const void *	key_seq
571573Srgrimes	)
581573Srgrimes{
591573Srgrimes	char str[25];
601573Srgrimes	snprintf(str, 25, "%d", key_id);
611573Srgrimes	ActivateOption("-a", str);
621573Srgrimes
631573Srgrimes	key_cnt = 1;
641573Srgrimes	key_ptr = emalloc(sizeof(struct key));
651573Srgrimes	key_ptr->next = NULL;
661573Srgrimes	key_ptr->key_id = key_id;
671573Srgrimes	key_ptr->key_len = key_len;
681573Srgrimes	memcpy(key_ptr->type, "MD5", 3);
69131504Sru
70131504Sru	TEST_ASSERT_TRUE(key_len < sizeof(key_ptr->key_seq));
711573Srgrimes
721573Srgrimes	memcpy(key_ptr->key_seq, key_seq, key_ptr->key_len);
731573Srgrimes	restoreKeyDb = true;
741573Srgrimes}
751573Srgrimes
761573Srgrimes
771573Srgrimesvoid
781573SrgrimesPrepareAuthenticationTestMD5(
791573Srgrimes	int 		key_id,
80108087Sru	int 		key_len,
811573Srgrimes	const void *	key_seq
821573Srgrimes	)
831573Srgrimes{
84108087Sru	PrepareAuthenticationTest(key_id, key_len, "MD5", key_seq);
851573Srgrimes}
861573Srgrimes
871573Srgrimes
881573Srgrimesvoid
891573SrgrimessetUp(void)
90131504Sru{
91131504Sru
921573Srgrimes	sntptest();
931573Srgrimes	restoreKeyDb = false;
94108087Sru
951573Srgrimes	/* Initialize the test packet and socket,
961573Srgrimes	 * so they contain at least some valid data.
971573Srgrimes	 */
98131504Sru	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING, NTP_VERSION,
99131504Sru										MODE_SERVER);
1001573Srgrimes	testpkt.stratum = STRATUM_REFCLOCK;
1011573Srgrimes	memcpy(&testpkt.refid, "GPS\0", 4);
1021573Srgrimes
1031573Srgrimes	/* Set the origin timestamp of the received packet to the
104108087Sru	 * same value as the transmit timestamp of the sent packet.
105108087Sru	 */
106108087Sru	l_fp tmp;
1071573Srgrimes	tmp.l_ui = 1000UL;
1081573Srgrimes	tmp.l_uf = 0UL;
1091573Srgrimes
110119964Sru	HTONL_FP(&tmp, &testpkt.org);
1111573Srgrimes	HTONL_FP(&tmp, &testspkt.xmt);
1121573Srgrimes}
1131573Srgrimes
1141573Srgrimes
1151573Srgrimesvoid
1161573SrgrimestearDown(void)
1171573Srgrimes{
1181573Srgrimes	if (restoreKeyDb) {
119108087Sru		key_cnt = 0;
120108087Sru		free(key_ptr);
1211573Srgrimes		key_ptr = NULL;
1221573Srgrimes	}
1231573Srgrimes
124108087Sru	sntptest_destroy(); /* only on the final test!! if counter == 0 etc... */
1251573Srgrimes}
1261573Srgrimes
1271573Srgrimes
128108087Sruvoid
129108087Srutest_TooShortLength(void)
130119964Sru{
1311573Srgrimes	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
1321573Srgrimes			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC - 1,
1331573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
1341573Srgrimes	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
1351573Srgrimes			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC - 1,
1361573Srgrimes				      MODE_BROADCAST, &testspkt, "UnitTest"));
137108087Sru}
138108087Sru
139119964Sru
1401573Srgrimesvoid
1411573Srgrimestest_LengthNotMultipleOfFour(void)
142195211Strasz{
143195211Strasz	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
144195211Strasz			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC + 6,
145195211Strasz				      MODE_SERVER, &testspkt, "UnitTest"));
146195211Strasz	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
1471573Srgrimes			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC + 3,
1481573Srgrimes				      MODE_BROADCAST, &testspkt, "UnitTest"));
1491573Srgrimes}
1501573Srgrimes
15163635Salfred
1521573Srgrimesvoid
1531573Srgrimestest_TooShortExtensionFieldLength(void)
1541573Srgrimes{
1551573Srgrimes	/* The lower 16-bits are the length of the extension field.
1561573Srgrimes	 * This lengths must be multiples of 4 bytes, which gives
1571573Srgrimes	 * a minimum of 4 byte extension field length.
1581573Srgrimes	 */
1591573Srgrimes	testpkt.exten[7] = htonl(3); /* 3 bytes is too short. */
1601573Srgrimes
1611573Srgrimes	/* We send in a pkt_len of header size + 4 byte extension
1621573Srgrimes	 * header + 24 byte MAC, this prevents the length error to
1631573Srgrimes	 * be caught at an earlier stage
1641573Srgrimes	 */
1651573Srgrimes	int pkt_len = LEN_PKT_NOMAC + 4 + 24;
16688886Syar
167162385Sru	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
168162385Sru			  process_pkt(&testpkt, &testsock, pkt_len,
169162385Sru				      MODE_SERVER, &testspkt, "UnitTest"));
170162385Sru}
171165945Smaxim
172165945Smaxim
173167335Sbmsvoid
1741573Srgrimestest_UnauthenticatedPacketReject(void)
175232180Skib{
176232180Skib	/* Activate authentication option */
1771573Srgrimes	ActivateOption("-a", "123");
178178886Sjulian	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
1791573Srgrimes
1801573Srgrimes	int pkt_len = LEN_PKT_NOMAC;
181179768Swkoszek
182179768Swkoszek	/* We demand authentication, but no MAC header is present. */
183179768Swkoszek	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
184179768Swkoszek			  process_pkt(&testpkt, &testsock, pkt_len,
185179768Swkoszek				      MODE_SERVER, &testspkt, "UnitTest"));
186179768Swkoszek}
187179768Swkoszek
188179768Swkoszek
189215178Sluigivoid
190179768Swkoszektest_CryptoNAKPacketReject(void)
191179768Swkoszek{
1921573Srgrimes	/* Activate authentication option */
1931573Srgrimes	ActivateOption("-a", "123");
194215178Sluigi	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
1951573Srgrimes
1961573Srgrimes	int pkt_len = LEN_PKT_NOMAC + 4; /* + 4 byte MAC = Crypto-NAK */
1971573Srgrimes
1981573Srgrimes	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
199108028Sru			  process_pkt(&testpkt, &testsock, pkt_len,
200215178Sluigi				      MODE_SERVER, &testspkt, "UnitTest"));
2011573Srgrimes}
2021573Srgrimes
2031573Srgrimes
2041573Srgrimesvoid
2051573Srgrimestest_AuthenticatedPacketInvalid(void)
2061573Srgrimes{
2071573Srgrimes	/* Activate authentication option */
208215178Sluigi	PrepareAuthenticationTestMD5(50, 9, "123456789");
2091573Srgrimes	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
2101573Srgrimes
211131504Sru	/* Prepare the packet. */
212131504Sru	int pkt_len = LEN_PKT_NOMAC;
2131573Srgrimes
2141573Srgrimes	testpkt.exten[0] = htonl(50);
2151573Srgrimes	int mac_len = make_mac(&testpkt, pkt_len,
2161573Srgrimes			       MAX_MD5_LEN, key_ptr,
217215178Sluigi			       &testpkt.exten[1]);
2181573Srgrimes
2191573Srgrimes	pkt_len += 4 + mac_len;
220131504Sru
221131504Sru	/* Now, alter the MAC so it becomes invalid. */
2221573Srgrimes	testpkt.exten[1] += 1;
2231573Srgrimes
2241573Srgrimes	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
2251573Srgrimes			  process_pkt(&testpkt, &testsock, pkt_len,
2261573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
22779754Sdd}
2281573Srgrimes
2291573Srgrimes
2301573Srgrimesvoid
23171895Srutest_AuthenticatedPacketUnknownKey(void)
23271895Sru{
23379754Sdd	/* Activate authentication option */
23414855Smpp	PrepareAuthenticationTestMD5(30, 9, "123456789");
2351573Srgrimes	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
2361573Srgrimes
23723660Speter	/* Prepare the packet. Note that the Key-ID expected is 30, but
2381573Srgrimes	 * the packet has a key id of 50.
239108028Sru	 */
2401573Srgrimes	int pkt_len = LEN_PKT_NOMAC;
24179754Sdd
2421573Srgrimes	testpkt.exten[0] = htonl(50);
2431573Srgrimes	int mac_len = make_mac(&testpkt, pkt_len,
24479754Sdd			       MAX_MD5_LEN, key_ptr,
24514855Smpp			       &testpkt.exten[1]);
2461573Srgrimes	pkt_len += 4 + mac_len;
2471573Srgrimes
2481573Srgrimes	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
2491573Srgrimes			  process_pkt(&testpkt, &testsock, pkt_len,
2501573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
2511573Srgrimes}
2521573Srgrimes
2531573Srgrimes
254215178Sluigivoid
2551573Srgrimestest_ServerVersionTooOld(void)
2561573Srgrimes{
2571573Srgrimes	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
2581573Srgrimes
2591573Srgrimes	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
26014855Smpp					    NTP_OLDVERSION - 1,
2611573Srgrimes					    MODE_CLIENT);
26214855Smpp	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.li_vn_mode) < NTP_OLDVERSION);
2631573Srgrimes
2641573Srgrimes	int pkt_len = LEN_PKT_NOMAC;
2651573Srgrimes
2661573Srgrimes	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
267215178Sluigi			  process_pkt(&testpkt, &testsock, pkt_len,
2681573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
2691573Srgrimes}
2701573Srgrimes
2711573Srgrimes
2721573Srgrimesvoid
2731573Srgrimestest_ServerVersionTooNew(void)
2741573Srgrimes{
27512042Swollman	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
27612042Swollman
27712042Swollman	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
27812042Swollman					    NTP_VERSION + 1,
27948822Sjlemon					    MODE_CLIENT);
2801573Srgrimes	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.li_vn_mode) > NTP_VERSION);
2811573Srgrimes
2821573Srgrimes	int pkt_len = LEN_PKT_NOMAC;
2831573Srgrimes
2841573Srgrimes	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
2851573Srgrimes			  process_pkt(&testpkt, &testsock, pkt_len,
2861573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
2871573Srgrimes}
2881573Srgrimes
2891573Srgrimes
2901573Srgrimesvoid
2911573Srgrimestest_NonWantedMode(void)
2921573Srgrimes{
2931573Srgrimes	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
2941573Srgrimes
2951573Srgrimes	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
2961573Srgrimes					    NTP_VERSION,
297215178Sluigi					    MODE_CLIENT);
2981573Srgrimes
2991573Srgrimes	/* The packet has a mode of MODE_CLIENT, but process_pkt expects
3001573Srgrimes	 * MODE_SERVER
3011573Srgrimes	 */
3021573Srgrimes	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
3031573Srgrimes			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
3041573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
3051573Srgrimes}
30679754Sdd
3071573Srgrimes
3081573Srgrimes/* Tests bug 1597 */
3091573Srgrimesvoid
3101573Srgrimestest_KoDRate(void)
3111573Srgrimes{
3121573Srgrimes	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
31312042Swollman
3141573Srgrimes	testpkt.stratum = STRATUM_PKT_UNSPEC;
3151573Srgrimes	memcpy(&testpkt.refid, "RATE", 4);
3161573Srgrimes
3171573Srgrimes	TEST_ASSERT_EQUAL(KOD_RATE,
318108087Sru			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
319108087Sru				      MODE_SERVER, &testspkt, "UnitTest"));
3201573Srgrimes}
3211573Srgrimes
3221573Srgrimes
3231573Srgrimesvoid
3241573Srgrimestest_KoDDeny(void)
3251573Srgrimes{
3261573Srgrimes	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
3271573Srgrimes
3281573Srgrimes	testpkt.stratum = STRATUM_PKT_UNSPEC;
3291573Srgrimes	memcpy(&testpkt.refid, "DENY", 4);
330215178Sluigi
3311573Srgrimes	TEST_ASSERT_EQUAL(KOD_DEMOBILIZE,
3321573Srgrimes			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
3331573Srgrimes				      MODE_SERVER, &testspkt, "UnitTest"));
334108087Sru}
335108087Sru
3361573Srgrimes
3371573Srgrimesvoid
3381573Srgrimestest_RejectUnsyncedServer(void)
3391573Srgrimes{
3401573Srgrimes	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
3411573Srgrimes
3421573Srgrimes	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
3431573Srgrimes					    NTP_VERSION,
3441573Srgrimes					    MODE_SERVER);
3451573Srgrimes
346178886Sjulian	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
347178886Sjulian			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
348178886Sjulian				      MODE_SERVER, &testspkt, "UnitTest"));
349178886Sjulian}
350178886Sjulian
351178886Sjulian
352215178Sluigivoid
353215178Sluigitest_RejectWrongResponseServerMode(void)
354215178Sluigi{
355215178Sluigi	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
356215178Sluigi
357215178Sluigi	l_fp tmp;
358215178Sluigi	tmp.l_ui = 1000UL;
359215178Sluigi	tmp.l_uf = 0UL;
360215178Sluigi	HTONL_FP(&tmp, &testpkt.org);
36163635Salfred
36263635Salfred	tmp.l_ui = 2000UL;
36363635Salfred	tmp.l_uf = 0UL;
36463635Salfred	HTONL_FP(&tmp, &testspkt.xmt);
36563635Salfred
36663635Salfred	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
36763635Salfred			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
36888885Syar				      MODE_SERVER, &testspkt, "UnitTest"));
36988885Syar}
37088885Syar
37188885Syar
37288885Syarvoid
37388885Syartest_AcceptNoSentPacketBroadcastMode(void)
374108028Sru{
37563635Salfred	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
37663635Salfred
37763635Salfred	testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
37863635Salfred					    NTP_VERSION,
37963635Salfred					    MODE_BROADCAST);
38063635Salfred
38163639Salfred	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
382108087Sru		  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
38363635Salfred			      MODE_BROADCAST, NULL, "UnitTest"));
384108087Sru}
38563635Salfred
38688886Syar
38763635Salfredvoid
38863635Salfredtest_CorrectUnauthenticatedPacket(void)
389108087Sru{
39063635Salfred	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
391108087Sru
39263635Salfred	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
39363635Salfred			  process_pkt(&testpkt, &testsock, LEN_PKT_NOMAC,
394108087Sru				      MODE_SERVER, &testspkt, "UnitTest"));
39563635Salfred}
396108087Sru
39763635Salfred
39863635Salfredvoid
39963635Salfredtest_CorrectAuthenticatedPacketMD5(void)
40063635Salfred{
40163635Salfred	PrepareAuthenticationTestMD5(10, 15, "123456789abcdef");
40263635Salfred	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
40363635Salfred
404157775Smaxim	int pkt_len = LEN_PKT_NOMAC;
405157775Smaxim
406162385Sru	/* Prepare the packet. */
407162385Sru	testpkt.exten[0] = htonl(10);
408162385Sru	int mac_len = make_mac(&testpkt, pkt_len,
409157775Smaxim			       MAX_MD5_LEN, key_ptr,
410157775Smaxim			       &testpkt.exten[1]);
411157775Smaxim
412157775Smaxim	pkt_len += 4 + mac_len;
413165945Smaxim
414165945Smaxim	TEST_ASSERT_EQUAL(pkt_len,
415165945Smaxim			  process_pkt(&testpkt, &testsock, pkt_len,
416165945Smaxim				      MODE_SERVER, &testspkt, "UnitTest"));
417165945Smaxim}
418165945Smaxim
419165945Smaxim
420165945Smaximvoid
421165945Smaximtest_CorrectAuthenticatedPacketSHA1(void)
422165945Smaxim{
423165945Smaxim	PrepareAuthenticationTest(20, 15, "SHA1", "abcdefghijklmno");
424165945Smaxim	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
425165945Smaxim
426165945Smaxim	int pkt_len = LEN_PKT_NOMAC;
427165945Smaxim
428165945Smaxim	/* Prepare the packet. */
429165945Smaxim	testpkt.exten[0] = htonl(20);
430165945Smaxim	int mac_len = make_mac(&testpkt, pkt_len,
431165945Smaxim			       MAX_MAC_LEN, key_ptr,
432165945Smaxim			       &testpkt.exten[1]);
433165945Smaxim
434165945Smaxim	pkt_len += 4 + mac_len;
435165945Smaxim
436165945Smaxim	TEST_ASSERT_EQUAL(pkt_len,
437165945Smaxim			  process_pkt(&testpkt, &testsock, pkt_len,
438165945Smaxim				      MODE_SERVER, &testspkt, "UnitTest"));
439165945Smaxim}
440249166Sgnn