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