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