1e6bfd18dSCy Schubert #include "config.h" 2e6bfd18dSCy Schubert 3e6bfd18dSCy Schubert #include <fcntl.h> 4e6bfd18dSCy Schubert #include <sys/types.h> 5e6bfd18dSCy Schubert #include <sys/stat.h> 6e6bfd18dSCy Schubert #include <unistd.h> 7e6bfd18dSCy Schubert 8e6bfd18dSCy Schubert #include "unity.h" 9e6bfd18dSCy Schubert #include "ntp.h" 10e6bfd18dSCy Schubert #include "ntp_stdlib.h" 11e6bfd18dSCy Schubert 12e6bfd18dSCy Schubert /* 13e6bfd18dSCy Schubert * tests/libntp/data/ntp.keys has two keys for each algorithm, 50 keyids apart. 14e6bfd18dSCy Schubert * The first is 20 random ASCII chars, the 2nd 40 random hex values. 15e6bfd18dSCy Schubert */ 16e6bfd18dSCy Schubert #define HEX_KEYID_OFFSET 50 17e6bfd18dSCy Schubert 18e6bfd18dSCy Schubert /* in generated srcdir.c */ 19e6bfd18dSCy Schubert extern const char srcdir[]; 20e6bfd18dSCy Schubert 21e6bfd18dSCy Schubert /* needed by authtrust() */ 22e6bfd18dSCy Schubert u_long current_time; 23e6bfd18dSCy Schubert 24e6bfd18dSCy Schubert static bool setup; 25e6bfd18dSCy Schubert static u_int32 * pkt; 26e6bfd18dSCy Schubert static size_t pkt_sz; 27e6bfd18dSCy Schubert static u_char * mac; 28e6bfd18dSCy Schubert 29e6bfd18dSCy Schubert /* helper routine */ 30e6bfd18dSCy Schubert void dump_mac(keyid_t keyid, u_char *pmac, size_t octets); 31e6bfd18dSCy Schubert 32e6bfd18dSCy Schubert 33e6bfd18dSCy Schubert /* unity calls setUp before each test routine */ 34e6bfd18dSCy Schubert void setUp(void); 35e6bfd18dSCy Schubert void 36e6bfd18dSCy Schubert setUp(void) 37e6bfd18dSCy Schubert { 38e6bfd18dSCy Schubert static bool done_once; 39e6bfd18dSCy Schubert const char msg_rel_fname[] = "data/mills,david-03.jpg"; 40e6bfd18dSCy Schubert const char keys_rel_fname[] = "data/ntp.keys"; 41e6bfd18dSCy Schubert char msg_fname[PATH_MAX]; 42e6bfd18dSCy Schubert char keys_fname[PATH_MAX]; 43e6bfd18dSCy Schubert int msgf; 44e6bfd18dSCy Schubert int result; 45e6bfd18dSCy Schubert struct stat msg_stat; 46e6bfd18dSCy Schubert u_char * msg; 47e6bfd18dSCy Schubert size_t msg_sz; 48e6bfd18dSCy Schubert size_t pad_sz; 49e6bfd18dSCy Schubert ssize_t octets; 50e6bfd18dSCy Schubert 51e6bfd18dSCy Schubert if (done_once) { 52e6bfd18dSCy Schubert return; 53e6bfd18dSCy Schubert } 54e6bfd18dSCy Schubert done_once = TRUE; 55e6bfd18dSCy Schubert 56e6bfd18dSCy Schubert init_auth(); 57e6bfd18dSCy Schubert 58e6bfd18dSCy Schubert snprintf(keys_fname, sizeof(keys_fname), "%s/%s", srcdir, 59e6bfd18dSCy Schubert keys_rel_fname); 60e6bfd18dSCy Schubert if (! authreadkeys(keys_fname)) { 61e6bfd18dSCy Schubert fprintf(stderr, "could not load keys %s\n", keys_fname); 62e6bfd18dSCy Schubert return; 63e6bfd18dSCy Schubert } 64e6bfd18dSCy Schubert 65e6bfd18dSCy Schubert snprintf(msg_fname, sizeof(msg_fname), "%s/%s", srcdir, msg_rel_fname); 66e6bfd18dSCy Schubert msgf = open(msg_fname, O_RDONLY); 67e6bfd18dSCy Schubert if (msgf < 0) { 68e6bfd18dSCy Schubert fprintf(stderr, "could not open msg file %s\n", msg_fname); 69e6bfd18dSCy Schubert return; 70e6bfd18dSCy Schubert } 71e6bfd18dSCy Schubert 72e6bfd18dSCy Schubert result = fstat(msgf, &msg_stat); 73e6bfd18dSCy Schubert if (result < 0) { 74e6bfd18dSCy Schubert fprintf(stderr, "could not get msg file %s size\n", msg_fname); 75e6bfd18dSCy Schubert return; 76e6bfd18dSCy Schubert } 77e6bfd18dSCy Schubert 78e6bfd18dSCy Schubert msg_sz = msg_stat.st_size; 79e6bfd18dSCy Schubert /* round up to next multiple of 4 as needed by MD5authencrypt() */ 80e6bfd18dSCy Schubert pad_sz = sizeof(u_int32) - (msg_sz % sizeof(u_int32)); 81e6bfd18dSCy Schubert if (sizeof(u_int32) == pad_sz) { 82e6bfd18dSCy Schubert pad_sz = 0; 83e6bfd18dSCy Schubert } 84e6bfd18dSCy Schubert /* allocate room for the message, key ID, and MAC */ 85e6bfd18dSCy Schubert msg = emalloc_zero(msg_sz + pad_sz + MAX_MAC_LEN); 86e6bfd18dSCy Schubert octets = read(msgf, msg, msg_sz); 87e6bfd18dSCy Schubert if (octets != msg_sz) { 88e6bfd18dSCy Schubert fprintf(stderr, "could not read msg from file %s, %u != %u\n", 89e6bfd18dSCy Schubert msg_fname, (u_int)octets, (u_int)msg_sz); 90e6bfd18dSCy Schubert return; 91e6bfd18dSCy Schubert } 92e6bfd18dSCy Schubert zero_mem(msg + msg_sz, pad_sz); 93e6bfd18dSCy Schubert pkt_sz = msg_sz + pad_sz; 94e6bfd18dSCy Schubert mac = (void *)((u_char *)msg + pkt_sz); 95e6bfd18dSCy Schubert pkt = (void *)msg; 96e6bfd18dSCy Schubert 97e6bfd18dSCy Schubert setup = TRUE; 98e6bfd18dSCy Schubert } 99e6bfd18dSCy Schubert 100e6bfd18dSCy Schubert /* reduce code duplication with an ugly macro */ 101e6bfd18dSCy Schubert #define TEST_ONE_DIGEST(key, exp_sz, exp_mac) \ 102e6bfd18dSCy Schubert do { \ 103e6bfd18dSCy Schubert size_t res_sz; \ 104e6bfd18dSCy Schubert \ 105e6bfd18dSCy Schubert zero_mem(mac, MAX_MAC_LEN); \ 106e6bfd18dSCy Schubert if (!auth_findkey(key)) { \ 107e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("MAC unsupported on this system"); \ 108e6bfd18dSCy Schubert return; \ 109e6bfd18dSCy Schubert } \ 110e6bfd18dSCy Schubert authtrust((key), 1); \ 111e6bfd18dSCy Schubert \ 112e6bfd18dSCy Schubert res_sz = authencrypt((key), pkt, pkt_sz); \ 113*f5f40dd6SCy Schubert if (0 == res_sz) { \ 114e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Likely OpenSSL 3 failed digest " \ 115e6bfd18dSCy Schubert "init."); \ 116e6bfd18dSCy Schubert return; \ 117e6bfd18dSCy Schubert } \ 118e6bfd18dSCy Schubert TEST_ASSERT_EQUAL_UINT((u_int)((exp_sz) + KEY_MAC_LEN), res_sz);\ 119e6bfd18dSCy Schubert dump_mac((key), mac, res_sz); \ 120e6bfd18dSCy Schubert TEST_ASSERT_EQUAL_HEX8_ARRAY((exp_mac), mac, MAX_MAC_LEN); \ 121e6bfd18dSCy Schubert } while (FALSE) 122e6bfd18dSCy Schubert 123e6bfd18dSCy Schubert 124e6bfd18dSCy Schubert #define AES128CMAC_KEYID 1 125e6bfd18dSCy Schubert #undef KEYID_A 126e6bfd18dSCy Schubert #define KEYID_A AES128CMAC_KEYID 127e6bfd18dSCy Schubert #undef DG_SZ 128e6bfd18dSCy Schubert #define DG_SZ 16 129e6bfd18dSCy Schubert #undef KEYID_B 130e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 131e6bfd18dSCy Schubert void test_Digest_AES128CMAC(void); 132e6bfd18dSCy Schubert void test_Digest_AES128CMAC(void) 133e6bfd18dSCy Schubert { 134e6bfd18dSCy Schubert #if defined(OPENSSL) && defined(ENABLE_CMAC) 135e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 136e6bfd18dSCy Schubert { 137e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 138e6bfd18dSCy Schubert 0x34, 0x5b, 0xcf, 0xa8, 139e6bfd18dSCy Schubert 0x85, 0x6e, 0x9d, 0x01, 140e6bfd18dSCy Schubert 0xeb, 0x81, 0x25, 0xc2, 141e6bfd18dSCy Schubert 0xa4, 0xb8, 0x1b, 0xe0 142e6bfd18dSCy Schubert }; 143e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 144e6bfd18dSCy Schubert { 145e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 146e6bfd18dSCy Schubert 0xd1, 0x04, 0x4e, 0xbf, 147e6bfd18dSCy Schubert 0x79, 0x2d, 0x3a, 0x40, 148e6bfd18dSCy Schubert 0xcd, 0xdc, 0x5a, 0x44, 149e6bfd18dSCy Schubert 0xde, 0xe0, 0x0c, 0x84 150e6bfd18dSCy Schubert }; 151e6bfd18dSCy Schubert 152e6bfd18dSCy Schubert TEST_ASSERT(setup); 153e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 154e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 155e6bfd18dSCy Schubert #else /* ! (OPENSSL && ENABLE_CMAC) follows */ 156e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL or not ENABLE_CMAC"); 157e6bfd18dSCy Schubert #endif 158e6bfd18dSCy Schubert } 159e6bfd18dSCy Schubert 160e6bfd18dSCy Schubert 161e6bfd18dSCy Schubert #define MD4_KEYID 2 162e6bfd18dSCy Schubert #undef KEYID_A 163e6bfd18dSCy Schubert #define KEYID_A MD4_KEYID 164e6bfd18dSCy Schubert #undef DG_SZ 165e6bfd18dSCy Schubert #define DG_SZ 16 166e6bfd18dSCy Schubert #undef KEYID_B 167e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 168e6bfd18dSCy Schubert void test_Digest_MD4(void); 169e6bfd18dSCy Schubert void test_Digest_MD4(void) 170e6bfd18dSCy Schubert { 171e6bfd18dSCy Schubert #ifdef OPENSSL 172e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 173e6bfd18dSCy Schubert { 174e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 175e6bfd18dSCy Schubert 0xf3, 0x39, 0x34, 0xca, 176e6bfd18dSCy Schubert 0xe0, 0x48, 0x26, 0x0f, 177e6bfd18dSCy Schubert 0x13, 0xca, 0x56, 0x9e, 178e6bfd18dSCy Schubert 0xbc, 0x53, 0x9c, 0x66 179e6bfd18dSCy Schubert }; 180e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 181e6bfd18dSCy Schubert { 182e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 183e6bfd18dSCy Schubert 0x5e, 0xe6, 0x81, 0xf2, 184e6bfd18dSCy Schubert 0x57, 0x57, 0x8a, 0x2b, 185e6bfd18dSCy Schubert 0xa8, 0x76, 0x8e, 0x7a, 186e6bfd18dSCy Schubert 0xc4, 0xf4, 0x34, 0x7e 187e6bfd18dSCy Schubert }; 188e6bfd18dSCy Schubert 189e6bfd18dSCy Schubert TEST_ASSERT(setup); 190e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 191e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 192e6bfd18dSCy Schubert #else /* ! OPENSSL follows */ 193e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 194e6bfd18dSCy Schubert #endif 195e6bfd18dSCy Schubert } 196e6bfd18dSCy Schubert 197e6bfd18dSCy Schubert 198e6bfd18dSCy Schubert #define MD5_KEYID 3 199e6bfd18dSCy Schubert #undef KEYID_A 200e6bfd18dSCy Schubert #define KEYID_A MD5_KEYID 201e6bfd18dSCy Schubert #undef DG_SZ 202e6bfd18dSCy Schubert #define DG_SZ 16 203e6bfd18dSCy Schubert #undef KEYID_B 204e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 205e6bfd18dSCy Schubert void test_Digest_MD5(void); 206e6bfd18dSCy Schubert void test_Digest_MD5(void) 207e6bfd18dSCy Schubert { 208e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 209e6bfd18dSCy Schubert { 210e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 211e6bfd18dSCy Schubert 0xa6, 0x8d, 0x3a, 0xfe, 212e6bfd18dSCy Schubert 0x52, 0xe5, 0xf7, 0xe9, 213e6bfd18dSCy Schubert 0x4c, 0x97, 0x72, 0x16, 214e6bfd18dSCy Schubert 0x7c, 0x28, 0x18, 0xaf 215e6bfd18dSCy Schubert }; 216e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 217e6bfd18dSCy Schubert { 218e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 219e6bfd18dSCy Schubert 0xd4, 0x11, 0x2c, 0xc6, 220e6bfd18dSCy Schubert 0x66, 0x74, 0x46, 0x8b, 221e6bfd18dSCy Schubert 0x12, 0xb1, 0x8c, 0x49, 222e6bfd18dSCy Schubert 0xb0, 0x06, 0xda, 0x34 223e6bfd18dSCy Schubert }; 224e6bfd18dSCy Schubert 225e6bfd18dSCy Schubert TEST_ASSERT(setup); 226e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 227e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 228e6bfd18dSCy Schubert } 229e6bfd18dSCy Schubert 230e6bfd18dSCy Schubert 231e6bfd18dSCy Schubert #define MDC2_KEYID 4 232e6bfd18dSCy Schubert #undef KEYID_A 233e6bfd18dSCy Schubert #define KEYID_A MDC2_KEYID 234e6bfd18dSCy Schubert #undef DG_SZ 235e6bfd18dSCy Schubert #define DG_SZ 16 236e6bfd18dSCy Schubert #undef KEYID_B 237e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 238e6bfd18dSCy Schubert void test_Digest_MDC2(void); 239e6bfd18dSCy Schubert void test_Digest_MDC2(void) 240e6bfd18dSCy Schubert { 241e6bfd18dSCy Schubert #ifdef OPENSSL 242e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 243e6bfd18dSCy Schubert { 244e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 245e6bfd18dSCy Schubert 0xa0, 0xfc, 0x18, 0xb6, 246e6bfd18dSCy Schubert 0xea, 0xba, 0xa5, 0x27, 247e6bfd18dSCy Schubert 0xc9, 0x64, 0x0e, 0x41, 248e6bfd18dSCy Schubert 0x95, 0x90, 0x5d, 0xf5 249e6bfd18dSCy Schubert }; 250e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 251e6bfd18dSCy Schubert { 252e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 253e6bfd18dSCy Schubert 0xe3, 0x2c, 0x1e, 0x64, 254e6bfd18dSCy Schubert 0x7f, 0x85, 0x81, 0xe7, 255e6bfd18dSCy Schubert 0x3b, 0xc3, 0x93, 0x5e, 256e6bfd18dSCy Schubert 0xcd, 0x0e, 0x89, 0xeb 257e6bfd18dSCy Schubert }; 258e6bfd18dSCy Schubert 259e6bfd18dSCy Schubert TEST_ASSERT(setup); 260e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 261e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 262e6bfd18dSCy Schubert #else /* ! OPENSSL follows */ 263e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 264e6bfd18dSCy Schubert #endif 265e6bfd18dSCy Schubert } 266e6bfd18dSCy Schubert 267e6bfd18dSCy Schubert 268e6bfd18dSCy Schubert #define RIPEMD160_KEYID 5 269e6bfd18dSCy Schubert #undef KEYID_A 270e6bfd18dSCy Schubert #define KEYID_A RIPEMD160_KEYID 271e6bfd18dSCy Schubert #undef DG_SZ 272e6bfd18dSCy Schubert #define DG_SZ 20 273e6bfd18dSCy Schubert #undef KEYID_B 274e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 275e6bfd18dSCy Schubert void test_Digest_RIPEMD160(void); 276e6bfd18dSCy Schubert void test_Digest_RIPEMD160(void) 277e6bfd18dSCy Schubert { 278e6bfd18dSCy Schubert #ifdef OPENSSL 279e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 280e6bfd18dSCy Schubert { 281e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 282e6bfd18dSCy Schubert 0x8c, 0x3e, 0x55, 0xbb, 283e6bfd18dSCy Schubert 0xec, 0x7c, 0xf6, 0x30, 284e6bfd18dSCy Schubert 0xef, 0xd1, 0x45, 0x8c, 285e6bfd18dSCy Schubert 0xdd, 0x29, 0x32, 0x7e, 286e6bfd18dSCy Schubert 0x04, 0x87, 0x6c, 0xd7 287e6bfd18dSCy Schubert }; 288e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 289e6bfd18dSCy Schubert { 290e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 291e6bfd18dSCy Schubert 0x2d, 0x4a, 0x48, 0xdd, 292e6bfd18dSCy Schubert 0x28, 0x02, 0xb4, 0x9d, 293e6bfd18dSCy Schubert 0xe3, 0x6d, 0x1b, 0x90, 294e6bfd18dSCy Schubert 0x2b, 0xc4, 0x3f, 0xe5, 295e6bfd18dSCy Schubert 0x19, 0x60, 0x12, 0xbc 296e6bfd18dSCy Schubert }; 297e6bfd18dSCy Schubert 298e6bfd18dSCy Schubert TEST_ASSERT(setup); 299e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 300e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 301e6bfd18dSCy Schubert #else /* ! OPENSSL follows */ 302e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 303e6bfd18dSCy Schubert #endif 304e6bfd18dSCy Schubert } 305e6bfd18dSCy Schubert 306e6bfd18dSCy Schubert 307e6bfd18dSCy Schubert #define SHA1_KEYID 6 308e6bfd18dSCy Schubert #undef KEYID_A 309e6bfd18dSCy Schubert #define KEYID_A SHA1_KEYID 310e6bfd18dSCy Schubert #undef DG_SZ 311e6bfd18dSCy Schubert #define DG_SZ 20 312e6bfd18dSCy Schubert #undef KEYID_B 313e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 314e6bfd18dSCy Schubert void test_Digest_SHA1(void); 315e6bfd18dSCy Schubert void test_Digest_SHA1(void) 316e6bfd18dSCy Schubert { 317e6bfd18dSCy Schubert #ifdef OPENSSL 318e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 319e6bfd18dSCy Schubert { 320e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 321e6bfd18dSCy Schubert 0xe2, 0xc6, 0x17, 0x71, 322e6bfd18dSCy Schubert 0x03, 0xc1, 0x85, 0x56, 323e6bfd18dSCy Schubert 0x35, 0xc7, 0x4e, 0x75, 324e6bfd18dSCy Schubert 0x79, 0x82, 0x9d, 0xcb, 325e6bfd18dSCy Schubert 0x2d, 0x06, 0x0e, 0xfa 326e6bfd18dSCy Schubert }; 327e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 328e6bfd18dSCy Schubert { 329e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 330e6bfd18dSCy Schubert 0x01, 0x16, 0x37, 0xb4, 331e6bfd18dSCy Schubert 0xf5, 0x2d, 0xe0, 0x97, 332e6bfd18dSCy Schubert 0xaf, 0xd8, 0x58, 0xf7, 333e6bfd18dSCy Schubert 0xad, 0xb3, 0x7e, 0x38, 334e6bfd18dSCy Schubert 0x86, 0x85, 0x78, 0x44 335e6bfd18dSCy Schubert }; 336e6bfd18dSCy Schubert 337e6bfd18dSCy Schubert TEST_ASSERT(setup); 338e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 339e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 340e6bfd18dSCy Schubert #else /* ! OPENSSL follows */ 341e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 342e6bfd18dSCy Schubert #endif 343e6bfd18dSCy Schubert } 344e6bfd18dSCy Schubert 345e6bfd18dSCy Schubert 346e6bfd18dSCy Schubert #define SHAKE128_KEYID 7 347e6bfd18dSCy Schubert #undef KEYID_A 348e6bfd18dSCy Schubert #define KEYID_A SHAKE128_KEYID 349e6bfd18dSCy Schubert #undef DG_SZ 350e6bfd18dSCy Schubert #define DG_SZ 16 351e6bfd18dSCy Schubert #undef KEYID_B 352e6bfd18dSCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 353e6bfd18dSCy Schubert void test_Digest_SHAKE128(void); 354e6bfd18dSCy Schubert void test_Digest_SHAKE128(void) 355e6bfd18dSCy Schubert { 356e6bfd18dSCy Schubert #ifdef OPENSSL 357e6bfd18dSCy Schubert u_char expectedA[MAX_MAC_LEN] = 358e6bfd18dSCy Schubert { 359e6bfd18dSCy Schubert 0, 0, 0, KEYID_A, 360e6bfd18dSCy Schubert 0x5c, 0x0c, 0x1a, 0x85, 361e6bfd18dSCy Schubert 0xad, 0x03, 0xb2, 0x9a, 362e6bfd18dSCy Schubert 0xe4, 0x75, 0x37, 0x93, 363e6bfd18dSCy Schubert 0xaa, 0xa6, 0xcd, 0x76 364e6bfd18dSCy Schubert }; 365e6bfd18dSCy Schubert u_char expectedB[MAX_MAC_LEN] = 366e6bfd18dSCy Schubert { 367e6bfd18dSCy Schubert 0, 0, 0, KEYID_B, 368e6bfd18dSCy Schubert 0x07, 0x04, 0x63, 0xcc, 369e6bfd18dSCy Schubert 0x46, 0xaf, 0xca, 0x00, 370e6bfd18dSCy Schubert 0x7d, 0xd1, 0x5a, 0x39, 371e6bfd18dSCy Schubert 0xfd, 0x34, 0xca, 0x10 372e6bfd18dSCy Schubert }; 373e6bfd18dSCy Schubert 374e6bfd18dSCy Schubert TEST_ASSERT(setup); 375e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 376e6bfd18dSCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 377e6bfd18dSCy Schubert #else /* ! OPENSSL follows */ 378e6bfd18dSCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 379e6bfd18dSCy Schubert #endif 380e6bfd18dSCy Schubert } 381e6bfd18dSCy Schubert 382e6bfd18dSCy Schubert 383*f5f40dd6SCy Schubert #define DSA_KEYID 8 384*f5f40dd6SCy Schubert #undef KEYID_A 385*f5f40dd6SCy Schubert #define KEYID_A DSA_KEYID 386*f5f40dd6SCy Schubert #undef DG_SZ 387*f5f40dd6SCy Schubert #define DG_SZ 20 388*f5f40dd6SCy Schubert #undef KEYID_B 389*f5f40dd6SCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 390*f5f40dd6SCy Schubert void test_Digest_DSA(void); 391*f5f40dd6SCy Schubert void test_Digest_DSA(void) 392*f5f40dd6SCy Schubert { 393*f5f40dd6SCy Schubert #ifdef OPENSSL 394*f5f40dd6SCy Schubert u_char expectedA[MAX_MAC_LEN] = 395*f5f40dd6SCy Schubert { 396*f5f40dd6SCy Schubert 0, 0, 0, KEYID_A, 397*f5f40dd6SCy Schubert 0xaf, 0xa0, 0x1d, 0x0c, 398*f5f40dd6SCy Schubert 0x92, 0xcb, 0xca, 0x95, 399*f5f40dd6SCy Schubert 0x0d, 0x57, 0x60, 0x49, 400*f5f40dd6SCy Schubert 0xe5, 0x28, 0x03, 0xf2, 401*f5f40dd6SCy Schubert 0x7b, 0x5b, 0xb1, 0x4a 402*f5f40dd6SCy Schubert }; 403*f5f40dd6SCy Schubert u_char expectedB[MAX_MAC_LEN] = 404*f5f40dd6SCy Schubert { 405*f5f40dd6SCy Schubert 0, 0, 0, KEYID_B, 406*f5f40dd6SCy Schubert 0x77, 0xcd, 0x88, 0xc2, 407*f5f40dd6SCy Schubert 0xed, 0x5d, 0x57, 0xc5, 408*f5f40dd6SCy Schubert 0x28, 0x92, 0xf0, 0x21, 409*f5f40dd6SCy Schubert 0x2b, 0xb9, 0x48, 0xac, 410*f5f40dd6SCy Schubert 0xfe, 0x9f, 0xf5, 0x1c 411*f5f40dd6SCy Schubert }; 412*f5f40dd6SCy Schubert 413*f5f40dd6SCy Schubert TEST_ASSERT(setup); 414*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 415*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 416*f5f40dd6SCy Schubert #else /* ! OPENSSL follows */ 417*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 418*f5f40dd6SCy Schubert #endif 419*f5f40dd6SCy Schubert } 420*f5f40dd6SCy Schubert 421*f5f40dd6SCy Schubert 422*f5f40dd6SCy Schubert #define DSA_SHA_KEYID 9 423*f5f40dd6SCy Schubert #undef KEYID_A 424*f5f40dd6SCy Schubert #define KEYID_A DSA_SHA_KEYID 425*f5f40dd6SCy Schubert #undef DG_SZ 426*f5f40dd6SCy Schubert #define DG_SZ 20 427*f5f40dd6SCy Schubert #undef KEYID_B 428*f5f40dd6SCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 429*f5f40dd6SCy Schubert void test_Digest_DSA_SHA(void); 430*f5f40dd6SCy Schubert void test_Digest_DSA_SHA(void) 431*f5f40dd6SCy Schubert { 432*f5f40dd6SCy Schubert #ifdef OPENSSL 433*f5f40dd6SCy Schubert u_char expectedA[MAX_MAC_LEN] = 434*f5f40dd6SCy Schubert { 435*f5f40dd6SCy Schubert 0, 0, 0, KEYID_A, 436*f5f40dd6SCy Schubert 0x7c, 0xb5, 0x79, 0xd0, 437*f5f40dd6SCy Schubert 0xf2, 0xcd, 0x47, 0xc0, 438*f5f40dd6SCy Schubert 0x21, 0xf3, 0xf5, 0x04, 439*f5f40dd6SCy Schubert 0x10, 0xc4, 0x59, 0x5c, 440*f5f40dd6SCy Schubert 0xd9, 0xa4, 0x4f, 0x3b 441*f5f40dd6SCy Schubert }; 442*f5f40dd6SCy Schubert u_char expectedB[MAX_MAC_LEN] = 443*f5f40dd6SCy Schubert { 444*f5f40dd6SCy Schubert 0, 0, 0, KEYID_B, 445*f5f40dd6SCy Schubert 0xb9, 0xca, 0xa6, 0x8e, 446*f5f40dd6SCy Schubert 0xd3, 0xcb, 0x94, 0x6a, 447*f5f40dd6SCy Schubert 0x6d, 0xae, 0xb4, 0xc8, 448*f5f40dd6SCy Schubert 0x0e, 0xc9, 0xf6, 0xed, 449*f5f40dd6SCy Schubert 0x58, 0x1a, 0xed, 0x22 450*f5f40dd6SCy Schubert }; 451*f5f40dd6SCy Schubert 452*f5f40dd6SCy Schubert TEST_ASSERT(setup); 453*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 454*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 455*f5f40dd6SCy Schubert #else /* ! OPENSSL follows */ 456*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 457*f5f40dd6SCy Schubert #endif 458*f5f40dd6SCy Schubert } 459*f5f40dd6SCy Schubert 460*f5f40dd6SCy Schubert 461*f5f40dd6SCy Schubert #define SHA_KEYID 10 462*f5f40dd6SCy Schubert #undef KEYID_A 463*f5f40dd6SCy Schubert #define KEYID_A SHA_KEYID 464*f5f40dd6SCy Schubert #undef DG_SZ 465*f5f40dd6SCy Schubert #define DG_SZ 20 466*f5f40dd6SCy Schubert #undef KEYID_B 467*f5f40dd6SCy Schubert #define KEYID_B (KEYID_A + HEX_KEYID_OFFSET) 468*f5f40dd6SCy Schubert void test_Digest_SHA(void); 469*f5f40dd6SCy Schubert void test_Digest_SHA(void) 470*f5f40dd6SCy Schubert { 471*f5f40dd6SCy Schubert #ifdef OPENSSL 472*f5f40dd6SCy Schubert u_char expectedA[MAX_MAC_LEN] = 473*f5f40dd6SCy Schubert { 474*f5f40dd6SCy Schubert 0, 0, 0, KEYID_A, 475*f5f40dd6SCy Schubert 0xd5, 0xbd, 0xb8, 0x55, 476*f5f40dd6SCy Schubert 0x9b, 0x9e, 0x5e, 0x8f, 477*f5f40dd6SCy Schubert 0x1a, 0x3d, 0x99, 0x60, 478*f5f40dd6SCy Schubert 0xbd, 0x70, 0x0c, 0x5c, 479*f5f40dd6SCy Schubert 0x68, 0xae, 0xb0, 0xbd 480*f5f40dd6SCy Schubert }; 481*f5f40dd6SCy Schubert u_char expectedB[MAX_MAC_LEN] = 482*f5f40dd6SCy Schubert { 483*f5f40dd6SCy Schubert 0, 0, 0, KEYID_B, 484*f5f40dd6SCy Schubert 0x63, 0x05, 0x41, 0x45, 485*f5f40dd6SCy Schubert 0xe9, 0x61, 0x84, 0xe7, 486*f5f40dd6SCy Schubert 0xc6, 0x94, 0x24, 0xa4, 487*f5f40dd6SCy Schubert 0x84, 0x76, 0xc7, 0xc9, 488*f5f40dd6SCy Schubert 0xdd, 0x80, 0x80, 0x89 489*f5f40dd6SCy Schubert }; 490*f5f40dd6SCy Schubert 491*f5f40dd6SCy Schubert TEST_ASSERT(setup); 492*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_A, DG_SZ, expectedA); 493*f5f40dd6SCy Schubert TEST_ONE_DIGEST(KEYID_B, DG_SZ, expectedB); 494*f5f40dd6SCy Schubert #else /* ! OPENSSL follows */ 495*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("Skipping, no OPENSSL"); 496*f5f40dd6SCy Schubert #endif 497*f5f40dd6SCy Schubert } 498*f5f40dd6SCy Schubert 499*f5f40dd6SCy Schubert 500e6bfd18dSCy Schubert /* 501e6bfd18dSCy Schubert * Dump a MAC in a form easy to cut and paste into the expected declaration. 502e6bfd18dSCy Schubert */ 503e6bfd18dSCy Schubert void dump_mac( 504e6bfd18dSCy Schubert keyid_t keyid, 505e6bfd18dSCy Schubert u_char * pmac, 506e6bfd18dSCy Schubert size_t octets 507e6bfd18dSCy Schubert ) 508e6bfd18dSCy Schubert { 509e6bfd18dSCy Schubert char dump[128]; 510e6bfd18dSCy Schubert size_t dc = 0; 511e6bfd18dSCy Schubert size_t idx; 512e6bfd18dSCy Schubert 513e6bfd18dSCy Schubert dc += snprintf(dump + dc, sizeof(dump) - dc, "digest with key %u { ", keyid); 514e6bfd18dSCy Schubert 515*f5f40dd6SCy Schubert for (idx = 4; idx < octets; idx++) { 516*f5f40dd6SCy Schubert if (14 == idx) { 517e6bfd18dSCy Schubert msyslog(LOG_DEBUG, "%s", dump); 518e6bfd18dSCy Schubert dc = 0; 519e6bfd18dSCy Schubert } 520e6bfd18dSCy Schubert if (dc < sizeof(dump)) { 521e6bfd18dSCy Schubert dc += snprintf(dump + dc, sizeof(dump) - dc, 522e6bfd18dSCy Schubert "0x%02x, ", pmac[idx]); 523e6bfd18dSCy Schubert } 524e6bfd18dSCy Schubert } 525e6bfd18dSCy Schubert 526e6bfd18dSCy Schubert if (dc < sizeof(dump)) { 527e6bfd18dSCy Schubert dc += snprintf(dump + dc, sizeof(dump) - dc, "}"); 528e6bfd18dSCy Schubert } 529e6bfd18dSCy Schubert 530e6bfd18dSCy Schubert msyslog(LOG_DEBUG, "%s", dump); 531e6bfd18dSCy Schubert } 532e6bfd18dSCy Schubert 533