1284990Scy#include "config.h"
2284990Scy#include "unity.h"
3284990Scy
4284990Scy#ifdef OPENSSL
5284990Scy# include "openssl/err.h"
6284990Scy# include "openssl/rand.h"
7284990Scy# include "openssl/evp.h"
8284990Scy#endif
9284990Scy#include "ntp.h"
10284990Scy#include "ntp_stdlib.h"
11284990Scy
12284990Scyu_long current_time = 4;
13284990Scy
14284990Scy
15284990Scy/*
16284990Scy * Example packet with MD5 hash calculated manually.
17284990Scy */
18284990Scyconst int keytype = KEY_TYPE_MD5;
19293894Sglebiusconst u_char *key = (const u_char*)"abcdefgh";
20284990Scyconst u_short keyLength = 8;
21293894Sglebiusconst u_char *packet = (const u_char*)"ijklmnopqrstuvwx";
22290000Sglebius#define packetLength 16
23290000Sglebius#define keyIdLength  4
24290000Sglebius#define digestLength 16
25293894Sglebius#define totalLength (packetLength + keyIdLength + digestLength)
26293894Sglebiusunion {
27293894Sglebius	u_char		u8 [totalLength];
28293894Sglebius	uint32_t	u32[1];
29293894Sglebius} expectedPacket = {
30293894Sglebius	"ijklmnopqrstuvwx\0\0\0\0\x0c\x0e\x84\xcf\x0b\xb7\xa8\x68\x8e\x52\x38\xdb\xbc\x1c\x39\x53"
31293894Sglebius};
32293894Sglebiusunion {
33293894Sglebius	u_char		u8 [totalLength];
34293894Sglebius	uint32_t	u32[1];
35293894Sglebius} invalidPacket = {
36293894Sglebius	"ijklmnopqrstuvwx\0\0\0\0\x0c\x0e\x84\xcf\x0b\xb7\xa8\x68\x8e\x52\x38\xdb\xbc\x1c\x39\x54"
37293894Sglebius};
38284990Scy
39284990Scy
40290000Sglebiusvoid test_Encrypt(void);
41290000Sglebiusvoid test_DecryptValid(void);
42290000Sglebiusvoid test_DecryptInvalid(void);
43290000Sglebiusvoid test_IPv4AddressToRefId(void);
44290000Sglebiusvoid test_IPv6AddressToRefId(void);
45290000Sglebius
46290000Sglebius
47290000Sglebiusvoid
48290000Sglebiustest_Encrypt(void) {
49293894Sglebius	u_int32 *packetPtr;
50290000Sglebius	int length;
51290000Sglebius
52310419Sdelphij	packetPtr = emalloc_zero(totalLength * sizeof(*packetPtr));
53284990Scy	memcpy(packetPtr, packet, packetLength);
54284990Scy
55284990Scy	cache_secretsize = keyLength;
56284990Scy
57293894Sglebius	length = MD5authencrypt(keytype, key, packetPtr, packetLength);
58284990Scy
59293894Sglebius	TEST_ASSERT_TRUE(MD5authdecrypt(keytype, key, packetPtr, packetLength, length));
60284990Scy
61284990Scy	TEST_ASSERT_EQUAL(20, length);
62293894Sglebius	TEST_ASSERT_EQUAL_MEMORY(expectedPacket.u8, packetPtr, totalLength);
63284990Scy
64290000Sglebius	free(packetPtr);
65284990Scy}
66284990Scy
67290000Sglebiusvoid
68290000Sglebiustest_DecryptValid(void) {
69284990Scy	cache_secretsize = keyLength;
70293894Sglebius	TEST_ASSERT_TRUE(MD5authdecrypt(keytype, key, expectedPacket.u32, packetLength, 20));
71284990Scy}
72284990Scy
73290000Sglebiusvoid
74290000Sglebiustest_DecryptInvalid(void) {
75284990Scy	cache_secretsize = keyLength;
76293894Sglebius	TEST_ASSERT_FALSE(MD5authdecrypt(keytype, key, invalidPacket.u32, packetLength, 20));
77284990Scy}
78284990Scy
79290000Sglebiusvoid
80290000Sglebiustest_IPv4AddressToRefId(void) {
81284990Scy	sockaddr_u addr;
82284990Scy	addr.sa4.sin_family = AF_INET;
83290000Sglebius	u_int32 address;
84290000Sglebius
85284990Scy	addr.sa4.sin_port = htons(80);
86284990Scy
87290000Sglebius	address = inet_addr("192.0.2.1");
88284990Scy	addr.sa4.sin_addr.s_addr = address;
89284990Scy
90284990Scy	TEST_ASSERT_EQUAL(address, addr2refid(&addr));
91284990Scy}
92284990Scy
93290000Sglebiusvoid
94290000Sglebiustest_IPv6AddressToRefId(void) {
95293894Sglebius	const int expected = 0x75cffd52;
96293894Sglebius	const struct in6_addr address = { { {
97284990Scy		0x20, 0x01, 0x0d, 0xb8,
98284990Scy		0x85, 0xa3, 0x08, 0xd3,
99284990Scy		0x13, 0x19, 0x8a, 0x2e,
100284990Scy		0x03, 0x70, 0x73, 0x34
101293894Sglebius	} } };
102284990Scy	sockaddr_u addr;
103284990Scy
104284990Scy	addr.sa6.sin6_family = AF_INET6;
105284990Scy
106284990Scy	addr.sa6.sin6_addr = address;
107284990Scy
108284990Scy
109284990Scy#if 0
110284990Scy	TEST_ASSERT_EQUAL(expected, addr2refid(&addr));
111284990Scy#else
112293894Sglebius	(void)expected;
113284990Scy	TEST_IGNORE_MESSAGE("Skipping because of big endian problem?");
114284990Scy#endif
115284990Scy}
116