xref: /dflybsd-src/contrib/wpa_supplicant/src/tls/tlsv1_common.c (revision 6d49e1aea1f916afb9e202b8d2ad09cfab6e48c3)
1*6d49e1aeSJan Lentfer /*
2*6d49e1aeSJan Lentfer  * TLSv1 common routines
3*6d49e1aeSJan Lentfer  * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
4*6d49e1aeSJan Lentfer  *
5*6d49e1aeSJan Lentfer  * This program is free software; you can redistribute it and/or modify
6*6d49e1aeSJan Lentfer  * it under the terms of the GNU General Public License version 2 as
7*6d49e1aeSJan Lentfer  * published by the Free Software Foundation.
8*6d49e1aeSJan Lentfer  *
9*6d49e1aeSJan Lentfer  * Alternatively, this software may be distributed under the terms of BSD
10*6d49e1aeSJan Lentfer  * license.
11*6d49e1aeSJan Lentfer  *
12*6d49e1aeSJan Lentfer  * See README and COPYING for more details.
13*6d49e1aeSJan Lentfer  */
14*6d49e1aeSJan Lentfer 
15*6d49e1aeSJan Lentfer #include "includes.h"
16*6d49e1aeSJan Lentfer 
17*6d49e1aeSJan Lentfer #include "common.h"
18*6d49e1aeSJan Lentfer #include "x509v3.h"
19*6d49e1aeSJan Lentfer #include "tlsv1_common.h"
20*6d49e1aeSJan Lentfer 
21*6d49e1aeSJan Lentfer 
22*6d49e1aeSJan Lentfer /*
23*6d49e1aeSJan Lentfer  * TODO:
24*6d49e1aeSJan Lentfer  * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
25*6d49e1aeSJan Lentfer  * Add support for commonly used cipher suites; don't bother with exportable
26*6d49e1aeSJan Lentfer  * suites.
27*6d49e1aeSJan Lentfer  */
28*6d49e1aeSJan Lentfer 
29*6d49e1aeSJan Lentfer static const struct tls_cipher_suite tls_cipher_suites[] = {
30*6d49e1aeSJan Lentfer 	{ TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
31*6d49e1aeSJan Lentfer 	  TLS_HASH_NULL },
32*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
33*6d49e1aeSJan Lentfer 	  TLS_HASH_MD5 },
34*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
35*6d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
36*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
37*6d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
38*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
39*6d49e1aeSJan Lentfer 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
40*6d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
41*6d49e1aeSJan Lentfer 	  TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
42*6d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
43*6d49e1aeSJan Lentfer 	  TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
44*6d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
45*6d49e1aeSJan Lentfer 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
46*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
47*6d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
48*6d49e1aeSJan Lentfer 	{ TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
49*6d49e1aeSJan Lentfer 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
50*6d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
51*6d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
52*6d49e1aeSJan Lentfer 	{ TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
53*6d49e1aeSJan Lentfer 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA }
54*6d49e1aeSJan Lentfer };
55*6d49e1aeSJan Lentfer 
56*6d49e1aeSJan Lentfer #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
57*6d49e1aeSJan Lentfer #define NUM_TLS_CIPHER_SUITES NUM_ELEMS(tls_cipher_suites)
58*6d49e1aeSJan Lentfer 
59*6d49e1aeSJan Lentfer 
60*6d49e1aeSJan Lentfer static const struct tls_cipher_data tls_ciphers[] = {
61*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_NULL,         TLS_CIPHER_STREAM,  0,  0,  0,
62*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_NULL },
63*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_IDEA_CBC,     TLS_CIPHER_BLOCK,  16, 16,  8,
64*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_NULL },
65*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC2_CBC_40,   TLS_CIPHER_BLOCK,   5, 16,  0,
66*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC2 },
67*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC4_40,       TLS_CIPHER_STREAM,  5, 16,  0,
68*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC4 },
69*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC4_128,      TLS_CIPHER_STREAM, 16, 16,  0,
70*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC4 },
71*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_DES40_CBC,    TLS_CIPHER_BLOCK,   5,  8,  8,
72*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_DES },
73*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_DES_CBC,      TLS_CIPHER_BLOCK,   8,  8,  8,
74*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_DES },
75*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK,  24, 24,  8,
76*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_3DES },
77*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_AES_128_CBC,  TLS_CIPHER_BLOCK,  16, 16, 16,
78*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_AES },
79*6d49e1aeSJan Lentfer 	{ TLS_CIPHER_AES_256_CBC,  TLS_CIPHER_BLOCK,  32, 32, 16,
80*6d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_AES }
81*6d49e1aeSJan Lentfer };
82*6d49e1aeSJan Lentfer 
83*6d49e1aeSJan Lentfer #define NUM_TLS_CIPHER_DATA NUM_ELEMS(tls_ciphers)
84*6d49e1aeSJan Lentfer 
85*6d49e1aeSJan Lentfer 
86*6d49e1aeSJan Lentfer /**
87*6d49e1aeSJan Lentfer  * tls_get_cipher_suite - Get TLS cipher suite
88*6d49e1aeSJan Lentfer  * @suite: Cipher suite identifier
89*6d49e1aeSJan Lentfer  * Returns: Pointer to the cipher data or %NULL if not found
90*6d49e1aeSJan Lentfer  */
91*6d49e1aeSJan Lentfer const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
92*6d49e1aeSJan Lentfer {
93*6d49e1aeSJan Lentfer 	size_t i;
94*6d49e1aeSJan Lentfer 	for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
95*6d49e1aeSJan Lentfer 		if (tls_cipher_suites[i].suite == suite)
96*6d49e1aeSJan Lentfer 			return &tls_cipher_suites[i];
97*6d49e1aeSJan Lentfer 	return NULL;
98*6d49e1aeSJan Lentfer }
99*6d49e1aeSJan Lentfer 
100*6d49e1aeSJan Lentfer 
101*6d49e1aeSJan Lentfer const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
102*6d49e1aeSJan Lentfer {
103*6d49e1aeSJan Lentfer 	size_t i;
104*6d49e1aeSJan Lentfer 	for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
105*6d49e1aeSJan Lentfer 		if (tls_ciphers[i].cipher == cipher)
106*6d49e1aeSJan Lentfer 			return &tls_ciphers[i];
107*6d49e1aeSJan Lentfer 	return NULL;
108*6d49e1aeSJan Lentfer }
109*6d49e1aeSJan Lentfer 
110*6d49e1aeSJan Lentfer 
111*6d49e1aeSJan Lentfer int tls_server_key_exchange_allowed(tls_cipher cipher)
112*6d49e1aeSJan Lentfer {
113*6d49e1aeSJan Lentfer 	const struct tls_cipher_suite *suite;
114*6d49e1aeSJan Lentfer 
115*6d49e1aeSJan Lentfer 	/* RFC 2246, Section 7.4.3 */
116*6d49e1aeSJan Lentfer 	suite = tls_get_cipher_suite(cipher);
117*6d49e1aeSJan Lentfer 	if (suite == NULL)
118*6d49e1aeSJan Lentfer 		return 0;
119*6d49e1aeSJan Lentfer 
120*6d49e1aeSJan Lentfer 	switch (suite->key_exchange) {
121*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_DSS:
122*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_DSS_EXPORT:
123*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_RSA:
124*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_RSA_EXPORT:
125*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DH_anon_EXPORT:
126*6d49e1aeSJan Lentfer 	case TLS_KEY_X_DH_anon:
127*6d49e1aeSJan Lentfer 		return 1;
128*6d49e1aeSJan Lentfer 	case TLS_KEY_X_RSA_EXPORT:
129*6d49e1aeSJan Lentfer 		return 1 /* FIX: public key len > 512 bits */;
130*6d49e1aeSJan Lentfer 	default:
131*6d49e1aeSJan Lentfer 		return 0;
132*6d49e1aeSJan Lentfer 	}
133*6d49e1aeSJan Lentfer }
134*6d49e1aeSJan Lentfer 
135*6d49e1aeSJan Lentfer 
136*6d49e1aeSJan Lentfer /**
137*6d49e1aeSJan Lentfer  * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
138*6d49e1aeSJan Lentfer  * @buf: ASN.1 DER encoded certificate
139*6d49e1aeSJan Lentfer  * @len: Length of the buffer
140*6d49e1aeSJan Lentfer  * @pk: Buffer for returning the allocated public key
141*6d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
142*6d49e1aeSJan Lentfer  *
143*6d49e1aeSJan Lentfer  * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
144*6d49e1aeSJan Lentfer  * the public key from it. The caller is responsible for freeing the public key
145*6d49e1aeSJan Lentfer  * by calling crypto_public_key_free().
146*6d49e1aeSJan Lentfer  */
147*6d49e1aeSJan Lentfer int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
148*6d49e1aeSJan Lentfer {
149*6d49e1aeSJan Lentfer 	struct x509_certificate *cert;
150*6d49e1aeSJan Lentfer 
151*6d49e1aeSJan Lentfer 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
152*6d49e1aeSJan Lentfer 		    buf, len);
153*6d49e1aeSJan Lentfer 
154*6d49e1aeSJan Lentfer 	*pk = crypto_public_key_from_cert(buf, len);
155*6d49e1aeSJan Lentfer 	if (*pk)
156*6d49e1aeSJan Lentfer 		return 0;
157*6d49e1aeSJan Lentfer 
158*6d49e1aeSJan Lentfer 	cert = x509_certificate_parse(buf, len);
159*6d49e1aeSJan Lentfer 	if (cert == NULL) {
160*6d49e1aeSJan Lentfer 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
161*6d49e1aeSJan Lentfer 			   "certificate");
162*6d49e1aeSJan Lentfer 		return -1;
163*6d49e1aeSJan Lentfer 	}
164*6d49e1aeSJan Lentfer 
165*6d49e1aeSJan Lentfer 	/* TODO
166*6d49e1aeSJan Lentfer 	 * verify key usage (must allow encryption)
167*6d49e1aeSJan Lentfer 	 *
168*6d49e1aeSJan Lentfer 	 * All certificate profiles, key and cryptographic formats are
169*6d49e1aeSJan Lentfer 	 * defined by the IETF PKIX working group [PKIX]. When a key
170*6d49e1aeSJan Lentfer 	 * usage extension is present, the digitalSignature bit must be
171*6d49e1aeSJan Lentfer 	 * set for the key to be eligible for signing, as described
172*6d49e1aeSJan Lentfer 	 * above, and the keyEncipherment bit must be present to allow
173*6d49e1aeSJan Lentfer 	 * encryption, as described above. The keyAgreement bit must be
174*6d49e1aeSJan Lentfer 	 * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
175*6d49e1aeSJan Lentfer 	 */
176*6d49e1aeSJan Lentfer 
177*6d49e1aeSJan Lentfer 	*pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
178*6d49e1aeSJan Lentfer 	x509_certificate_free(cert);
179*6d49e1aeSJan Lentfer 
180*6d49e1aeSJan Lentfer 	if (*pk == NULL) {
181*6d49e1aeSJan Lentfer 		wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
182*6d49e1aeSJan Lentfer 			   "server public key");
183*6d49e1aeSJan Lentfer 		return -1;
184*6d49e1aeSJan Lentfer 	}
185*6d49e1aeSJan Lentfer 
186*6d49e1aeSJan Lentfer 	return 0;
187*6d49e1aeSJan Lentfer }
188*6d49e1aeSJan Lentfer 
189*6d49e1aeSJan Lentfer 
190*6d49e1aeSJan Lentfer int tls_verify_hash_init(struct tls_verify_hash *verify)
191*6d49e1aeSJan Lentfer {
192*6d49e1aeSJan Lentfer 	tls_verify_hash_free(verify);
193*6d49e1aeSJan Lentfer 	verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
194*6d49e1aeSJan Lentfer 	verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
195*6d49e1aeSJan Lentfer 	verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
196*6d49e1aeSJan Lentfer 	verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
197*6d49e1aeSJan Lentfer 	verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
198*6d49e1aeSJan Lentfer 	verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
199*6d49e1aeSJan Lentfer 	if (verify->md5_client == NULL || verify->md5_server == NULL ||
200*6d49e1aeSJan Lentfer 	    verify->md5_cert == NULL || verify->sha1_client == NULL ||
201*6d49e1aeSJan Lentfer 	    verify->sha1_server == NULL || verify->sha1_cert == NULL) {
202*6d49e1aeSJan Lentfer 		tls_verify_hash_free(verify);
203*6d49e1aeSJan Lentfer 		return -1;
204*6d49e1aeSJan Lentfer 	}
205*6d49e1aeSJan Lentfer 	return 0;
206*6d49e1aeSJan Lentfer }
207*6d49e1aeSJan Lentfer 
208*6d49e1aeSJan Lentfer 
209*6d49e1aeSJan Lentfer void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
210*6d49e1aeSJan Lentfer 			 size_t len)
211*6d49e1aeSJan Lentfer {
212*6d49e1aeSJan Lentfer 	if (verify->md5_client && verify->sha1_client) {
213*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_client, buf, len);
214*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_client, buf, len);
215*6d49e1aeSJan Lentfer 	}
216*6d49e1aeSJan Lentfer 	if (verify->md5_server && verify->sha1_server) {
217*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_server, buf, len);
218*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_server, buf, len);
219*6d49e1aeSJan Lentfer 	}
220*6d49e1aeSJan Lentfer 	if (verify->md5_cert && verify->sha1_cert) {
221*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_cert, buf, len);
222*6d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_cert, buf, len);
223*6d49e1aeSJan Lentfer 	}
224*6d49e1aeSJan Lentfer }
225*6d49e1aeSJan Lentfer 
226*6d49e1aeSJan Lentfer 
227*6d49e1aeSJan Lentfer void tls_verify_hash_free(struct tls_verify_hash *verify)
228*6d49e1aeSJan Lentfer {
229*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_client, NULL, NULL);
230*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_server, NULL, NULL);
231*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_cert, NULL, NULL);
232*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_client, NULL, NULL);
233*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_server, NULL, NULL);
234*6d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_cert, NULL, NULL);
235*6d49e1aeSJan Lentfer 	verify->md5_client = NULL;
236*6d49e1aeSJan Lentfer 	verify->md5_server = NULL;
237*6d49e1aeSJan Lentfer 	verify->md5_cert = NULL;
238*6d49e1aeSJan Lentfer 	verify->sha1_client = NULL;
239*6d49e1aeSJan Lentfer 	verify->sha1_server = NULL;
240*6d49e1aeSJan Lentfer 	verify->sha1_cert = NULL;
241*6d49e1aeSJan Lentfer }
242