kate(4): put missing \n into device_printf(9) calls
[dragonfly.git] / contrib / wpa_supplicant-0.5.8 / tlsv1_client.c
1 /*
2  * wpa_supplicant: TLSv1 client (RFC 2246)
3  * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "includes.h"
16
17 #include "common.h"
18 #include "base64.h"
19 #include "md5.h"
20 #include "sha1.h"
21 #include "crypto.h"
22 #include "tls.h"
23 #include "tlsv1_common.h"
24 #include "tlsv1_client.h"
25 #include "x509v3.h"
26
27 /* TODO:
28  * Support for a message fragmented across several records (RFC 2246, 6.2.1)
29  */
30
31 struct tlsv1_client {
32         enum {
33                 CLIENT_HELLO, SERVER_HELLO, SERVER_CERTIFICATE,
34                 SERVER_KEY_EXCHANGE, SERVER_CERTIFICATE_REQUEST,
35                 SERVER_HELLO_DONE, CLIENT_KEY_EXCHANGE, CHANGE_CIPHER_SPEC,
36                 SERVER_CHANGE_CIPHER_SPEC, SERVER_FINISHED, ACK_FINISHED,
37                 ESTABLISHED, FAILED
38         } state;
39
40         struct tlsv1_record_layer rl;
41
42         u8 session_id[TLS_SESSION_ID_MAX_LEN];
43         size_t session_id_len;
44         u8 client_random[TLS_RANDOM_LEN];
45         u8 server_random[TLS_RANDOM_LEN];
46         u8 master_secret[TLS_MASTER_SECRET_LEN];
47
48         u8 alert_level;
49         u8 alert_description;
50
51         unsigned int certificate_requested:1;
52         unsigned int session_resumed:1;
53         unsigned int ticket:1;
54         unsigned int ticket_key:1;
55
56         struct crypto_public_key *server_rsa_key;
57
58         struct crypto_hash *verify_md5_client;
59         struct crypto_hash *verify_sha1_client;
60         struct crypto_hash *verify_md5_server;
61         struct crypto_hash *verify_sha1_server;
62         struct crypto_hash *verify_md5_cert;
63         struct crypto_hash *verify_sha1_cert;
64
65 #define MAX_CIPHER_COUNT 30
66         u16 cipher_suites[MAX_CIPHER_COUNT];
67         size_t num_cipher_suites;
68
69         u16 prev_cipher_suite;
70
71         u8 *client_hello_ext;
72         size_t client_hello_ext_len;
73
74         /* The prime modulus used for Diffie-Hellman */
75         u8 *dh_p;
76         size_t dh_p_len;
77         /* The generator used for Diffie-Hellman */
78         u8 *dh_g;
79         size_t dh_g_len;
80         /* The server's Diffie-Hellman public value */
81         u8 *dh_ys;
82         size_t dh_ys_len;
83
84         struct x509_certificate *trusted_certs;
85         struct x509_certificate *client_cert;
86         struct crypto_private_key *client_key;
87 };
88
89
90 static int tls_derive_keys(struct tlsv1_client *conn,
91                            const u8 *pre_master_secret,
92                            size_t pre_master_secret_len);
93 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
94                                            const u8 *in_data, size_t *in_len);
95 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
96                                            const u8 *in_data, size_t *in_len);
97 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
98                                          const u8 *in_data, size_t *in_len);
99
100
101 static void tls_alert(struct tlsv1_client *conn, u8 level, u8 description)
102 {
103         conn->alert_level = level;
104         conn->alert_description = description;
105 }
106
107
108 static void tls_verify_hash_add(struct tlsv1_client *conn, const u8 *buf,
109                                 size_t len)
110 {
111         if (conn->verify_md5_client && conn->verify_sha1_client) {
112                 crypto_hash_update(conn->verify_md5_client, buf, len);
113                 crypto_hash_update(conn->verify_sha1_client, buf, len);
114         }
115         if (conn->verify_md5_server && conn->verify_sha1_server) {
116                 crypto_hash_update(conn->verify_md5_server, buf, len);
117                 crypto_hash_update(conn->verify_sha1_server, buf, len);
118         }
119         if (conn->verify_md5_cert && conn->verify_sha1_cert) {
120                 crypto_hash_update(conn->verify_md5_cert, buf, len);
121                 crypto_hash_update(conn->verify_sha1_cert, buf, len);
122         }
123 }
124
125
126 static u8 * tls_send_alert(struct tlsv1_client *conn,
127                            u8 level, u8 description,
128                            size_t *out_len)
129 {
130         u8 *alert, *pos, *length;
131
132         wpa_printf(MSG_DEBUG, "TLSv1: Send Alert(%d:%d)", level, description);
133         *out_len = 0;
134
135         alert = os_malloc(10);
136         if (alert == NULL)
137                 return NULL;
138
139         pos = alert;
140
141         /* TLSPlaintext */
142         /* ContentType type */
143         *pos++ = TLS_CONTENT_TYPE_ALERT;
144         /* ProtocolVersion version */
145         WPA_PUT_BE16(pos, TLS_VERSION);
146         pos += 2;
147         /* uint16 length (to be filled) */
148         length = pos;
149         pos += 2;
150         /* opaque fragment[TLSPlaintext.length] */
151
152         /* Alert */
153         /* AlertLevel level */
154         *pos++ = level;
155         /* AlertDescription description */
156         *pos++ = description;
157
158         WPA_PUT_BE16(length, pos - length - 2);
159         *out_len = pos - alert;
160
161         return alert;
162 }
163
164
165 static u8 * tls_send_client_hello(struct tlsv1_client *conn,
166                                   size_t *out_len)
167 {
168         u8 *hello, *end, *pos, *hs_length, *hs_start, *rhdr;
169         struct os_time now;
170         size_t len, i;
171
172         wpa_printf(MSG_DEBUG, "TLSv1: Send ClientHello");
173         *out_len = 0;
174
175         os_get_time(&now);
176         WPA_PUT_BE32(conn->client_random, now.sec);
177         if (os_get_random(conn->client_random + 4, TLS_RANDOM_LEN - 4)) {
178                 wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
179                            "client_random");
180                 return NULL;
181         }
182         wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random",
183                     conn->client_random, TLS_RANDOM_LEN);
184
185         len = 100 + conn->num_cipher_suites * 2 + conn->client_hello_ext_len;
186         hello = os_malloc(len);
187         if (hello == NULL)
188                 return NULL;
189         end = hello + len;
190
191         rhdr = hello;
192         pos = rhdr + TLS_RECORD_HEADER_LEN;
193
194         /* opaque fragment[TLSPlaintext.length] */
195
196         /* Handshake */
197         hs_start = pos;
198         /* HandshakeType msg_type */
199         *pos++ = TLS_HANDSHAKE_TYPE_CLIENT_HELLO;
200         /* uint24 length (to be filled) */
201         hs_length = pos;
202         pos += 3;
203         /* body - ClientHello */
204         /* ProtocolVersion client_version */
205         WPA_PUT_BE16(pos, TLS_VERSION);
206         pos += 2;
207         /* Random random: uint32 gmt_unix_time, opaque random_bytes */
208         os_memcpy(pos, conn->client_random, TLS_RANDOM_LEN);
209         pos += TLS_RANDOM_LEN;
210         /* SessionID session_id */
211         *pos++ = conn->session_id_len;
212         os_memcpy(pos, conn->session_id, conn->session_id_len);
213         pos += conn->session_id_len;
214         /* CipherSuite cipher_suites<2..2^16-1> */
215         WPA_PUT_BE16(pos, 2 * conn->num_cipher_suites);
216         pos += 2;
217         for (i = 0; i < conn->num_cipher_suites; i++) {
218                 WPA_PUT_BE16(pos, conn->cipher_suites[i]);
219                 pos += 2;
220         }
221         /* CompressionMethod compression_methods<1..2^8-1> */
222         *pos++ = 1;
223         *pos++ = TLS_COMPRESSION_NULL;
224
225         if (conn->client_hello_ext) {
226                 os_memcpy(pos, conn->client_hello_ext,
227                           conn->client_hello_ext_len);
228                 pos += conn->client_hello_ext_len;
229         }
230
231         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
232         tls_verify_hash_add(conn, hs_start, pos - hs_start);
233
234         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
235                               rhdr, end - rhdr, pos - hs_start, out_len) < 0) {
236                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record");
237                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
238                           TLS_ALERT_INTERNAL_ERROR);
239                 os_free(hello);
240                 return NULL;
241         }
242
243         conn->state = SERVER_HELLO;
244
245         return hello;
246 }
247
248
249 static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct,
250                                     const u8 *in_data, size_t *in_len)
251 {
252         const u8 *pos, *end;
253         size_t left, len, i;
254         u16 cipher_suite;
255
256         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
257                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
258                            "received content type 0x%x", ct);
259                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
260                           TLS_ALERT_UNEXPECTED_MESSAGE);
261                 return -1;
262         }
263
264         pos = in_data;
265         left = *in_len;
266
267         if (left < 4)
268                 goto decode_error;
269
270         /* HandshakeType msg_type */
271         if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) {
272                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
273                            "message %d (expected ServerHello)", *pos);
274                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
275                           TLS_ALERT_UNEXPECTED_MESSAGE);
276                 return -1;
277         }
278         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello");
279         pos++;
280         /* uint24 length */
281         len = WPA_GET_BE24(pos);
282         pos += 3;
283         left -= 4;
284
285         if (len > left)
286                 goto decode_error;
287
288         /* body - ServerHello */
289
290         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len);
291         end = pos + len;
292
293         /* ProtocolVersion server_version */
294         if (end - pos < 2)
295                 goto decode_error;
296         if (WPA_GET_BE16(pos) != TLS_VERSION) {
297                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in "
298                            "ServerHello");
299                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
300                           TLS_ALERT_PROTOCOL_VERSION);
301                 return -1;
302         }
303         pos += 2;
304
305         /* Random random */
306         if (end - pos < TLS_RANDOM_LEN)
307                 goto decode_error;
308
309         os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN);
310         pos += TLS_RANDOM_LEN;
311         wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
312                     conn->server_random, TLS_RANDOM_LEN);
313
314         /* SessionID session_id */
315         if (end - pos < 1)
316                 goto decode_error;
317         if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
318                 goto decode_error;
319         if (conn->session_id_len && conn->session_id_len == *pos &&
320             os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) {
321                 pos += 1 + conn->session_id_len;
322                 wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session");
323                 conn->session_resumed = 1;
324         } else {
325                 conn->session_id_len = *pos;
326                 pos++;
327                 os_memcpy(conn->session_id, pos, conn->session_id_len);
328                 pos += conn->session_id_len;
329         }
330         wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
331                     conn->session_id, conn->session_id_len);
332
333         /* CipherSuite cipher_suite */
334         if (end - pos < 2)
335                 goto decode_error;
336         cipher_suite = WPA_GET_BE16(pos);
337         pos += 2;
338         for (i = 0; i < conn->num_cipher_suites; i++) {
339                 if (cipher_suite == conn->cipher_suites[i])
340                         break;
341         }
342         if (i == conn->num_cipher_suites) {
343                 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
344                            "cipher suite 0x%04x", cipher_suite);
345                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
346                           TLS_ALERT_ILLEGAL_PARAMETER);
347                 return -1;
348         }
349
350         if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) {
351                 wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different "
352                            "cipher suite for a resumed connection (0x%04x != "
353                            "0x%04x)", cipher_suite, conn->prev_cipher_suite);
354                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
355                           TLS_ALERT_ILLEGAL_PARAMETER);
356                 return -1;
357         }
358
359         if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
360                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
361                            "record layer");
362                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
363                           TLS_ALERT_INTERNAL_ERROR);
364                 return -1;
365         }
366
367         conn->prev_cipher_suite = cipher_suite;
368
369         if (conn->session_resumed || conn->ticket_key)
370                 tls_derive_keys(conn, NULL, 0);
371
372         /* CompressionMethod compression_method */
373         if (end - pos < 1)
374                 goto decode_error;
375         if (*pos != TLS_COMPRESSION_NULL) {
376                 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
377                            "compression 0x%02x", *pos);
378                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
379                           TLS_ALERT_ILLEGAL_PARAMETER);
380                 return -1;
381         }
382         pos++;
383
384         if (end != pos) {
385                 wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the "
386                             "end of ServerHello", pos, end - pos);
387                 goto decode_error;
388         }
389
390         *in_len = end - in_data;
391
392         conn->state = (conn->session_resumed || conn->ticket) ?
393                 SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE;
394
395         return 0;
396
397 decode_error:
398         wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello");
399         tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
400         return -1;
401 }
402
403
404 static int tls_server_key_exchange_allowed(struct tlsv1_client *conn)
405 {
406         const struct tls_cipher_suite *suite;
407
408         /* RFC 2246, Section 7.4.3 */
409         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
410         if (suite == NULL)
411                 return 0;
412
413         switch (suite->key_exchange) {
414         case TLS_KEY_X_DHE_DSS:
415         case TLS_KEY_X_DHE_DSS_EXPORT:
416         case TLS_KEY_X_DHE_RSA:
417         case TLS_KEY_X_DHE_RSA_EXPORT:
418         case TLS_KEY_X_DH_anon_EXPORT:
419         case TLS_KEY_X_DH_anon:
420                 return 1;
421         case TLS_KEY_X_RSA_EXPORT:
422                 return 1 /* FIX: public key len > 512 bits */;
423         default:
424                 return 0;
425         }
426 }
427
428
429 static int tls_process_certificate(struct tlsv1_client *conn, u8 ct,
430                                    const u8 *in_data, size_t *in_len)
431 {
432         const u8 *pos, *end;
433         size_t left, len, list_len, cert_len, idx;
434         u8 type;
435         struct x509_certificate *chain = NULL, *last = NULL, *cert;
436         int reason;
437
438         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
439                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
440                            "received content type 0x%x", ct);
441                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
442                           TLS_ALERT_UNEXPECTED_MESSAGE);
443                 return -1;
444         }
445
446         pos = in_data;
447         left = *in_len;
448
449         if (left < 4) {
450                 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message "
451                            "(len=%lu)", (unsigned long) left);
452                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
453                 return -1;
454         }
455
456         type = *pos++;
457         len = WPA_GET_BE24(pos);
458         pos += 3;
459         left -= 4;
460
461         if (len > left) {
462                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message "
463                            "length (len=%lu != left=%lu)",
464                            (unsigned long) len, (unsigned long) left);
465                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
466                 return -1;
467         }
468
469         if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE)
470                 return tls_process_server_key_exchange(conn, ct, in_data,
471                                                        in_len);
472         if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
473                 return tls_process_certificate_request(conn, ct, in_data,
474                                                        in_len);
475         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
476                 return tls_process_server_hello_done(conn, ct, in_data,
477                                                      in_len);
478         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
479                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
480                            "message %d (expected Certificate/"
481                            "ServerKeyExchange/CertificateRequest/"
482                            "ServerHelloDone)", type);
483                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
484                           TLS_ALERT_UNEXPECTED_MESSAGE);
485                 return -1;
486         }
487
488         wpa_printf(MSG_DEBUG,
489                    "TLSv1: Received Certificate (certificate_list len %lu)",
490                    (unsigned long) len);
491
492         /*
493          * opaque ASN.1Cert<2^24-1>;
494          *
495          * struct {
496          *     ASN.1Cert certificate_list<1..2^24-1>;
497          * } Certificate;
498          */
499
500         end = pos + len;
501
502         if (end - pos < 3) {
503                 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "
504                            "(left=%lu)", (unsigned long) left);
505                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
506                 return -1;
507         }
508
509         list_len = WPA_GET_BE24(pos);
510         pos += 3;
511
512         if ((size_t) (end - pos) != list_len) {
513                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "
514                            "length (len=%lu left=%lu)",
515                            (unsigned long) list_len,
516                            (unsigned long) (end - pos));
517                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
518                 return -1;
519         }
520
521         idx = 0;
522         while (pos < end) {
523                 if (end - pos < 3) {
524                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
525                                    "certificate_list");
526                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
527                                   TLS_ALERT_DECODE_ERROR);
528                         x509_certificate_chain_free(chain);
529                         return -1;
530                 }
531
532                 cert_len = WPA_GET_BE24(pos);
533                 pos += 3;
534
535                 if ((size_t) (end - pos) < cert_len) {
536                         wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "
537                                    "length (len=%lu left=%lu)",
538                                    (unsigned long) cert_len,
539                                    (unsigned long) (end - pos));
540                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
541                                   TLS_ALERT_DECODE_ERROR);
542                         x509_certificate_chain_free(chain);
543                         return -1;
544                 }
545
546                 wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",
547                            (unsigned long) idx, (unsigned long) cert_len);
548
549                 if (idx == 0) {
550                         crypto_public_key_free(conn->server_rsa_key);
551                         if (tls_parse_cert(pos, cert_len,
552                                            &conn->server_rsa_key)) {
553                                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
554                                            "the certificate");
555                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
556                                           TLS_ALERT_BAD_CERTIFICATE);
557                                 x509_certificate_chain_free(chain);
558                                 return -1;
559                         }
560                 }
561
562                 cert = x509_certificate_parse(pos, cert_len);
563                 if (cert == NULL) {
564                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
565                                    "the certificate");
566                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
567                                   TLS_ALERT_BAD_CERTIFICATE);
568                         x509_certificate_chain_free(chain);
569                         return -1;
570                 }
571
572                 if (last == NULL)
573                         chain = cert;
574                 else
575                         last->next = cert;
576                 last = cert;
577
578                 idx++;
579                 pos += cert_len;
580         }
581
582         if (x509_certificate_chain_validate(conn->trusted_certs, chain,
583                                             &reason) < 0) {
584                 int tls_reason;
585                 wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "
586                            "validation failed (reason=%d)", reason);
587                 switch (reason) {
588                 case X509_VALIDATE_BAD_CERTIFICATE:
589                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
590                         break;
591                 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
592                         tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
593                         break;
594                 case X509_VALIDATE_CERTIFICATE_REVOKED:
595                         tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
596                         break;
597                 case X509_VALIDATE_CERTIFICATE_EXPIRED:
598                         tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
599                         break;
600                 case X509_VALIDATE_CERTIFICATE_UNKNOWN:
601                         tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
602                         break;
603                 case X509_VALIDATE_UNKNOWN_CA:
604                         tls_reason = TLS_ALERT_UNKNOWN_CA;
605                         break;
606                 default:
607                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
608                         break;
609                 }
610                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
611                 x509_certificate_chain_free(chain);
612                 return -1;
613         }
614
615         x509_certificate_chain_free(chain);
616
617         *in_len = end - in_data;
618
619         conn->state = SERVER_KEY_EXCHANGE;
620
621         return 0;
622 }
623
624
625 static void tlsv1_client_free_dh(struct tlsv1_client *conn)
626 {
627         os_free(conn->dh_p);
628         os_free(conn->dh_g);
629         os_free(conn->dh_ys);
630         conn->dh_p = conn->dh_g = conn->dh_ys = NULL;
631 }
632
633
634 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,
635                                         const u8 *buf, size_t len)
636 {
637         const u8 *pos, *end;
638
639         tlsv1_client_free_dh(conn);
640
641         pos = buf;
642         end = buf + len;
643
644         if (end - pos < 3)
645                 goto fail;
646         conn->dh_p_len = WPA_GET_BE16(pos);
647         pos += 2;
648         if (conn->dh_p_len == 0 || end - pos < (int) conn->dh_p_len)
649                 goto fail;
650         conn->dh_p = os_malloc(conn->dh_p_len);
651         if (conn->dh_p == NULL)
652                 goto fail;
653         os_memcpy(conn->dh_p, pos, conn->dh_p_len);
654         pos += conn->dh_p_len;
655         wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
656                     conn->dh_p, conn->dh_p_len);
657
658         if (end - pos < 3)
659                 goto fail;
660         conn->dh_g_len = WPA_GET_BE16(pos);
661         pos += 2;
662         if (conn->dh_g_len == 0 || end - pos < (int) conn->dh_g_len)
663                 goto fail;
664         conn->dh_g = os_malloc(conn->dh_g_len);
665         if (conn->dh_g == NULL)
666                 goto fail;
667         os_memcpy(conn->dh_g, pos, conn->dh_g_len);
668         pos += conn->dh_g_len;
669         wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
670                     conn->dh_g, conn->dh_g_len);
671         if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
672                 goto fail;
673
674         if (end - pos < 3)
675                 goto fail;
676         conn->dh_ys_len = WPA_GET_BE16(pos);
677         pos += 2;
678         if (conn->dh_ys_len == 0 || end - pos < (int) conn->dh_ys_len)
679                 goto fail;
680         conn->dh_ys = os_malloc(conn->dh_ys_len);
681         if (conn->dh_ys == NULL)
682                 goto fail;
683         os_memcpy(conn->dh_ys, pos, conn->dh_ys_len);
684         pos += conn->dh_ys_len;
685         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
686                     conn->dh_ys, conn->dh_ys_len);
687
688         return 0;
689
690 fail:
691         tlsv1_client_free_dh(conn);
692         return -1;
693 }
694
695
696 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
697                                            const u8 *in_data, size_t *in_len)
698 {
699         const u8 *pos, *end;
700         size_t left, len;
701         u8 type;
702         const struct tls_cipher_suite *suite;
703
704         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
705                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
706                            "received content type 0x%x", ct);
707                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
708                           TLS_ALERT_UNEXPECTED_MESSAGE);
709                 return -1;
710         }
711
712         pos = in_data;
713         left = *in_len;
714
715         if (left < 4) {
716                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
717                            "(Left=%lu)", (unsigned long) left);
718                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
719                 return -1;
720         }
721
722         type = *pos++;
723         len = WPA_GET_BE24(pos);
724         pos += 3;
725         left -= 4;
726
727         if (len > left) {
728                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
729                            "length (len=%lu != left=%lu)",
730                            (unsigned long) len, (unsigned long) left);
731                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
732                 return -1;
733         }
734
735         end = pos + len;
736
737         if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
738                 return tls_process_certificate_request(conn, ct, in_data,
739                                                        in_len);
740         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
741                 return tls_process_server_hello_done(conn, ct, in_data,
742                                                      in_len);
743         if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
744                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
745                            "message %d (expected ServerKeyExchange/"
746                            "CertificateRequest/ServerHelloDone)", type);
747                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
748                           TLS_ALERT_UNEXPECTED_MESSAGE);
749                 return -1;
750         }
751
752         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
753
754         if (!tls_server_key_exchange_allowed(conn)) {
755                 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
756                            "with the selected cipher suite");
757                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
758                           TLS_ALERT_UNEXPECTED_MESSAGE);
759                 return -1;
760         }
761
762         wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
763         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
764         if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) {
765                 if (tlsv1_process_diffie_hellman(conn, pos, len) < 0) {
766                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
767                                   TLS_ALERT_DECODE_ERROR);
768                         return -1;
769                 }
770         } else {
771                 wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
772                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
773                           TLS_ALERT_UNEXPECTED_MESSAGE);
774                 return -1;
775         }
776
777         *in_len = end - in_data;
778
779         conn->state = SERVER_CERTIFICATE_REQUEST;
780
781         return 0;
782 }
783
784
785 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
786                                            const u8 *in_data, size_t *in_len)
787 {
788         const u8 *pos, *end;
789         size_t left, len;
790         u8 type;
791
792         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
793                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
794                            "received content type 0x%x", ct);
795                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
796                           TLS_ALERT_UNEXPECTED_MESSAGE);
797                 return -1;
798         }
799
800         pos = in_data;
801         left = *in_len;
802
803         if (left < 4) {
804                 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
805                            "(left=%lu)", (unsigned long) left);
806                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
807                 return -1;
808         }
809
810         type = *pos++;
811         len = WPA_GET_BE24(pos);
812         pos += 3;
813         left -= 4;
814
815         if (len > left) {
816                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
817                            "length (len=%lu != left=%lu)",
818                            (unsigned long) len, (unsigned long) left);
819                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
820                 return -1;
821         }
822
823         end = pos + len;
824
825         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
826                 return tls_process_server_hello_done(conn, ct, in_data,
827                                                      in_len);
828         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
829                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
830                            "message %d (expected CertificateRequest/"
831                            "ServerHelloDone)", type);
832                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
833                           TLS_ALERT_UNEXPECTED_MESSAGE);
834                 return -1;
835         }
836
837         wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
838
839         conn->certificate_requested = 1;
840
841         *in_len = end - in_data;
842
843         conn->state = SERVER_HELLO_DONE;
844
845         return 0;
846 }
847
848
849 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
850                                          const u8 *in_data, size_t *in_len)
851 {
852         const u8 *pos, *end;
853         size_t left, len;
854         u8 type;
855
856         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
857                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
858                            "received content type 0x%x", ct);
859                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
860                           TLS_ALERT_UNEXPECTED_MESSAGE);
861                 return -1;
862         }
863
864         pos = in_data;
865         left = *in_len;
866
867         if (left < 4) {
868                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
869                            "(left=%lu)", (unsigned long) left);
870                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
871                 return -1;
872         }
873
874         type = *pos++;
875         len = WPA_GET_BE24(pos);
876         pos += 3;
877         left -= 4;
878
879         if (len > left) {
880                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
881                            "length (len=%lu != left=%lu)",
882                            (unsigned long) len, (unsigned long) left);
883                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
884                 return -1;
885         }
886         end = pos + len;
887
888         if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
889                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
890                            "message %d (expected ServerHelloDone)", type);
891                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
892                           TLS_ALERT_UNEXPECTED_MESSAGE);
893                 return -1;
894         }
895
896         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
897
898         *in_len = end - in_data;
899
900         conn->state = CLIENT_KEY_EXCHANGE;
901
902         return 0;
903 }
904
905
906 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
907                                                  u8 ct, const u8 *in_data,
908                                                  size_t *in_len)
909 {
910         const u8 *pos;
911         size_t left;
912
913         if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
914                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
915                            "received content type 0x%x", ct);
916                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
917                           TLS_ALERT_UNEXPECTED_MESSAGE);
918                 return -1;
919         }
920
921         pos = in_data;
922         left = *in_len;
923
924         if (left < 1) {
925                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
926                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
927                 return -1;
928         }
929
930         if (*pos != TLS_CHANGE_CIPHER_SPEC) {
931                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
932                            "received data 0x%x", *pos);
933                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
934                           TLS_ALERT_UNEXPECTED_MESSAGE);
935                 return -1;
936         }
937
938         wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
939         if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
940                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
941                            "for record layer");
942                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
943                           TLS_ALERT_INTERNAL_ERROR);
944                 return -1;
945         }
946
947         *in_len = pos + 1 - in_data;
948
949         conn->state = SERVER_FINISHED;
950
951         return 0;
952 }
953
954
955 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
956                                        const u8 *in_data, size_t *in_len)
957 {
958         const u8 *pos, *end;
959         size_t left, len, hlen;
960         u8 verify_data[TLS_VERIFY_DATA_LEN];
961         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
962
963         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
964                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
965                            "received content type 0x%x", ct);
966                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
967                           TLS_ALERT_UNEXPECTED_MESSAGE);
968                 return -1;
969         }
970
971         pos = in_data;
972         left = *in_len;
973
974         if (left < 4) {
975                 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
976                            "Finished",
977                            (unsigned long) left);
978                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
979                           TLS_ALERT_DECODE_ERROR);
980                 return -1;
981         }
982
983         if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
984                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
985                            "type 0x%x", pos[0]);
986                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
987                           TLS_ALERT_UNEXPECTED_MESSAGE);
988                 return -1;
989         }
990
991         len = WPA_GET_BE24(pos + 1);
992
993         pos += 4;
994         left -= 4;
995
996         if (len > left) {
997                 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
998                            "(len=%lu > left=%lu)",
999                            (unsigned long) len, (unsigned long) left);
1000                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1001                           TLS_ALERT_DECODE_ERROR);
1002                 return -1;
1003         }
1004         end = pos + len;
1005         if (len != TLS_VERIFY_DATA_LEN) {
1006                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
1007                            "in Finished: %lu (expected %d)",
1008                            (unsigned long) len, TLS_VERIFY_DATA_LEN);
1009                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1010                           TLS_ALERT_DECODE_ERROR);
1011                 return -1;
1012         }
1013         wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1014                     pos, TLS_VERIFY_DATA_LEN);
1015
1016         hlen = MD5_MAC_LEN;
1017         if (conn->verify_md5_server == NULL ||
1018             crypto_hash_finish(conn->verify_md5_server, hash, &hlen) < 0) {
1019                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1020                           TLS_ALERT_INTERNAL_ERROR);
1021                 conn->verify_md5_server = NULL;
1022                 crypto_hash_finish(conn->verify_sha1_server, NULL, NULL);
1023                 conn->verify_sha1_server = NULL;
1024                 return -1;
1025         }
1026         conn->verify_md5_server = NULL;
1027         hlen = SHA1_MAC_LEN;
1028         if (conn->verify_sha1_server == NULL ||
1029             crypto_hash_finish(conn->verify_sha1_server, hash + MD5_MAC_LEN,
1030                                &hlen) < 0) {
1031                 conn->verify_sha1_server = NULL;
1032                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1033                           TLS_ALERT_INTERNAL_ERROR);
1034                 return -1;
1035         }
1036         conn->verify_sha1_server = NULL;
1037
1038         if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN,
1039                     "server finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN,
1040                     verify_data, TLS_VERIFY_DATA_LEN)) {
1041                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1042                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1043                           TLS_ALERT_DECRYPT_ERROR);
1044                 return -1;
1045         }
1046         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
1047                         verify_data, TLS_VERIFY_DATA_LEN);
1048
1049         if (os_memcmp(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1050                 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
1051                 return -1;
1052         }
1053
1054         wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
1055
1056         *in_len = end - in_data;
1057
1058         conn->state = (conn->session_resumed || conn->ticket) ?
1059                 CHANGE_CIPHER_SPEC : ACK_FINISHED;
1060
1061         return 0;
1062 }
1063
1064
1065 static int tls_derive_pre_master_secret(u8 *pre_master_secret)
1066 {
1067         WPA_PUT_BE16(pre_master_secret, TLS_VERSION);
1068         if (os_get_random(pre_master_secret + 2,
1069                           TLS_PRE_MASTER_SECRET_LEN - 2))
1070                 return -1;
1071         return 0;
1072 }
1073
1074
1075 static int tls_derive_keys(struct tlsv1_client *conn,
1076                            const u8 *pre_master_secret,
1077                            size_t pre_master_secret_len)
1078 {
1079         u8 seed[2 * TLS_RANDOM_LEN];
1080         u8 key_block[TLS_MAX_KEY_BLOCK_LEN];
1081         u8 *pos;
1082         size_t key_block_len;
1083
1084         if (pre_master_secret) {
1085                 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: pre_master_secret",
1086                                 pre_master_secret, pre_master_secret_len);
1087                 os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN);
1088                 os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random,
1089                           TLS_RANDOM_LEN);
1090                 if (tls_prf(pre_master_secret, pre_master_secret_len,
1091                             "master secret", seed, 2 * TLS_RANDOM_LEN,
1092                             conn->master_secret, TLS_MASTER_SECRET_LEN)) {
1093                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive "
1094                                    "master_secret");
1095                         return -1;
1096                 }
1097                 wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret",
1098                                 conn->master_secret, TLS_MASTER_SECRET_LEN);
1099         }
1100
1101         os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN);
1102         os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, TLS_RANDOM_LEN);
1103         key_block_len = 2 * (conn->rl.hash_size + conn->rl.key_material_len +
1104                              conn->rl.iv_size);
1105         if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN,
1106                     "key expansion", seed, 2 * TLS_RANDOM_LEN,
1107                     key_block, key_block_len)) {
1108                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive key_block");
1109                 return -1;
1110         }
1111         wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: key_block",
1112                         key_block, key_block_len);
1113
1114         pos = key_block;
1115
1116         /* client_write_MAC_secret */
1117         os_memcpy(conn->rl.write_mac_secret, pos, conn->rl.hash_size);
1118         pos += conn->rl.hash_size;
1119         /* server_write_MAC_secret */
1120         os_memcpy(conn->rl.read_mac_secret, pos, conn->rl.hash_size);
1121         pos += conn->rl.hash_size;
1122
1123         /* client_write_key */
1124         os_memcpy(conn->rl.write_key, pos, conn->rl.key_material_len);
1125         pos += conn->rl.key_material_len;
1126         /* server_write_key */
1127         os_memcpy(conn->rl.read_key, pos, conn->rl.key_material_len);
1128         pos += conn->rl.key_material_len;
1129
1130         /* client_write_IV */
1131         os_memcpy(conn->rl.write_iv, pos, conn->rl.iv_size);
1132         pos += conn->rl.iv_size;
1133         /* server_write_IV */
1134         os_memcpy(conn->rl.read_iv, pos, conn->rl.iv_size);
1135         pos += conn->rl.iv_size;
1136
1137         return 0;
1138 }
1139
1140
1141 static int tls_write_client_certificate(struct tlsv1_client *conn,
1142                                         u8 **msgpos, u8 *end)
1143 {
1144         u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start;
1145         size_t rlen;
1146         struct x509_certificate *cert;
1147
1148         pos = *msgpos;
1149
1150         wpa_printf(MSG_DEBUG, "TLSv1: Send Certificate");
1151         rhdr = pos;
1152         pos += TLS_RECORD_HEADER_LEN;
1153
1154         /* opaque fragment[TLSPlaintext.length] */
1155
1156         /* Handshake */
1157         hs_start = pos;
1158         /* HandshakeType msg_type */
1159         *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE;
1160         /* uint24 length (to be filled) */
1161         hs_length = pos;
1162         pos += 3;
1163         /* body - Certificate */
1164         /* uint24 length (to be filled) */
1165         cert_start = pos;
1166         pos += 3;
1167         cert = conn->client_cert;
1168         while (cert) {
1169                 if (pos + 3 + cert->cert_len > end) {
1170                         wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space "
1171                                    "for Certificate (cert_len=%lu left=%lu)",
1172                                    (unsigned long) cert->cert_len,
1173                                    (unsigned long) (end - pos));
1174                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1175                                   TLS_ALERT_INTERNAL_ERROR);
1176                         return -1;
1177                 }
1178                 WPA_PUT_BE24(pos, cert->cert_len);
1179                 pos += 3;
1180                 os_memcpy(pos, cert->cert_start, cert->cert_len);
1181                 pos += cert->cert_len;
1182
1183                 if (x509_certificate_self_signed(cert))
1184                         break;
1185                 cert = x509_certificate_get_subject(conn->trusted_certs,
1186                                                     &cert->issuer);
1187         }
1188         if (cert == conn->client_cert || cert == NULL) {
1189                 /*
1190                  * Client was not configured with all the needed certificates
1191                  * to form a full certificate chain. The server may fail to
1192                  * validate the chain unless it is configured with all the
1193                  * missing CA certificates.
1194                  */
1195                 wpa_printf(MSG_DEBUG, "TLSv1: Full client certificate chain "
1196                            "not configured - validation may fail");
1197         }
1198         WPA_PUT_BE24(cert_start, pos - cert_start - 3);
1199
1200         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
1201
1202         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
1203                               rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {
1204                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
1205                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1206                           TLS_ALERT_INTERNAL_ERROR);
1207                 return -1;
1208         }
1209         pos = rhdr + rlen;
1210
1211         tls_verify_hash_add(conn, hs_start, pos - hs_start);
1212
1213         *msgpos = pos;
1214
1215         return 0;
1216 }
1217
1218
1219 static int tlsv1_key_x_anon_dh(struct tlsv1_client *conn, u8 **pos, u8 *end)
1220 {
1221 #ifdef EAP_FAST
1222         /* ClientDiffieHellmanPublic */
1223         u8 *csecret, *csecret_start, *dh_yc, *shared;
1224         size_t csecret_len, dh_yc_len, shared_len;
1225
1226         csecret_len = conn->dh_p_len;
1227         csecret = os_malloc(csecret_len);
1228         if (csecret == NULL) {
1229                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
1230                            "memory for Yc (Diffie-Hellman)");
1231                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1232                           TLS_ALERT_INTERNAL_ERROR);
1233                 return -1;
1234         }
1235         if (os_get_random(csecret, csecret_len)) {
1236                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
1237                            "data for Diffie-Hellman");
1238                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1239                           TLS_ALERT_INTERNAL_ERROR);
1240                 os_free(csecret);
1241                 return -1;
1242         }
1243
1244         if (os_memcmp(csecret, conn->dh_p, csecret_len) > 0)
1245                 csecret[0] = 0; /* make sure Yc < p */
1246
1247         csecret_start = csecret;
1248         while (csecret_len > 1 && *csecret_start == 0) {
1249                 csecret_start++;
1250                 csecret_len--;
1251         }
1252         wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH client's secret value",
1253                         csecret_start, csecret_len);
1254
1255         /* Yc = g^csecret mod p */
1256         dh_yc_len = conn->dh_p_len;
1257         dh_yc = os_malloc(dh_yc_len);
1258         if (dh_yc == NULL) {
1259                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
1260                            "memory for Diffie-Hellman");
1261                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1262                           TLS_ALERT_INTERNAL_ERROR);
1263                 os_free(csecret);
1264                 return -1;
1265         }
1266         crypto_mod_exp(conn->dh_g, conn->dh_g_len,
1267                        csecret_start, csecret_len,
1268                        conn->dh_p, conn->dh_p_len,
1269                        dh_yc, &dh_yc_len);
1270
1271         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)",
1272                     dh_yc, dh_yc_len);
1273
1274         WPA_PUT_BE16(*pos, dh_yc_len);
1275         *pos += 2;
1276         if (*pos + dh_yc_len > end) {
1277                 wpa_printf(MSG_DEBUG, "TLSv1: Not enough room in the "
1278                            "message buffer for Yc");
1279                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1280                           TLS_ALERT_INTERNAL_ERROR);
1281                 os_free(csecret);
1282                 os_free(dh_yc);
1283                 return -1;
1284         }
1285         os_memcpy(*pos, dh_yc, dh_yc_len);
1286         *pos += dh_yc_len;
1287         os_free(dh_yc);
1288
1289         shared_len = conn->dh_p_len;
1290         shared = os_malloc(shared_len);
1291         if (shared == NULL) {
1292                 wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for "
1293                            "DH");
1294                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1295                           TLS_ALERT_INTERNAL_ERROR);
1296                 os_free(csecret);
1297                 return -1;
1298         }
1299
1300         /* shared = Ys^csecret mod p */
1301         crypto_mod_exp(conn->dh_ys, conn->dh_ys_len,
1302                        csecret_start, csecret_len,
1303                        conn->dh_p, conn->dh_p_len,
1304                        shared, &shared_len);
1305         wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange",
1306                         shared, shared_len);
1307
1308         os_memset(csecret_start, 0, csecret_len);
1309         os_free(csecret);
1310         if (tls_derive_keys(conn, shared, shared_len)) {
1311                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
1312                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1313                           TLS_ALERT_INTERNAL_ERROR);
1314                 os_free(shared);
1315                 return -1;
1316         }
1317         os_memset(shared, 0, shared_len);
1318         os_free(shared);
1319         tlsv1_client_free_dh(conn);
1320         return 0;
1321 #else /* EAP_FAST */
1322         tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_INTERNAL_ERROR);
1323         return -1;
1324 #endif /* EAP_FAST */
1325 }
1326
1327
1328 static int tlsv1_key_x_rsa(struct tlsv1_client *conn, u8 **pos, u8 *end)
1329 {
1330         u8 pre_master_secret[TLS_PRE_MASTER_SECRET_LEN];
1331         size_t clen;
1332         int res;
1333
1334         if (tls_derive_pre_master_secret(pre_master_secret) < 0 ||
1335             tls_derive_keys(conn, pre_master_secret,
1336                             TLS_PRE_MASTER_SECRET_LEN)) {
1337                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
1338                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1339                           TLS_ALERT_INTERNAL_ERROR);
1340                 return -1;
1341         }
1342
1343         /* EncryptedPreMasterSecret */
1344         if (conn->server_rsa_key == NULL) {
1345                 wpa_printf(MSG_DEBUG, "TLSv1: No server RSA key to "
1346                            "use for encrypting pre-master secret");
1347                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1348                           TLS_ALERT_INTERNAL_ERROR);
1349                 return -1;
1350         }
1351
1352         /* RSA encrypted value is encoded with PKCS #1 v1.5 block type 2. */
1353         *pos += 2;
1354         clen = end - *pos;
1355         res = crypto_public_key_encrypt_pkcs1_v15(
1356                 conn->server_rsa_key,
1357                 pre_master_secret, TLS_PRE_MASTER_SECRET_LEN,
1358                 *pos, &clen);
1359         os_memset(pre_master_secret, 0, TLS_PRE_MASTER_SECRET_LEN);
1360         if (res < 0) {
1361                 wpa_printf(MSG_DEBUG, "TLSv1: RSA encryption failed");
1362                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1363                           TLS_ALERT_INTERNAL_ERROR);
1364                 return -1;
1365         }
1366         WPA_PUT_BE16(*pos - 2, clen);
1367         wpa_hexdump(MSG_MSGDUMP, "TLSv1: Encrypted pre_master_secret",
1368                     *pos, clen);
1369         *pos += clen;
1370
1371         return 0;
1372 }
1373
1374
1375 static int tls_write_client_key_exchange(struct tlsv1_client *conn,
1376                                          u8 **msgpos, u8 *end)
1377 {
1378         u8 *pos, *rhdr, *hs_start, *hs_length;
1379         size_t rlen;
1380         tls_key_exchange keyx;
1381         const struct tls_cipher_suite *suite;
1382
1383         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
1384         if (suite == NULL)
1385                 keyx = TLS_KEY_X_NULL;
1386         else
1387                 keyx = suite->key_exchange;
1388
1389         pos = *msgpos;
1390
1391         wpa_printf(MSG_DEBUG, "TLSv1: Send ClientKeyExchange");
1392
1393         rhdr = pos;
1394         pos += TLS_RECORD_HEADER_LEN;
1395
1396         /* opaque fragment[TLSPlaintext.length] */
1397
1398         /* Handshake */
1399         hs_start = pos;
1400         /* HandshakeType msg_type */
1401         *pos++ = TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE;
1402         /* uint24 length (to be filled) */
1403         hs_length = pos;
1404         pos += 3;
1405         /* body - ClientKeyExchange */
1406         if (keyx == TLS_KEY_X_DH_anon) {
1407                 if (tlsv1_key_x_anon_dh(conn, &pos, end) < 0)
1408                         return -1;
1409         } else {
1410                 if (tlsv1_key_x_rsa(conn, &pos, end) < 0)
1411                         return -1;
1412         }
1413
1414         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
1415
1416         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
1417                               rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {
1418                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
1419                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1420                           TLS_ALERT_INTERNAL_ERROR);
1421                 return -1;
1422         }
1423         pos = rhdr + rlen;
1424         tls_verify_hash_add(conn, hs_start, pos - hs_start);
1425
1426         *msgpos = pos;
1427
1428         return 0;
1429 }
1430
1431
1432 static int tls_write_client_certificate_verify(struct tlsv1_client *conn,
1433                                                u8 **msgpos, u8 *end)
1434 {
1435         u8 *pos, *rhdr, *hs_start, *hs_length, *signed_start;
1436         size_t rlen, hlen, clen;
1437         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN], *hpos;
1438         enum { SIGN_ALG_RSA, SIGN_ALG_DSA } alg = SIGN_ALG_RSA;
1439
1440         pos = *msgpos;
1441
1442         wpa_printf(MSG_DEBUG, "TLSv1: Send CertificateVerify");
1443         rhdr = pos;
1444         pos += TLS_RECORD_HEADER_LEN;
1445
1446         /* Handshake */
1447         hs_start = pos;
1448         /* HandshakeType msg_type */
1449         *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY;
1450         /* uint24 length (to be filled) */
1451         hs_length = pos;
1452         pos += 3;
1453
1454         /*
1455          * RFC 2246: 7.4.3 and 7.4.8:
1456          * Signature signature
1457          *
1458          * RSA:
1459          * digitally-signed struct {
1460          *     opaque md5_hash[16];
1461          *     opaque sha_hash[20];
1462          * };
1463          *
1464          * DSA:
1465          * digitally-signed struct {
1466          *     opaque sha_hash[20];
1467          * };
1468          *
1469          * The hash values are calculated over all handshake messages sent or
1470          * received starting at ClientHello up to, but not including, this
1471          * CertificateVerify message, including the type and length fields of
1472          * the handshake messages.
1473          */
1474
1475         hpos = hash;
1476
1477         if (alg == SIGN_ALG_RSA) {
1478                 hlen = MD5_MAC_LEN;
1479                 if (conn->verify_md5_cert == NULL ||
1480                     crypto_hash_finish(conn->verify_md5_cert, hpos, &hlen) < 0)
1481                 {
1482                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1483                                   TLS_ALERT_INTERNAL_ERROR);
1484                         conn->verify_md5_cert = NULL;
1485                         crypto_hash_finish(conn->verify_sha1_cert, NULL, NULL);
1486                         conn->verify_sha1_cert = NULL;
1487                         return -1;
1488                 }
1489                 hpos += MD5_MAC_LEN;
1490         } else
1491                 crypto_hash_finish(conn->verify_md5_cert, NULL, NULL);
1492
1493         conn->verify_md5_cert = NULL;
1494         hlen = SHA1_MAC_LEN;
1495         if (conn->verify_sha1_cert == NULL ||
1496             crypto_hash_finish(conn->verify_sha1_cert, hpos, &hlen) < 0) {
1497                 conn->verify_sha1_cert = NULL;
1498                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1499                           TLS_ALERT_INTERNAL_ERROR);
1500                 return -1;
1501         }
1502         conn->verify_sha1_cert = NULL;
1503
1504         if (alg == SIGN_ALG_RSA)
1505                 hlen += MD5_MAC_LEN;
1506
1507         wpa_hexdump(MSG_MSGDUMP, "TLSv1: CertificateVerify hash", hash, hlen);
1508
1509         /*
1510          * RFC 2246, 4.7:
1511          * In digital signing, one-way hash functions are used as input for a
1512          * signing algorithm. A digitally-signed element is encoded as an
1513          * opaque vector <0..2^16-1>, where the length is specified by the
1514          * signing algorithm and key.
1515          *
1516          * In RSA signing, a 36-byte structure of two hashes (one SHA and one
1517          * MD5) is signed (encrypted with the private key). It is encoded with
1518          * PKCS #1 block type 0 or type 1 as described in [PKCS1].
1519          */
1520         signed_start = pos; /* length to be filled */
1521         pos += 2;
1522         clen = end - pos;
1523         if (crypto_private_key_sign_pkcs1(conn->client_key, hash, hlen,
1524                                           pos, &clen) < 0) {
1525                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to sign hash (PKCS #1)");
1526                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1527                           TLS_ALERT_INTERNAL_ERROR);
1528                 return -1;
1529         }
1530         WPA_PUT_BE16(signed_start, clen);
1531
1532         pos += clen;
1533
1534         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
1535
1536         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
1537                               rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {
1538                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
1539                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1540                           TLS_ALERT_INTERNAL_ERROR);
1541                 return -1;
1542         }
1543         pos = rhdr + rlen;
1544
1545         tls_verify_hash_add(conn, hs_start, pos - hs_start);
1546
1547         *msgpos = pos;
1548
1549         return 0;
1550 }
1551
1552
1553 static int tls_write_client_change_cipher_spec(struct tlsv1_client *conn,
1554                                                u8 **msgpos, u8 *end)
1555 {
1556         u8 *pos, *rhdr;
1557         size_t rlen;
1558
1559         pos = *msgpos;
1560
1561         wpa_printf(MSG_DEBUG, "TLSv1: Send ChangeCipherSpec");
1562         rhdr = pos;
1563         pos += TLS_RECORD_HEADER_LEN;
1564         *pos = TLS_CHANGE_CIPHER_SPEC;
1565         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC,
1566                               rhdr, end - rhdr, 1, &rlen) < 0) {
1567                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
1568                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1569                           TLS_ALERT_INTERNAL_ERROR);
1570                 return -1;
1571         }
1572
1573         if (tlsv1_record_change_write_cipher(&conn->rl) < 0) {
1574                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for "
1575                            "record layer");
1576                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1577                           TLS_ALERT_INTERNAL_ERROR);
1578                 return -1;
1579         }
1580
1581         *msgpos = rhdr + rlen;
1582
1583         return 0;
1584 }
1585
1586
1587 static int tls_write_client_finished(struct tlsv1_client *conn,
1588                                      u8 **msgpos, u8 *end)
1589 {
1590         u8 *pos, *rhdr, *hs_start, *hs_length;
1591         size_t rlen, hlen;
1592         u8 verify_data[TLS_VERIFY_DATA_LEN];
1593         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
1594
1595         pos = *msgpos;
1596
1597         wpa_printf(MSG_DEBUG, "TLSv1: Send Finished");
1598
1599         /* Encrypted Handshake Message: Finished */
1600
1601         hlen = MD5_MAC_LEN;
1602         if (conn->verify_md5_client == NULL ||
1603             crypto_hash_finish(conn->verify_md5_client, hash, &hlen) < 0) {
1604                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1605                           TLS_ALERT_INTERNAL_ERROR);
1606                 conn->verify_md5_client = NULL;
1607                 crypto_hash_finish(conn->verify_sha1_client, NULL, NULL);
1608                 conn->verify_sha1_client = NULL;
1609                 return -1;
1610         }
1611         conn->verify_md5_client = NULL;
1612         hlen = SHA1_MAC_LEN;
1613         if (conn->verify_sha1_client == NULL ||
1614             crypto_hash_finish(conn->verify_sha1_client, hash + MD5_MAC_LEN,
1615                                &hlen) < 0) {
1616                 conn->verify_sha1_client = NULL;
1617                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1618                           TLS_ALERT_INTERNAL_ERROR);
1619                 return -1;
1620         }
1621         conn->verify_sha1_client = NULL;
1622
1623         if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN,
1624                     "client finished", hash, MD5_MAC_LEN + SHA1_MAC_LEN,
1625                     verify_data, TLS_VERIFY_DATA_LEN)) {
1626                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data");
1627                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1628                           TLS_ALERT_INTERNAL_ERROR);
1629                 return -1;
1630         }
1631         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)",
1632                         verify_data, TLS_VERIFY_DATA_LEN);
1633
1634         rhdr = pos;
1635         pos += TLS_RECORD_HEADER_LEN;
1636         /* Handshake */
1637         hs_start = pos;
1638         /* HandshakeType msg_type */
1639         *pos++ = TLS_HANDSHAKE_TYPE_FINISHED;
1640         /* uint24 length (to be filled) */
1641         hs_length = pos;
1642         pos += 3;
1643         os_memcpy(pos, verify_data, TLS_VERIFY_DATA_LEN);
1644         pos += TLS_VERIFY_DATA_LEN;
1645         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
1646         tls_verify_hash_add(conn, hs_start, pos - hs_start);
1647
1648         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
1649                               rhdr, end - rhdr, pos - hs_start, &rlen) < 0) {
1650                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
1651                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1652                           TLS_ALERT_INTERNAL_ERROR);
1653                 return -1;
1654         }
1655
1656         pos = rhdr + rlen;
1657
1658         *msgpos = pos;
1659
1660         return 0;
1661 }
1662
1663
1664 static size_t tls_client_cert_chain_der_len(struct tlsv1_client *conn)
1665 {
1666         size_t len = 0;
1667         struct x509_certificate *cert;
1668
1669         cert = conn->client_cert;
1670         while (cert) {
1671                 len += 3 + cert->cert_len;
1672                 if (x509_certificate_self_signed(cert))
1673                         break;
1674                 cert = x509_certificate_get_subject(conn->trusted_certs,
1675                                                     &cert->issuer);
1676         }
1677
1678         return len;
1679 }
1680
1681
1682 static u8 * tls_send_client_key_exchange(struct tlsv1_client *conn,
1683                                          size_t *out_len)
1684 {
1685         u8 *msg, *end, *pos;
1686         size_t msglen;
1687
1688         *out_len = 0;
1689
1690         msglen = 1000;
1691         if (conn->certificate_requested)
1692                 msglen += tls_client_cert_chain_der_len(conn);
1693
1694         msg = os_malloc(msglen);
1695         if (msg == NULL)
1696                 return NULL;
1697
1698         pos = msg;
1699         end = msg + msglen;
1700
1701         if (conn->certificate_requested) {
1702                 if (tls_write_client_certificate(conn, &pos, end) < 0) {
1703                         os_free(msg);
1704                         return NULL;
1705                 }
1706         }
1707
1708         if (tls_write_client_key_exchange(conn, &pos, end) < 0 ||
1709             (conn->certificate_requested && conn->client_key &&
1710              tls_write_client_certificate_verify(conn, &pos, end) < 0) ||
1711             tls_write_client_change_cipher_spec(conn, &pos, end) < 0 ||
1712             tls_write_client_finished(conn, &pos, end) < 0) {
1713                 os_free(msg);
1714                 return NULL;
1715         }
1716
1717         *out_len = pos - msg;
1718
1719         conn->state = SERVER_CHANGE_CIPHER_SPEC;
1720
1721         return msg;
1722 }
1723
1724
1725 static u8 * tls_send_change_cipher_spec(struct tlsv1_client *conn,
1726                                         size_t *out_len)
1727 {
1728         u8 *msg, *end, *pos;
1729
1730         *out_len = 0;
1731
1732         msg = os_malloc(1000);
1733         if (msg == NULL)
1734                 return NULL;
1735
1736         pos = msg;
1737         end = msg + 1000;
1738
1739         if (tls_write_client_change_cipher_spec(conn, &pos, end) < 0 ||
1740             tls_write_client_finished(conn, &pos, end) < 0) {
1741                 os_free(msg);
1742                 return NULL;
1743         }
1744
1745         *out_len = pos - msg;
1746
1747         wpa_printf(MSG_DEBUG, "TLSv1: Session resumption completed "
1748                    "successfully");
1749         conn->state = ESTABLISHED;
1750
1751         return msg;
1752 }
1753
1754
1755 static int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
1756                                           const u8 *buf, size_t *len)
1757 {
1758         if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
1759             buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
1760                 size_t hr_len = WPA_GET_BE24(buf + 1);
1761                 if (hr_len > *len - 4) {
1762                         wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
1763                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1764                                   TLS_ALERT_DECODE_ERROR);
1765                         return -1;
1766                 }
1767                 wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
1768                 *len = 4 + hr_len;
1769                 return 0;
1770         }
1771
1772         switch (conn->state) {
1773         case SERVER_HELLO:
1774                 if (tls_process_server_hello(conn, ct, buf, len))
1775                         return -1;
1776                 break;
1777         case SERVER_CERTIFICATE:
1778                 if (tls_process_certificate(conn, ct, buf, len))
1779                         return -1;
1780                 break;
1781         case SERVER_KEY_EXCHANGE:
1782                 if (tls_process_server_key_exchange(conn, ct, buf, len))
1783                         return -1;
1784                 break;
1785         case SERVER_CERTIFICATE_REQUEST:
1786                 if (tls_process_certificate_request(conn, ct, buf, len))
1787                         return -1;
1788                 break;
1789         case SERVER_HELLO_DONE:
1790                 if (tls_process_server_hello_done(conn, ct, buf, len))
1791                         return -1;
1792                 break;
1793         case SERVER_CHANGE_CIPHER_SPEC:
1794                 if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
1795                         return -1;
1796                 break;
1797         case SERVER_FINISHED:
1798                 if (tls_process_server_finished(conn, ct, buf, len))
1799                         return -1;
1800                 break;
1801         default:
1802                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
1803                            "while processing received message",
1804                            conn->state);
1805                 return -1;
1806         }
1807
1808         if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1809                 tls_verify_hash_add(conn, buf, *len);
1810
1811         return 0;
1812 }
1813
1814
1815 /**
1816  * tlsv1_client_handshake - Process TLS handshake
1817  * @conn: TLSv1 client connection data from tlsv1_client_init()
1818  * @in_data: Input data from TLS peer
1819  * @in_len: Input data length
1820  * @out_len: Length of the output buffer.
1821  * Returns: Pointer to output data, %NULL on failure
1822  */
1823 u8 * tlsv1_client_handshake(struct tlsv1_client *conn,
1824                             const u8 *in_data, size_t in_len,
1825                             size_t *out_len)
1826 {
1827         const u8 *pos, *end;
1828         u8 *msg = NULL, *in_msg, *in_pos, *in_end, alert, ct;
1829         size_t in_msg_len;
1830
1831         if (conn->state == CLIENT_HELLO) {
1832                 if (in_len)
1833                         return NULL;
1834                 return tls_send_client_hello(conn, out_len);
1835         }
1836
1837         if (in_data == NULL || in_len == 0)
1838                 return NULL;
1839
1840         pos = in_data;
1841         end = in_data + in_len;
1842         in_msg = os_malloc(in_len);
1843         if (in_msg == NULL)
1844                 return NULL;
1845
1846         /* Each received packet may include multiple records */
1847         while (pos < end) {
1848                 in_msg_len = in_len;
1849                 if (tlsv1_record_receive(&conn->rl, pos, end - pos,
1850                                          in_msg, &in_msg_len, &alert)) {
1851                         wpa_printf(MSG_DEBUG, "TLSv1: Processing received "
1852                                    "record failed");
1853                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
1854                         goto failed;
1855                 }
1856                 ct = pos[0];
1857
1858                 in_pos = in_msg;
1859                 in_end = in_msg + in_msg_len;
1860
1861                 /* Each received record may include multiple messages of the
1862                  * same ContentType. */
1863                 while (in_pos < in_end) {
1864                         in_msg_len = in_end - in_pos;
1865                         if (tlsv1_client_process_handshake(conn, ct, in_pos,
1866                                                            &in_msg_len) < 0)
1867                                 goto failed;
1868                         in_pos += in_msg_len;
1869                 }
1870
1871                 pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3);
1872         }
1873
1874         os_free(in_msg);
1875         in_msg = NULL;
1876
1877         switch (conn->state) {
1878         case CLIENT_KEY_EXCHANGE:
1879                 msg = tls_send_client_key_exchange(conn, out_len);
1880                 break;
1881         case CHANGE_CIPHER_SPEC:
1882                 msg = tls_send_change_cipher_spec(conn, out_len);
1883                 break;
1884         case ACK_FINISHED:
1885                 wpa_printf(MSG_DEBUG, "TLSv1: Handshake completed "
1886                            "successfully");
1887                 conn->state = ESTABLISHED;
1888                 /* Need to return something to get final TLS ACK. */
1889                 msg = os_malloc(1);
1890                 *out_len = 0;
1891                 break;
1892         default:
1893                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d while "
1894                            "generating reply", conn->state);
1895                 break;
1896         }
1897
1898 failed:
1899         os_free(in_msg);
1900         if (conn->alert_level) {
1901                 conn->state = FAILED;
1902                 os_free(msg);
1903                 msg = tls_send_alert(conn, conn->alert_level,
1904                                      conn->alert_description, out_len);
1905         }
1906
1907         return msg;
1908 }
1909
1910
1911 /**
1912  * tlsv1_client_encrypt - Encrypt data into TLS tunnel
1913  * @conn: TLSv1 client connection data from tlsv1_client_init()
1914  * @in_data: Pointer to plaintext data to be encrypted
1915  * @in_len: Input buffer length
1916  * @out_data: Pointer to output buffer (encrypted TLS data)
1917  * @out_len: Maximum out_data length 
1918  * Returns: Number of bytes written to out_data, -1 on failure
1919  *
1920  * This function is used after TLS handshake has been completed successfully to
1921  * send data in the encrypted tunnel.
1922  */
1923 int tlsv1_client_encrypt(struct tlsv1_client *conn,
1924                          const u8 *in_data, size_t in_len,
1925                          u8 *out_data, size_t out_len)
1926 {
1927         size_t rlen;
1928
1929         wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Plaintext AppData",
1930                         in_data, in_len);
1931
1932         os_memcpy(out_data + TLS_RECORD_HEADER_LEN, in_data, in_len);
1933
1934         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_APPLICATION_DATA,
1935                               out_data, out_len, in_len, &rlen) < 0) {
1936                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
1937                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1938                           TLS_ALERT_INTERNAL_ERROR);
1939                 return -1;
1940         }
1941
1942         return rlen;
1943 }
1944
1945
1946 /**
1947  * tlsv1_client_decrypt - Decrypt data from TLS tunnel
1948  * @conn: TLSv1 client connection data from tlsv1_client_init()
1949  * @in_data: Pointer to input buffer (encrypted TLS data)
1950  * @in_len: Input buffer length
1951  * @out_data: Pointer to output buffer (decrypted data from TLS tunnel)
1952  * @out_len: Maximum out_data length
1953  * Returns: Number of bytes written to out_data, -1 on failure
1954  *
1955  * This function is used after TLS handshake has been completed successfully to
1956  * receive data from the encrypted tunnel.
1957  */
1958 int tlsv1_client_decrypt(struct tlsv1_client *conn,
1959                          const u8 *in_data, size_t in_len,
1960                          u8 *out_data, size_t out_len)
1961 {
1962         const u8 *in_end, *pos;
1963         int res;
1964         u8 alert, *out_end, *out_pos;
1965         size_t olen;
1966
1967         pos = in_data;
1968         in_end = in_data + in_len;
1969         out_pos = out_data;
1970         out_end = out_data + out_len;
1971
1972         while (pos < in_end) {
1973                 if (pos[0] != TLS_CONTENT_TYPE_APPLICATION_DATA) {
1974                         wpa_printf(MSG_DEBUG, "TLSv1: Unexpected content type "
1975                                    "0x%x", pos[0]);
1976                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1977                                   TLS_ALERT_UNEXPECTED_MESSAGE);
1978                         return -1;
1979                 }
1980
1981                 olen = out_end - out_pos;
1982                 res = tlsv1_record_receive(&conn->rl, pos, in_end - pos,
1983                                            out_pos, &olen, &alert);
1984                 if (res < 0) {
1985                         wpa_printf(MSG_DEBUG, "TLSv1: Record layer processing "
1986                                    "failed");
1987                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
1988                         return -1;
1989                 }
1990                 out_pos += olen;
1991                 if (out_pos > out_end) {
1992                         wpa_printf(MSG_DEBUG, "TLSv1: Buffer not large enough "
1993                                    "for processing the received record");
1994                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1995                                   TLS_ALERT_INTERNAL_ERROR);
1996                         return -1;
1997                 }
1998
1999                 pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3);
2000         }
2001
2002         return out_pos - out_data;
2003 }
2004
2005
2006 /**
2007  * tlsv1_client_global_init - Initialize TLSv1 client
2008  * Returns: 0 on success, -1 on failure
2009  *
2010  * This function must be called before using any other TLSv1 client functions.
2011  */
2012 int tlsv1_client_global_init(void)
2013 {
2014         return crypto_global_init();
2015 }
2016
2017
2018 /**
2019  * tlsv1_client_global_deinit - Deinitialize TLSv1 client
2020  *
2021  * This function can be used to deinitialize the TLSv1 client that was
2022  * initialized by calling tlsv1_client_global_init(). No TLSv1 client functions
2023  * can be called after this before calling tlsv1_client_global_init() again.
2024  */
2025 void tlsv1_client_global_deinit(void)
2026 {
2027         crypto_global_deinit();
2028 }
2029
2030
2031 static void tlsv1_client_free_verify_hashes(struct tlsv1_client *conn)
2032 {
2033         crypto_hash_finish(conn->verify_md5_client, NULL, NULL);
2034         crypto_hash_finish(conn->verify_md5_server, NULL, NULL);
2035         crypto_hash_finish(conn->verify_md5_cert, NULL, NULL);
2036         crypto_hash_finish(conn->verify_sha1_client, NULL, NULL);
2037         crypto_hash_finish(conn->verify_sha1_server, NULL, NULL);
2038         crypto_hash_finish(conn->verify_sha1_cert, NULL, NULL);
2039         conn->verify_md5_client = NULL;
2040         conn->verify_md5_server = NULL;
2041         conn->verify_md5_cert = NULL;
2042         conn->verify_sha1_client = NULL;
2043         conn->verify_sha1_server = NULL;
2044         conn->verify_sha1_cert = NULL;
2045 }
2046
2047
2048 static int tlsv1_client_init_verify_hashes(struct tlsv1_client *conn)
2049 {
2050         conn->verify_md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL,
2051                                                    0);
2052         conn->verify_md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL,
2053                                                    0);
2054         conn->verify_md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
2055         conn->verify_sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL,
2056                                                     0);
2057         conn->verify_sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL,
2058                                                     0);
2059         conn->verify_sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL,
2060                                                   0);
2061         if (conn->verify_md5_client == NULL ||
2062             conn->verify_md5_server == NULL ||
2063             conn->verify_md5_cert == NULL ||
2064             conn->verify_sha1_client == NULL ||
2065             conn->verify_sha1_server == NULL ||
2066             conn->verify_sha1_cert == NULL) {
2067                 tlsv1_client_free_verify_hashes(conn);
2068                 return -1;
2069         }
2070         return 0;
2071 }
2072
2073
2074 /**
2075  * tlsv1_client_init - Initialize TLSv1 client connection
2076  * Returns: Pointer to TLSv1 client connection data or %NULL on failure
2077  */
2078 struct tlsv1_client * tlsv1_client_init(void)
2079 {
2080         struct tlsv1_client *conn;
2081         size_t count;
2082         u16 *suites;
2083
2084         conn = os_zalloc(sizeof(*conn));
2085         if (conn == NULL)
2086                 return NULL;
2087
2088         conn->state = CLIENT_HELLO;
2089
2090         if (tlsv1_client_init_verify_hashes(conn) < 0) {
2091                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize verify "
2092                            "hash");
2093                 os_free(conn);
2094                 return NULL;
2095         }
2096
2097         count = 0;
2098         suites = conn->cipher_suites;
2099 #ifndef CONFIG_CRYPTO_INTERNAL
2100         suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA;
2101 #endif /* CONFIG_CRYPTO_INTERNAL */
2102         suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA;
2103         suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA;
2104         suites[count++] = TLS_RSA_WITH_RC4_128_SHA;
2105         suites[count++] = TLS_RSA_WITH_RC4_128_MD5;
2106         conn->num_cipher_suites = count;
2107
2108         return conn;
2109 }
2110
2111
2112 /**
2113  * tlsv1_client_deinit - Deinitialize TLSv1 client connection
2114  * @conn: TLSv1 client connection data from tlsv1_client_init()
2115  */
2116 void tlsv1_client_deinit(struct tlsv1_client *conn)
2117 {
2118         crypto_public_key_free(conn->server_rsa_key);
2119         tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL);
2120         tlsv1_record_change_write_cipher(&conn->rl);
2121         tlsv1_record_change_read_cipher(&conn->rl);
2122         tlsv1_client_free_verify_hashes(conn);
2123         os_free(conn->client_hello_ext);
2124         tlsv1_client_free_dh(conn);
2125         x509_certificate_chain_free(conn->trusted_certs);
2126         x509_certificate_chain_free(conn->client_cert);
2127         crypto_private_key_free(conn->client_key);
2128         os_free(conn);
2129 }
2130
2131
2132 /**
2133  * tlsv1_client_established - Check whether connection has been established
2134  * @conn: TLSv1 client connection data from tlsv1_client_init()
2135  * Returns: 1 if connection is established, 0 if not
2136  */
2137 int tlsv1_client_established(struct tlsv1_client *conn)
2138 {
2139         return conn->state == ESTABLISHED;
2140 }
2141
2142
2143 /**
2144  * tlsv1_client_prf - Use TLS-PRF to derive keying material
2145  * @conn: TLSv1 client connection data from tlsv1_client_init()
2146  * @label: Label (e.g., description of the key) for PRF
2147  * @server_random_first: seed is 0 = client_random|server_random,
2148  * 1 = server_random|client_random
2149  * @out: Buffer for output data from TLS-PRF
2150  * @out_len: Length of the output buffer
2151  * Returns: 0 on success, -1 on failure
2152  */
2153 int tlsv1_client_prf(struct tlsv1_client *conn, const char *label,
2154                      int server_random_first, u8 *out, size_t out_len)
2155 {
2156         u8 seed[2 * TLS_RANDOM_LEN];
2157
2158         if (conn->state != ESTABLISHED)
2159                 return -1;
2160
2161         if (server_random_first) {
2162                 os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN);
2163                 os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random,
2164                           TLS_RANDOM_LEN);
2165         } else {
2166                 os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN);
2167                 os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random,
2168                           TLS_RANDOM_LEN);
2169         }
2170
2171         return tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN,
2172                        label, seed, 2 * TLS_RANDOM_LEN, out, out_len);
2173 }
2174
2175
2176 /**
2177  * tlsv1_client_get_cipher - Get current cipher name
2178  * @conn: TLSv1 client connection data from tlsv1_client_init()
2179  * @buf: Buffer for the cipher name
2180  * @buflen: buf size
2181  * Returns: 0 on success, -1 on failure
2182  *
2183  * Get the name of the currently used cipher.
2184  */
2185 int tlsv1_client_get_cipher(struct tlsv1_client *conn, char *buf,
2186                             size_t buflen)
2187 {
2188         char *cipher;
2189
2190         switch (conn->rl.cipher_suite) {
2191         case TLS_RSA_WITH_RC4_128_MD5:
2192                 cipher = "RC4-MD5";
2193                 break;
2194         case TLS_RSA_WITH_RC4_128_SHA:
2195                 cipher = "RC4-SHA";
2196                 break;
2197         case TLS_RSA_WITH_DES_CBC_SHA:
2198                 cipher = "DES-CBC-SHA";
2199                 break;
2200         case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
2201                 cipher = "DES-CBC3-SHA";
2202                 break;
2203         default:
2204                 return -1;
2205         }
2206
2207         os_snprintf(buf, buflen, "%s", cipher);
2208         return 0;
2209 }
2210
2211
2212 /**
2213  * tlsv1_client_shutdown - Shutdown TLS connection
2214  * @conn: TLSv1 client connection data from tlsv1_client_init()
2215  * Returns: 0 on success, -1 on failure
2216  */
2217 int tlsv1_client_shutdown(struct tlsv1_client *conn)
2218 {
2219         conn->state = CLIENT_HELLO;
2220
2221         tlsv1_client_free_verify_hashes(conn);
2222         if (tlsv1_client_init_verify_hashes(conn) < 0) {
2223                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to re-initialize verify "
2224                            "hash");
2225                 return -1;
2226         }
2227
2228         tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL);
2229         tlsv1_record_change_write_cipher(&conn->rl);
2230         tlsv1_record_change_read_cipher(&conn->rl);
2231
2232         conn->certificate_requested = 0;
2233         crypto_public_key_free(conn->server_rsa_key);
2234         conn->server_rsa_key = NULL;
2235         conn->session_resumed = 0;
2236
2237         return 0;
2238 }
2239
2240
2241 /**
2242  * tlsv1_client_resumed - Was session resumption used
2243  * @conn: TLSv1 client connection data from tlsv1_client_init()
2244  * Returns: 1 if current session used session resumption, 0 if not
2245  */
2246 int tlsv1_client_resumed(struct tlsv1_client *conn)
2247 {
2248         return !!conn->session_resumed;
2249 }
2250
2251
2252 /**
2253  * tlsv1_client_hello_ext - Set TLS extension for ClientHello
2254  * @conn: TLSv1 client connection data from tlsv1_client_init()
2255  * @ext_type: Extension type
2256  * @data: Extension payload (%NULL to remove extension)
2257  * @data_len: Extension payload length
2258  * Returns: 0 on success, -1 on failure
2259  */
2260 int tlsv1_client_hello_ext(struct tlsv1_client *conn, int ext_type,
2261                            const u8 *data, size_t data_len)
2262 {
2263         u8 *pos;
2264
2265         conn->ticket = 0;
2266         os_free(conn->client_hello_ext);
2267         conn->client_hello_ext = NULL;
2268         conn->client_hello_ext_len = 0;
2269
2270         if (data == NULL || data_len == 0)
2271                 return 0;
2272
2273         pos = conn->client_hello_ext = os_malloc(6 + data_len);
2274         if (pos == NULL)
2275                 return -1;
2276
2277         WPA_PUT_BE16(pos, 4 + data_len);
2278         pos += 2;
2279         WPA_PUT_BE16(pos, ext_type);
2280         pos += 2;
2281         WPA_PUT_BE16(pos, data_len);
2282         pos += 2;
2283         os_memcpy(pos, data, data_len);
2284         conn->client_hello_ext_len = 6 + data_len;
2285
2286         if (ext_type == TLS_EXT_PAC_OPAQUE) {
2287                 conn->ticket = 1;
2288                 wpa_printf(MSG_DEBUG, "TLSv1: Using session ticket");
2289         }
2290
2291         return 0;
2292 }
2293
2294
2295 /**
2296  * tlsv1_client_get_keys - Get master key and random data from TLS connection
2297  * @conn: TLSv1 client connection data from tlsv1_client_init()
2298  * @keys: Structure of key/random data (filled on success)
2299  * Returns: 0 on success, -1 on failure
2300  */
2301 int tlsv1_client_get_keys(struct tlsv1_client *conn, struct tls_keys *keys)
2302 {
2303         os_memset(keys, 0, sizeof(*keys));
2304         if (conn->state == CLIENT_HELLO)
2305                 return -1;
2306
2307         keys->client_random = conn->client_random;
2308         keys->client_random_len = TLS_RANDOM_LEN;
2309
2310         if (conn->state != SERVER_HELLO) {
2311                 keys->server_random = conn->server_random;
2312                 keys->server_random_len = TLS_RANDOM_LEN;
2313                 keys->master_key = conn->master_secret;
2314                 keys->master_key_len = TLS_MASTER_SECRET_LEN;
2315         }
2316
2317         return 0;
2318 }
2319
2320
2321 /**
2322  * tlsv1_client_set_master_key - Configure master secret for TLS connection
2323  * @conn: TLSv1 client connection data from tlsv1_client_init()
2324  * @key: TLS pre-master-secret
2325  * @key_len: length of key in bytes
2326  * Returns: 0 on success, -1 on failure
2327  */
2328 int tlsv1_client_set_master_key(struct tlsv1_client *conn,
2329                                 const u8 *key, size_t key_len)
2330 {
2331         if (key_len > TLS_MASTER_SECRET_LEN)
2332                 return -1;
2333         wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret from session "
2334                         "ticket", key, key_len);
2335         os_memcpy(conn->master_secret, key, key_len);
2336         conn->ticket_key = 1;
2337
2338         return 0;
2339 }
2340
2341
2342 /**
2343  * tlsv1_client_get_keyblock_size - Get TLS key_block size
2344  * @conn: TLSv1 client connection data from tlsv1_client_init()
2345  * Returns: Size of the key_block for the negotiated cipher suite or -1 on
2346  * failure
2347  */
2348 int tlsv1_client_get_keyblock_size(struct tlsv1_client *conn)
2349 {
2350         if (conn->state == CLIENT_HELLO || conn->state == SERVER_HELLO)
2351                 return -1;
2352
2353         return 2 * (conn->rl.hash_size + conn->rl.key_material_len +
2354                     conn->rl.iv_size);
2355 }
2356
2357
2358 /**
2359  * tlsv1_client_set_cipher_list - Configure acceptable cipher suites
2360  * @conn: TLSv1 client connection data from tlsv1_client_init()
2361  * @ciphers: Zero (TLS_CIPHER_NONE) terminated list of allowed ciphers
2362  * (TLS_CIPHER_*).
2363  * Returns: 0 on success, -1 on failure
2364  */
2365 int tlsv1_client_set_cipher_list(struct tlsv1_client *conn, u8 *ciphers)
2366 {
2367 #ifdef EAP_FAST
2368         size_t count;
2369         u16 *suites;
2370
2371         /* TODO: implement proper configuration of cipher suites */
2372         if (ciphers[0] == TLS_CIPHER_ANON_DH_AES128_SHA) {
2373                 count = 0;
2374                 suites = conn->cipher_suites;
2375                 suites[count++] = TLS_DH_anon_WITH_AES_256_CBC_SHA;
2376                 suites[count++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
2377                 suites[count++] = TLS_DH_anon_WITH_3DES_EDE_CBC_SHA;
2378                 suites[count++] = TLS_DH_anon_WITH_RC4_128_MD5;
2379                 suites[count++] = TLS_DH_anon_WITH_DES_CBC_SHA;
2380                 conn->num_cipher_suites = count;
2381         }
2382
2383         return 0;
2384 #else /* EAP_FAST */
2385         return -1;
2386 #endif /* EAP_FAST */
2387 }
2388
2389
2390 static int tlsv1_client_add_cert_der(struct x509_certificate **chain,
2391                                      const u8 *buf, size_t len)
2392 {
2393         struct x509_certificate *cert;
2394         char name[128];
2395
2396         cert = x509_certificate_parse(buf, len);
2397         if (cert == NULL) {
2398                 wpa_printf(MSG_INFO, "TLSv1: %s - failed to parse certificate",
2399                            __func__);
2400                 return -1;
2401         }
2402
2403         cert->next = *chain;
2404         *chain = cert;
2405
2406         x509_name_string(&cert->subject, name, sizeof(name));
2407         wpa_printf(MSG_DEBUG, "TLSv1: Added certificate: %s", name);
2408
2409         return 0;
2410 }
2411
2412
2413 static const char *pem_cert_begin = "-----BEGIN CERTIFICATE-----";
2414 static const char *pem_cert_end = "-----END CERTIFICATE-----";
2415
2416
2417 static const u8 * search_tag(const char *tag, const u8 *buf, size_t len)
2418 {
2419         size_t i, plen;
2420
2421         plen = os_strlen(tag);
2422         if (len < plen)
2423                 return NULL;
2424
2425         for (i = 0; i < len - plen; i++) {
2426                 if (os_memcmp(buf + i, tag, plen) == 0)
2427                         return buf + i;
2428         }
2429
2430         return NULL;
2431 }
2432
2433
2434 static int tlsv1_client_add_cert(struct x509_certificate **chain,
2435                                  const u8 *buf, size_t len)
2436 {
2437         const u8 *pos, *end;
2438         unsigned char *der;
2439         size_t der_len;
2440
2441         pos = search_tag(pem_cert_begin, buf, len);
2442         if (!pos) {
2443                 wpa_printf(MSG_DEBUG, "TLSv1: No PEM certificate tag found - "
2444                            "assume DER format");
2445                 return tlsv1_client_add_cert_der(chain, buf, len);
2446         }
2447
2448         wpa_printf(MSG_DEBUG, "TLSv1: Converting PEM format certificate into "
2449                    "DER format");
2450
2451         while (pos) {
2452                 pos += os_strlen(pem_cert_begin);
2453                 end = search_tag(pem_cert_end, pos, buf + len - pos);
2454                 if (end == NULL) {
2455                         wpa_printf(MSG_INFO, "TLSv1: Could not find PEM "
2456                                    "certificate end tag (%s)", pem_cert_end);
2457                         return -1;
2458                 }
2459
2460                 der = base64_decode(pos, end - pos, &der_len);
2461                 if (der == NULL) {
2462                         wpa_printf(MSG_INFO, "TLSv1: Could not decode PEM "
2463                                    "certificate");
2464                         return -1;
2465                 }
2466
2467                 if (tlsv1_client_add_cert_der(chain, der, der_len) < 0) {
2468                         wpa_printf(MSG_INFO, "TLSv1: Failed to parse PEM "
2469                                    "certificate after DER conversion");
2470                         os_free(der);
2471                         return -1;
2472                 }
2473
2474                 os_free(der);
2475
2476                 end += os_strlen(pem_cert_end);
2477                 pos = search_tag(pem_cert_begin, end, buf + len - end);
2478         }
2479
2480         return 0;
2481 }
2482
2483
2484 static int tlsv1_client_set_cert_chain(struct x509_certificate **chain,
2485                                        const char *cert, const u8 *cert_blob,
2486                                        size_t cert_blob_len)
2487 {
2488         if (cert_blob)
2489                 return tlsv1_client_add_cert(chain, cert_blob, cert_blob_len);
2490
2491         if (cert) {
2492                 u8 *buf;
2493                 size_t len;
2494                 int ret;
2495
2496                 buf = (u8 *) os_readfile(cert, &len);
2497                 if (buf == NULL) {
2498                         wpa_printf(MSG_INFO, "TLSv1: Failed to read '%s'",
2499                                    cert);
2500                         return -1;
2501                 }
2502
2503                 ret = tlsv1_client_add_cert(chain, buf, len);
2504                 os_free(buf);
2505                 return ret;
2506         }
2507
2508         return 0;
2509 }
2510
2511
2512 /**
2513  * tlsv1_client_set_ca_cert - Set trusted CA certificate(s)
2514  * @conn: TLSv1 client connection data from tlsv1_client_init()
2515  * @cert: File or reference name for X.509 certificate in PEM or DER format
2516  * @cert_blob: cert as inlined data or %NULL if not used
2517  * @cert_blob_len: ca_cert_blob length
2518  * @path: Path to CA certificates (not yet supported)
2519  * Returns: 0 on success, -1 on failure
2520  */
2521 int tlsv1_client_set_ca_cert(struct tlsv1_client *conn, const char *cert,
2522                              const u8 *cert_blob, size_t cert_blob_len,
2523                              const char *path)
2524 {
2525         if (tlsv1_client_set_cert_chain(&conn->trusted_certs, cert,
2526                                         cert_blob, cert_blob_len) < 0)
2527                 return -1;
2528
2529         if (path) {
2530                 /* TODO: add support for reading number of certificate files */
2531                 wpa_printf(MSG_INFO, "TLSv1: Use of CA certificate directory "
2532                            "not yet supported");
2533                 return -1;
2534         }
2535
2536         return 0;
2537 }
2538
2539
2540 /**
2541  * tlsv1_client_set_client_cert - Set client certificate
2542  * @conn: TLSv1 client connection data from tlsv1_client_init()
2543  * @cert: File or reference name for X.509 certificate in PEM or DER format
2544  * @cert_blob: cert as inlined data or %NULL if not used
2545  * @cert_blob_len: ca_cert_blob length
2546  * Returns: 0 on success, -1 on failure
2547  */
2548 int tlsv1_client_set_client_cert(struct tlsv1_client *conn, const char *cert,
2549                                  const u8 *cert_blob, size_t cert_blob_len)
2550 {
2551         return tlsv1_client_set_cert_chain(&conn->client_cert, cert,
2552                                            cert_blob, cert_blob_len);
2553 }
2554
2555
2556 static int tlsv1_client_set_key(struct tlsv1_client *conn,
2557                                 const u8 *key, size_t len)
2558 {
2559         conn->client_key = crypto_private_key_import(key, len);
2560         if (conn->client_key == NULL) {
2561                 wpa_printf(MSG_INFO, "TLSv1: Failed to parse private key");
2562                 return -1;
2563         }
2564         return 0;
2565 }
2566
2567
2568 /**
2569  * tlsv1_client_set_private_key - Set client private key
2570  * @conn: TLSv1 client connection data from tlsv1_client_init()
2571  * @private_key: File or reference name for the key in PEM or DER format
2572  * @private_key_passwd: Passphrase for decrypted private key, %NULL if no
2573  * passphrase is used.
2574  * @private_key_blob: private_key as inlined data or %NULL if not used
2575  * @private_key_blob_len: private_key_blob length
2576  * Returns: 0 on success, -1 on failure
2577  */
2578 int tlsv1_client_set_private_key(struct tlsv1_client *conn,
2579                                  const char *private_key,
2580                                  const char *private_key_passwd,
2581                                  const u8 *private_key_blob,
2582                                  size_t private_key_blob_len)
2583 {
2584         crypto_private_key_free(conn->client_key);
2585         conn->client_key = NULL;
2586
2587         if (private_key_blob)
2588                 return tlsv1_client_set_key(conn, private_key_blob,
2589                                             private_key_blob_len);
2590
2591         if (private_key) {
2592                 u8 *buf;
2593                 size_t len;
2594                 int ret;
2595
2596                 buf = (u8 *) os_readfile(private_key, &len);
2597                 if (buf == NULL) {
2598                         wpa_printf(MSG_INFO, "TLSv1: Failed to read '%s'",
2599                                    private_key);
2600                         return -1;
2601                 }
2602
2603                 ret = tlsv1_client_set_key(conn, buf, len);
2604                 os_free(buf);
2605                 return ret;
2606         }
2607
2608         return 0;
2609 }