1290001Sglebius/* This file contains test for both libntp/authkeys.c and libntp/authusekey.c */ 2290001Sglebius 3290001Sglebius#include "config.h" 4290001Sglebius 5290001Sglebius#include "ntp.h" 6290001Sglebius#include "ntp_stdlib.h" 7290001Sglebius#include "ntp_calendar.h" 8290001Sglebius 9290001Sglebius#include "unity.h" 10290001Sglebius 11290001Sglebius#ifdef OPENSSL 12290001Sglebius# include "openssl/err.h" 13290001Sglebius# include "openssl/rand.h" 14290001Sglebius# include "openssl/evp.h" 15290001Sglebius#endif 16294905Sdelphij#include <limits.h> 17290001Sglebius 18290001Sglebiusu_long current_time = 4; 19290001Sglebiusint counter = 0; 20290001Sglebius 21290001Sglebiusvoid setUp(void); 22290001Sglebiusvoid tearDown(void); 23290001Sglebiusvoid AddTrustedKey(keyid_t keyno); 24290001Sglebiusvoid AddUntrustedKey(keyid_t keyno); 25290001Sglebiusvoid test_AddTrustedKeys(void); 26290001Sglebiusvoid test_AddUntrustedKey(void); 27290001Sglebiusvoid test_HaveKeyCorrect(void); 28290001Sglebiusvoid test_HaveKeyIncorrect(void); 29290001Sglebiusvoid test_AddWithAuthUseKey(void); 30290001Sglebiusvoid test_EmptyKey(void); 31294905Sdelphijvoid test_auth_log2(void); 32290001Sglebius 33290001Sglebius 34290001Sglebiusvoid 35290001SglebiussetUp(void) 36290001Sglebius{ 37290001Sglebius if (counter == 0) { 38290001Sglebius counter++; 39290001Sglebius init_auth(); // causes segfault if called more than once 40290001Sglebius } 41290001Sglebius /* 42290001Sglebius * init_auth() is called by tests_main.cpp earlier. It 43290001Sglebius * does not initialize global variables like 44290001Sglebius * authnumkeys, so let's reset them to zero here. 45290001Sglebius */ 46290001Sglebius authnumkeys = 0; 47290001Sglebius 48290001Sglebius /* 49290001Sglebius * Especially, empty the key cache! 50290001Sglebius */ 51290001Sglebius cache_keyid = 0; 52290001Sglebius cache_type = 0; 53290001Sglebius cache_flags = 0; 54290001Sglebius cache_secret = NULL; 55290001Sglebius cache_secretsize = 0; 56293896Sglebius 57293896Sglebius return; 58290001Sglebius} 59290001Sglebius 60290001Sglebiusvoid 61290001SglebiustearDown(void) 62290001Sglebius{ 63293896Sglebius return; 64290001Sglebius} 65290001Sglebius 66290001Sglebiusstatic const int KEYTYPE = KEY_TYPE_MD5; 67290001Sglebius 68290001Sglebiusvoid 69293896SglebiusAddTrustedKey(keyid_t keyno) 70293896Sglebius{ 71290001Sglebius /* 72290001Sglebius * We need to add a MD5-key in addition to setting the 73290001Sglebius * trust, because authhavekey() requires type != 0. 74290001Sglebius */ 75294905Sdelphij MD5auth_setkey(keyno, KEYTYPE, NULL, 0, NULL); 76290001Sglebius 77290001Sglebius authtrust(keyno, TRUE); 78293896Sglebius 79293896Sglebius return; 80290001Sglebius} 81290001Sglebius 82290001Sglebiusvoid 83293896SglebiusAddUntrustedKey(keyid_t keyno) 84293896Sglebius{ 85290001Sglebius authtrust(keyno, FALSE); 86293896Sglebius 87293896Sglebius return; 88290001Sglebius} 89290001Sglebius 90290001Sglebiusvoid 91293896Sglebiustest_AddTrustedKeys(void) 92293896Sglebius{ 93290001Sglebius const keyid_t KEYNO1 = 5; 94290001Sglebius const keyid_t KEYNO2 = 8; 95290001Sglebius 96290001Sglebius AddTrustedKey(KEYNO1); 97290001Sglebius AddTrustedKey(KEYNO2); 98290001Sglebius 99290001Sglebius TEST_ASSERT_TRUE(authistrusted(KEYNO1)); 100290001Sglebius TEST_ASSERT_TRUE(authistrusted(KEYNO2)); 101293896Sglebius 102293896Sglebius return; 103290001Sglebius} 104290001Sglebius 105290001Sglebiusvoid 106293896Sglebiustest_AddUntrustedKey(void) 107293896Sglebius{ 108290001Sglebius const keyid_t KEYNO = 3; 109290001Sglebius 110290001Sglebius AddUntrustedKey(KEYNO); 111290001Sglebius 112290001Sglebius TEST_ASSERT_FALSE(authistrusted(KEYNO)); 113293896Sglebius 114293896Sglebius return; 115290001Sglebius} 116290001Sglebius 117290001Sglebiusvoid 118293896Sglebiustest_HaveKeyCorrect(void) 119293896Sglebius{ 120290001Sglebius const keyid_t KEYNO = 3; 121290001Sglebius 122290001Sglebius AddTrustedKey(KEYNO); 123290001Sglebius 124290001Sglebius TEST_ASSERT_TRUE(auth_havekey(KEYNO)); 125290001Sglebius TEST_ASSERT_TRUE(authhavekey(KEYNO)); 126293896Sglebius 127293896Sglebius return; 128290001Sglebius} 129290001Sglebius 130290001Sglebiusvoid 131293896Sglebiustest_HaveKeyIncorrect(void) 132293896Sglebius{ 133290001Sglebius const keyid_t KEYNO = 2; 134290001Sglebius 135290001Sglebius TEST_ASSERT_FALSE(auth_havekey(KEYNO)); 136290001Sglebius TEST_ASSERT_FALSE(authhavekey(KEYNO)); 137293896Sglebius 138293896Sglebius return; 139290001Sglebius} 140290001Sglebius 141290001Sglebiusvoid 142293896Sglebiustest_AddWithAuthUseKey(void) 143293896Sglebius{ 144290001Sglebius const keyid_t KEYNO = 5; 145290001Sglebius const char* KEY = "52a"; 146290001Sglebius 147293896Sglebius TEST_ASSERT_TRUE(authusekey(KEYNO, KEYTYPE, (const u_char*)KEY)); 148293896Sglebius 149293896Sglebius return; 150290001Sglebius} 151290001Sglebius 152290001Sglebiusvoid 153293896Sglebiustest_EmptyKey(void) 154293896Sglebius{ 155290001Sglebius const keyid_t KEYNO = 3; 156290001Sglebius const char* KEY = ""; 157290001Sglebius 158290001Sglebius 159293896Sglebius TEST_ASSERT_FALSE(authusekey(KEYNO, KEYTYPE, (const u_char*)KEY)); 160293896Sglebius 161293896Sglebius return; 162290001Sglebius} 163294905Sdelphij 164294905Sdelphij/* test the implementation of 'auth_log2' -- use a local copy of the code */ 165294905Sdelphij 166294905Sdelphijstatic u_short 167294905Sdelphijauth_log2( 168294905Sdelphij size_t x) 169294905Sdelphij{ 170294905Sdelphij int s; 171294905Sdelphij int r = 0; 172294905Sdelphij size_t m = ~(size_t)0; 173294905Sdelphij 174294905Sdelphij for (s = sizeof(size_t) / 2 * CHAR_BIT; s != 0; s >>= 1) { 175294905Sdelphij m <<= s; 176294905Sdelphij if (x & m) 177294905Sdelphij r += s; 178294905Sdelphij else 179294905Sdelphij x <<= s; 180294905Sdelphij } 181294905Sdelphij return (u_short)r; 182294905Sdelphij} 183294905Sdelphij 184294905Sdelphijvoid 185294905Sdelphijtest_auth_log2(void) 186294905Sdelphij{ 187294905Sdelphij int l2; 188294905Sdelphij size_t tv; 189294905Sdelphij 190294905Sdelphij TEST_ASSERT_EQUAL_INT(0, auth_log2(0)); 191294905Sdelphij TEST_ASSERT_EQUAL_INT(0, auth_log2(1)); 192294905Sdelphij for (l2 = 1; l2 < sizeof(size_t)*CHAR_BIT; ++l2) { 193294905Sdelphij tv = (size_t)1 << l2; 194294905Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2( tv )); 195294905Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2( tv + 1 )); 196294905Sdelphij TEST_ASSERT_EQUAL_INT(l2, auth_log2(2*tv - 1)); 197294905Sdelphij } 198294905Sdelphij} 199