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