1284990Scy/* This file contains test for both libntp/authkeys.c and libntp/authusekey.c */ 2284990Scy 3284990Scy#include "config.h" 4284990Scy 5284990Scy#include "ntp.h" 6284990Scy#include "ntp_stdlib.h" 7284990Scy#include "ntp_calendar.h" 8284990Scy 9284990Scy#include "unity.h" 10284990Scy 11284990Scy#ifdef OPENSSL 12284990Scy# include "openssl/err.h" 13284990Scy# include "openssl/rand.h" 14284990Scy# include "openssl/evp.h" 15284990Scy#endif 16294569Sdelphij#include <limits.h> 17284990Scy 18284990Scyu_long current_time = 4; 19284990Scyint counter = 0; 20284990Scy 21289997Sglebiusvoid setUp(void); 22289997Sglebiusvoid tearDown(void); 23289997Sglebiusvoid AddTrustedKey(keyid_t keyno); 24289997Sglebiusvoid AddUntrustedKey(keyid_t keyno); 25289997Sglebiusvoid test_AddTrustedKeys(void); 26289997Sglebiusvoid test_AddUntrustedKey(void); 27289997Sglebiusvoid test_HaveKeyCorrect(void); 28289997Sglebiusvoid test_HaveKeyIncorrect(void); 29289997Sglebiusvoid test_AddWithAuthUseKey(void); 30289997Sglebiusvoid test_EmptyKey(void); 31294569Sdelphijvoid test_auth_log2(void); 32284990Scy 33289997Sglebius 34289997Sglebiusvoid 35289997SglebiussetUp(void) 36284990Scy{ 37289997Sglebius if (counter == 0) { 38289997Sglebius counter++; 39289997Sglebius init_auth(); // causes segfault if called more than once 40284990Scy } 41289997Sglebius /* 42284990Scy * init_auth() is called by tests_main.cpp earlier. It 43284990Scy * does not initialize global variables like 44284990Scy * authnumkeys, so let's reset them to zero here. 45284990Scy */ 46284990Scy authnumkeys = 0; 47284990Scy 48284990Scy /* 49284990Scy * Especially, empty the key cache! 50284990Scy */ 51284990Scy cache_keyid = 0; 52284990Scy cache_type = 0; 53284990Scy cache_flags = 0; 54284990Scy cache_secret = NULL; 55284990Scy cache_secretsize = 0; 56293650Sglebius 57293650Sglebius return; 58284990Scy} 59284990Scy 60289997Sglebiusvoid 61289997SglebiustearDown(void) 62284990Scy{ 63293650Sglebius return; 64284990Scy} 65284990Scy 66284990Scystatic const int KEYTYPE = KEY_TYPE_MD5; 67284990Scy 68289997Sglebiusvoid 69293650SglebiusAddTrustedKey(keyid_t keyno) 70293650Sglebius{ 71284990Scy /* 72284990Scy * We need to add a MD5-key in addition to setting the 73284990Scy * trust, because authhavekey() requires type != 0. 74284990Scy */ 75294569Sdelphij MD5auth_setkey(keyno, KEYTYPE, NULL, 0, NULL); 76284990Scy 77284990Scy authtrust(keyno, TRUE); 78293650Sglebius 79293650Sglebius return; 80284990Scy} 81284990Scy 82289997Sglebiusvoid 83293650SglebiusAddUntrustedKey(keyid_t keyno) 84293650Sglebius{ 85284990Scy authtrust(keyno, FALSE); 86293650Sglebius 87293650Sglebius return; 88284990Scy} 89284990Scy 90289997Sglebiusvoid 91293650Sglebiustest_AddTrustedKeys(void) 92293650Sglebius{ 93284990Scy const keyid_t KEYNO1 = 5; 94284990Scy const keyid_t KEYNO2 = 8; 95284990Scy 96284990Scy AddTrustedKey(KEYNO1); 97284990Scy AddTrustedKey(KEYNO2); 98284990Scy 99284990Scy TEST_ASSERT_TRUE(authistrusted(KEYNO1)); 100284990Scy TEST_ASSERT_TRUE(authistrusted(KEYNO2)); 101293650Sglebius 102293650Sglebius return; 103284990Scy} 104284990Scy 105289997Sglebiusvoid 106293650Sglebiustest_AddUntrustedKey(void) 107293650Sglebius{ 108284990Scy const keyid_t KEYNO = 3; 109284990Scy 110284990Scy AddUntrustedKey(KEYNO); 111284990Scy 112284990Scy TEST_ASSERT_FALSE(authistrusted(KEYNO)); 113293650Sglebius 114293650Sglebius return; 115284990Scy} 116284990Scy 117289997Sglebiusvoid 118293650Sglebiustest_HaveKeyCorrect(void) 119293650Sglebius{ 120284990Scy const keyid_t KEYNO = 3; 121284990Scy 122284990Scy AddTrustedKey(KEYNO); 123284990Scy 124284990Scy TEST_ASSERT_TRUE(auth_havekey(KEYNO)); 125284990Scy TEST_ASSERT_TRUE(authhavekey(KEYNO)); 126293650Sglebius 127293650Sglebius return; 128284990Scy} 129284990Scy 130289997Sglebiusvoid 131293650Sglebiustest_HaveKeyIncorrect(void) 132293650Sglebius{ 133284990Scy const keyid_t KEYNO = 2; 134284990Scy 135284990Scy TEST_ASSERT_FALSE(auth_havekey(KEYNO)); 136284990Scy TEST_ASSERT_FALSE(authhavekey(KEYNO)); 137293650Sglebius 138293650Sglebius return; 139284990Scy} 140284990Scy 141289997Sglebiusvoid 142293650Sglebiustest_AddWithAuthUseKey(void) 143293650Sglebius{ 144284990Scy const keyid_t KEYNO = 5; 145284990Scy const char* KEY = "52a"; 146284990Scy 147293650Sglebius TEST_ASSERT_TRUE(authusekey(KEYNO, KEYTYPE, (const u_char*)KEY)); 148293650Sglebius 149293650Sglebius return; 150284990Scy} 151284990Scy 152289997Sglebiusvoid 153293650Sglebiustest_EmptyKey(void) 154293650Sglebius{ 155284990Scy const keyid_t KEYNO = 3; 156284990Scy const char* KEY = ""; 157284990Scy 158284990Scy 159293650Sglebius TEST_ASSERT_FALSE(authusekey(KEYNO, KEYTYPE, (const u_char*)KEY)); 160293650Sglebius 161293650Sglebius return; 162284990Scy} 163294569Sdelphij 164294569Sdelphij/* test the implementation of 'auth_log2' -- use a local copy of the code */ 165294569Sdelphij 166294569Sdelphijstatic u_short 167294569Sdelphijauth_log2( 168294569Sdelphij size_t x) 169294569Sdelphij{ 170294569Sdelphij int s; 171294569Sdelphij int r = 0; 172294569Sdelphij size_t m = ~(size_t)0; 173294569Sdelphij 174294569Sdelphij for (s = sizeof(size_t) / 2 * CHAR_BIT; s != 0; s >>= 1) { 175294569Sdelphij m <<= s; 176294569Sdelphij if (x & m) 177294569Sdelphij r += s; 178294569Sdelphij else 179294569Sdelphij x <<= s; 180294569Sdelphij } 181294569Sdelphij return (u_short)r; 182294569Sdelphij} 183294569Sdelphij 184294569Sdelphijvoid 185294569Sdelphijtest_auth_log2(void) 186294569Sdelphij{ 187294569Sdelphij int l2; 188294569Sdelphij size_t tv; 189294569Sdelphij 190294569Sdelphij TEST_ASSERT_EQUAL_INT(0, auth_log2(0)); 191294569Sdelphij TEST_ASSERT_EQUAL_INT(0, auth_log2(1)); 192294569Sdelphij for (l2 = 1; l2 < sizeof(size_t)*CHAR_BIT; ++l2) { 193294569Sdelphij tv = (size_t)1 << l2; 194294569Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2( tv )); 195294569Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2( tv + 1 )); 196294569Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2(2*tv - 1)); 197294569Sdelphij } 198294569Sdelphij} 199