Home | History | Annotate | Line # | Download | only in tests
crypto.c revision 1.1.1.6.14.2
      1 /*	$NetBSD: crypto.c,v 1.1.1.6.14.2 2018/09/30 01:45:27 pgoyette 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