Home | History | Annotate | Download | only in tests
      1 /*
      2  * Test program for SHA1 and MD5
      3  * Copyright (c) 2003-2006, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License version 2 as
      7  * published by the Free Software Foundation.
      8  *
      9  * Alternatively, this software may be distributed under the terms of BSD
     10  * license.
     11  *
     12  * See README and COPYING for more details.
     13  */
     14 
     15 #include "includes.h"
     16 
     17 #include "common.h"
     18 #include "sha1.h"
     19 #include "md5.h"
     20 #include "crypto.h"
     21 
     22 
     23 static int test_eap_fast(void)
     24 {
     25 	/* draft-cam-winget-eap-fast-01.txt */
     26 	const u8 pac_key[] = {
     27 		0x0B, 0x97, 0x39, 0x0F, 0x37, 0x51, 0x78, 0x09,
     28 		0x81, 0x1E, 0xFD, 0x9C, 0x6E, 0x65, 0x94, 0x2B,
     29 		0x63, 0x2C, 0xE9, 0x53, 0x89, 0x38, 0x08, 0xBA,
     30 		0x36, 0x0B, 0x03, 0x7C, 0xD1, 0x85, 0xE4, 0x14
     31 	};
     32 	const u8 seed[] = {
     33 		0x3F, 0xFB, 0x11, 0xC4, 0x6C, 0xBF, 0xA5, 0x7A,
     34 		0x54, 0x40, 0xDA, 0xE8, 0x22, 0xD3, 0x11, 0xD3,
     35 		0xF7, 0x6D, 0xE4, 0x1D, 0xD9, 0x33, 0xE5, 0x93,
     36 		0x70, 0x97, 0xEB, 0xA9, 0xB3, 0x66, 0xF4, 0x2A,
     37 		0x00, 0x00, 0x00, 0x02, 0x6A, 0x66, 0x43, 0x2A,
     38 		0x8D, 0x14, 0x43, 0x2C, 0xEC, 0x58, 0x2D, 0x2F,
     39 		0xC7, 0x9C, 0x33, 0x64, 0xBA, 0x04, 0xAD, 0x3A,
     40 		0x52, 0x54, 0xD6, 0xA5, 0x79, 0xAD, 0x1E, 0x00
     41 	};
     42 	const u8 master_secret[] = {
     43 		0x4A, 0x1A, 0x51, 0x2C, 0x01, 0x60, 0xBC, 0x02,
     44 		0x3C, 0xCF, 0xBC, 0x83, 0x3F, 0x03, 0xBC, 0x64,
     45 		0x88, 0xC1, 0x31, 0x2F, 0x0B, 0xA9, 0xA2, 0x77,
     46 		0x16, 0xA8, 0xD8, 0xE8, 0xBD, 0xC9, 0xD2, 0x29,
     47 		0x38, 0x4B, 0x7A, 0x85, 0xBE, 0x16, 0x4D, 0x27,
     48 		0x33, 0xD5, 0x24, 0x79, 0x87, 0xB1, 0xC5, 0xA2
     49 	};
     50 	const u8 key_block[] = {
     51 		0x59, 0x59, 0xBE, 0x8E, 0x41, 0x3A, 0x77, 0x74,
     52 		0x8B, 0xB2, 0xE5, 0xD3, 0x60, 0xAC, 0x4D, 0x35,
     53 		0xDF, 0xFB, 0xC8, 0x1E, 0x9C, 0x24, 0x9C, 0x8B,
     54 		0x0E, 0xC3, 0x1D, 0x72, 0xC8, 0x84, 0x9D, 0x57,
     55 		0x48, 0x51, 0x2E, 0x45, 0x97, 0x6C, 0x88, 0x70,
     56 		0xBE, 0x5F, 0x01, 0xD3, 0x64, 0xE7, 0x4C, 0xBB,
     57 		0x11, 0x24, 0xE3, 0x49, 0xE2, 0x3B, 0xCD, 0xEF,
     58 		0x7A, 0xB3, 0x05, 0x39, 0x5D, 0x64, 0x8A, 0x44,
     59 		0x11, 0xB6, 0x69, 0x88, 0x34, 0x2E, 0x8E, 0x29,
     60 		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
     61 		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
     62 		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
     63 		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
     64 		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
     65 	};
     66 	const u8 sks[] = {
     67 		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
     68 		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
     69 		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
     70 		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
     71 		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
     72 	};
     73 	const u8 isk[] = {
     74 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     75 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     76 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     77 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     78 	};
     79 	const u8 imck[] = {
     80 		0x16, 0x15, 0x3C, 0x3F, 0x21, 0x55, 0xEF, 0xD9,
     81 		0x7F, 0x34, 0xAE, 0xC8, 0x1A, 0x4E, 0x66, 0x80,
     82 		0x4C, 0xC3, 0x76, 0xF2, 0x8A, 0xA9, 0x6F, 0x96,
     83 		0xC2, 0x54, 0x5F, 0x8C, 0xAB, 0x65, 0x02, 0xE1,
     84 		0x18, 0x40, 0x7B, 0x56, 0xBE, 0xEA, 0xA7, 0xC5,
     85 		0x76, 0x5D, 0x8F, 0x0B, 0xC5, 0x07, 0xC6, 0xB9,
     86 		0x04, 0xD0, 0x69, 0x56, 0x72, 0x8B, 0x6B, 0xB8,
     87 		0x15, 0xEC, 0x57, 0x7B
     88 	};
     89 	const u8 msk[] = {
     90 		0x4D, 0x83, 0xA9, 0xBE, 0x6F, 0x8A, 0x74, 0xED,
     91 		0x6A, 0x02, 0x66, 0x0A, 0x63, 0x4D, 0x2C, 0x33,
     92 		0xC2, 0xDA, 0x60, 0x15, 0xC6, 0x37, 0x04, 0x51,
     93 		0x90, 0x38, 0x63, 0xDA, 0x54, 0x3E, 0x14, 0xB9,
     94 		0x27, 0x99, 0x18, 0x1E, 0x07, 0xBF, 0x0F, 0x5A,
     95 		0x5E, 0x3C, 0x32, 0x93, 0x80, 0x8C, 0x6C, 0x49,
     96 		0x67, 0xED, 0x24, 0xFE, 0x45, 0x40, 0xA0, 0x59,
     97 		0x5E, 0x37, 0xC2, 0xE9, 0xD0, 0x5D, 0x0A, 0xE3
     98 	};
     99 	u8 tlv[] = {
    100 		0x80, 0x0C, 0x00, 0x38, 0x00, 0x01, 0x01, 0x00,
    101 		0xD8, 0x6A, 0x8C, 0x68, 0x3C, 0x32, 0x31, 0xA8,
    102 		0x56, 0x63, 0xB6, 0x40, 0x21, 0xFE, 0x21, 0x14,
    103 		0x4E, 0xE7, 0x54, 0x20, 0x79, 0x2D, 0x42, 0x62,
    104 		0xC9, 0xBF, 0x53, 0x7F, 0x54, 0xFD, 0xAC, 0x58,
    105 		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
    106 		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
    107 		0x05, 0xC5, 0x5B, 0xB7
    108 	};
    109 	const u8 compound_mac[] = {
    110 		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
    111 		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
    112 		0x05, 0xC5, 0x5B, 0xB7
    113 	};
    114 	u8 buf[512];
    115 	const u8 *simck, *cmk;
    116 	int errors = 0;
    117 
    118 	printf("EAP-FAST test cases\n");
    119 
    120 	printf("- T-PRF (SHA1) test case / master_secret\n");
    121 	sha1_t_prf(pac_key, sizeof(pac_key), "PAC to master secret label hash",
    122 		   seed, sizeof(seed), buf, sizeof(master_secret));
    123 	if (memcmp(master_secret, buf, sizeof(master_secret)) != 0) {
    124 		printf("T-PRF test - FAILED!\n");
    125 		errors++;
    126 	}
    127 
    128 	printf("- PRF (TLS, SHA1/MD5) test case / key_block\n");
    129 	tls_prf(master_secret, sizeof(master_secret), "key expansion",
    130 		seed, sizeof(seed), buf, sizeof(key_block));
    131 	if (memcmp(key_block, buf, sizeof(key_block)) != 0) {
    132 		printf("PRF test - FAILED!\n");
    133 		errors++;
    134 	}
    135 
    136 	printf("- T-PRF (SHA1) test case / IMCK\n");
    137 	sha1_t_prf(sks, sizeof(sks), "Inner Methods Compound Keys",
    138 		   isk, sizeof(isk), buf, sizeof(imck));
    139 	if (memcmp(imck, buf, sizeof(imck)) != 0) {
    140 		printf("T-PRF test - FAILED!\n");
    141 		errors++;
    142 	}
    143 
    144 	simck = imck;
    145 	cmk = imck + 40;
    146 
    147 	printf("- T-PRF (SHA1) test case / MSK\n");
    148 	sha1_t_prf(simck, 40, "Session Key Generating Function",
    149 		   (u8 *) "", 0, buf, sizeof(msk));
    150 	if (memcmp(msk, buf, sizeof(msk)) != 0) {
    151 		printf("T-PRF test - FAILED!\n");
    152 		errors++;
    153 	}
    154 
    155 	printf("- Compound MAC test case\n");
    156 	memset(tlv + sizeof(tlv) - 20, 0, 20);
    157 	hmac_sha1(cmk, 20, tlv, sizeof(tlv), tlv + sizeof(tlv) - 20);
    158 	if (memcmp(tlv + sizeof(tlv) - 20, compound_mac, sizeof(compound_mac))
    159 	    != 0) {
    160 		printf("Compound MAC test - FAILED!\n");
    161 		errors++;
    162 	}
    163 
    164 	return errors;
    165 }
    166 
    167 
    168 static u8 key0[] =
    169 {
    170 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
    171 	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
    172 	0x0b, 0x0b, 0x0b, 0x0b
    173 };
    174 static u8 data0[] = "Hi There";
    175 static u8 prf0[] =
    176 {
    177 	0xbc, 0xd4, 0xc6, 0x50, 0xb3, 0x0b, 0x96, 0x84,
    178 	0x95, 0x18, 0x29, 0xe0, 0xd7, 0x5f, 0x9d, 0x54,
    179 	0xb8, 0x62, 0x17, 0x5e, 0xd9, 0xf0, 0x06, 0x06,
    180 	0xe1, 0x7d, 0x8d, 0xa3, 0x54, 0x02, 0xff, 0xee,
    181 	0x75, 0xdf, 0x78, 0xc3, 0xd3, 0x1e, 0x0f, 0x88,
    182 	0x9f, 0x01, 0x21, 0x20, 0xc0, 0x86, 0x2b, 0xeb,
    183 	0x67, 0x75, 0x3e, 0x74, 0x39, 0xae, 0x24, 0x2e,
    184 	0xdb, 0x83, 0x73, 0x69, 0x83, 0x56, 0xcf, 0x5a
    185 };
    186 
    187 static u8 key1[] = "Jefe";
    188 static u8 data1[] = "what do ya want for nothing?";
    189 static u8 prf1[] =
    190 {
    191 	0x51, 0xf4, 0xde, 0x5b, 0x33, 0xf2, 0x49, 0xad,
    192 	0xf8, 0x1a, 0xeb, 0x71, 0x3a, 0x3c, 0x20, 0xf4,
    193 	0xfe, 0x63, 0x14, 0x46, 0xfa, 0xbd, 0xfa, 0x58,
    194 	0x24, 0x47, 0x59, 0xae, 0x58, 0xef, 0x90, 0x09,
    195 	0xa9, 0x9a, 0xbf, 0x4e, 0xac, 0x2c, 0xa5, 0xfa,
    196 	0x87, 0xe6, 0x92, 0xc4, 0x40, 0xeb, 0x40, 0x02,
    197 	0x3e, 0x7b, 0xab, 0xb2, 0x06, 0xd6, 0x1d, 0xe7,
    198 	0xb9, 0x2f, 0x41, 0x52, 0x90, 0x92, 0xb8, 0xfc
    199 };
    200 
    201 
    202 static u8 key2[] =
    203 {
    204 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
    205 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
    206 	0xaa, 0xaa, 0xaa, 0xaa
    207 };
    208 static u8 data2[] =
    209 {
    210 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    211 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    212 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    213 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    214 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    215 	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
    216 	0xdd, 0xdd
    217 };
    218 static u8 prf2[] =
    219 {
    220 	0xe1, 0xac, 0x54, 0x6e, 0xc4, 0xcb, 0x63, 0x6f,
    221 	0x99, 0x76, 0x48, 0x7b, 0xe5, 0xc8, 0x6b, 0xe1,
    222 	0x7a, 0x02, 0x52, 0xca, 0x5d, 0x8d, 0x8d, 0xf1,
    223 	0x2c, 0xfb, 0x04, 0x73, 0x52, 0x52, 0x49, 0xce,
    224 	0x9d, 0xd8, 0xd1, 0x77, 0xea, 0xd7, 0x10, 0xbc,
    225 	0x9b, 0x59, 0x05, 0x47, 0x23, 0x91, 0x07, 0xae,
    226 	0xf7, 0xb4, 0xab, 0xd4, 0x3d, 0x87, 0xf0, 0xa6,
    227 	0x8f, 0x1c, 0xbd, 0x9e, 0x2b, 0x6f, 0x76, 0x07
    228 };
    229 
    230 
    231 struct passphrase_test {
    232 	char *passphrase;
    233 	char *ssid;
    234 	char psk[32];
    235 };
    236 
    237 static struct passphrase_test passphrase_tests[] =
    238 {
    239 	{
    240 		"password",
    241 		"IEEE",
    242 		{
    243 			0xf4, 0x2c, 0x6f, 0xc5, 0x2d, 0xf0, 0xeb, 0xef,
    244 			0x9e, 0xbb, 0x4b, 0x90, 0xb3, 0x8a, 0x5f, 0x90,
    245 			0x2e, 0x83, 0xfe, 0x1b, 0x13, 0x5a, 0x70, 0xe2,
    246 			0x3a, 0xed, 0x76, 0x2e, 0x97, 0x10, 0xa1, 0x2e
    247 		}
    248 	},
    249 	{
    250 		"ThisIsAPassword",
    251 		"ThisIsASSID",
    252 		{
    253 			0x0d, 0xc0, 0xd6, 0xeb, 0x90, 0x55, 0x5e, 0xd6,
    254 			0x41, 0x97, 0x56, 0xb9, 0xa1, 0x5e, 0xc3, 0xe3,
    255 			0x20, 0x9b, 0x63, 0xdf, 0x70, 0x7d, 0xd5, 0x08,
    256 			0xd1, 0x45, 0x81, 0xf8, 0x98, 0x27, 0x21, 0xaf
    257 		}
    258 	},
    259 	{
    260 		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    261 		"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
    262 		{
    263 			0xbe, 0xcb, 0x93, 0x86, 0x6b, 0xb8, 0xc3, 0x83,
    264 			0x2c, 0xb7, 0x77, 0xc2, 0xf5, 0x59, 0x80, 0x7c,
    265 			0x8c, 0x59, 0xaf, 0xcb, 0x6e, 0xae, 0x73, 0x48,
    266 			0x85, 0x00, 0x13, 0x00, 0xa9, 0x81, 0xcc, 0x62
    267 		}
    268 	},
    269 };
    270 
    271 #define NUM_PASSPHRASE_TESTS \
    272 (sizeof(passphrase_tests) / sizeof(passphrase_tests[0]))
    273 
    274 
    275 int main(int argc, char *argv[])
    276 {
    277 	u8 res[512];
    278 	int ret = 0;
    279 	unsigned int i;
    280 
    281 	printf("PRF-SHA1 test cases:\n");
    282 
    283 	sha1_prf(key0, sizeof(key0), "prefix", data0, sizeof(data0) - 1,
    284 		 res, sizeof(prf0));
    285 	if (memcmp(res, prf0, sizeof(prf0)) == 0)
    286 		printf("Test case 0 - OK\n");
    287 	else {
    288 		printf("Test case 0 - FAILED!\n");
    289 		ret++;
    290 	}
    291 
    292 	sha1_prf(key1, sizeof(key1) - 1, "prefix", data1, sizeof(data1) - 1,
    293 		 res, sizeof(prf1));
    294 	if (memcmp(res, prf1, sizeof(prf1)) == 0)
    295 		printf("Test case 1 - OK\n");
    296 	else {
    297 		printf("Test case 1 - FAILED!\n");
    298 		ret++;
    299 	}
    300 
    301 	sha1_prf(key2, sizeof(key2), "prefix", data2, sizeof(data2),
    302 		 res, sizeof(prf2));
    303 	if (memcmp(res, prf2, sizeof(prf2)) == 0)
    304 		printf("Test case 2 - OK\n");
    305 	else {
    306 		printf("Test case 2 - FAILED!\n");
    307 		ret++;
    308 	}
    309 
    310 	ret += test_eap_fast();
    311 
    312 	printf("PBKDF2-SHA1 Passphrase test cases:\n");
    313 	for (i = 0; i < NUM_PASSPHRASE_TESTS; i++) {
    314 		u8 psk[32];
    315 		struct passphrase_test *test = &passphrase_tests[i];
    316 		pbkdf2_sha1(test->passphrase,
    317 			    test->ssid, strlen(test->ssid),
    318 			    4096, psk, 32);
    319 		if (memcmp(psk, test->psk, 32) == 0)
    320 			printf("Test case %d - OK\n", i);
    321 		else {
    322 			printf("Test case %d - FAILED!\n", i);
    323 			ret++;
    324 		}
    325 	}
    326 
    327 	return ret;
    328 }
    329