a_md5encrypt.c revision 293896
1#include "config.h" 2#include "unity.h" 3 4#ifdef OPENSSL 5# include "openssl/err.h" 6# include "openssl/rand.h" 7# include "openssl/evp.h" 8#endif 9#include "ntp.h" 10#include "ntp_stdlib.h" 11 12u_long current_time = 4; 13 14 15/* 16 * Example packet with MD5 hash calculated manually. 17 */ 18const int keytype = KEY_TYPE_MD5; 19const u_char *key = (const u_char*)"abcdefgh"; 20const u_short keyLength = 8; 21const u_char *packet = (const u_char*)"ijklmnopqrstuvwx"; 22#define packetLength 16 23#define keyIdLength 4 24#define digestLength 16 25#define totalLength (packetLength + keyIdLength + digestLength) 26union { 27 u_char u8 [totalLength]; 28 uint32_t u32[1]; 29} expectedPacket = { 30 "ijklmnopqrstuvwx\0\0\0\0\x0c\x0e\x84\xcf\x0b\xb7\xa8\x68\x8e\x52\x38\xdb\xbc\x1c\x39\x53" 31}; 32union { 33 u_char u8 [totalLength]; 34 uint32_t u32[1]; 35} invalidPacket = { 36 "ijklmnopqrstuvwx\0\0\0\0\x0c\x0e\x84\xcf\x0b\xb7\xa8\x68\x8e\x52\x38\xdb\xbc\x1c\x39\x54" 37}; 38 39 40void test_Encrypt(void); 41void test_DecryptValid(void); 42void test_DecryptInvalid(void); 43void test_IPv4AddressToRefId(void); 44void test_IPv6AddressToRefId(void); 45 46 47void 48test_Encrypt(void) { 49 u_int32 *packetPtr; 50 int length; 51 52 packetPtr = emalloc(totalLength * sizeof(*packetPtr)); 53 54 memset(packetPtr + packetLength, 0, keyIdLength); 55 memcpy(packetPtr, packet, packetLength); 56 57 cache_secretsize = keyLength; 58 59 length = MD5authencrypt(keytype, key, packetPtr, packetLength); 60 61 TEST_ASSERT_TRUE(MD5authdecrypt(keytype, key, packetPtr, packetLength, length)); 62 63 TEST_ASSERT_EQUAL(20, length); 64 TEST_ASSERT_EQUAL_MEMORY(expectedPacket.u8, packetPtr, totalLength); 65 66 free(packetPtr); 67} 68 69void 70test_DecryptValid(void) { 71 cache_secretsize = keyLength; 72 TEST_ASSERT_TRUE(MD5authdecrypt(keytype, key, expectedPacket.u32, packetLength, 20)); 73} 74 75void 76test_DecryptInvalid(void) { 77 cache_secretsize = keyLength; 78 TEST_ASSERT_FALSE(MD5authdecrypt(keytype, key, invalidPacket.u32, packetLength, 20)); 79} 80 81void 82test_IPv4AddressToRefId(void) { 83 sockaddr_u addr; 84 addr.sa4.sin_family = AF_INET; 85 u_int32 address; 86 87 addr.sa4.sin_port = htons(80); 88 89 address = inet_addr("192.0.2.1"); 90 addr.sa4.sin_addr.s_addr = address; 91 92 TEST_ASSERT_EQUAL(address, addr2refid(&addr)); 93} 94 95void 96test_IPv6AddressToRefId(void) { 97 const int expected = 0x75cffd52; 98 const struct in6_addr address = { { { 99 0x20, 0x01, 0x0d, 0xb8, 100 0x85, 0xa3, 0x08, 0xd3, 101 0x13, 0x19, 0x8a, 0x2e, 102 0x03, 0x70, 0x73, 0x34 103 } } }; 104 sockaddr_u addr; 105 106 addr.sa6.sin6_family = AF_INET6; 107 108 addr.sa6.sin6_addr = address; 109 110 111#if 0 112 TEST_ASSERT_EQUAL(expected, addr2refid(&addr)); 113#else 114 (void)expected; 115 TEST_IGNORE_MESSAGE("Skipping because of big endian problem?"); 116#endif 117} 118