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