Home | History | Annotate | Line # | Download | only in tests
packetProcessing.c revision 1.1.1.7.12.2
      1  1.1.1.7.12.2  pgoyette /*	$NetBSD: packetProcessing.c,v 1.1.1.7.12.2 2018/09/30 01:45:27 pgoyette Exp $	*/
      2       1.1.1.5  christos 
      3           1.1  christos #include "config.h"
      4       1.1.1.6  christos 
      5           1.1  christos #include "sntptest.h"
      6           1.1  christos #include "networking.h"
      7           1.1  christos #include "ntp_stdlib.h"
      8           1.1  christos #include "unity.h"
      9           1.1  christos 
     10  1.1.1.7.12.1  pgoyette #define CMAC		"AES128CMAC"
     11  1.1.1.7.12.1  pgoyette #define CMAC_LENGTH	16
     12  1.1.1.7.12.1  pgoyette 
     13       1.1.1.3  christos 
     14           1.1  christos const char * Version = "stub unit test Version string";
     15           1.1  christos 
     16       1.1.1.7  christos /* Hacks into the key database. */
     17           1.1  christos extern struct key* key_ptr;
     18           1.1  christos extern int key_cnt;
     19           1.1  christos 
     20           1.1  christos 
     21       1.1.1.3  christos void PrepareAuthenticationTest(int key_id,int key_len,const char* type,const void* key_seq);
     22       1.1.1.3  christos void PrepareAuthenticationTestMD5(int key_id,int key_len,const void* key_seq);
     23       1.1.1.3  christos void setUp(void);
     24       1.1.1.3  christos void tearDown(void);
     25       1.1.1.3  christos void test_TooShortLength(void);
     26       1.1.1.3  christos void test_LengthNotMultipleOfFour(void);
     27       1.1.1.3  christos void test_TooShortExtensionFieldLength(void);
     28       1.1.1.3  christos void test_UnauthenticatedPacketReject(void);
     29       1.1.1.3  christos void test_CryptoNAKPacketReject(void);
     30       1.1.1.3  christos void test_AuthenticatedPacketInvalid(void);
     31       1.1.1.3  christos void test_AuthenticatedPacketUnknownKey(void);
     32       1.1.1.3  christos void test_ServerVersionTooOld(void);
     33       1.1.1.3  christos void test_ServerVersionTooNew(void);
     34       1.1.1.3  christos void test_NonWantedMode(void);
     35       1.1.1.3  christos void test_KoDRate(void);
     36       1.1.1.3  christos void test_KoDDeny(void);
     37       1.1.1.3  christos void test_RejectUnsyncedServer(void);
     38       1.1.1.3  christos void test_RejectWrongResponseServerMode(void);
     39       1.1.1.3  christos void test_AcceptNoSentPacketBroadcastMode(void);
     40       1.1.1.3  christos void test_CorrectUnauthenticatedPacket(void);
     41       1.1.1.3  christos void test_CorrectAuthenticatedPacketMD5(void);
     42       1.1.1.3  christos void test_CorrectAuthenticatedPacketSHA1(void);
     43  1.1.1.7.12.1  pgoyette void test_CorrectAuthenticatedPacketCMAC(void);
     44       1.1.1.3  christos 
     45       1.1.1.7  christos /* [Bug 2998] There are some issues whith the definition of 'struct pkt'
     46       1.1.1.7  christos  * when AUTOKEY is undefined -- the formal struct is too small to hold
     47       1.1.1.7  christos  * all the extension fields that are going to be tested. We have to make
     48       1.1.1.7  christos  * sure we have the extra bytes, or the test yield undefined results due
     49       1.1.1.7  christos  * to buffer overrun.
     50       1.1.1.7  christos  */
     51       1.1.1.7  christos #ifndef AUTOKEY
     52       1.1.1.7  christos # define EXTRA_BUFSIZE 256
     53       1.1.1.7  christos #else
     54       1.1.1.7  christos # define EXTRA_BUFSIZE 0
     55       1.1.1.7  christos #endif
     56       1.1.1.7  christos 
     57       1.1.1.7  christos union tpkt {
     58       1.1.1.7  christos 	struct pkt p;
     59       1.1.1.7  christos 	u_char     b[sizeof(struct pkt) + EXTRA_BUFSIZE];
     60       1.1.1.7  christos };
     61       1.1.1.3  christos 
     62       1.1.1.7  christos static union tpkt testpkt;
     63       1.1.1.7  christos static union tpkt testspkt;
     64           1.1  christos static sockaddr_u testsock;
     65           1.1  christos bool restoreKeyDb;
     66           1.1  christos 
     67       1.1.1.3  christos 
     68       1.1.1.3  christos void
     69       1.1.1.6  christos PrepareAuthenticationTest(
     70       1.1.1.6  christos 	int		key_id,
     71       1.1.1.6  christos 	int		key_len,
     72       1.1.1.6  christos 	const char *	type,
     73       1.1.1.6  christos 	const void *	key_seq
     74       1.1.1.6  christos 	)
     75       1.1.1.6  christos {
     76           1.1  christos 	char str[25];
     77       1.1.1.3  christos 	snprintf(str, 25, "%d", key_id);
     78           1.1  christos 	ActivateOption("-a", str);
     79           1.1  christos 
     80           1.1  christos 	key_cnt = 1;
     81       1.1.1.3  christos 	key_ptr = emalloc(sizeof(struct key));
     82           1.1  christos 	key_ptr->next = NULL;
     83           1.1  christos 	key_ptr->key_id = key_id;
     84           1.1  christos 	key_ptr->key_len = key_len;
     85  1.1.1.7.12.1  pgoyette 	memcpy(key_ptr->typen, type, strlen(type) + 1);
     86           1.1  christos 
     87           1.1  christos 	TEST_ASSERT_TRUE(key_len < sizeof(key_ptr->key_seq));
     88           1.1  christos 
     89           1.1  christos 	memcpy(key_ptr->key_seq, key_seq, key_ptr->key_len);
     90           1.1  christos 	restoreKeyDb = true;
     91           1.1  christos }
     92           1.1  christos 
     93       1.1.1.3  christos 
     94       1.1.1.3  christos void
     95       1.1.1.6  christos PrepareAuthenticationTestMD5(
     96       1.1.1.6  christos 	int 		key_id,
     97       1.1.1.6  christos 	int 		key_len,
     98       1.1.1.6  christos 	const void *	key_seq
     99       1.1.1.6  christos 	)
    100       1.1.1.6  christos {
    101           1.1  christos 	PrepareAuthenticationTest(key_id, key_len, "MD5", key_seq);
    102           1.1  christos }
    103           1.1  christos 
    104       1.1.1.3  christos 
    105       1.1.1.3  christos void
    106       1.1.1.6  christos setUp(void)
    107       1.1.1.6  christos {
    108           1.1  christos 
    109           1.1  christos 	sntptest();
    110           1.1  christos 	restoreKeyDb = false;
    111           1.1  christos 
    112           1.1  christos 	/* Initialize the test packet and socket,
    113       1.1.1.6  christos 	 * so they contain at least some valid data.
    114       1.1.1.6  christos 	 */
    115       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING, NTP_VERSION,
    116           1.1  christos 										MODE_SERVER);
    117       1.1.1.7  christos 	testpkt.p.stratum = STRATUM_REFCLOCK;
    118       1.1.1.7  christos 	memcpy(&testpkt.p.refid, "GPS\0", 4);
    119           1.1  christos 
    120           1.1  christos 	/* Set the origin timestamp of the received packet to the
    121       1.1.1.6  christos 	 * same value as the transmit timestamp of the sent packet.
    122       1.1.1.6  christos 	 */
    123           1.1  christos 	l_fp tmp;
    124           1.1  christos 	tmp.l_ui = 1000UL;
    125           1.1  christos 	tmp.l_uf = 0UL;
    126           1.1  christos 
    127       1.1.1.7  christos 	HTONL_FP(&tmp, &testpkt.p.org);
    128       1.1.1.7  christos 	HTONL_FP(&tmp, &testspkt.p.xmt);
    129           1.1  christos }
    130           1.1  christos 
    131       1.1.1.3  christos 
    132       1.1.1.3  christos void
    133       1.1.1.6  christos tearDown(void)
    134       1.1.1.6  christos {
    135           1.1  christos 	if (restoreKeyDb) {
    136           1.1  christos 		key_cnt = 0;
    137           1.1  christos 		free(key_ptr);
    138           1.1  christos 		key_ptr = NULL;
    139           1.1  christos 	}
    140           1.1  christos 
    141       1.1.1.6  christos 	sntptest_destroy(); /* only on the final test!! if counter == 0 etc... */
    142           1.1  christos }
    143           1.1  christos 
    144           1.1  christos 
    145       1.1.1.3  christos void
    146       1.1.1.6  christos test_TooShortLength(void)
    147       1.1.1.6  christos {
    148           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    149       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC - 1,
    150       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    151           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    152       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC - 1,
    153       1.1.1.7  christos 				      MODE_BROADCAST, &testspkt.p, "UnitTest"));
    154           1.1  christos }
    155           1.1  christos 
    156       1.1.1.3  christos 
    157       1.1.1.3  christos void
    158       1.1.1.6  christos test_LengthNotMultipleOfFour(void)
    159       1.1.1.6  christos {
    160           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    161       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC + 6,
    162       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    163           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    164       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC + 3,
    165       1.1.1.7  christos 				      MODE_BROADCAST, &testspkt.p, "UnitTest"));
    166           1.1  christos }
    167           1.1  christos 
    168       1.1.1.3  christos 
    169       1.1.1.3  christos void
    170       1.1.1.6  christos test_TooShortExtensionFieldLength(void)
    171       1.1.1.6  christos {
    172       1.1.1.7  christos 	/* [Bug 2998] We have to get around the formal specification of
    173       1.1.1.7  christos 	 * the extension field if AUTOKEY is undefined. (At least CLANG
    174       1.1.1.7  christos 	 * issues a warning in this case. It's just a warning, but
    175       1.1.1.7  christos 	 * still...
    176       1.1.1.7  christos 	 */
    177       1.1.1.7  christos 	uint32_t * pe = testpkt.p.exten + 7;
    178       1.1.1.7  christos 
    179           1.1  christos 	/* The lower 16-bits are the length of the extension field.
    180           1.1  christos 	 * This lengths must be multiples of 4 bytes, which gives
    181       1.1.1.6  christos 	 * a minimum of 4 byte extension field length.
    182       1.1.1.6  christos 	 */
    183       1.1.1.7  christos 	*pe = htonl(3); /* 3 bytes is too short. */
    184           1.1  christos 
    185           1.1  christos 	/* We send in a pkt_len of header size + 4 byte extension
    186           1.1  christos 	 * header + 24 byte MAC, this prevents the length error to
    187       1.1.1.6  christos 	 * be caught at an earlier stage
    188       1.1.1.6  christos 	 */
    189           1.1  christos 	int pkt_len = LEN_PKT_NOMAC + 4 + 24;
    190           1.1  christos 
    191           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    192       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    193       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    194           1.1  christos }
    195           1.1  christos 
    196       1.1.1.3  christos 
    197       1.1.1.3  christos void
    198       1.1.1.6  christos test_UnauthenticatedPacketReject(void)
    199       1.1.1.6  christos {
    200       1.1.1.6  christos 	/* Activate authentication option */
    201           1.1  christos 	ActivateOption("-a", "123");
    202           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    203           1.1  christos 
    204           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    205           1.1  christos 
    206       1.1.1.6  christos 	/* We demand authentication, but no MAC header is present. */
    207           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
    208       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    209       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    210           1.1  christos }
    211           1.1  christos 
    212       1.1.1.3  christos 
    213       1.1.1.3  christos void
    214       1.1.1.6  christos test_CryptoNAKPacketReject(void)
    215       1.1.1.6  christos {
    216       1.1.1.6  christos 	/* Activate authentication option */
    217           1.1  christos 	ActivateOption("-a", "123");
    218           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    219           1.1  christos 
    220       1.1.1.6  christos 	int pkt_len = LEN_PKT_NOMAC + 4; /* + 4 byte MAC = Crypto-NAK */
    221           1.1  christos 
    222           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
    223       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    224       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    225           1.1  christos }
    226           1.1  christos 
    227       1.1.1.3  christos 
    228       1.1.1.3  christos void
    229       1.1.1.6  christos test_AuthenticatedPacketInvalid(void)
    230       1.1.1.6  christos {
    231       1.1.1.6  christos 	/* Activate authentication option */
    232           1.1  christos 	PrepareAuthenticationTestMD5(50, 9, "123456789");
    233           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    234           1.1  christos 
    235       1.1.1.6  christos 	/* Prepare the packet. */
    236           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    237           1.1  christos 
    238       1.1.1.7  christos 	testpkt.p.exten[0] = htonl(50);
    239       1.1.1.7  christos 	int mac_len = make_mac(&testpkt.p, pkt_len,
    240  1.1.1.7.12.1  pgoyette 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
    241       1.1.1.7  christos 			       &testpkt.p.exten[1]);
    242           1.1  christos 
    243           1.1  christos 	pkt_len += 4 + mac_len;
    244           1.1  christos 
    245       1.1.1.6  christos 	/* Now, alter the MAC so it becomes invalid. */
    246       1.1.1.7  christos 	testpkt.p.exten[1] += 1;
    247           1.1  christos 
    248           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
    249       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    250       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    251           1.1  christos }
    252           1.1  christos 
    253       1.1.1.3  christos 
    254       1.1.1.3  christos void
    255       1.1.1.6  christos test_AuthenticatedPacketUnknownKey(void)
    256       1.1.1.6  christos {
    257       1.1.1.6  christos 	/* Activate authentication option */
    258           1.1  christos 	PrepareAuthenticationTestMD5(30, 9, "123456789");
    259           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    260           1.1  christos 
    261       1.1.1.6  christos 	/* Prepare the packet. Note that the Key-ID expected is 30, but
    262       1.1.1.6  christos 	 * the packet has a key id of 50.
    263       1.1.1.6  christos 	 */
    264           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    265           1.1  christos 
    266       1.1.1.7  christos 	testpkt.p.exten[0] = htonl(50);
    267       1.1.1.7  christos 	int mac_len = make_mac(&testpkt.p, pkt_len,
    268  1.1.1.7.12.1  pgoyette 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
    269       1.1.1.7  christos 			       &testpkt.p.exten[1]);
    270  1.1.1.7.12.1  pgoyette 	pkt_len += KEY_MAC_LEN + mac_len;
    271           1.1  christos 
    272           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_AUTH_FAIL,
    273       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    274       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    275           1.1  christos }
    276           1.1  christos 
    277       1.1.1.3  christos 
    278       1.1.1.3  christos void
    279       1.1.1.6  christos test_ServerVersionTooOld(void)
    280       1.1.1.6  christos {
    281           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    282           1.1  christos 
    283       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
    284       1.1.1.7  christos 					      NTP_OLDVERSION - 1,
    285       1.1.1.7  christos 					      MODE_CLIENT);
    286       1.1.1.7  christos 	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.p.li_vn_mode) < NTP_OLDVERSION);
    287           1.1  christos 
    288           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    289           1.1  christos 
    290           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
    291       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    292       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    293           1.1  christos }
    294           1.1  christos 
    295       1.1.1.3  christos 
    296       1.1.1.3  christos void
    297       1.1.1.6  christos test_ServerVersionTooNew(void)
    298       1.1.1.6  christos {
    299           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    300           1.1  christos 
    301       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
    302       1.1.1.7  christos 					      NTP_VERSION + 1,
    303       1.1.1.7  christos 					      MODE_CLIENT);
    304       1.1.1.7  christos 	TEST_ASSERT_TRUE(PKT_VERSION(testpkt.p.li_vn_mode) > NTP_VERSION);
    305           1.1  christos 
    306           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    307           1.1  christos 
    308           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
    309       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    310       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    311           1.1  christos }
    312           1.1  christos 
    313       1.1.1.3  christos 
    314       1.1.1.3  christos void
    315       1.1.1.6  christos test_NonWantedMode(void)
    316       1.1.1.6  christos {
    317           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    318           1.1  christos 
    319       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
    320       1.1.1.7  christos 					      NTP_VERSION,
    321       1.1.1.7  christos 					      MODE_CLIENT);
    322           1.1  christos 
    323       1.1.1.6  christos 	/* The packet has a mode of MODE_CLIENT, but process_pkt expects
    324       1.1.1.6  christos 	 * MODE_SERVER
    325       1.1.1.6  christos 	 */
    326           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
    327       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    328       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    329           1.1  christos }
    330           1.1  christos 
    331       1.1.1.3  christos 
    332           1.1  christos /* Tests bug 1597 */
    333       1.1.1.3  christos void
    334       1.1.1.6  christos test_KoDRate(void)
    335       1.1.1.6  christos {
    336           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    337           1.1  christos 
    338       1.1.1.7  christos 	testpkt.p.stratum = STRATUM_PKT_UNSPEC;
    339       1.1.1.7  christos 	memcpy(&testpkt.p.refid, "RATE", 4);
    340           1.1  christos 
    341           1.1  christos 	TEST_ASSERT_EQUAL(KOD_RATE,
    342       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    343       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    344           1.1  christos }
    345           1.1  christos 
    346       1.1.1.3  christos 
    347       1.1.1.3  christos void
    348       1.1.1.6  christos test_KoDDeny(void)
    349       1.1.1.6  christos {
    350           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    351           1.1  christos 
    352       1.1.1.7  christos 	testpkt.p.stratum = STRATUM_PKT_UNSPEC;
    353       1.1.1.7  christos 	memcpy(&testpkt.p.refid, "DENY", 4);
    354           1.1  christos 
    355           1.1  christos 	TEST_ASSERT_EQUAL(KOD_DEMOBILIZE,
    356       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    357       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    358           1.1  christos }
    359           1.1  christos 
    360       1.1.1.3  christos 
    361       1.1.1.3  christos void
    362       1.1.1.6  christos test_RejectUnsyncedServer(void)
    363       1.1.1.6  christos {
    364           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    365           1.1  christos 
    366       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
    367       1.1.1.7  christos 					      NTP_VERSION,
    368       1.1.1.7  christos 					      MODE_SERVER);
    369           1.1  christos 
    370           1.1  christos 	TEST_ASSERT_EQUAL(SERVER_UNUSEABLE,
    371       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    372       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    373           1.1  christos }
    374           1.1  christos 
    375       1.1.1.3  christos 
    376       1.1.1.3  christos void
    377       1.1.1.6  christos test_RejectWrongResponseServerMode(void)
    378       1.1.1.6  christos {
    379           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    380           1.1  christos 
    381           1.1  christos 	l_fp tmp;
    382           1.1  christos 	tmp.l_ui = 1000UL;
    383           1.1  christos 	tmp.l_uf = 0UL;
    384       1.1.1.7  christos 	HTONL_FP(&tmp, &testpkt.p.org);
    385           1.1  christos 
    386           1.1  christos 	tmp.l_ui = 2000UL;
    387           1.1  christos 	tmp.l_uf = 0UL;
    388       1.1.1.7  christos 	HTONL_FP(&tmp, &testspkt.p.xmt);
    389           1.1  christos 
    390           1.1  christos 	TEST_ASSERT_EQUAL(PACKET_UNUSEABLE,
    391       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    392       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    393           1.1  christos }
    394           1.1  christos 
    395       1.1.1.3  christos 
    396       1.1.1.3  christos void
    397       1.1.1.6  christos test_AcceptNoSentPacketBroadcastMode(void)
    398       1.1.1.6  christos {
    399           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    400           1.1  christos 
    401       1.1.1.7  christos 	testpkt.p.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
    402       1.1.1.7  christos 					      NTP_VERSION,
    403       1.1.1.7  christos 					      MODE_BROADCAST);
    404           1.1  christos 
    405           1.1  christos 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
    406       1.1.1.7  christos 		  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    407           1.1  christos 			      MODE_BROADCAST, NULL, "UnitTest"));
    408           1.1  christos }
    409           1.1  christos 
    410       1.1.1.3  christos 
    411       1.1.1.3  christos void
    412       1.1.1.6  christos test_CorrectUnauthenticatedPacket(void)
    413       1.1.1.6  christos {
    414           1.1  christos 	TEST_ASSERT_FALSE(ENABLED_OPT(AUTHENTICATION));
    415           1.1  christos 
    416           1.1  christos 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
    417       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, LEN_PKT_NOMAC,
    418       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    419           1.1  christos }
    420           1.1  christos 
    421       1.1.1.3  christos 
    422       1.1.1.3  christos void
    423       1.1.1.6  christos test_CorrectAuthenticatedPacketMD5(void)
    424       1.1.1.6  christos {
    425           1.1  christos 	PrepareAuthenticationTestMD5(10, 15, "123456789abcdef");
    426           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    427           1.1  christos 
    428           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    429           1.1  christos 
    430       1.1.1.6  christos 	/* Prepare the packet. */
    431       1.1.1.7  christos 	testpkt.p.exten[0] = htonl(10);
    432       1.1.1.7  christos 	int mac_len = make_mac(&testpkt.p, pkt_len,
    433  1.1.1.7.12.1  pgoyette 			       MAX_MD5_LEN - KEY_MAC_LEN, key_ptr,
    434       1.1.1.7  christos 			       &testpkt.p.exten[1]);
    435           1.1  christos 
    436  1.1.1.7.12.1  pgoyette 	pkt_len += KEY_MAC_LEN + mac_len;
    437           1.1  christos 
    438           1.1  christos 	TEST_ASSERT_EQUAL(pkt_len,
    439       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    440       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    441           1.1  christos }
    442           1.1  christos 
    443       1.1.1.3  christos 
    444       1.1.1.3  christos void
    445       1.1.1.6  christos test_CorrectAuthenticatedPacketSHA1(void)
    446       1.1.1.6  christos {
    447           1.1  christos 	PrepareAuthenticationTest(20, 15, "SHA1", "abcdefghijklmno");
    448           1.1  christos 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    449           1.1  christos 
    450           1.1  christos 	int pkt_len = LEN_PKT_NOMAC;
    451           1.1  christos 
    452       1.1.1.6  christos 	/* Prepare the packet. */
    453       1.1.1.7  christos 	testpkt.p.exten[0] = htonl(20);
    454       1.1.1.7  christos 	int mac_len = make_mac(&testpkt.p, pkt_len,
    455  1.1.1.7.12.1  pgoyette 			       MAX_MDG_LEN, key_ptr,
    456  1.1.1.7.12.1  pgoyette 			       &testpkt.p.exten[1]);
    457  1.1.1.7.12.1  pgoyette 
    458  1.1.1.7.12.1  pgoyette 	pkt_len += KEY_MAC_LEN + mac_len;
    459  1.1.1.7.12.1  pgoyette 
    460  1.1.1.7.12.1  pgoyette 	TEST_ASSERT_EQUAL(pkt_len,
    461  1.1.1.7.12.1  pgoyette 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    462  1.1.1.7.12.1  pgoyette 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    463  1.1.1.7.12.1  pgoyette }
    464  1.1.1.7.12.1  pgoyette 
    465  1.1.1.7.12.1  pgoyette 
    466  1.1.1.7.12.1  pgoyette void
    467  1.1.1.7.12.1  pgoyette test_CorrectAuthenticatedPacketCMAC(void)
    468  1.1.1.7.12.1  pgoyette {
    469  1.1.1.7.12.2  pgoyette #if defined(OPENSSL) && defined(ENABLE_CMAC)
    470  1.1.1.7.12.2  pgoyette 
    471  1.1.1.7.12.1  pgoyette 	PrepareAuthenticationTest(30, CMAC_LENGTH, CMAC, "abcdefghijklmnop");
    472  1.1.1.7.12.1  pgoyette 	TEST_ASSERT_TRUE(ENABLED_OPT(AUTHENTICATION));
    473  1.1.1.7.12.1  pgoyette 
    474  1.1.1.7.12.1  pgoyette 	int pkt_len = LEN_PKT_NOMAC;
    475  1.1.1.7.12.1  pgoyette 
    476  1.1.1.7.12.1  pgoyette 	/* Prepare the packet. */
    477  1.1.1.7.12.1  pgoyette 	testpkt.p.exten[0] = htonl(30);
    478  1.1.1.7.12.1  pgoyette 	int mac_len = make_mac(&testpkt.p, pkt_len,
    479       1.1.1.6  christos 			       MAX_MAC_LEN, key_ptr,
    480       1.1.1.7  christos 			       &testpkt.p.exten[1]);
    481           1.1  christos 
    482           1.1  christos 	pkt_len += 4 + mac_len;
    483           1.1  christos 
    484           1.1  christos 	TEST_ASSERT_EQUAL(pkt_len,
    485       1.1.1.7  christos 			  process_pkt(&testpkt.p, &testsock, pkt_len,
    486       1.1.1.7  christos 				      MODE_SERVER, &testspkt.p, "UnitTest"));
    487  1.1.1.7.12.2  pgoyette 
    488  1.1.1.7.12.2  pgoyette #else
    489  1.1.1.7.12.2  pgoyette 
    490  1.1.1.7.12.2  pgoyette 	TEST_IGNORE_MESSAGE("OpenSSL CMAC not used, skipping...");
    491  1.1.1.7.12.2  pgoyette 
    492  1.1.1.7.12.2  pgoyette #endif	/* OPENSSL */
    493           1.1  christos }
    494  1.1.1.7.12.1  pgoyette 
    495