1276da39aSCy Schubert #include "config.h" 2276da39aSCy Schubert #include "unity.h" 3276da39aSCy Schubert #include "ntp_types.h" 4276da39aSCy Schubert 5276da39aSCy Schubert #include "sntptest.h" 6276da39aSCy Schubert #include "crypto.h" 7276da39aSCy Schubert 809100258SXin LI #define CMAC "AES128CMAC" 909100258SXin LI 10276da39aSCy Schubert #define SHA1_LENGTH 20 1109100258SXin LI #define CMAC_LENGTH 16 12276da39aSCy Schubert 139034852cSGleb Smirnoff 14*f5f40dd6SCy Schubert void test_MakeSHAKE128Mac(void); 159034852cSGleb Smirnoff void test_MakeSHA1Mac(void); 1609100258SXin LI void test_MakeCMac(void); 17*f5f40dd6SCy Schubert void test_VerifySHAKE128(void); 189034852cSGleb Smirnoff void test_VerifySHA1(void); 1909100258SXin LI void test_VerifyCMAC(void); 209034852cSGleb Smirnoff void test_VerifyFailure(void); 219034852cSGleb Smirnoff void test_PacketSizeNotMultipleOfFourBytes(void); 229034852cSGleb Smirnoff 2309100258SXin LI void VerifyLocalCMAC(struct key *cmac); 2409100258SXin LI void VerifyOpenSSLCMAC(struct key *cmac); 2509100258SXin LI 269034852cSGleb Smirnoff 279034852cSGleb Smirnoff void 28*f5f40dd6SCy Schubert test_MakeSHAKE128Mac(void) 2968ba7e87SXin LI { 30*f5f40dd6SCy Schubert #ifdef OPENSSL 31276da39aSCy Schubert 32*f5f40dd6SCy Schubert const char KEY[] = "SHAKE128 unit test key"; 33*f5f40dd6SCy Schubert const u_char PAYLOAD[] = "packettestdata16"; 34*f5f40dd6SCy Schubert const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1; 35*f5f40dd6SCy Schubert const u_char EXPECTED_DIGEST[] = 36*f5f40dd6SCy Schubert "\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6" 37*f5f40dd6SCy Schubert "\x73\x62\x68\x8D\x11\xB8\x42\xBB"; 38*f5f40dd6SCy Schubert u_char actual[sizeof(EXPECTED_DIGEST) - 1]; 39*f5f40dd6SCy Schubert struct key sk; 40276da39aSCy Schubert 41*f5f40dd6SCy Schubert sk.next = NULL; 42*f5f40dd6SCy Schubert sk.key_id = 10; 43*f5f40dd6SCy Schubert sk.key_len = sizeof(KEY) - 1; 44*f5f40dd6SCy Schubert memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len)); 45*f5f40dd6SCy Schubert strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen)); 46*f5f40dd6SCy Schubert sk.typei = keytype_from_text(sk.typen, NULL); 47276da39aSCy Schubert 48*f5f40dd6SCy Schubert TEST_ASSERT_EQUAL(sizeof(actual), 49*f5f40dd6SCy Schubert make_mac(PAYLOAD, PAYLOAD_LEN, &sk, actual, 50*f5f40dd6SCy Schubert sizeof(actual))); 51*f5f40dd6SCy Schubert 52*f5f40dd6SCy Schubert TEST_ASSERT_EQUAL_HEX8_ARRAY(EXPECTED_DIGEST, actual, sizeof(actual)); 53*f5f40dd6SCy Schubert #else 54*f5f40dd6SCy Schubert 55*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 56*f5f40dd6SCy Schubert 57*f5f40dd6SCy Schubert #endif /* OPENSSL */ 58276da39aSCy Schubert } 59276da39aSCy Schubert 60276da39aSCy Schubert 619034852cSGleb Smirnoff void 6268ba7e87SXin LI test_MakeSHA1Mac(void) 6368ba7e87SXin LI { 64276da39aSCy Schubert #ifdef OPENSSL 6568ba7e87SXin LI 66276da39aSCy Schubert const char* PKT_DATA = "abcdefgh0123"; 67276da39aSCy Schubert const int PKT_LEN = strlen(PKT_DATA); 68276da39aSCy Schubert const char* EXPECTED_DIGEST = 69276da39aSCy Schubert "\x17\xaa\x82\x97\xc7\x17\x13\x6a\x9b\xa9" 70276da39aSCy Schubert "\x63\x85\xb4\xce\xbe\x94\xa0\x97\x16\x1d"; 71276da39aSCy Schubert char actual[SHA1_LENGTH]; 72276da39aSCy Schubert 73276da39aSCy Schubert struct key sha1; 74276da39aSCy Schubert sha1.next = NULL; 75276da39aSCy Schubert sha1.key_id = 20; 76276da39aSCy Schubert sha1.key_len = 7; 77276da39aSCy Schubert memcpy(&sha1.key_seq, "sha1seq", sha1.key_len); 7809100258SXin LI strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen)); 7909100258SXin LI sha1.typei = keytype_from_text(sha1.typen, NULL); 80276da39aSCy Schubert 81276da39aSCy Schubert TEST_ASSERT_EQUAL(SHA1_LENGTH, 82*f5f40dd6SCy Schubert make_mac(PKT_DATA, PKT_LEN, &sha1, actual, 83*f5f40dd6SCy Schubert SHA1_LENGTH)); 84276da39aSCy Schubert 859034852cSGleb Smirnoff TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, SHA1_LENGTH); 8668ba7e87SXin LI 87276da39aSCy Schubert #else 8868ba7e87SXin LI 89276da39aSCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 9068ba7e87SXin LI 91276da39aSCy Schubert #endif /* OPENSSL */ 92276da39aSCy Schubert } 93276da39aSCy Schubert 94276da39aSCy Schubert 959034852cSGleb Smirnoff void 9609100258SXin LI test_MakeCMac(void) 9709100258SXin LI { 984e1ef62aSXin LI #if defined(OPENSSL) && defined(ENABLE_CMAC) 9909100258SXin LI 10009100258SXin LI const char* PKT_DATA = "abcdefgh0123"; 10109100258SXin LI const int PKT_LEN = strlen(PKT_DATA); 10209100258SXin LI const char* EXPECTED_DIGEST = 10309100258SXin LI "\xdd\x35\xd5\xf5\x14\x23\xd9\xd6" 10409100258SXin LI "\x38\x5d\x29\x80\xfe\x51\xb9\x6b"; 10509100258SXin LI char actual[CMAC_LENGTH]; 10609100258SXin LI struct key cmac; 107*f5f40dd6SCy Schubert 10809100258SXin LI cmac.next = NULL; 10909100258SXin LI cmac.key_id = 30; 11009100258SXin LI cmac.key_len = CMAC_LENGTH; 11109100258SXin LI memcpy(&cmac.key_seq, "aes-128-cmac-seq", cmac.key_len); 11209100258SXin LI memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1); 11309100258SXin LI 11409100258SXin LI TEST_ASSERT_EQUAL(CMAC_LENGTH, 115*f5f40dd6SCy Schubert make_mac(PKT_DATA, PKT_LEN, &cmac, actual, CMAC_LENGTH)); 11609100258SXin LI 11709100258SXin LI TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, CMAC_LENGTH); 11809100258SXin LI 11909100258SXin LI #else 12009100258SXin LI 121*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("CMAC not enabled, skipping..."); 12209100258SXin LI 12309100258SXin LI #endif /* OPENSSL */ 12409100258SXin LI } 12509100258SXin LI 12609100258SXin LI 12709100258SXin LI void 128*f5f40dd6SCy Schubert test_VerifySHAKE128(void) 12968ba7e87SXin LI { 130*f5f40dd6SCy Schubert #ifdef OPENSSL 131*f5f40dd6SCy Schubert const char KEY[] = "SHAKE128 unit test key"; 132*f5f40dd6SCy Schubert const u_char PAYLOAD[] = "packettestdata16"; 133*f5f40dd6SCy Schubert const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1; 134*f5f40dd6SCy Schubert const u_char EXPECTED_DIGEST[] = 135*f5f40dd6SCy Schubert "\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6" 136*f5f40dd6SCy Schubert "\x73\x62\x68\x8D\x11\xB8\x42\xBB"; 137*f5f40dd6SCy Schubert const size_t DIGEST_LEN = sizeof(EXPECTED_DIGEST) - 1; 138*f5f40dd6SCy Schubert struct key sk; 139*f5f40dd6SCy Schubert u_char PKT_DATA[ PAYLOAD_LEN + sizeof(sk.key_id) 140*f5f40dd6SCy Schubert + DIGEST_LEN]; 141*f5f40dd6SCy Schubert u_char *p; 142276da39aSCy Schubert 143*f5f40dd6SCy Schubert sk.next = NULL; 144*f5f40dd6SCy Schubert sk.key_id = 0; 145*f5f40dd6SCy Schubert sk.key_len = sizeof(KEY) - 1; 146*f5f40dd6SCy Schubert memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len)); 147*f5f40dd6SCy Schubert strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen)); 148*f5f40dd6SCy Schubert sk.typei = keytype_from_text(sk.typen, NULL); 149276da39aSCy Schubert 150*f5f40dd6SCy Schubert p = PKT_DATA; 151*f5f40dd6SCy Schubert memcpy(p, PAYLOAD, PAYLOAD_LEN); p += PAYLOAD_LEN; 152*f5f40dd6SCy Schubert memcpy(p, &sk.key_id, sizeof(sk.key_id)); p += sizeof(sk.key_id); 153*f5f40dd6SCy Schubert memcpy(p, EXPECTED_DIGEST, DIGEST_LEN); p += DIGEST_LEN; 154*f5f40dd6SCy Schubert TEST_ASSERT_TRUE(sizeof(PKT_DATA) == p - PKT_DATA); 155*f5f40dd6SCy Schubert 156*f5f40dd6SCy Schubert TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PAYLOAD_LEN, DIGEST_LEN, &sk)); 157*f5f40dd6SCy Schubert #else 158*f5f40dd6SCy Schubert 159*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 160*f5f40dd6SCy Schubert 161*f5f40dd6SCy Schubert #endif /* OPENSSL */ 162276da39aSCy Schubert } 163276da39aSCy Schubert 164276da39aSCy Schubert 1659034852cSGleb Smirnoff void 16668ba7e87SXin LI test_VerifySHA1(void) 16768ba7e87SXin LI { 168276da39aSCy Schubert #ifdef OPENSSL 16968ba7e87SXin LI 170276da39aSCy Schubert const char* PKT_DATA = 17168ba7e87SXin LI "sometestdata" /* Data */ 17268ba7e87SXin LI "\0\0\0\0" /* Key-ID (unused) */ 17368ba7e87SXin LI "\xad\x07\xde\x36\x39\xa6\x77\xfa\x5b\xce" /* MAC */ 174276da39aSCy Schubert "\x2d\x8a\x7d\x06\x96\xe6\x0c\xbc\xed\xe1"; 175276da39aSCy Schubert const int PKT_LEN = 12; 176276da39aSCy Schubert struct key sha1; 177*f5f40dd6SCy Schubert 178276da39aSCy Schubert sha1.next = NULL; 179276da39aSCy Schubert sha1.key_id = 0; 180276da39aSCy Schubert sha1.key_len = 7; 181276da39aSCy Schubert memcpy(&sha1.key_seq, "sha1key", sha1.key_len); 18209100258SXin LI strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen)); 18309100258SXin LI sha1.typei = keytype_from_text(sha1.typen, NULL); 184276da39aSCy Schubert 18568ba7e87SXin LI TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1)); 18668ba7e87SXin LI 187276da39aSCy Schubert #else 18868ba7e87SXin LI 189276da39aSCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 19068ba7e87SXin LI 191276da39aSCy Schubert #endif /* OPENSSL */ 192276da39aSCy Schubert } 193276da39aSCy Schubert 19409100258SXin LI 19509100258SXin LI void 19609100258SXin LI test_VerifyCMAC(void) 19709100258SXin LI { 19809100258SXin LI struct key cmac; 19909100258SXin LI 20009100258SXin LI cmac.next = NULL; 20109100258SXin LI cmac.key_id = 0; 20209100258SXin LI cmac.key_len = CMAC_LENGTH; 20309100258SXin LI memcpy(&cmac.key_seq, "aes-128-cmac-key", cmac.key_len); 20409100258SXin LI memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1); 20509100258SXin LI 20609100258SXin LI VerifyOpenSSLCMAC(&cmac); 20709100258SXin LI VerifyLocalCMAC(&cmac); 20809100258SXin LI } 20909100258SXin LI 21009100258SXin LI 21109100258SXin LI void 21209100258SXin LI VerifyOpenSSLCMAC(struct key *cmac) 21309100258SXin LI { 2144e1ef62aSXin LI #if defined(OPENSSL) && defined(ENABLE_CMAC) 21509100258SXin LI 21609100258SXin LI /* XXX: HMS: auth_md5 must be renamed/incorrect. */ 21709100258SXin LI // TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac)); 21809100258SXin LI TEST_IGNORE_MESSAGE("VerifyOpenSSLCMAC needs to be implemented, skipping..."); 21909100258SXin LI 22009100258SXin LI #else 22109100258SXin LI 222*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("CMAC not enabled, skipping..."); 22309100258SXin LI 22409100258SXin LI #endif /* OPENSSL */ 22509100258SXin LI return; 22609100258SXin LI } 22709100258SXin LI 22809100258SXin LI 22909100258SXin LI void 23009100258SXin LI VerifyLocalCMAC(struct key *cmac) 23109100258SXin LI { 23209100258SXin LI 23309100258SXin LI /* XXX: HMS: auth_md5 must be renamed/incorrect. */ 23409100258SXin LI // TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac)); 23509100258SXin LI 23609100258SXin LI TEST_IGNORE_MESSAGE("Hook in the local AES-128-CMAC check!"); 23709100258SXin LI 23809100258SXin LI return; 23909100258SXin LI } 24009100258SXin LI 24109100258SXin LI 2429034852cSGleb Smirnoff void 24368ba7e87SXin LI test_VerifyFailure(void) 24468ba7e87SXin LI { 245*f5f40dd6SCy Schubert /* 246*f5f40dd6SCy Schubert * We use a copy of test_VerifySHAKE128(), but modify the 247*f5f40dd6SCy Schubert * last packet octet to make sure verification fails. 24868ba7e87SXin LI */ 249*f5f40dd6SCy Schubert #ifdef OPENSSL 250*f5f40dd6SCy Schubert const char KEY[] = "SHAKE128 unit test key"; 251*f5f40dd6SCy Schubert const u_char PAYLOAD[] = "packettestdata1_"; 252*f5f40dd6SCy Schubert /* last packet byte different */ 253*f5f40dd6SCy Schubert const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1; 254*f5f40dd6SCy Schubert const u_char EXPECTED_DIGEST[] = 255*f5f40dd6SCy Schubert "\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6" 256*f5f40dd6SCy Schubert "\x73\x62\x68\x8D\x11\xB8\x42\xBB"; 257*f5f40dd6SCy Schubert const size_t DIGEST_LEN = sizeof(EXPECTED_DIGEST) - 1; 258*f5f40dd6SCy Schubert struct key sk; 259*f5f40dd6SCy Schubert u_char PKT_DATA[ PAYLOAD_LEN + sizeof(sk.key_id) 260*f5f40dd6SCy Schubert + DIGEST_LEN]; 261*f5f40dd6SCy Schubert u_char *p; 262276da39aSCy Schubert 263*f5f40dd6SCy Schubert sk.next = NULL; 264*f5f40dd6SCy Schubert sk.key_id = 0; 265*f5f40dd6SCy Schubert sk.key_len = sizeof(KEY) - 1; 266*f5f40dd6SCy Schubert memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len)); 267*f5f40dd6SCy Schubert strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen)); 268*f5f40dd6SCy Schubert sk.typei = keytype_from_text(sk.typen, NULL); 269276da39aSCy Schubert 270*f5f40dd6SCy Schubert p = PKT_DATA; 271*f5f40dd6SCy Schubert memcpy(p, PAYLOAD, PAYLOAD_LEN); p += PAYLOAD_LEN; 272*f5f40dd6SCy Schubert memcpy(p, &sk.key_id, sizeof(sk.key_id)); p += sizeof(sk.key_id); 273*f5f40dd6SCy Schubert memcpy(p, EXPECTED_DIGEST, DIGEST_LEN); p += DIGEST_LEN; 274*f5f40dd6SCy Schubert TEST_ASSERT_TRUE(sizeof(PKT_DATA) == p - PKT_DATA); 275*f5f40dd6SCy Schubert 276*f5f40dd6SCy Schubert TEST_ASSERT_FALSE(auth_md5(PKT_DATA, PAYLOAD_LEN, DIGEST_LEN, &sk)); 277*f5f40dd6SCy Schubert #else 278*f5f40dd6SCy Schubert 279*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 280*f5f40dd6SCy Schubert 281*f5f40dd6SCy Schubert #endif /* OPENSSL */ 282276da39aSCy Schubert } 283276da39aSCy Schubert 2849034852cSGleb Smirnoff 2859034852cSGleb Smirnoff void 28668ba7e87SXin LI test_PacketSizeNotMultipleOfFourBytes(void) 28768ba7e87SXin LI { 288*f5f40dd6SCy Schubert /* 289*f5f40dd6SCy Schubert * We use a copy of test_MakeSHAKE128Mac(), but modify 290*f5f40dd6SCy Schubert * the packet length to 17. 291*f5f40dd6SCy Schubert */ 292*f5f40dd6SCy Schubert #ifdef OPENSSL 293276da39aSCy Schubert 294*f5f40dd6SCy Schubert const char KEY[] = "SHAKE128 unit test key"; 295*f5f40dd6SCy Schubert const u_char PAYLOAD[] = "packettestdata_17"; 296*f5f40dd6SCy Schubert const size_t PAYLOAD_LEN = sizeof(PAYLOAD) - 1; 297*f5f40dd6SCy Schubert const u_char EXPECTED_DIGEST[] = 298*f5f40dd6SCy Schubert "\x62\x5A\x8F\xE4\x66\xCB\xF3\xA6" 299*f5f40dd6SCy Schubert "\x73\x62\x68\x8D\x11\xB8\x42\xBB"; 300*f5f40dd6SCy Schubert u_char actual[sizeof(EXPECTED_DIGEST) - 1]; 301*f5f40dd6SCy Schubert struct key sk; 302276da39aSCy Schubert 303*f5f40dd6SCy Schubert sk.next = NULL; 304*f5f40dd6SCy Schubert sk.key_id = 10; 305*f5f40dd6SCy Schubert sk.key_len = sizeof(KEY) - 1; 306*f5f40dd6SCy Schubert memcpy(&sk.key_seq, KEY, min(sizeof(sk.key_seq), sk.key_len)); 307*f5f40dd6SCy Schubert strlcpy(sk.typen, "SHAKE128", sizeof(sk.typen)); 308*f5f40dd6SCy Schubert sk.typei = keytype_from_text(sk.typen, NULL); 309*f5f40dd6SCy Schubert 310*f5f40dd6SCy Schubert TEST_ASSERT_EQUAL(0, 311*f5f40dd6SCy Schubert make_mac(PAYLOAD, PAYLOAD_LEN, &sk, actual, 312*f5f40dd6SCy Schubert sizeof(actual))); 313*f5f40dd6SCy Schubert #else 314*f5f40dd6SCy Schubert 315*f5f40dd6SCy Schubert TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 316*f5f40dd6SCy Schubert 317*f5f40dd6SCy Schubert #endif /* OPENSSL */ 318276da39aSCy Schubert } 319