1 /* $NetBSD: crypto.c,v 1.3 2018/09/29 21:52:35 christos Exp $ */ 2 3 #include "config.h" 4 #include "unity.h" 5 #include "ntp_types.h" 6 7 #include "sntptest.h" 8 #include "crypto.h" 9 10 #define CMAC "AES128CMAC" 11 12 #define MD5_LENGTH 16 13 #define SHA1_LENGTH 20 14 #define CMAC_LENGTH 16 15 16 17 void test_MakeMd5Mac(void); 18 void test_MakeSHA1Mac(void); 19 void test_MakeCMac(void); 20 void test_VerifyCorrectMD5(void); 21 void test_VerifySHA1(void); 22 void test_VerifyCMAC(void); 23 void test_VerifyFailure(void); 24 void test_PacketSizeNotMultipleOfFourBytes(void); 25 26 void VerifyLocalCMAC(struct key *cmac); 27 void VerifyOpenSSLCMAC(struct key *cmac); 28 29 30 void 31 test_MakeMd5Mac(void) 32 { 33 const char* PKT_DATA = "abcdefgh0123"; 34 const int PKT_LEN = strlen(PKT_DATA); 35 const char* EXPECTED_DIGEST = 36 "\x52\x6c\xb8\x38\xaf\x06\x5a\xfb\x6c\x98\xbb\xc0\x9b\x0a\x7a\x1b"; 37 char actual[MD5_LENGTH]; 38 39 struct key md5; 40 md5.next = NULL; 41 md5.key_id = 10; 42 md5.key_len = 6; 43 memcpy(&md5.key_seq, "md5seq", md5.key_len); 44 strlcpy(md5.typen, "MD5", sizeof(md5.typen)); 45 md5.typei = keytype_from_text(md5.typen, NULL); 46 47 TEST_ASSERT_EQUAL(MD5_LENGTH, 48 make_mac(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5, actual)); 49 50 TEST_ASSERT_TRUE(memcmp(EXPECTED_DIGEST, actual, MD5_LENGTH) == 0); 51 } 52 53 54 void 55 test_MakeSHA1Mac(void) 56 { 57 #ifdef OPENSSL 58 59 const char* PKT_DATA = "abcdefgh0123"; 60 const int PKT_LEN = strlen(PKT_DATA); 61 const char* EXPECTED_DIGEST = 62 "\x17\xaa\x82\x97\xc7\x17\x13\x6a\x9b\xa9" 63 "\x63\x85\xb4\xce\xbe\x94\xa0\x97\x16\x1d"; 64 char actual[SHA1_LENGTH]; 65 66 struct key sha1; 67 sha1.next = NULL; 68 sha1.key_id = 20; 69 sha1.key_len = 7; 70 memcpy(&sha1.key_seq, "sha1seq", sha1.key_len); 71 strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen)); 72 sha1.typei = keytype_from_text(sha1.typen, NULL); 73 74 TEST_ASSERT_EQUAL(SHA1_LENGTH, 75 make_mac(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1, actual)); 76 77 TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, SHA1_LENGTH); 78 79 #else 80 81 TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 82 83 #endif /* OPENSSL */ 84 } 85 86 87 void 88 test_MakeCMac(void) 89 { 90 #if defined(OPENSSL) && defined(ENABLE_CMAC) 91 92 const char* PKT_DATA = "abcdefgh0123"; 93 const int PKT_LEN = strlen(PKT_DATA); 94 const char* EXPECTED_DIGEST = 95 "\xdd\x35\xd5\xf5\x14\x23\xd9\xd6" 96 "\x38\x5d\x29\x80\xfe\x51\xb9\x6b"; 97 char actual[CMAC_LENGTH]; 98 99 struct key cmac; 100 cmac.next = NULL; 101 cmac.key_id = 30; 102 cmac.key_len = CMAC_LENGTH; 103 memcpy(&cmac.key_seq, "aes-128-cmac-seq", cmac.key_len); 104 memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1); 105 106 TEST_ASSERT_EQUAL(CMAC_LENGTH, 107 make_mac(PKT_DATA, PKT_LEN, CMAC_LENGTH, &cmac, actual)); 108 109 TEST_ASSERT_EQUAL_MEMORY(EXPECTED_DIGEST, actual, CMAC_LENGTH); 110 111 #else 112 113 TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 114 115 #endif /* OPENSSL */ 116 } 117 118 119 void 120 test_VerifyCorrectMD5(void) 121 { 122 const char* PKT_DATA = 123 "sometestdata" /* Data */ 124 "\0\0\0\0" /* Key-ID (unused) */ 125 "\xc7\x58\x99\xdd\x99\x32\x0f\x71" /* MAC */ 126 "\x2b\x7b\xfe\x4f\xa2\x32\xcf\xac"; 127 const int PKT_LEN = 12; 128 129 struct key md5; 130 md5.next = NULL; 131 md5.key_id = 0; 132 md5.key_len = 6; 133 memcpy(&md5.key_seq, "md5key", md5.key_len); 134 strlcpy(md5.typen, "MD5", sizeof(md5.typen)); 135 md5.typei = keytype_from_text(md5.typen, NULL); 136 137 TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5)); 138 } 139 140 141 void 142 test_VerifySHA1(void) 143 { 144 #ifdef OPENSSL 145 146 const char* PKT_DATA = 147 "sometestdata" /* Data */ 148 "\0\0\0\0" /* Key-ID (unused) */ 149 "\xad\x07\xde\x36\x39\xa6\x77\xfa\x5b\xce" /* MAC */ 150 "\x2d\x8a\x7d\x06\x96\xe6\x0c\xbc\xed\xe1"; 151 const int PKT_LEN = 12; 152 153 struct key sha1; 154 sha1.next = NULL; 155 sha1.key_id = 0; 156 sha1.key_len = 7; 157 memcpy(&sha1.key_seq, "sha1key", sha1.key_len); 158 strlcpy(sha1.typen, "SHA1", sizeof(sha1.typen)); 159 sha1.typei = keytype_from_text(sha1.typen, NULL); 160 161 TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, SHA1_LENGTH, &sha1)); 162 163 #else 164 165 TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 166 167 #endif /* OPENSSL */ 168 } 169 170 171 void 172 test_VerifyCMAC(void) 173 { 174 const char* PKT_DATA = 175 "sometestdata" /* Data */ 176 "\0\0\0\0" /* Key-ID (unused) */ 177 "\x4e\x0c\xf0\xe2\xc7\x8e\xbb\xbf" /* MAC */ 178 "\x79\xfc\x87\xc7\x8b\xb7\x4a\x0b"; 179 const int PKT_LEN = 12; 180 struct key cmac; 181 182 cmac.next = NULL; 183 cmac.key_id = 0; 184 cmac.key_len = CMAC_LENGTH; 185 memcpy(&cmac.key_seq, "aes-128-cmac-key", cmac.key_len); 186 memcpy(&cmac.typen, CMAC, strlen(CMAC) + 1); 187 188 VerifyOpenSSLCMAC(&cmac); 189 VerifyLocalCMAC(&cmac); 190 } 191 192 193 void 194 VerifyOpenSSLCMAC(struct key *cmac) 195 { 196 #if defined(OPENSSL) && defined(ENABLE_CMAC) 197 198 /* XXX: HMS: auth_md5 must be renamed/incorrect. */ 199 // TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac)); 200 TEST_IGNORE_MESSAGE("VerifyOpenSSLCMAC needs to be implemented, skipping..."); 201 202 #else 203 204 TEST_IGNORE_MESSAGE("OpenSSL not found, skipping..."); 205 206 #endif /* OPENSSL */ 207 return; 208 } 209 210 211 void 212 VerifyLocalCMAC(struct key *cmac) 213 { 214 215 /* XXX: HMS: auth_md5 must be renamed/incorrect. */ 216 // TEST_ASSERT_TRUE(auth_md5(PKT_DATA, PKT_LEN, CMAC_LENGTH, cmac)); 217 218 TEST_IGNORE_MESSAGE("Hook in the local AES-128-CMAC check!"); 219 220 return; 221 } 222 223 224 void 225 test_VerifyFailure(void) 226 { 227 /* We use a copy of the MD5 verification code, but modify the 228 * last bit to make sure verification fails. 229 */ 230 const char* PKT_DATA = 231 "sometestdata" /* Data */ 232 "\0\0\0\0" /* Key-ID (unused) */ 233 "\xc7\x58\x99\xdd\x99\x32\x0f\x71" /* MAC */ 234 "\x2b\x7b\xfe\x4f\xa2\x32\xcf\x00"; /* Last byte is wrong! */ 235 const int PKT_LEN = 12; 236 237 struct key md5; 238 md5.next = NULL; 239 md5.key_id = 0; 240 md5.key_len = 6; 241 memcpy(&md5.key_seq, "md5key", md5.key_len); 242 strlcpy(md5.typen, "MD5", sizeof(md5.typen)); 243 md5.typei = keytype_from_text(md5.typen, NULL); 244 245 TEST_ASSERT_FALSE(auth_md5(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5)); 246 } 247 248 249 void 250 test_PacketSizeNotMultipleOfFourBytes(void) 251 { 252 const char* PKT_DATA = "123456"; 253 const int PKT_LEN = 6; 254 char actual[MD5_LENGTH]; 255 256 struct key md5; 257 md5.next = NULL; 258 md5.key_id = 10; 259 md5.key_len = 6; 260 memcpy(&md5.key_seq, "md5seq", md5.key_len); 261 strlcpy(md5.typen, "MD5", sizeof(md5.typen)); 262 md5.typei = keytype_from_text(md5.typen, NULL); 263 264 TEST_ASSERT_EQUAL(0, make_mac(PKT_DATA, PKT_LEN, MD5_LENGTH, &md5, actual)); 265 } 266