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