1ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt/*
2ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * crypto module tests
3ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * Copyright (c) 2014-2015, Jouni Malinen <j@w1.fi>
4ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt *
5ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * This software may be distributed under the terms of the BSD license.
6ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * See README for more details.
7ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt */
8ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
9ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "utils/includes.h"
10ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
11ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "utils/common.h"
12ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/aes_siv.h"
13ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/aes_wrap.h"
14ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/aes.h"
15ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/ms_funcs.h"
16ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/crypto.h"
17ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/sha1.h"
18ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#include "crypto/sha256.h"
19ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
20ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
21ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_siv(void)
22ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
23ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#ifdef CONFIG_MESH
24ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 5297, A.1. Deterministic Authenticated Encryption Example */
25ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key[] = {
26ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
27ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
28ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
29ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
30ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
31ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 ad[] = {
32ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
33ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
34ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
35ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
36ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plaintext[] = {
37ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
38ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee
39ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
40ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 iv_c[] = {
41ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x85, 0x63, 0x2d, 0x07, 0xc6, 0xe8, 0xf3, 0x7f,
42ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x95, 0x0a, 0xcd, 0x32, 0x0a, 0x2e, 0xcc, 0x93,
43ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x40, 0xc0, 0x2b, 0x96, 0x90, 0xc4, 0xdc, 0x04,
44ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xda, 0xef, 0x7f, 0x6a, 0xfe, 0x5c
45ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
46ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 5297, A.2. Nonce-Based Authenticated Encryption Example */
47ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key_2[] = {
48ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
49ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
50ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
51ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
52ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
53ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 ad1_2[] = {
54ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
55ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
56ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xde, 0xad, 0xda, 0xda, 0xde, 0xad, 0xda, 0xda,
57ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88,
58ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00
59ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
60ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 ad2_2[] = {
61ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80,
62ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x90, 0xa0
63ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
64ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 nonce_2[] = {
65ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x09, 0xf9, 0x11, 0x02, 0x9d, 0x74, 0xe3, 0x5b,
66ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xd8, 0x41, 0x56, 0xc5, 0x63, 0x56, 0x88, 0xc0
67ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
68ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plaintext_2[] = {
69ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
70ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x73, 0x6f, 0x6d, 0x65, 0x20, 0x70, 0x6c, 0x61,
71ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74,
72ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x6f, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70,
73ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20,
74ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x53, 0x49, 0x56, 0x2d, 0x41, 0x45, 0x53
75ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
76ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 iv_c_2[] = {
77ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x7b, 0xdb, 0x6e, 0x3b, 0x43, 0x26, 0x67, 0xeb,
78ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x06, 0xf4, 0xd1, 0x4b, 0xff, 0x2f, 0xbd, 0x0f,
79ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xcb, 0x90, 0x0f, 0x2f, 0xdd, 0xbe, 0x40, 0x43,
80ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x26, 0x60, 0x19, 0x65, 0xc8, 0x89, 0xbf, 0x17,
81ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xdb, 0xa7, 0x7c, 0xeb, 0x09, 0x4f, 0xa6, 0x63,
82ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xb7, 0xa3, 0xf7, 0x48, 0xba, 0x8a, 0xf8, 0x29,
83ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xea, 0x64, 0xad, 0x54, 0x4a, 0x27, 0x2e, 0x9c,
84ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x48, 0x5b, 0x62, 0xa3, 0xfd, 0x5c, 0x0d
85ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
86ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 out[2 * AES_BLOCK_SIZE + sizeof(plaintext_2)];
87ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 *addr[3];
88ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t len[3];
89ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
90ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 5297, A.1. Deterministic Authenticated Encryption Example */
91ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[0] = ad;
92ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[0] = sizeof(ad);
93ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
94ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_siv_encrypt(key, plaintext, sizeof(plaintext),
95ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			    1, addr, len, out)) {
96ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-SIV mode encryption failed");
97ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
98ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
99ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(out, iv_c, sizeof(iv_c)) != 0) {
100ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
101ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-SIV mode encryption returned invalid cipher text");
102ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
103ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
104ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
105ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_siv_decrypt(key, iv_c, sizeof(iv_c), 1, addr, len, out)) {
106ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-SIV mode decryption failed");
107ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
108ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
109ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(out, plaintext, sizeof(plaintext)) != 0) {
110ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
111ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-SIV mode decryption returned invalid plain text");
112ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
113ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
114ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
115ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 5297, A.2. Nonce-Based Authenticated Encryption Example */
116ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[0] = ad1_2;
117ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[0] = sizeof(ad1_2);
118ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[1] = ad2_2;
119ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[1] = sizeof(ad2_2);
120ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[2] = nonce_2;
121ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[2] = sizeof(nonce_2);
122ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
123ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_siv_encrypt(key_2, plaintext_2, sizeof(plaintext_2),
124ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			    3, addr, len, out)) {
125ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-SIV mode encryption failed");
126ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
127ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
128ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(out, iv_c_2, sizeof(iv_c_2)) != 0) {
129ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
130ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-SIV mode encryption returned invalid cipher text");
131ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
132ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
133ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
134ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_siv_decrypt(key_2, iv_c_2, sizeof(iv_c_2), 3, addr, len, out)) {
135ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-SIV mode decryption failed");
136ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
137ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
138ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(out, plaintext_2, sizeof(plaintext_2)) != 0) {
139ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
140ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-SIV mode decryption returned invalid plain text");
141ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
142ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
143ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
144ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "AES-SIV test cases passed");
145ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif /* CONFIG_MESH */
146ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
147ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
148ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
149ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
150ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
151ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt/* OMAC1 AES-128 test vectors from
152ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * http://csrc.nist.gov/CryptoToolkit/modes/proposedmodes/omac/omac-ad.pdf
153ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * which are same as the examples from NIST SP800-38B
154ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt * http://csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf
155ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt */
156ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
157ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstruct omac1_test_vector {
158ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 k[16];
159ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 msg[64];
160ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int msg_len;
161ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 tag[16];
162ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
163ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1641d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const struct omac1_test_vector omac1_test_vectors[] =
165ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
166ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
167ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
168ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
169ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ },
170ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0,
171ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
172ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 }
173ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
174ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
175ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
176ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
177ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
178ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a},
179ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		16,
180ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
181ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c }
182ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
183ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
184ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
185ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
186ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
187ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
188ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
189ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
190ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11 },
191ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		40,
192ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30,
193ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 }
194ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
195ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
196ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
197ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c },
198ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
199ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
200ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
201ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
202ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
203ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
204ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
205ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 },
206ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		64,
207ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{ 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
208ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		  0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe }
209ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
210ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
211ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
212ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
2131d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic int test_omac1_vector(const struct omac1_test_vector *tv,
2141d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt			     unsigned int i)
215ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
216ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key[] = {
217ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
218ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
219ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
220ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 msg[] = { 0x12, 0x34, 0x56 };
221ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 result[24], result2[24];
222ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 *addr[3];
223ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t len[3];
224ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
225ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (omac1_aes_128(tv->k, tv->msg, tv->msg_len, result) ||
226ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(result, tv->tag, 16) != 0) {
227ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "OMAC1-AES-128 test vector %u failed", i);
228ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
229ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
230ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
231ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (tv->msg_len > 1) {
232ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
233ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[0] = tv->msg;
234ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[0] = 1;
235ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[1] = tv->msg + 1;
236ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[1] = tv->msg_len - 1;
237ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
238ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (omac1_aes_128_vector(tv->k, 2, addr, len, result) ||
239ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(result, tv->tag, 16) != 0) {
240ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR,
241ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				   "OMAC1-AES-128(vector) test vector %u failed",
242ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				   i);
243ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			return 1;
244ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
245ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
246ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[0] = tv->msg;
247ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[0] = tv->msg_len - 2;
248ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[1] = tv->msg + tv->msg_len - 2;
249ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[1] = 1;
250ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[2] = tv->msg + tv->msg_len - 1;
251ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[2] = 1;
252ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
253ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (omac1_aes_128_vector(tv->k, 3, addr, len, result) ||
254ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(result, tv->tag, 16) != 0) {
255ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR,
256ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				   "OMAC1-AES-128(vector2) test vector %u failed",
257ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				   i);
258ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			return 1;
259ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
260ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
261ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
262ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[0] = &msg[0];
263ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[0] = 1;
264ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[1] = &msg[1];
265ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[1] = 1;
266ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	addr[2] = &msg[2];
267ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	len[2] = 1;
268ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (omac1_aes_128(key, msg, sizeof(msg), result) ||
269ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    omac1_aes_128_vector(key, 3, addr, len, result2) ||
270ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(result, result2, 16) != 0) {
271ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "OMAC1-AES-128 short test mismatch");
272ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
273ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
274ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
275ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
276ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
277ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
278ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
279ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_omac1(void)
280ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
281ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
282ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
283ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(omac1_test_vectors); i++) {
284ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (test_omac1_vector(&omac1_test_vectors[i], i))
285ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			return 1;
286ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
287ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
288ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "OMAC1-AES-128 test cases passed");
289ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
290ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
291ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
292ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
293ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
294ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_eax(void)
295ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
296ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#ifdef EAP_PSK
297ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 msg[] = { 0xF7, 0xFB };
298ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key[] = { 0x91, 0x94, 0x5D, 0x3F, 0x4D, 0xCB, 0xEE, 0x0B,
299ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     0xF4, 0x5E, 0xF5, 0x22, 0x55, 0xF0, 0x95, 0xA4 };
300ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 nonce[] = { 0xBE, 0xCA, 0xF0, 0x43, 0xB0, 0xA2, 0x3D, 0x84,
301ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       0x31, 0x94, 0xBA, 0x97, 0x2C, 0x66, 0xDE, 0xBD };
302ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 hdr[] = { 0xFA, 0x3B, 0xFD, 0x48, 0x06, 0xEB, 0x53, 0xFA };
303ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 cipher[] = { 0x19, 0xDD, 0x5C, 0x4C, 0x93, 0x31, 0x04, 0x9D,
304ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0B, 0xDA, 0xB0, 0x27, 0x74, 0x08, 0xF6, 0x79,
305ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x67, 0xE5 };
306ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 data[sizeof(msg)], tag[AES_BLOCK_SIZE];
307ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
308ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	os_memcpy(data, msg, sizeof(msg));
309ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_128_eax_encrypt(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
310ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				data, sizeof(data), tag)) {
311ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-128 EAX mode encryption failed");
312ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
313ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
314ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(data, cipher, sizeof(data)) != 0) {
315ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
316ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-128 EAX mode encryption returned invalid cipher text");
317ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
318ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
319ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(tag, cipher + sizeof(data), AES_BLOCK_SIZE) != 0) {
320ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
321ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-128 EAX mode encryption returned invalid tag");
322ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
323ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
324ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
325ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_128_eax_decrypt(key, nonce, sizeof(nonce), hdr, sizeof(hdr),
326ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				data, sizeof(data), tag)) {
327ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-128 EAX mode decryption failed");
328ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
329ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
330ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(data, msg, sizeof(data)) != 0) {
331ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR,
332ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			   "AES-128 EAX mode decryption returned invalid plain text");
333ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		return 1;
334ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
335ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
336ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "AES-128 EAX mode test cases passed");
337ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif /* EAP_PSK */
338ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
339ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
340ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
341ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
342ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
343ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_cbc(void)
344ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
345ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	struct cbc_test_vector {
346ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 key[16];
347ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 iv[16];
348ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 plain[32];
349ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 cipher[32];
350ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		size_t len;
351ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	} vectors[] = {
352ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
353ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b,
354ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06 },
355ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30,
356ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41 },
357ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"Single block msg",
358ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0xe3, 0x53, 0x77, 0x9c, 0x10, 0x79, 0xae, 0xb8,
359ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x27, 0x08, 0x94, 0x2d, 0xbe, 0x77, 0x18, 0x1a },
360ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			16
361ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
362ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
363ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0,
364ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a },
365ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28,
366ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58 },
367ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
368ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
369ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
370ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
371ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			{ 0xd2, 0x96, 0xcd, 0x94, 0xc2, 0xcc, 0xcf, 0x8a,
372ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x3a, 0x86, 0x30, 0x28, 0xb5, 0xe1, 0xdc, 0x0a,
373ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9,
374ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			  0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1 },
375ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			32
376ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
377ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
378ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int ret = 0;
379ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 *buf;
380ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
381ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
382ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(vectors); i++) {
383ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		struct cbc_test_vector *tv = &vectors[i];
384ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
385ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		buf = os_malloc(tv->len);
386ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (buf == NULL) {
387ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
388ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			break;
389ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
390ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
391ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		os_memcpy(buf, tv->plain, tv->len);
392ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (aes_128_cbc_encrypt(tv->key, tv->iv, buf, tv->len) ||
393ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(buf, tv->cipher, tv->len) != 0) {
394ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR, "AES-CBC encrypt %d failed", i);
395ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
396ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
397ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
398ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		os_memcpy(buf, tv->cipher, tv->len);
399ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (aes_128_cbc_decrypt(tv->key, tv->iv, buf, tv->len) ||
400ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(buf, tv->plain, tv->len) != 0) {
401ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR, "AES-CBC decrypt %d failed", i);
402ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
403ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
404ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
405ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		os_free(buf);
406ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
407ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
408ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return ret;
409ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
410ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
411ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
412ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_ecb(void)
413ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
414ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#ifdef EAP_PSK
415ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	struct ecb_test_vector {
416ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		char *key;
417ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		char *plaintext;
418ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		char *ciphertext;
419ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	} vectors[] = {
420ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		/* CAVS 11.1 - ECBGFSbox128.rsp */
421ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
422ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
423ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"f34481ec3cc627bacd5dc3fb08f273e6",
424ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"0336763e966d92595a567cc9ce537f5e"
425ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
426ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
427ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
428ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"9798c4640bad75c7c3227db910174e72",
429ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"a9a1631bf4996954ebc093957b234589"
430ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
431ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
432ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
433ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"96ab5c2ff612d9dfaae8c31f30c42168",
434ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"ff4f8391a6a40ca5b25d23bedd44a597"
435ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
436ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
437ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
438ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"6a118a874519e64e9963798a503f1d35",
439ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"dc43be40be0e53712f7e2bf5ca707209"
440ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
441ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
442ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
443ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"cb9fceec81286ca3e989bd979b0cb284",
444ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"92beedab1895a94faa69b632e5cc47ce"
445ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
446ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
447ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
448ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"b26aeb1874e47ca8358ff22378f09144",
449ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"459264f4798f6a78bacb89c15ed3d601"
450ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
451ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
452ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
453ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"58c8e00b2631686d54eab84b91f0aca1",
454ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"08a4e2efec8a8e3312ca7460b9040bbf"
455ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
456ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		/* CAVS 11.1 - ECBKeySbox128.rsp */
457ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
458ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"10a58869d74be5a374cf867cfb473859",
459ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
460ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"6d251e6944b051e04eaa6fb4dbf78465"
461ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
462ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
463ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"caea65cdbb75e9169ecd22ebe6e54675",
464ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"00000000000000000000000000000000",
465ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"6e29201190152df4ee058139def610bb",
466ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
467ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
468ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int ret = 0;
469ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
470ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key[16], plain[16], cipher[16], out[16];
471ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
472ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(vectors); i++) {
473ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		struct ecb_test_vector *tv = &vectors[i];
474ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
475ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (hexstr2bin(tv->key, key, sizeof(key)) ||
476ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    hexstr2bin(tv->plaintext, plain, sizeof(plain)) ||
477ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    hexstr2bin(tv->ciphertext, cipher, sizeof(cipher))) {
478ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR, "Invalid AES-ECB test vector %u",
479ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				   i);
480ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
481ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			continue;
482ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
483ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
484ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (aes_128_encrypt_block(key, plain, out) < 0 ||
485ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(out, cipher, 16) != 0) {
486ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_ERROR, "AES-ECB encrypt %u failed", i);
487ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
488ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
489ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
490ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
491ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (!ret)
492ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "AES ECB mode test cases passed");
493ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
494ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return ret;
495ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif /* EAP_PSK */
496ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
497ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
498ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
499ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
500ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
501ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_key_wrap(void)
502ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
503ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int ret = 0;
504ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
505ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.1 */
506ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek41[] = {
507ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
508ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
509ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
510ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain41[] = {
511ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
512ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
513ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
514ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt41[] = {
515ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x1F, 0xA6, 0x8B, 0x0A, 0x81, 0x12, 0xB4, 0x47,
516ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xAE, 0xF3, 0x4B, 0xD8, 0xFB, 0x5A, 0x7B, 0x82,
517ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x9D, 0x3E, 0x86, 0x23, 0x71, 0xD2, 0xCF, 0xE5
518ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
519ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.2 */
520ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek42[] = {
521ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
522ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
523ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
524ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
525ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain42[] = {
526ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
527ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
528ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
529ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt42[] = {
530ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x96, 0x77, 0x8B, 0x25, 0xAE, 0x6C, 0xA4, 0x35,
531ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xF9, 0x2B, 0x5B, 0x97, 0xC0, 0x50, 0xAE, 0xD2,
532ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x46, 0x8A, 0xB8, 0xA1, 0x7A, 0xD8, 0x4E, 0x5D
533ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
534ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.3 */
535ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek43[] = {
536ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
537ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
538ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
539ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
540ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
541ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain43[] = {
542ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
543ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
544ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
545ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt43[] = {
546ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x64, 0xE8, 0xC3, 0xF9, 0xCE, 0x0F, 0x5B, 0xA2,
547ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x63, 0xE9, 0x77, 0x79, 0x05, 0x81, 0x8A, 0x2A,
548ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x93, 0xC8, 0x19, 0x1E, 0x7D, 0x6E, 0x8A, 0xE7,
549ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
550ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.4 */
551ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek44[] = {
552ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
553ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
554ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
555ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
556ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain44[] = {
557ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
558ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
559ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
560ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
561ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt44[] = {
562ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x03, 0x1D, 0x33, 0x26, 0x4E, 0x15, 0xD3, 0x32,
563ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x68, 0xF2, 0x4E, 0xC2, 0x60, 0x74, 0x3E, 0xDC,
564ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xE1, 0xC6, 0xC7, 0xDD, 0xEE, 0x72, 0x5A, 0x93,
565ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x6B, 0xA8, 0x14, 0x91, 0x5C, 0x67, 0x62, 0xD2
566ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
567ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.5 */
568ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek45[] = {
569ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
570ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
571ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
572ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
573ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
574ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain45[] = {
575ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
576ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
577ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
578ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
579ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt45[] = {
580ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xA8, 0xF9, 0xBC, 0x16, 0x12, 0xC6, 0x8B, 0x3F,
581ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xF6, 0xE6, 0xF4, 0xFB, 0xE3, 0x0E, 0x71, 0xE4,
582ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x76, 0x9C, 0x8B, 0x80, 0xA3, 0x2C, 0xB8, 0x95,
583ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8C, 0xD5, 0xD1, 0x7D, 0x6B, 0x25, 0x4D, 0xA1,
584ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
585ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 3394 - Test vector 4.6 */
586ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 kek46[] = {
587ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
588ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
589ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
590ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
591ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
592ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 plain46[] = {
593ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
594ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
595ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
596ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
597ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
598ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 crypt46[] = {
599ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x28, 0xC9, 0xF4, 0x04, 0xC4, 0xB8, 0x10, 0xF4,
600ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xCB, 0xCC, 0xB3, 0x5C, 0xFB, 0x87, 0xF8, 0x26,
601ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x3F, 0x57, 0x86, 0xE2, 0xD8, 0x0E, 0xD3, 0x26,
602ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xCB, 0xC7, 0xF0, 0xE7, 0x1A, 0x99, 0xF4, 0x3B,
603ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xFB, 0x98, 0x8B, 0x9B, 0x7A, 0x02, 0xDD, 0x21
604ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
605ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 result[40];
606ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
607ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.1");
608ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek41, sizeof(kek41), sizeof(plain41) / 8, plain41,
609ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
610ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-128 reported failure");
611ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
612ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
613ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt41, sizeof(crypt41)) != 0) {
614ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-128 failed");
615ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
616ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
617ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek41, sizeof(kek41), sizeof(plain41) / 8, crypt41,
618ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
619ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 reported failure");
620ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
621ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
622ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain41, sizeof(plain41)) != 0) {
623ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-128 failed");
624ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
625ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
626ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.2");
628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek42, sizeof(kek42), sizeof(plain42) / 8, plain42,
629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
630ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
631ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
632ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
633ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt42, sizeof(crypt42)) != 0) {
634ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
635ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
636ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
637ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek42, sizeof(kek42), sizeof(plain42) / 8, crypt42,
638ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
639ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
640ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
641ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
642ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain42, sizeof(plain42)) != 0) {
643ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
644ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
645ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
646ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
647ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.3");
648ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek43, sizeof(kek43), sizeof(plain43) / 8, plain43,
649ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
650ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
651ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
652ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
653ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt43, sizeof(crypt43)) != 0) {
654ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
655ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
656ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
657ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek43, sizeof(kek43), sizeof(plain43) / 8, crypt43,
658ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
659ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
660ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
661ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
662ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain43, sizeof(plain43)) != 0) {
663ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
664ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
665ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
666ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
667ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.4");
668ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek44, sizeof(kek44), sizeof(plain44) / 8, plain44,
669ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
670ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-192 reported failure");
671ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
672ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
673ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt44, sizeof(crypt44)) != 0) {
674ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-192 failed");
675ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
676ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
677ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek44, sizeof(kek44), sizeof(plain44) / 8, crypt44,
678ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
679ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 reported failure");
680ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
681ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
682ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain44, sizeof(plain44)) != 0) {
683ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-192 failed");
684ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
685ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
686ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
687ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.5");
688ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek45, sizeof(kek45), sizeof(plain45) / 8, plain45,
689ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
690ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
691ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
692ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
693ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt45, sizeof(crypt45)) != 0) {
694ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
695ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
696ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
697ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek45, sizeof(kek45), sizeof(plain45) / 8, crypt45,
698ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
699ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
700ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
701ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
702ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain45, sizeof(plain45)) != 0) {
703ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
704ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
705ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
706ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
707ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "RFC 3394 - Test vector 4.6");
708ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_wrap(kek46, sizeof(kek46), sizeof(plain46) / 8, plain46,
709ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     result)) {
710ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 reported failure");
711ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
712ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
713ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, crypt46, sizeof(crypt46)) != 0) {
714ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-WRAP-256 failed");
715ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
716ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
717ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (aes_unwrap(kek46, sizeof(kek46), sizeof(plain46) / 8, crypt46,
718ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       result)) {
719ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 reported failure");
720ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
721ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
722ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (os_memcmp(result, plain46, sizeof(plain46)) != 0) {
723ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "AES-UNWRAP-256 failed");
724ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
725ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
726ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
727ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (!ret)
728ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "AES key wrap/unwrap test cases passed");
729ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
730ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return ret;
731ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
732ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
733ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
734ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_md5(void)
735ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
736ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	struct {
737ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		char *data;
738ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		char *hash;
739ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	} tests[] = {
740ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
741ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"",
742ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04"
743ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xe9\x80\x09\x98\xec\xf8\x42\x7e"
744ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
745ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
746ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"a",
747ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8"
748ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x31\xc3\x99\xe2\x69\x77\x26\x61"
749ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
750ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
751ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"abc",
752ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x90\x01\x50\x98\x3c\xd2\x4f\xb0"
753ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xd6\x96\x3f\x7d\x28\xe1\x7f\x72"
754ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
755ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
756ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"message digest",
757ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d"
758ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"
759ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
760ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
761ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"abcdefghijklmnopqrstuvwxyz",
762ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xc3\xfc\xd3\xd7\x61\x92\xe4\x00"
763ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x7d\xfb\x49\x6c\xca\x67\xe1\x3b"
764ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
765ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
766ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
767ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"0123456789",
768ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xd1\x74\xab\x98\xd2\x77\xd9\xf5"
769ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f"
770ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
771ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
772ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"12345678901234567890123456789012345678901234567890"
773ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"123456789012345678901234567890",
774ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\x57\xed\xf4\xa2\x2b\xe3\xc9\x55"
775ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			"\xac\x49\xda\x2e\x21\x07\xb6\x7a"
776ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
777ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
778ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
779ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 hash[16];
780ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 *addr[2];
781ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t len[2];
782ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int errors = 0;
783ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
784ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(tests); i++) {
785ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "MD5 test case %d", i);
786ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
787ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[0] = (u8 *) tests[i].data;
788ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[0] = strlen(tests[i].data);
789ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (md5_vector(1, addr, len, hash) < 0 ||
790ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(hash, tests[i].hash, 16) != 0) {
791ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " FAIL");
792ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			errors++;
793ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		} else
794ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " OK");
795ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
796ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (len[0]) {
797ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[0] = (u8 *) tests[i].data;
798ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[0] = strlen(tests[i].data);
799ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[1] = (u8 *) tests[i].data + 1;
800ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[1] = strlen(tests[i].data) - 1;
801ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			if (md5_vector(1, addr, len, hash) < 0 ||
802ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			    os_memcmp(hash, tests[i].hash, 16) != 0) {
803ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " FAIL");
804ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				errors++;
805ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			} else
806ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " OK");
807ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
808ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
809ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
810ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (!errors)
811ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "MD5 test cases passed");
812ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
813ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return errors;
814ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
815ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
816ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
817ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_eap_fast(void)
818ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
819ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#ifdef EAP_FAST
820ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 4851, Appendix B.1 */
821ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 pac_key[] = {
822ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x0B, 0x97, 0x39, 0x0F, 0x37, 0x51, 0x78, 0x09,
823ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x81, 0x1E, 0xFD, 0x9C, 0x6E, 0x65, 0x94, 0x2B,
824ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x63, 0x2C, 0xE9, 0x53, 0x89, 0x38, 0x08, 0xBA,
825ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x36, 0x0B, 0x03, 0x7C, 0xD1, 0x85, 0xE4, 0x14
826ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
827ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 seed[] = {
828ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x3F, 0xFB, 0x11, 0xC4, 0x6C, 0xBF, 0xA5, 0x7A,
829ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x54, 0x40, 0xDA, 0xE8, 0x22, 0xD3, 0x11, 0xD3,
830ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xF7, 0x6D, 0xE4, 0x1D, 0xD9, 0x33, 0xE5, 0x93,
831ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x70, 0x97, 0xEB, 0xA9, 0xB3, 0x66, 0xF4, 0x2A,
832ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x00, 0x00, 0x02, 0x6A, 0x66, 0x43, 0x2A,
833ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8D, 0x14, 0x43, 0x2C, 0xEC, 0x58, 0x2D, 0x2F,
834ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xC7, 0x9C, 0x33, 0x64, 0xBA, 0x04, 0xAD, 0x3A,
835ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x52, 0x54, 0xD6, 0xA5, 0x79, 0xAD, 0x1E, 0x00
836ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
837ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 master_secret[] = {
838ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x4A, 0x1A, 0x51, 0x2C, 0x01, 0x60, 0xBC, 0x02,
839ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x3C, 0xCF, 0xBC, 0x83, 0x3F, 0x03, 0xBC, 0x64,
840ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x88, 0xC1, 0x31, 0x2F, 0x0B, 0xA9, 0xA2, 0x77,
841ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x16, 0xA8, 0xD8, 0xE8, 0xBD, 0xC9, 0xD2, 0x29,
842ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x38, 0x4B, 0x7A, 0x85, 0xBE, 0x16, 0x4D, 0x27,
843ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x33, 0xD5, 0x24, 0x79, 0x87, 0xB1, 0xC5, 0xA2
844ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
845ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 key_block[] = {
846ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x59, 0x59, 0xBE, 0x8E, 0x41, 0x3A, 0x77, 0x74,
847ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8B, 0xB2, 0xE5, 0xD3, 0x60, 0xAC, 0x4D, 0x35,
848ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xDF, 0xFB, 0xC8, 0x1E, 0x9C, 0x24, 0x9C, 0x8B,
849ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x0E, 0xC3, 0x1D, 0x72, 0xC8, 0x84, 0x9D, 0x57,
850ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x48, 0x51, 0x2E, 0x45, 0x97, 0x6C, 0x88, 0x70,
851ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xBE, 0x5F, 0x01, 0xD3, 0x64, 0xE7, 0x4C, 0xBB,
852ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x11, 0x24, 0xE3, 0x49, 0xE2, 0x3B, 0xCD, 0xEF,
853ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x7A, 0xB3, 0x05, 0x39, 0x5D, 0x64, 0x8A, 0x44,
854ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x11, 0xB6, 0x69, 0x88, 0x34, 0x2E, 0x8E, 0x29,
855ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
856ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
857ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
858ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
859ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
860ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
861ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 sks[] = {
862ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xD6, 0x4B, 0x7D, 0x72, 0x17, 0x59, 0x28, 0x05,
863ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xAF, 0xF9, 0xB7, 0xFF, 0x66, 0x6D, 0xA1, 0x96,
864ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8F, 0x0B, 0x5E, 0x06, 0x46, 0x7A, 0x44, 0x84,
865ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x64, 0xC1, 0xC8, 0x0C, 0x96, 0x44, 0x09, 0x98,
866ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xFF, 0x92, 0xA8, 0xB4, 0xC6, 0x42, 0x28, 0x71
867ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
868ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 isk[] = {
869ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
873ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
874ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 imck[] = {
875ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x16, 0x15, 0x3C, 0x3F, 0x21, 0x55, 0xEF, 0xD9,
876ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x7F, 0x34, 0xAE, 0xC8, 0x1A, 0x4E, 0x66, 0x80,
877ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x4C, 0xC3, 0x76, 0xF2, 0x8A, 0xA9, 0x6F, 0x96,
878ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xC2, 0x54, 0x5F, 0x8C, 0xAB, 0x65, 0x02, 0xE1,
879ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x18, 0x40, 0x7B, 0x56, 0xBE, 0xEA, 0xA7, 0xC5,
880ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x76, 0x5D, 0x8F, 0x0B, 0xC5, 0x07, 0xC6, 0xB9,
881ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x04, 0xD0, 0x69, 0x56, 0x72, 0x8B, 0x6B, 0xB8,
882ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x15, 0xEC, 0x57, 0x7B
883ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
884ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 msk[] = {
885ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x4D, 0x83, 0xA9, 0xBE, 0x6F, 0x8A, 0x74, 0xED,
886ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x6A, 0x02, 0x66, 0x0A, 0x63, 0x4D, 0x2C, 0x33,
887ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xC2, 0xDA, 0x60, 0x15, 0xC6, 0x37, 0x04, 0x51,
888ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x90, 0x38, 0x63, 0xDA, 0x54, 0x3E, 0x14, 0xB9,
889ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x27, 0x99, 0x18, 0x1E, 0x07, 0xBF, 0x0F, 0x5A,
890ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x5E, 0x3C, 0x32, 0x93, 0x80, 0x8C, 0x6C, 0x49,
891ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x67, 0xED, 0x24, 0xFE, 0x45, 0x40, 0xA0, 0x59,
892ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x5E, 0x37, 0xC2, 0xE9, 0xD0, 0x5D, 0x0A, 0xE3
893ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
894ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 emsk[] = {
895ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x3A, 0xD4, 0xAB, 0xDB, 0x76, 0xB2, 0x7F, 0x3B,
896ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xEA, 0x32, 0x2C, 0x2B, 0x74, 0xF4, 0x28, 0x55,
897ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xEF, 0x2D, 0xBA, 0x78, 0xC9, 0x57, 0x2F, 0x0D,
898ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x06, 0xCD, 0x51, 0x7C, 0x20, 0x93, 0x98, 0xA9,
899ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x76, 0xEA, 0x70, 0x21, 0xD7, 0x0E, 0x25, 0x54,
900ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x97, 0xED, 0xB2, 0x8A, 0xF6, 0xED, 0xFD, 0x0A,
901ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x2A, 0xE7, 0xA1, 0x58, 0x90, 0x10, 0x50, 0x44,
902ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xB3, 0x82, 0x85, 0xDB, 0x06, 0x14, 0xD2, 0xF9
903ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
904ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* RFC 4851, Appendix B.2 */
905ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 tlv[] = {
906ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x80, 0x0C, 0x00, 0x38, 0x00, 0x01, 0x01, 0x00,
907ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xD8, 0x6A, 0x8C, 0x68, 0x3C, 0x32, 0x31, 0xA8,
908ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x56, 0x63, 0xB6, 0x40, 0x21, 0xFE, 0x21, 0x14,
909ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x4E, 0xE7, 0x54, 0x20, 0x79, 0x2D, 0x42, 0x62,
910ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xC9, 0xBF, 0x53, 0x7F, 0x54, 0xFD, 0xAC, 0x58,
911ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
912ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
913ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x05, 0xC5, 0x5B, 0xB7
914ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
915ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 compound_mac[] = {
916ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x43, 0x24, 0x6E, 0x30, 0x92, 0x17, 0x6D, 0xCF,
917ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xE6, 0xE0, 0x69, 0xEB, 0x33, 0x61, 0x6A, 0xCC,
918ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x05, 0xC5, 0x5B, 0xB7
919ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
920ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 buf[512];
921ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 *simck, *cmk;
922ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int errors = 0;
923ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
924ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "EAP-FAST test cases");
925ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
926ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / master_secret");
927ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_t_prf(pac_key, sizeof(pac_key),
928ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       "PAC to master secret label hash",
929ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       seed, sizeof(seed), buf, sizeof(master_secret)) < 0 ||
930ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(master_secret, buf, sizeof(master_secret)) != 0) {
931ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
932ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
933ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
934ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
935ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- PRF (TLS, SHA1/MD5) test case / key_block");
936ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (tls_prf_sha1_md5(master_secret, sizeof(master_secret),
937ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			     "key expansion", seed, sizeof(seed),
938ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			     buf, sizeof(key_block)) ||
939ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(key_block, buf, sizeof(key_block)) != 0) {
940ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "PRF test - FAILED!");
941ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
942ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
943ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
944ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / IMCK");
945ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_t_prf(sks, sizeof(sks), "Inner Methods Compound Keys",
946ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       isk, sizeof(isk), buf, sizeof(imck)) < 0 ||
947ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(imck, buf, sizeof(imck)) != 0) {
948ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
949ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
950ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
951ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
952ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	simck = imck;
953ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	cmk = imck + 40;
954ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
955ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / MSK");
956ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_t_prf(simck, 40, "Session Key Generating Function",
957ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
958ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(msk, buf, sizeof(msk)) != 0) {
959ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
960ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
961ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
962ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
963ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- T-PRF (SHA1) test case / EMSK");
964ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_t_prf(simck, 40, "Extended Session Key Generating Function",
965ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		       (u8 *) "", 0, buf, sizeof(msk)) < 0 ||
966ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(emsk, buf, sizeof(emsk)) != 0) {
967ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "T-PRF test - FAILED!");
968ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
969ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
970ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
971ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "- Compound MAC test case");
972ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	os_memset(tlv + sizeof(tlv) - 20, 0, 20);
973ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (hmac_sha1(cmk, 20, tlv, sizeof(tlv), tlv + sizeof(tlv) - 20) < 0 ||
974ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(tlv + sizeof(tlv) - 20, compound_mac,
975ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		      sizeof(compound_mac)) != 0) {
976ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Compound MAC test - FAILED!");
977ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
978ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
979ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
980ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return errors;
981ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#else /* EAP_FAST */
982ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return 0;
983ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif /* EAP_FAST */
984ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
985ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
986ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
9871d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 key0[] =
988ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
989ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
990ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
991ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x0b, 0x0b, 0x0b, 0x0b
992ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
9931d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 data0[] = "Hi There";
9941d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 prf0[] =
995ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
996ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xbc, 0xd4, 0xc6, 0x50, 0xb3, 0x0b, 0x96, 0x84,
997ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x95, 0x18, 0x29, 0xe0, 0xd7, 0x5f, 0x9d, 0x54,
998ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xb8, 0x62, 0x17, 0x5e, 0xd9, 0xf0, 0x06, 0x06,
999ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xe1, 0x7d, 0x8d, 0xa3, 0x54, 0x02, 0xff, 0xee,
1000ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x75, 0xdf, 0x78, 0xc3, 0xd3, 0x1e, 0x0f, 0x88,
1001ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x9f, 0x01, 0x21, 0x20, 0xc0, 0x86, 0x2b, 0xeb,
1002ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x67, 0x75, 0x3e, 0x74, 0x39, 0xae, 0x24, 0x2e,
1003ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdb, 0x83, 0x73, 0x69, 0x83, 0x56, 0xcf, 0x5a
1004ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1005ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
10061d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 key1[] = "Jefe";
10071d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 data1[] = "what do ya want for nothing?";
10081d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 prf1[] =
1009ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1010ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x51, 0xf4, 0xde, 0x5b, 0x33, 0xf2, 0x49, 0xad,
1011ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xf8, 0x1a, 0xeb, 0x71, 0x3a, 0x3c, 0x20, 0xf4,
1012ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xfe, 0x63, 0x14, 0x46, 0xfa, 0xbd, 0xfa, 0x58,
1013ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x24, 0x47, 0x59, 0xae, 0x58, 0xef, 0x90, 0x09,
1014ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xa9, 0x9a, 0xbf, 0x4e, 0xac, 0x2c, 0xa5, 0xfa,
1015ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x87, 0xe6, 0x92, 0xc4, 0x40, 0xeb, 0x40, 0x02,
1016ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x3e, 0x7b, 0xab, 0xb2, 0x06, 0xd6, 0x1d, 0xe7,
1017ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xb9, 0x2f, 0x41, 0x52, 0x90, 0x92, 0xb8, 0xfc
1018ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1019ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1020ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
10211d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 key2[] =
1022ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1023ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1024ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1025ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xaa, 0xaa, 0xaa, 0xaa
1026ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
10271d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 data2[] =
1028ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1029ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1030ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1031ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1032ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1033ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1034ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1035ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xdd, 0xdd
1036ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
10371d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const u8 prf2[] =
1038ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1039ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xe1, 0xac, 0x54, 0x6e, 0xc4, 0xcb, 0x63, 0x6f,
1040ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x99, 0x76, 0x48, 0x7b, 0xe5, 0xc8, 0x6b, 0xe1,
1041ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x7a, 0x02, 0x52, 0xca, 0x5d, 0x8d, 0x8d, 0xf1,
1042ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x2c, 0xfb, 0x04, 0x73, 0x52, 0x52, 0x49, 0xce,
1043ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x9d, 0xd8, 0xd1, 0x77, 0xea, 0xd7, 0x10, 0xbc,
1044ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x9b, 0x59, 0x05, 0x47, 0x23, 0x91, 0x07, 0xae,
1045ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0xf7, 0xb4, 0xab, 0xd4, 0x3d, 0x87, 0xf0, 0xa6,
1046ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	0x8f, 0x1c, 0xbd, 0x9e, 0x2b, 0x6f, 0x76, 0x07
1047ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1048ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1049ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1050ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstruct passphrase_test {
1051ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *passphrase;
1052ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *ssid;
1053ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char psk[32];
1054ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1055ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
10561d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const struct passphrase_test passphrase_tests[] =
1057ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1058ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1059ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"password",
1060ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"IEEE",
1061ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1062ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xf4, 0x2c, 0x6f, 0xc5, 0x2d, 0xf0, 0xeb, 0xef,
1063ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x9e, 0xbb, 0x4b, 0x90, 0xb3, 0x8a, 0x5f, 0x90,
1064ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x2e, 0x83, 0xfe, 0x1b, 0x13, 0x5a, 0x70, 0xe2,
1065ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x3a, 0xed, 0x76, 0x2e, 0x97, 0x10, 0xa1, 0x2e
1066ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1067ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1068ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1069ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"ThisIsAPassword",
1070ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"ThisIsASSID",
1071ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1072ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0d, 0xc0, 0xd6, 0xeb, 0x90, 0x55, 0x5e, 0xd6,
1073ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x41, 0x97, 0x56, 0xb9, 0xa1, 0x5e, 0xc3, 0xe3,
1074ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x20, 0x9b, 0x63, 0xdf, 0x70, 0x7d, 0xd5, 0x08,
1075ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xd1, 0x45, 0x81, 0xf8, 0x98, 0x27, 0x21, 0xaf
1076ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1077ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1078ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1079ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1080ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
1081ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1082ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xbe, 0xcb, 0x93, 0x86, 0x6b, 0xb8, 0xc3, 0x83,
1083ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x2c, 0xb7, 0x77, 0xc2, 0xf5, 0x59, 0x80, 0x7c,
1084ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x8c, 0x59, 0xaf, 0xcb, 0x6e, 0xae, 0x73, 0x48,
1085ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x85, 0x00, 0x13, 0x00, 0xa9, 0x81, 0xcc, 0x62
1086ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1087ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1088ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1089ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1090ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#define NUM_PASSPHRASE_TESTS ARRAY_SIZE(passphrase_tests)
1091ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1092ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1093ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstruct rfc6070_test {
1094ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *p;
1095ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *s;
1096ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int c;
1097ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char dk[32];
1098ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t dk_len;
1099ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1100ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
11011d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const struct rfc6070_test rfc6070_tests[] =
1102ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1103ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1104ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"password",
1105ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"salt",
1106ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		1,
1107ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1108ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,
1109ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,
1110ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x2f, 0xe0, 0x37, 0xa6
1111ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1112ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		20
1113ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1114ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1115ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"password",
1116ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"salt",
1117ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		2,
1118ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1119ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,
1120ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,
1121ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xd8, 0xde, 0x89, 0x57
1122ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1123ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		20
1124ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1125ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1126ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"password",
1127ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"salt",
1128ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		4096,
1129ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1130ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,
1131ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,
1132ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x65, 0xa4, 0x29, 0xc1
1133ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1134ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		20
1135ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1136ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#if 0 /* This takes quite long to derive.. */
1137ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1138ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"password",
1139ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"salt",
1140ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		16777216,
1141ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1142ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4,
1143ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c,
1144ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x26, 0x34, 0xe9, 0x84
1145ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1146ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		20
1147ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1148ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif
1149ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1150ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"passwordPASSWORDpassword",
1151ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"saltSALTsaltSALTsaltSALTsaltSALTsalt",
1152ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		4096,
1153ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1154ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,
1155ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,
1156ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,
1157ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x38
1158ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1159ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		25
1160ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1161ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#if 0 /* \0 not currently supported in passphrase parameters.. */
1162ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1163ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"pass\0word",
1164ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"sa\0lt",
1165ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		4096,
1166ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1167ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,
1168ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3
1169ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1170ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		16
1171ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1172ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#endif
1173ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1174ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1175ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt#define NUM_RFC6070_TESTS ARRAY_SIZE(rfc6070_tests)
1176ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1177ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1178ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_sha1(void)
1179ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1180ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 res[512];
1181ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int ret = 0;
1182ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
1183ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1184ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "PRF-SHA1 test cases:");
1185ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1186ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_prf(key0, sizeof(key0), "prefix", data0, sizeof(data0) - 1,
1187ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     res, sizeof(prf0)) == 0 &&
1188ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(res, prf0, sizeof(prf0)) == 0)
1189ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 0 - OK");
1190ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	else {
1191ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 0 - FAILED!");
1192ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
1193ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1194ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1195ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_prf(key1, sizeof(key1) - 1, "prefix", data1, sizeof(data1) - 1,
1196ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     res, sizeof(prf1)) == 0 &&
1197ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(res, prf1, sizeof(prf1)) == 0)
1198ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 1 - OK");
1199ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	else {
1200ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 1 - FAILED!");
1201ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
1202ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1203ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1204ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (sha1_prf(key2, sizeof(key2), "prefix", data2, sizeof(data2),
1205ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		     res, sizeof(prf2)) == 0 &&
1206ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(res, prf2, sizeof(prf2)) == 0)
1207ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 2 - OK");
1208ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	else {
1209ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "Test case 2 - FAILED!");
1210ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret++;
1211ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1212ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1213ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	ret += test_eap_fast();
1214ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1215ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "PBKDF2-SHA1 Passphrase test cases:");
1216ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < NUM_PASSPHRASE_TESTS; i++) {
1217ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 psk[32];
12181d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt		const struct passphrase_test *test = &passphrase_tests[i];
1219ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1220ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (pbkdf2_sha1(test->passphrase,
1221ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				(const u8 *) test->ssid, strlen(test->ssid),
1222ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				4096, psk, 32) == 0 &&
1223ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(psk, test->psk, 32) == 0)
1224ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1225ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		else {
1226ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1227ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
1228ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1229ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1230ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1231ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "PBKDF2-SHA1 test cases (RFC 6070):");
1232ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < NUM_RFC6070_TESTS; i++) {
1233ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		u8 dk[25];
12341d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt		const struct rfc6070_test *test = &rfc6070_tests[i];
1235ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1236ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (pbkdf2_sha1(test->p, (const u8 *) test->s, strlen(test->s),
1237ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				test->c, dk, test->dk_len) == 0 &&
1238ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(dk, test->dk, test->dk_len) == 0)
1239ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, "Test case %d - OK", i);
1240ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		else {
1241ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, "Test case %d - FAILED!", i);
1242ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			ret++;
1243ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1244ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1245ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1246ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (!ret)
1247ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "SHA1 test cases passed");
1248ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return ret;
1249ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
1250ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1251ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
12521d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtconst struct {
1253ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *data;
1254ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 hash[32];
1255ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt} tests[] = {
1256ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1257ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abc",
1258ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1259ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
1260ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
1261ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
1262ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
1263ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1264ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1265ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1266ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1267ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1268ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
1269ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
1270ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
1271ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1
1272ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1273ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1274ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1275ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
12761d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtconst struct hmac_test {
1277ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 key[80];
1278ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t key_len;
1279ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 data[128];
1280ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t data_len;
1281ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 hash[32];
1282ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt} hmac_tests[] = {
1283ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* draft-ietf-ipsec-ciph-sha-256-01.txt */
1284ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1285ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1286ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1287ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1288ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1289ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1290ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1291ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1292ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abc", 3,
1293ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1294ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
1295ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
1296ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
1297ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81
1298ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1299ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1300ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1301ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1302ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1303ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1304ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1305ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1306ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1307ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1308ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1309ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		56,
1310ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1311ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
1312ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
1313ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
1314ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30
1315ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1316ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1317ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1318ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1319ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1320ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1321ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1322ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
1323ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1324ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1325ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
1326ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
1327ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		112,
1328ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1329ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
1330ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
1331ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
1332ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3
1333ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1334ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1335ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1336ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1337ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1338ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1339ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
1340ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
1341ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1342ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1343ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Hi There",
1344ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		8,
1345ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1346ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
1347ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
1348ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
1349ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7
1350ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1351ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1352ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1353ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Jefe",
1354ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		4,
1355ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"what do ya want for nothing?",
1356ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		28,
1357ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1358ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
1359ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
1360ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
1361ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43
1362ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1363ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1364ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1365ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1366ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1367ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1368ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1369ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1370ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1371ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1372ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1373ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1374ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1375ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1376ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1377ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1378ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1379ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xdd, 0xdd
1380ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1381ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		50,
1382ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1383ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
1384ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
1385ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
1386ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0
1387ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1388ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1389ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1390ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1391ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1392ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1393ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1394ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1395ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x21, 0x22, 0x23, 0x24, 0x25
1396ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1397ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		37,
1398ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1399ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1400ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1401ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1402ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1403ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1404ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1405ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xcd, 0xcd
1406ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1407ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		50,
1408ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1409ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
1410ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
1411ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
1412ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17
1413ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1414ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1415ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1416ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1417ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1418ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1419ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1420ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
1421ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1422ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		32,
1423ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Test With Truncation",
1424ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		20,
1425ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1426ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
1427ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
1428ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
1429ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42
1430ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1431ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1432ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1433ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1434ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1435ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1436ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1437ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1438ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1439ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1440ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1441ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1442ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1443ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1444ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1445ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		80,
1446ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Test Using Larger Than Block-Size Key - Hash Key First",
1447ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		54,
1448ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1449ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
1450ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
1451ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
1452ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f
1453ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1454ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	},
1455ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	{
1456ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1457ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1458ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1459ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1460ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1461ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1462ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1463ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1464ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1465ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1466ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1467ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		},
1468ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		80,
1469ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Test Using Larger Than Block-Size Key and Larger Than One "
1470ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		"Block-Size Data",
1471ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		73,
1472ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		{
1473ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
1474ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
1475ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
1476ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6
1477ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1478ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1479ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt};
1480ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1481ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1482ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_sha256(void)
1483ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1484ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	unsigned int i;
1485ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 hash[32];
1486ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	const u8 *addr[2];
1487ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	size_t len[2];
1488ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int errors = 0;
1489ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1490ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(tests); i++) {
1491ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "SHA256 test case %d:", i + 1);
1492ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1493ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[0] = (u8 *) tests[i].data;
1494ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[0] = strlen(tests[i].data);
1495ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		sha256_vector(1, addr, len, hash);
1496ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (memcmp(hash, tests[i].hash, 32) != 0) {
1497ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " FAIL");
1498ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			errors++;
1499ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		} else
1500ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " OK");
1501ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1502ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (len[0]) {
1503ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[0] = (u8 *) tests[i].data;
1504ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[0] = 1;
1505ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[1] = (u8 *) tests[i].data + 1;
1506ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[1] = strlen(tests[i].data) - 1;
1507ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			sha256_vector(2, addr, len, hash);
1508ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			if (memcmp(hash, tests[i].hash, 32) != 0) {
1509ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " FAIL");
1510ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				errors++;
1511ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			} else
1512ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " OK");
1513ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1514ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1515ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1516ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	for (i = 0; i < ARRAY_SIZE(hmac_tests); i++) {
15171d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt		const struct hmac_test *t = &hmac_tests[i];
1518ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1519ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "HMAC-SHA256 test case %d:", i + 1);
1520ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1521ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (hmac_sha256(t->key, t->key_len, t->data, t->data_len,
1522ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				hash) < 0 ||
1523ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(hash, t->hash, 32) != 0) {
1524ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " FAIL");
1525ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			errors++;
1526ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		} else
1527ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " OK");
1528ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1529ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		addr[0] = t->data;
1530ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		len[0] = t->data_len;
1531ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (hmac_sha256_vector(t->key, t->key_len, 1, addr, len,
1532ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				       hash) < 0 ||
1533ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		    os_memcmp(hash, t->hash, 32) != 0) {
1534ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " FAIL");
1535ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			errors++;
1536ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		} else
1537ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			wpa_printf(MSG_INFO, " OK");
1538ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1539ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		if (len[0]) {
1540ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[0] = t->data;
1541ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[0] = 1;
1542ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			addr[1] = t->data + 1;
1543ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			len[1] = t->data_len - 1;
1544ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			if (hmac_sha256_vector(t->key, t->key_len, 2, addr, len,
1545ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					       hash) < 0 ||
1546ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			    os_memcmp(hash, t->hash, 32) != 0) {
1547ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " FAIL");
1548ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				errors++;
1549ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt			} else
1550ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				wpa_printf(MSG_INFO, " OK");
1551ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		}
1552ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1553ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1554ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "Test IEEE 802.11r KDF");
1555ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	sha256_prf((u8 *) "abc", 3, "KDF test", (u8 *) "data", 4,
1556ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		   hash, sizeof(hash));
1557ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* TODO: add proper test case for this */
1558ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1559ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (!errors)
1560ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "SHA256 test cases passed");
1561ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return errors;
1562ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
1563ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1564ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1565ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtstatic int test_ms_funcs(void)
1566ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1567ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	/* Test vector from RFC2759 example */
1568ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *username = "User";
1569ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	char *password = "clientPass";
1570ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 auth_challenge[] = {
1571ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x5B, 0x5D, 0x7C, 0x7D, 0x7B, 0x3F, 0x2F, 0x3E,
1572ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x3C, 0x2C, 0x60, 0x21, 0x32, 0x26, 0x26, 0x28
1573ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1574ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 peer_challenge[] = {
1575ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A,
1576ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x28, 0x29, 0x5F, 0x2B, 0x3A, 0x33, 0x7C, 0x7E
1577ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1578ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 password_hash[] = {
1579ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x44, 0xEB, 0xBA, 0x8D, 0x53, 0x12, 0xB8, 0xD6,
1580ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x11, 0x47, 0x44, 0x11, 0xF5, 0x69, 0x89, 0xAE
1581ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1582ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 nt_response[] = {
1583ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x82, 0x30, 0x9E, 0xCD, 0x8D, 0x70, 0x8B, 0x5E,
1584ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xA0, 0x8F, 0xAA, 0x39, 0x81, 0xCD, 0x83, 0x54,
1585ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x42, 0x33, 0x11, 0x4A, 0x3D, 0x85, 0xD6, 0xDF
1586ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1587ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 password_hash_hash[] = {
1588ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x41, 0xC0, 0x0C, 0x58, 0x4B, 0xD2, 0xD9, 0x1C,
1589ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x40, 0x17, 0xA2, 0xA1, 0x2F, 0xA5, 0x9F, 0x3F
1590ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1591ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 authenticator_response[] = {
1592ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x40, 0x7A, 0x55, 0x89, 0x11, 0x5F, 0xD0, 0xD6,
1593ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x20, 0x9F, 0x51, 0x0F, 0xE9, 0xC0, 0x45, 0x66,
1594ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x93, 0x2C, 0xDA, 0x56
1595ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1596ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 master_key[] = {
1597ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xFD, 0xEC, 0xE3, 0x71, 0x7A, 0x8C, 0x83, 0x8C,
1598ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xB3, 0x88, 0xE5, 0x27, 0xAE, 0x3C, 0xDD, 0x31
1599ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1600ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 send_start_key[] = {
1601ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0x8B, 0x7C, 0xDC, 0x14, 0x9B, 0x99, 0x3A, 0x1B,
1602ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		0xA1, 0x18, 0xCB, 0x15, 0x3F, 0x56, 0xDC, 0xCB
1603ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	};
1604ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	u8 buf[32];
1605ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int errors = 0;
1606ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1607ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (nt_password_hash((u8 *) password, os_strlen(password), buf) ||
1608ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(password_hash, buf, sizeof(password_hash)) != 0) {
1609ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "nt_password_hash failed");
1610ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1611ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1612ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1613ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (generate_nt_response(auth_challenge, peer_challenge,
1614ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				 (u8 *) username, os_strlen(username),
1615ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				 (u8 *) password, os_strlen(password), buf) ||
1616ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(nt_response, buf, sizeof(nt_response)) != 0) {
1617ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "generate_nt_response failed");
1618ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1619ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1620ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1621ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (hash_nt_password_hash(password_hash, buf) ||
1622ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(password_hash_hash, buf,
1623ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		      sizeof(password_hash_hash)) != 0) {
1624ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "hash_nt_password_hash failed");
1625ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1626ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1627ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1628ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (generate_authenticator_response((u8 *) password,
1629ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					    os_strlen(password),
1630ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					    peer_challenge, auth_challenge,
1631ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					    (u8 *) username,
1632ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					    os_strlen(username),
1633ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt					    nt_response, buf) ||
1634ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(authenticator_response, buf,
1635ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		      sizeof(authenticator_response)) != 0) {
1636ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "generate_authenticator_response failed");
1637ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1638ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1639ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1640ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (get_master_key(password_hash_hash, nt_response, buf) ||
1641ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(master_key, buf, sizeof(master_key)) != 0) {
1642ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "get_master_key failed");
1643ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1644ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1645ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1646ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (get_asymetric_start_key(master_key, buf, sizeof(send_start_key),
1647ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt				    1, 1) ||
1648ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    os_memcmp(send_start_key, buf, sizeof(send_start_key)) != 0) {
1649ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "get_asymetric_start_key failed");
1650ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		errors++;
1651ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	}
1652ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1653ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (errors)
1654ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_ERROR, "ms_funcs: %d errors", errors);
1655ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	else
1656ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		wpa_printf(MSG_INFO, "ms_funcs test cases passed");
1657ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1658ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return errors;
1659ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
1660ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1661ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1662ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidtint crypto_module_tests(void)
1663ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt{
1664ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	int ret = 0;
1665ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1666ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	wpa_printf(MSG_INFO, "crypto module tests");
1667ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	if (test_siv() ||
1668ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_omac1() ||
1669ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_eax() ||
1670ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_cbc() ||
1671ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_ecb() ||
1672ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_key_wrap() ||
1673ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_md5() ||
1674ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_sha1() ||
1675ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_sha256() ||
1676ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	    test_ms_funcs())
1677ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt		ret = -1;
1678ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt
1679ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt	return ret;
1680ff787d557db719adea0fdf2679667500c65cf74dDmitry Shmidt}
1681