Updated to hostap_2_6
[mech_eap.git] / libeap / src / tls / tlsv1_client_read.c
1 /*
2  * TLSv1 client - read handshake message
3  * Copyright (c) 2006-2015, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "includes.h"
10
11 #include "common.h"
12 #include "crypto/md5.h"
13 #include "crypto/sha1.h"
14 #include "crypto/sha256.h"
15 #include "crypto/tls.h"
16 #include "x509v3.h"
17 #include "tlsv1_common.h"
18 #include "tlsv1_record.h"
19 #include "tlsv1_client.h"
20 #include "tlsv1_client_i.h"
21
22 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
23                                            const u8 *in_data, size_t *in_len);
24 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
25                                            const u8 *in_data, size_t *in_len);
26 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
27                                          const u8 *in_data, size_t *in_len);
28
29
30 static int tls_version_disabled(struct tlsv1_client *conn, u16 ver)
31 {
32         return (((conn->flags & TLS_CONN_DISABLE_TLSv1_0) &&
33                  ver == TLS_VERSION_1) ||
34                 ((conn->flags & TLS_CONN_DISABLE_TLSv1_1) &&
35                  ver == TLS_VERSION_1_1) ||
36                 ((conn->flags & TLS_CONN_DISABLE_TLSv1_2) &&
37                  ver == TLS_VERSION_1_2));
38 }
39
40
41 static int tls_process_server_hello_extensions(struct tlsv1_client *conn,
42                                                const u8 *pos, size_t len)
43 {
44         const u8 *end = pos + len;
45
46         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello extensions",
47                     pos, len);
48         while (pos < end) {
49                 u16 ext, elen;
50
51                 if (end - pos < 4) {
52                         wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension header");
53                         return -1;
54                 }
55
56                 ext = WPA_GET_BE16(pos);
57                 pos += 2;
58                 elen = WPA_GET_BE16(pos);
59                 pos += 2;
60
61                 if (elen > end - pos) {
62                         wpa_printf(MSG_INFO, "TLSv1: Truncated ServerHello extension");
63                         return -1;
64                 }
65
66                 wpa_printf(MSG_DEBUG, "TLSv1: ServerHello ExtensionType %u",
67                            ext);
68                 wpa_hexdump(MSG_DEBUG, "TLSv1: ServerHello extension data",
69                             pos, elen);
70
71                 pos += elen;
72         }
73
74         return 0;
75 }
76
77
78 static int tls_process_server_hello(struct tlsv1_client *conn, u8 ct,
79                                     const u8 *in_data, size_t *in_len)
80 {
81         const u8 *pos, *end;
82         size_t left, len, i;
83         u16 cipher_suite;
84         u16 tls_version;
85
86         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
87                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
88                            "received content type 0x%x", ct);
89                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
90                           TLS_ALERT_UNEXPECTED_MESSAGE);
91                 return -1;
92         }
93
94         pos = in_data;
95         left = *in_len;
96
97         if (left < 4)
98                 goto decode_error;
99
100         /* HandshakeType msg_type */
101         if (*pos != TLS_HANDSHAKE_TYPE_SERVER_HELLO) {
102                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
103                            "message %d (expected ServerHello)", *pos);
104                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
105                           TLS_ALERT_UNEXPECTED_MESSAGE);
106                 return -1;
107         }
108         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHello");
109         pos++;
110         /* uint24 length */
111         len = WPA_GET_BE24(pos);
112         pos += 3;
113         left -= 4;
114
115         if (len > left)
116                 goto decode_error;
117
118         /* body - ServerHello */
119
120         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerHello", pos, len);
121         end = pos + len;
122
123         /* ProtocolVersion server_version */
124         if (end - pos < 2)
125                 goto decode_error;
126         tls_version = WPA_GET_BE16(pos);
127         if (!tls_version_ok(tls_version) ||
128             tls_version_disabled(conn, tls_version)) {
129                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected protocol version in "
130                            "ServerHello %u.%u", pos[0], pos[1]);
131                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
132                           TLS_ALERT_PROTOCOL_VERSION);
133                 return -1;
134         }
135         pos += 2;
136
137         wpa_printf(MSG_DEBUG, "TLSv1: Using TLS v%s",
138                    tls_version_str(tls_version));
139         conn->rl.tls_version = tls_version;
140
141         /* Random random */
142         if (end - pos < TLS_RANDOM_LEN)
143                 goto decode_error;
144
145         os_memcpy(conn->server_random, pos, TLS_RANDOM_LEN);
146         pos += TLS_RANDOM_LEN;
147         wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
148                     conn->server_random, TLS_RANDOM_LEN);
149
150         /* SessionID session_id */
151         if (end - pos < 1)
152                 goto decode_error;
153         if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN)
154                 goto decode_error;
155         if (conn->session_id_len && conn->session_id_len == *pos &&
156             os_memcmp(conn->session_id, pos + 1, conn->session_id_len) == 0) {
157                 pos += 1 + conn->session_id_len;
158                 wpa_printf(MSG_DEBUG, "TLSv1: Resuming old session");
159                 conn->session_resumed = 1;
160         } else {
161                 conn->session_id_len = *pos;
162                 pos++;
163                 os_memcpy(conn->session_id, pos, conn->session_id_len);
164                 pos += conn->session_id_len;
165         }
166         wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
167                     conn->session_id, conn->session_id_len);
168
169         /* CipherSuite cipher_suite */
170         if (end - pos < 2)
171                 goto decode_error;
172         cipher_suite = WPA_GET_BE16(pos);
173         pos += 2;
174         for (i = 0; i < conn->num_cipher_suites; i++) {
175                 if (cipher_suite == conn->cipher_suites[i])
176                         break;
177         }
178         if (i == conn->num_cipher_suites) {
179                 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
180                            "cipher suite 0x%04x", cipher_suite);
181                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
182                           TLS_ALERT_ILLEGAL_PARAMETER);
183                 return -1;
184         }
185
186         if (conn->session_resumed && cipher_suite != conn->prev_cipher_suite) {
187                 wpa_printf(MSG_DEBUG, "TLSv1: Server selected a different "
188                            "cipher suite for a resumed connection (0x%04x != "
189                            "0x%04x)", cipher_suite, conn->prev_cipher_suite);
190                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
191                           TLS_ALERT_ILLEGAL_PARAMETER);
192                 return -1;
193         }
194
195         if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
196                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
197                            "record layer");
198                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
199                           TLS_ALERT_INTERNAL_ERROR);
200                 return -1;
201         }
202
203         conn->prev_cipher_suite = cipher_suite;
204
205         /* CompressionMethod compression_method */
206         if (end - pos < 1)
207                 goto decode_error;
208         if (*pos != TLS_COMPRESSION_NULL) {
209                 wpa_printf(MSG_INFO, "TLSv1: Server selected unexpected "
210                            "compression 0x%02x", *pos);
211                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
212                           TLS_ALERT_ILLEGAL_PARAMETER);
213                 return -1;
214         }
215         pos++;
216
217         if (end - pos >= 2) {
218                 u16 ext_len;
219
220                 ext_len = WPA_GET_BE16(pos);
221                 pos += 2;
222                 if (end - pos < ext_len) {
223                         wpa_printf(MSG_INFO,
224                                    "TLSv1: Invalid ServerHello extension length: %u (left: %u)",
225                                    ext_len, (unsigned int) (end - pos));
226                         goto decode_error;
227                 }
228
229                 if (tls_process_server_hello_extensions(conn, pos, ext_len))
230                         goto decode_error;
231                 pos += ext_len;
232         }
233
234         if (end != pos) {
235                 wpa_hexdump(MSG_DEBUG, "TLSv1: Unexpected extra data in the "
236                             "end of ServerHello", pos, end - pos);
237                 goto decode_error;
238         }
239
240         if (conn->session_ticket_included && conn->session_ticket_cb) {
241                 /* TODO: include SessionTicket extension if one was included in
242                  * ServerHello */
243                 int res = conn->session_ticket_cb(
244                         conn->session_ticket_cb_ctx, NULL, 0,
245                         conn->client_random, conn->server_random,
246                         conn->master_secret);
247                 if (res < 0) {
248                         wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback "
249                                    "indicated failure");
250                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
251                                   TLS_ALERT_HANDSHAKE_FAILURE);
252                         return -1;
253                 }
254                 conn->use_session_ticket = !!res;
255         }
256
257         if ((conn->session_resumed || conn->use_session_ticket) &&
258             tls_derive_keys(conn, NULL, 0)) {
259                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
260                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
261                           TLS_ALERT_INTERNAL_ERROR);
262                 return -1;
263         }
264
265         *in_len = end - in_data;
266
267         conn->state = (conn->session_resumed || conn->use_session_ticket) ?
268                 SERVER_CHANGE_CIPHER_SPEC : SERVER_CERTIFICATE;
269
270         return 0;
271
272 decode_error:
273         wpa_printf(MSG_DEBUG, "TLSv1: Failed to decode ServerHello");
274         tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
275         return -1;
276 }
277
278
279 static void tls_peer_cert_event(struct tlsv1_client *conn, int depth,
280                                 struct x509_certificate *cert)
281 {
282         union tls_event_data ev;
283         struct wpabuf *cert_buf = NULL;
284 #ifdef CONFIG_SHA256
285         u8 hash[32];
286 #endif /* CONFIG_SHA256 */
287         char subject[128];
288
289         if (!conn->event_cb)
290                 return;
291
292         os_memset(&ev, 0, sizeof(ev));
293         if (conn->cred->cert_probe || conn->cert_in_cb) {
294                 cert_buf = wpabuf_alloc_copy(cert->cert_start,
295                                              cert->cert_len);
296                 ev.peer_cert.cert = cert_buf;
297         }
298 #ifdef CONFIG_SHA256
299         if (cert_buf) {
300                 const u8 *addr[1];
301                 size_t len[1];
302                 addr[0] = wpabuf_head(cert_buf);
303                 len[0] = wpabuf_len(cert_buf);
304                 if (sha256_vector(1, addr, len, hash) == 0) {
305                         ev.peer_cert.hash = hash;
306                         ev.peer_cert.hash_len = sizeof(hash);
307                 }
308         }
309 #endif /* CONFIG_SHA256 */
310
311         ev.peer_cert.depth = depth;
312         x509_name_string(&cert->subject, subject, sizeof(subject));
313         ev.peer_cert.subject = subject;
314
315         conn->event_cb(conn->cb_ctx, TLS_PEER_CERTIFICATE, &ev);
316         wpabuf_free(cert_buf);
317 }
318
319
320 static void tls_cert_chain_failure_event(struct tlsv1_client *conn, int depth,
321                                          struct x509_certificate *cert,
322                                          enum tls_fail_reason reason,
323                                          const char *reason_txt)
324 {
325         struct wpabuf *cert_buf = NULL;
326         union tls_event_data ev;
327         char subject[128];
328
329         if (!conn->event_cb || !cert)
330                 return;
331
332         os_memset(&ev, 0, sizeof(ev));
333         ev.cert_fail.depth = depth;
334         x509_name_string(&cert->subject, subject, sizeof(subject));
335         ev.peer_cert.subject = subject;
336         ev.cert_fail.reason = reason;
337         ev.cert_fail.reason_txt = reason_txt;
338         cert_buf = wpabuf_alloc_copy(cert->cert_start,
339                                      cert->cert_len);
340         ev.cert_fail.cert = cert_buf;
341         conn->event_cb(conn->cb_ctx, TLS_CERT_CHAIN_FAILURE, &ev);
342         wpabuf_free(cert_buf);
343 }
344
345
346 static int tls_process_certificate(struct tlsv1_client *conn, u8 ct,
347                                    const u8 *in_data, size_t *in_len)
348 {
349         const u8 *pos, *end;
350         size_t left, len, list_len, cert_len, idx;
351         u8 type;
352         struct x509_certificate *chain = NULL, *last = NULL, *cert;
353         int reason;
354
355         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
356                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
357                            "received content type 0x%x", ct);
358                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
359                           TLS_ALERT_UNEXPECTED_MESSAGE);
360                 return -1;
361         }
362
363         pos = in_data;
364         left = *in_len;
365
366         if (left < 4) {
367                 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate message "
368                            "(len=%lu)", (unsigned long) left);
369                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
370                 return -1;
371         }
372
373         type = *pos++;
374         len = WPA_GET_BE24(pos);
375         pos += 3;
376         left -= 4;
377
378         if (len > left) {
379                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected Certificate message "
380                            "length (len=%lu != left=%lu)",
381                            (unsigned long) len, (unsigned long) left);
382                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
383                 return -1;
384         }
385
386         if (type == TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE)
387                 return tls_process_server_key_exchange(conn, ct, in_data,
388                                                        in_len);
389         if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
390                 return tls_process_certificate_request(conn, ct, in_data,
391                                                        in_len);
392         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
393                 return tls_process_server_hello_done(conn, ct, in_data,
394                                                      in_len);
395         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
396                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
397                            "message %d (expected Certificate/"
398                            "ServerKeyExchange/CertificateRequest/"
399                            "ServerHelloDone)", type);
400                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
401                           TLS_ALERT_UNEXPECTED_MESSAGE);
402                 return -1;
403         }
404
405         wpa_printf(MSG_DEBUG,
406                    "TLSv1: Received Certificate (certificate_list len %lu)",
407                    (unsigned long) len);
408
409         /*
410          * opaque ASN.1Cert<2^24-1>;
411          *
412          * struct {
413          *     ASN.1Cert certificate_list<1..2^24-1>;
414          * } Certificate;
415          */
416
417         end = pos + len;
418
419         if (end - pos < 3) {
420                 wpa_printf(MSG_DEBUG, "TLSv1: Too short Certificate "
421                            "(left=%lu)", (unsigned long) left);
422                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
423                 return -1;
424         }
425
426         list_len = WPA_GET_BE24(pos);
427         pos += 3;
428
429         if ((size_t) (end - pos) != list_len) {
430                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate_list "
431                            "length (len=%lu left=%lu)",
432                            (unsigned long) list_len,
433                            (unsigned long) (end - pos));
434                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
435                 return -1;
436         }
437
438         idx = 0;
439         while (pos < end) {
440                 if (end - pos < 3) {
441                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
442                                    "certificate_list");
443                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
444                                   TLS_ALERT_DECODE_ERROR);
445                         x509_certificate_chain_free(chain);
446                         return -1;
447                 }
448
449                 cert_len = WPA_GET_BE24(pos);
450                 pos += 3;
451
452                 if ((size_t) (end - pos) < cert_len) {
453                         wpa_printf(MSG_DEBUG, "TLSv1: Unexpected certificate "
454                                    "length (len=%lu left=%lu)",
455                                    (unsigned long) cert_len,
456                                    (unsigned long) (end - pos));
457                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
458                                   TLS_ALERT_DECODE_ERROR);
459                         x509_certificate_chain_free(chain);
460                         return -1;
461                 }
462
463                 wpa_printf(MSG_DEBUG, "TLSv1: Certificate %lu (len %lu)",
464                            (unsigned long) idx, (unsigned long) cert_len);
465
466                 if (idx == 0) {
467                         crypto_public_key_free(conn->server_rsa_key);
468                         if (tls_parse_cert(pos, cert_len,
469                                            &conn->server_rsa_key)) {
470                                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
471                                            "the certificate");
472                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
473                                           TLS_ALERT_BAD_CERTIFICATE);
474                                 x509_certificate_chain_free(chain);
475                                 return -1;
476                         }
477                 }
478
479                 cert = x509_certificate_parse(pos, cert_len);
480                 if (cert == NULL) {
481                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse "
482                                    "the certificate");
483                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
484                                   TLS_ALERT_BAD_CERTIFICATE);
485                         x509_certificate_chain_free(chain);
486                         return -1;
487                 }
488
489                 tls_peer_cert_event(conn, idx, cert);
490
491                 if (last == NULL)
492                         chain = cert;
493                 else
494                         last->next = cert;
495                 last = cert;
496
497                 idx++;
498                 pos += cert_len;
499         }
500
501         if (conn->cred && conn->cred->server_cert_only && chain) {
502                 u8 hash[SHA256_MAC_LEN];
503                 char buf[128];
504
505                 wpa_printf(MSG_DEBUG,
506                            "TLSv1: Validate server certificate hash");
507                 x509_name_string(&chain->subject, buf, sizeof(buf));
508                 wpa_printf(MSG_DEBUG, "TLSv1: 0: %s", buf);
509                 if (sha256_vector(1, &chain->cert_start, &chain->cert_len,
510                                   hash) < 0 ||
511                     os_memcmp(conn->cred->srv_cert_hash, hash,
512                               SHA256_MAC_LEN) != 0) {
513                         wpa_printf(MSG_DEBUG,
514                                    "TLSv1: Server certificate hash mismatch");
515                         wpa_hexdump(MSG_MSGDUMP, "TLSv1: SHA256 hash",
516                                     hash, SHA256_MAC_LEN);
517                         if (conn->event_cb) {
518                                 union tls_event_data ev;
519
520                                 os_memset(&ev, 0, sizeof(ev));
521                                 ev.cert_fail.reason = TLS_FAIL_UNSPECIFIED;
522                                 ev.cert_fail.reason_txt =
523                                         "Server certificate mismatch";
524                                 ev.cert_fail.subject = buf;
525                                 conn->event_cb(conn->cb_ctx,
526                                                TLS_CERT_CHAIN_FAILURE, &ev);
527                         }
528                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
529                                   TLS_ALERT_BAD_CERTIFICATE);
530                         x509_certificate_chain_free(chain);
531                         return -1;
532                 }
533         } else if (conn->cred && conn->cred->cert_probe) {
534                 wpa_printf(MSG_DEBUG,
535                            "TLSv1: Reject server certificate on probe-only rune");
536                 if (conn->event_cb) {
537                         union tls_event_data ev;
538                         char buf[128];
539
540                         os_memset(&ev, 0, sizeof(ev));
541                         ev.cert_fail.reason = TLS_FAIL_SERVER_CHAIN_PROBE;
542                         ev.cert_fail.reason_txt =
543                                 "Server certificate chain probe";
544                         if (chain) {
545                                 x509_name_string(&chain->subject, buf,
546                                                  sizeof(buf));
547                                 ev.cert_fail.subject = buf;
548                         }
549                         conn->event_cb(conn->cb_ctx, TLS_CERT_CHAIN_FAILURE,
550                                        &ev);
551                 }
552                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
553                           TLS_ALERT_BAD_CERTIFICATE);
554                 x509_certificate_chain_free(chain);
555                 return -1;
556         } else if (conn->cred && conn->cred->ca_cert_verify &&
557                    x509_certificate_chain_validate(
558                            conn->cred->trusted_certs, chain, &reason,
559                            !!(conn->flags & TLS_CONN_DISABLE_TIME_CHECKS))
560                    < 0) {
561                 int tls_reason;
562                 wpa_printf(MSG_DEBUG, "TLSv1: Server certificate chain "
563                            "validation failed (reason=%d)", reason);
564                 switch (reason) {
565                 case X509_VALIDATE_BAD_CERTIFICATE:
566                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
567                         tls_cert_chain_failure_event(
568                                 conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
569                                 "bad certificate");
570                         break;
571                 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
572                         tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
573                         break;
574                 case X509_VALIDATE_CERTIFICATE_REVOKED:
575                         tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
576                         tls_cert_chain_failure_event(
577                                 conn, 0, chain, TLS_FAIL_REVOKED,
578                                 "certificate revoked");
579                         break;
580                 case X509_VALIDATE_CERTIFICATE_EXPIRED:
581                         tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
582                         tls_cert_chain_failure_event(
583                                 conn, 0, chain, TLS_FAIL_EXPIRED,
584                                 "certificate has expired or is not yet valid");
585                         break;
586                 case X509_VALIDATE_CERTIFICATE_UNKNOWN:
587                         tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
588                         break;
589                 case X509_VALIDATE_UNKNOWN_CA:
590                         tls_reason = TLS_ALERT_UNKNOWN_CA;
591                         tls_cert_chain_failure_event(
592                                 conn, 0, chain, TLS_FAIL_UNTRUSTED,
593                                 "unknown CA");
594                         break;
595                 default:
596                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
597                         break;
598                 }
599                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
600                 x509_certificate_chain_free(chain);
601                 return -1;
602         }
603
604         if (conn->cred && !conn->cred->server_cert_only && chain &&
605             (chain->extensions_present & X509_EXT_EXT_KEY_USAGE) &&
606             !(chain->ext_key_usage &
607               (X509_EXT_KEY_USAGE_ANY | X509_EXT_KEY_USAGE_SERVER_AUTH))) {
608                 tls_cert_chain_failure_event(
609                         conn, 0, chain, TLS_FAIL_BAD_CERTIFICATE,
610                         "certificate not allowed for server authentication");
611                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
612                           TLS_ALERT_BAD_CERTIFICATE);
613                 x509_certificate_chain_free(chain);
614                 return -1;
615         }
616
617         if (conn->flags & TLS_CONN_REQUEST_OCSP) {
618                 x509_certificate_chain_free(conn->server_cert);
619                 conn->server_cert = chain;
620         } else {
621                 x509_certificate_chain_free(chain);
622         }
623
624         *in_len = end - in_data;
625
626         conn->state = SERVER_KEY_EXCHANGE;
627
628         return 0;
629 }
630
631
632 static unsigned int count_bits(const u8 *val, size_t len)
633 {
634         size_t i;
635         unsigned int bits;
636         u8 tmp;
637
638         for (i = 0; i < len; i++) {
639                 if (val[i])
640                         break;
641         }
642         if (i == len)
643                 return 0;
644
645         bits = (len - i - 1) * 8;
646         tmp = val[i];
647         while (tmp) {
648                 bits++;
649                 tmp >>= 1;
650         }
651
652         return bits;
653 }
654
655
656 static int tlsv1_process_diffie_hellman(struct tlsv1_client *conn,
657                                         const u8 *buf, size_t len,
658                                         tls_key_exchange key_exchange)
659 {
660         const u8 *pos, *end, *server_params, *server_params_end;
661         u8 alert;
662         unsigned int bits;
663         u16 val;
664
665         tlsv1_client_free_dh(conn);
666
667         pos = buf;
668         end = buf + len;
669
670         if (end - pos < 3)
671                 goto fail;
672         server_params = pos;
673         val = WPA_GET_BE16(pos);
674         pos += 2;
675         if (val == 0 || val > (size_t) (end - pos)) {
676                 wpa_printf(MSG_DEBUG, "TLSv1: Invalid dh_p length %u", val);
677                 goto fail;
678         }
679         conn->dh_p_len = val;
680         bits = count_bits(pos, conn->dh_p_len);
681         if (bits < 768) {
682                 wpa_printf(MSG_INFO, "TLSv1: Reject under 768-bit DH prime (insecure; only %u bits)",
683                            bits);
684                 wpa_hexdump(MSG_DEBUG, "TLSv1: Rejected DH prime",
685                             pos, conn->dh_p_len);
686                 goto fail;
687         }
688         conn->dh_p = os_malloc(conn->dh_p_len);
689         if (conn->dh_p == NULL)
690                 goto fail;
691         os_memcpy(conn->dh_p, pos, conn->dh_p_len);
692         pos += conn->dh_p_len;
693         wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
694                     conn->dh_p, conn->dh_p_len);
695
696         if (end - pos < 3)
697                 goto fail;
698         val = WPA_GET_BE16(pos);
699         pos += 2;
700         if (val == 0 || val > (size_t) (end - pos))
701                 goto fail;
702         conn->dh_g_len = val;
703         conn->dh_g = os_malloc(conn->dh_g_len);
704         if (conn->dh_g == NULL)
705                 goto fail;
706         os_memcpy(conn->dh_g, pos, conn->dh_g_len);
707         pos += conn->dh_g_len;
708         wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
709                     conn->dh_g, conn->dh_g_len);
710         if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
711                 goto fail;
712
713         if (end - pos < 3)
714                 goto fail;
715         val = WPA_GET_BE16(pos);
716         pos += 2;
717         if (val == 0 || val > (size_t) (end - pos))
718                 goto fail;
719         conn->dh_ys_len = val;
720         conn->dh_ys = os_malloc(conn->dh_ys_len);
721         if (conn->dh_ys == NULL)
722                 goto fail;
723         os_memcpy(conn->dh_ys, pos, conn->dh_ys_len);
724         pos += conn->dh_ys_len;
725         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
726                     conn->dh_ys, conn->dh_ys_len);
727         server_params_end = pos;
728
729         if (key_exchange == TLS_KEY_X_DHE_RSA) {
730                 u8 hash[64];
731                 int hlen;
732
733                 if (conn->rl.tls_version == TLS_VERSION_1_2) {
734 #ifdef CONFIG_TLSV12
735                         /*
736                          * RFC 5246, 4.7:
737                          * TLS v1.2 adds explicit indication of the used
738                          * signature and hash algorithms.
739                          *
740                          * struct {
741                          *   HashAlgorithm hash;
742                          *   SignatureAlgorithm signature;
743                          * } SignatureAndHashAlgorithm;
744                          */
745                         if (end - pos < 2)
746                                 goto fail;
747                         if ((pos[0] != TLS_HASH_ALG_SHA256 &&
748                              pos[0] != TLS_HASH_ALG_SHA384 &&
749                              pos[0] != TLS_HASH_ALG_SHA512) ||
750                             pos[1] != TLS_SIGN_ALG_RSA) {
751                                 wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/signature(%u) algorithm",
752                                            pos[0], pos[1]);
753                                 goto fail;
754                         }
755
756                         hlen = tlsv12_key_x_server_params_hash(
757                                 conn->rl.tls_version, pos[0],
758                                 conn->client_random,
759                                 conn->server_random, server_params,
760                                 server_params_end - server_params, hash);
761                         pos += 2;
762 #else /* CONFIG_TLSV12 */
763                         goto fail;
764 #endif /* CONFIG_TLSV12 */
765                 } else {
766                         hlen = tls_key_x_server_params_hash(
767                                 conn->rl.tls_version, conn->client_random,
768                                 conn->server_random, server_params,
769                                 server_params_end - server_params, hash);
770                 }
771
772                 if (hlen < 0)
773                         goto fail;
774                 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerKeyExchange hash",
775                             hash, hlen);
776
777                 if (tls_verify_signature(conn->rl.tls_version,
778                                          conn->server_rsa_key,
779                                          hash, hlen, pos, end - pos,
780                                          &alert) < 0)
781                         goto fail;
782         }
783
784         return 0;
785
786 fail:
787         wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
788         tlsv1_client_free_dh(conn);
789         return -1;
790 }
791
792
793 static enum tls_ocsp_result
794 tls_process_certificate_status_ocsp_response(struct tlsv1_client *conn,
795                                              const u8 *pos, size_t len)
796 {
797         const u8 *end = pos + len;
798         u32 ocsp_resp_len;
799
800         /* opaque OCSPResponse<1..2^24-1>; */
801         if (end - pos < 3) {
802                 wpa_printf(MSG_INFO, "TLSv1: Too short OCSPResponse");
803                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
804                 return TLS_OCSP_INVALID;
805         }
806         ocsp_resp_len = WPA_GET_BE24(pos);
807         pos += 3;
808         if (end - pos < ocsp_resp_len) {
809                 wpa_printf(MSG_INFO, "TLSv1: Truncated OCSPResponse");
810                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
811                 return TLS_OCSP_INVALID;
812         }
813
814         return tls_process_ocsp_response(conn, pos, ocsp_resp_len);
815 }
816
817
818 static int tls_process_certificate_status(struct tlsv1_client *conn, u8 ct,
819                                            const u8 *in_data, size_t *in_len)
820 {
821         const u8 *pos, *end;
822         size_t left, len;
823         u8 type, status_type;
824         enum tls_ocsp_result res;
825         struct x509_certificate *cert;
826         int depth;
827
828         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
829                 wpa_printf(MSG_DEBUG,
830                            "TLSv1: Expected Handshake; received content type 0x%x",
831                            ct);
832                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
833                           TLS_ALERT_UNEXPECTED_MESSAGE);
834                 return -1;
835         }
836
837         pos = in_data;
838         left = *in_len;
839
840         if (left < 4) {
841                 wpa_printf(MSG_DEBUG,
842                            "TLSv1: Too short CertificateStatus (left=%lu)",
843                            (unsigned long) left);
844                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
845                 return -1;
846         }
847
848         type = *pos++;
849         len = WPA_GET_BE24(pos);
850         pos += 3;
851         left -= 4;
852
853         if (len > left) {
854                 wpa_printf(MSG_DEBUG,
855                            "TLSv1: Mismatch in CertificateStatus length (len=%lu != left=%lu)",
856                            (unsigned long) len, (unsigned long) left);
857                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
858                 return -1;
859         }
860
861         end = pos + len;
862
863         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS) {
864                 wpa_printf(MSG_DEBUG,
865                            "TLSv1: Received unexpected handshake message %d (expected CertificateStatus)",
866                            type);
867                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
868                           TLS_ALERT_UNEXPECTED_MESSAGE);
869                 return -1;
870         }
871
872         wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateStatus");
873
874         /*
875          * struct {
876          *     CertificateStatusType status_type;
877          *     select (status_type) {
878          *         case ocsp: OCSPResponse;
879          *         case ocsp_multi: OCSPResponseList;
880          *     } response;
881          * } CertificateStatus;
882          */
883         if (end - pos < 1) {
884                 wpa_printf(MSG_INFO, "TLSv1: Too short CertificateStatus");
885                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
886                 return -1;
887         }
888         status_type = *pos++;
889         wpa_printf(MSG_DEBUG, "TLSv1: CertificateStatus status_type %u",
890                    status_type);
891
892         if (status_type == 1 /* ocsp */) {
893                 res = tls_process_certificate_status_ocsp_response(
894                         conn, pos, end - pos);
895         } else if (status_type == 2 /* ocsp_multi */) {
896                 int good = 0, revoked = 0;
897                 u32 resp_len;
898
899                 res = TLS_OCSP_NO_RESPONSE;
900
901                 /*
902                  * opaque OCSPResponse<0..2^24-1>;
903                  *
904                  * struct {
905                  *   OCSPResponse ocsp_response_list<1..2^24-1>;
906                  * } OCSPResponseList;
907                  */
908                 if (end - pos < 3) {
909                         wpa_printf(MSG_DEBUG,
910                                    "TLSv1: Truncated OCSPResponseList");
911                         res = TLS_OCSP_INVALID;
912                         goto done;
913                 }
914                 resp_len = WPA_GET_BE24(pos);
915                 pos += 3;
916                 if (end - pos < resp_len) {
917                         wpa_printf(MSG_DEBUG,
918                                    "TLSv1: Truncated OCSPResponseList(len=%u)",
919                                    resp_len);
920                         res = TLS_OCSP_INVALID;
921                         goto done;
922                 }
923                 end = pos + resp_len;
924
925                 while (end - pos >= 3) {
926                         resp_len = WPA_GET_BE24(pos);
927                         pos += 3;
928                         if (resp_len > end - pos) {
929                                 wpa_printf(MSG_DEBUG,
930                                            "TLSv1: Truncated OCSPResponse(len=%u; left=%d) in ocsp_multi",
931                                            resp_len, (int) (end - pos));
932                                 res = TLS_OCSP_INVALID;
933                                 break;
934                         }
935                         if (!resp_len)
936                                 continue; /* Skip an empty response */
937                         res = tls_process_certificate_status_ocsp_response(
938                                 conn, pos - 3, resp_len + 3);
939                         if (res == TLS_OCSP_REVOKED)
940                                 revoked++;
941                         else if (res == TLS_OCSP_GOOD)
942                                 good++;
943                         pos += resp_len;
944                 }
945
946                 if (revoked)
947                         res = TLS_OCSP_REVOKED;
948                 else if (good)
949                         res = TLS_OCSP_GOOD;
950         } else {
951                 wpa_printf(MSG_DEBUG,
952                            "TLSv1: Ignore unsupported CertificateStatus");
953                 goto skip;
954         }
955
956 done:
957         if (res == TLS_OCSP_REVOKED) {
958                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
959                           TLS_ALERT_CERTIFICATE_REVOKED);
960                 for (cert = conn->server_cert, depth = 0; cert;
961                      cert = cert->next, depth++) {
962                         if (cert->ocsp_revoked) {
963                                 tls_cert_chain_failure_event(
964                                         conn, depth, cert, TLS_FAIL_REVOKED,
965                                         "certificate revoked");
966                         }
967                 }
968                 return -1;
969         }
970
971         if (conn->flags & TLS_CONN_REQUIRE_OCSP_ALL) {
972                 /*
973                  * Verify that each certificate on the chain that is not part
974                  * of the trusted certificates has a good status. If not,
975                  * terminate handshake.
976                  */
977                 for (cert = conn->server_cert, depth = 0; cert;
978                      cert = cert->next, depth++) {
979                         if (!cert->ocsp_good) {
980                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
981                                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
982                                 tls_cert_chain_failure_event(
983                                         conn, depth, cert,
984                                         TLS_FAIL_UNSPECIFIED,
985                                         "bad certificate status response");
986                                 return -1;
987                         }
988                         if (cert->issuer_trusted)
989                                 break;
990                 }
991         }
992
993         if ((conn->flags & TLS_CONN_REQUIRE_OCSP) && res != TLS_OCSP_GOOD) {
994                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
995                           res == TLS_OCSP_INVALID ? TLS_ALERT_DECODE_ERROR :
996                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
997                 if (conn->server_cert)
998                         tls_cert_chain_failure_event(
999                                 conn, 0, conn->server_cert,
1000                                 TLS_FAIL_UNSPECIFIED,
1001                                 "bad certificate status response");
1002                 return -1;
1003         }
1004
1005         conn->ocsp_resp_received = 1;
1006
1007 skip:
1008         *in_len = end - in_data;
1009
1010         conn->state = SERVER_KEY_EXCHANGE;
1011
1012         return 0;
1013 }
1014
1015
1016 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
1017                                            const u8 *in_data, size_t *in_len)
1018 {
1019         const u8 *pos, *end;
1020         size_t left, len;
1021         u8 type;
1022         const struct tls_cipher_suite *suite;
1023
1024         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1025                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1026                            "received content type 0x%x", ct);
1027                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1028                           TLS_ALERT_UNEXPECTED_MESSAGE);
1029                 return -1;
1030         }
1031
1032         pos = in_data;
1033         left = *in_len;
1034
1035         if (left < 4) {
1036                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
1037                            "(Left=%lu)", (unsigned long) left);
1038                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1039                 return -1;
1040         }
1041
1042         type = *pos++;
1043         len = WPA_GET_BE24(pos);
1044         pos += 3;
1045         left -= 4;
1046
1047         if (len > left) {
1048                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
1049                            "length (len=%lu != left=%lu)",
1050                            (unsigned long) len, (unsigned long) left);
1051                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1052                 return -1;
1053         }
1054
1055         end = pos + len;
1056
1057         if ((conn->flags & TLS_CONN_REQUEST_OCSP) &&
1058             type == TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS)
1059                 return tls_process_certificate_status(conn, ct, in_data,
1060                                                       in_len);
1061         if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
1062                 return tls_process_certificate_request(conn, ct, in_data,
1063                                                        in_len);
1064         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1065                 return tls_process_server_hello_done(conn, ct, in_data,
1066                                                      in_len);
1067         if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
1068                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1069                            "message %d (expected ServerKeyExchange/"
1070                            "CertificateRequest/ServerHelloDone%s)", type,
1071                            (conn->flags & TLS_CONN_REQUEST_OCSP) ?
1072                            "/CertificateStatus" : "");
1073                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1074                           TLS_ALERT_UNEXPECTED_MESSAGE);
1075                 return -1;
1076         }
1077
1078         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
1079
1080         if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
1081                 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
1082                            "with the selected cipher suite");
1083                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1084                           TLS_ALERT_UNEXPECTED_MESSAGE);
1085                 return -1;
1086         }
1087
1088         wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
1089         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
1090         if (suite && (suite->key_exchange == TLS_KEY_X_DH_anon ||
1091                       suite->key_exchange == TLS_KEY_X_DHE_RSA)) {
1092                 if (tlsv1_process_diffie_hellman(conn, pos, len,
1093                                                  suite->key_exchange) < 0) {
1094                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1095                                   TLS_ALERT_DECODE_ERROR);
1096                         return -1;
1097                 }
1098         } else {
1099                 wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
1100                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1101                           TLS_ALERT_UNEXPECTED_MESSAGE);
1102                 return -1;
1103         }
1104
1105         *in_len = end - in_data;
1106
1107         conn->state = SERVER_CERTIFICATE_REQUEST;
1108
1109         return 0;
1110 }
1111
1112
1113 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
1114                                            const u8 *in_data, size_t *in_len)
1115 {
1116         const u8 *pos, *end;
1117         size_t left, len;
1118         u8 type;
1119
1120         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1121                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1122                            "received content type 0x%x", ct);
1123                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1124                           TLS_ALERT_UNEXPECTED_MESSAGE);
1125                 return -1;
1126         }
1127
1128         pos = in_data;
1129         left = *in_len;
1130
1131         if (left < 4) {
1132                 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
1133                            "(left=%lu)", (unsigned long) left);
1134                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1135                 return -1;
1136         }
1137
1138         type = *pos++;
1139         len = WPA_GET_BE24(pos);
1140         pos += 3;
1141         left -= 4;
1142
1143         if (len > left) {
1144                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
1145                            "length (len=%lu != left=%lu)",
1146                            (unsigned long) len, (unsigned long) left);
1147                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1148                 return -1;
1149         }
1150
1151         end = pos + len;
1152
1153         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1154                 return tls_process_server_hello_done(conn, ct, in_data,
1155                                                      in_len);
1156         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
1157                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1158                            "message %d (expected CertificateRequest/"
1159                            "ServerHelloDone)", type);
1160                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1161                           TLS_ALERT_UNEXPECTED_MESSAGE);
1162                 return -1;
1163         }
1164
1165         wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
1166
1167         conn->certificate_requested = 1;
1168
1169         *in_len = end - in_data;
1170
1171         conn->state = SERVER_HELLO_DONE;
1172
1173         return 0;
1174 }
1175
1176
1177 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
1178                                          const u8 *in_data, size_t *in_len)
1179 {
1180         const u8 *pos, *end;
1181         size_t left, len;
1182         u8 type;
1183
1184         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1185                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1186                            "received content type 0x%x", ct);
1187                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1188                           TLS_ALERT_UNEXPECTED_MESSAGE);
1189                 return -1;
1190         }
1191
1192         pos = in_data;
1193         left = *in_len;
1194
1195         if (left < 4) {
1196                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
1197                            "(left=%lu)", (unsigned long) left);
1198                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1199                 return -1;
1200         }
1201
1202         type = *pos++;
1203         len = WPA_GET_BE24(pos);
1204         pos += 3;
1205         left -= 4;
1206
1207         if (len > left) {
1208                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
1209                            "length (len=%lu != left=%lu)",
1210                            (unsigned long) len, (unsigned long) left);
1211                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1212                 return -1;
1213         }
1214         end = pos + len;
1215
1216         if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
1217                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1218                            "message %d (expected ServerHelloDone)", type);
1219                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1220                           TLS_ALERT_UNEXPECTED_MESSAGE);
1221                 return -1;
1222         }
1223
1224         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
1225
1226         if ((conn->flags & TLS_CONN_REQUIRE_OCSP) &&
1227             !conn->ocsp_resp_received) {
1228                 wpa_printf(MSG_INFO,
1229                            "TLSv1: No OCSP response received - reject handshake");
1230                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1231                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
1232                 return -1;
1233         }
1234
1235         *in_len = end - in_data;
1236
1237         conn->state = CLIENT_KEY_EXCHANGE;
1238
1239         return 0;
1240 }
1241
1242
1243 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
1244                                                  u8 ct, const u8 *in_data,
1245                                                  size_t *in_len)
1246 {
1247         const u8 *pos;
1248         size_t left;
1249
1250         if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
1251                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1252                            "received content type 0x%x", ct);
1253                 if (conn->use_session_ticket) {
1254                         int res;
1255                         wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
1256                                    "rejected SessionTicket");
1257                         conn->use_session_ticket = 0;
1258
1259                         /* Notify upper layers that SessionTicket failed */
1260                         res = conn->session_ticket_cb(
1261                                 conn->session_ticket_cb_ctx, NULL, 0, NULL,
1262                                 NULL, NULL);
1263                         if (res < 0) {
1264                                 wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
1265                                            "callback indicated failure");
1266                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1267                                           TLS_ALERT_HANDSHAKE_FAILURE);
1268                                 return -1;
1269                         }
1270
1271                         conn->state = SERVER_CERTIFICATE;
1272                         return tls_process_certificate(conn, ct, in_data,
1273                                                        in_len);
1274                 }
1275                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1276                           TLS_ALERT_UNEXPECTED_MESSAGE);
1277                 return -1;
1278         }
1279
1280         pos = in_data;
1281         left = *in_len;
1282
1283         if (left < 1) {
1284                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
1285                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1286                 return -1;
1287         }
1288
1289         if (*pos != TLS_CHANGE_CIPHER_SPEC) {
1290                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1291                            "received data 0x%x", *pos);
1292                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1293                           TLS_ALERT_UNEXPECTED_MESSAGE);
1294                 return -1;
1295         }
1296
1297         wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
1298         if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
1299                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
1300                            "for record layer");
1301                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1302                           TLS_ALERT_INTERNAL_ERROR);
1303                 return -1;
1304         }
1305
1306         *in_len = pos + 1 - in_data;
1307
1308         conn->state = SERVER_FINISHED;
1309
1310         return 0;
1311 }
1312
1313
1314 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
1315                                        const u8 *in_data, size_t *in_len)
1316 {
1317         const u8 *pos, *end;
1318         size_t left, len, hlen;
1319         u8 verify_data[TLS_VERIFY_DATA_LEN];
1320         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
1321
1322         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1323                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
1324                            "received content type 0x%x", ct);
1325                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1326                           TLS_ALERT_UNEXPECTED_MESSAGE);
1327                 return -1;
1328         }
1329
1330         pos = in_data;
1331         left = *in_len;
1332
1333         if (left < 4) {
1334                 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
1335                            "Finished",
1336                            (unsigned long) left);
1337                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1338                           TLS_ALERT_DECODE_ERROR);
1339                 return -1;
1340         }
1341
1342         if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
1343                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
1344                            "type 0x%x", pos[0]);
1345                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1346                           TLS_ALERT_UNEXPECTED_MESSAGE);
1347                 return -1;
1348         }
1349
1350         len = WPA_GET_BE24(pos + 1);
1351
1352         pos += 4;
1353         left -= 4;
1354
1355         if (len > left) {
1356                 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
1357                            "(len=%lu > left=%lu)",
1358                            (unsigned long) len, (unsigned long) left);
1359                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1360                           TLS_ALERT_DECODE_ERROR);
1361                 return -1;
1362         }
1363         end = pos + len;
1364         if (len != TLS_VERIFY_DATA_LEN) {
1365                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
1366                            "in Finished: %lu (expected %d)",
1367                            (unsigned long) len, TLS_VERIFY_DATA_LEN);
1368                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1369                           TLS_ALERT_DECODE_ERROR);
1370                 return -1;
1371         }
1372         wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1373                     pos, TLS_VERIFY_DATA_LEN);
1374
1375 #ifdef CONFIG_TLSV12
1376         if (conn->rl.tls_version >= TLS_VERSION_1_2) {
1377                 hlen = SHA256_MAC_LEN;
1378                 if (conn->verify.sha256_server == NULL ||
1379                     crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
1380                     < 0) {
1381                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1382                                   TLS_ALERT_INTERNAL_ERROR);
1383                         conn->verify.sha256_server = NULL;
1384                         return -1;
1385                 }
1386                 conn->verify.sha256_server = NULL;
1387         } else {
1388 #endif /* CONFIG_TLSV12 */
1389
1390         hlen = MD5_MAC_LEN;
1391         if (conn->verify.md5_server == NULL ||
1392             crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
1393                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1394                           TLS_ALERT_INTERNAL_ERROR);
1395                 conn->verify.md5_server = NULL;
1396                 crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
1397                 conn->verify.sha1_server = NULL;
1398                 return -1;
1399         }
1400         conn->verify.md5_server = NULL;
1401         hlen = SHA1_MAC_LEN;
1402         if (conn->verify.sha1_server == NULL ||
1403             crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
1404                                &hlen) < 0) {
1405                 conn->verify.sha1_server = NULL;
1406                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1407                           TLS_ALERT_INTERNAL_ERROR);
1408                 return -1;
1409         }
1410         conn->verify.sha1_server = NULL;
1411         hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
1412
1413 #ifdef CONFIG_TLSV12
1414         }
1415 #endif /* CONFIG_TLSV12 */
1416
1417         if (tls_prf(conn->rl.tls_version,
1418                     conn->master_secret, TLS_MASTER_SECRET_LEN,
1419                     "server finished", hash, hlen,
1420                     verify_data, TLS_VERIFY_DATA_LEN)) {
1421                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1422                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1423                           TLS_ALERT_DECRYPT_ERROR);
1424                 return -1;
1425         }
1426         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
1427                         verify_data, TLS_VERIFY_DATA_LEN);
1428
1429         if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1430                 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
1431                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1432                           TLS_ALERT_DECRYPT_ERROR);
1433                 return -1;
1434         }
1435
1436         wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
1437
1438         *in_len = end - in_data;
1439
1440         conn->state = (conn->session_resumed || conn->use_session_ticket) ?
1441                 CHANGE_CIPHER_SPEC : ACK_FINISHED;
1442
1443         return 0;
1444 }
1445
1446
1447 static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,
1448                                         const u8 *in_data, size_t *in_len,
1449                                         u8 **out_data, size_t *out_len)
1450 {
1451         const u8 *pos;
1452         size_t left;
1453
1454         if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
1455                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "
1456                            "received content type 0x%x", ct);
1457                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1458                           TLS_ALERT_UNEXPECTED_MESSAGE);
1459                 return -1;
1460         }
1461
1462         pos = in_data;
1463         left = *in_len;
1464
1465         wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",
1466                     pos, left);
1467
1468         *out_data = os_malloc(left);
1469         if (*out_data) {
1470                 os_memcpy(*out_data, pos, left);
1471                 *out_len = left;
1472         }
1473
1474         return 0;
1475 }
1476
1477
1478 int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
1479                                    const u8 *buf, size_t *len,
1480                                    u8 **out_data, size_t *out_len)
1481 {
1482         if (ct == TLS_CONTENT_TYPE_ALERT) {
1483                 if (*len < 2) {
1484                         wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
1485                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1486                                   TLS_ALERT_DECODE_ERROR);
1487                         return -1;
1488                 }
1489                 wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
1490                            buf[0], buf[1]);
1491                 *len = 2;
1492                 conn->state = FAILED;
1493                 return -1;
1494         }
1495
1496         if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
1497             buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
1498                 size_t hr_len = WPA_GET_BE24(buf + 1);
1499                 if (hr_len > *len - 4) {
1500                         wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
1501                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1502                                   TLS_ALERT_DECODE_ERROR);
1503                         return -1;
1504                 }
1505                 wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
1506                 *len = 4 + hr_len;
1507                 return 0;
1508         }
1509
1510         switch (conn->state) {
1511         case SERVER_HELLO:
1512                 if (tls_process_server_hello(conn, ct, buf, len))
1513                         return -1;
1514                 break;
1515         case SERVER_CERTIFICATE:
1516                 if (tls_process_certificate(conn, ct, buf, len))
1517                         return -1;
1518                 break;
1519         case SERVER_KEY_EXCHANGE:
1520                 if (tls_process_server_key_exchange(conn, ct, buf, len))
1521                         return -1;
1522                 break;
1523         case SERVER_CERTIFICATE_REQUEST:
1524                 if (tls_process_certificate_request(conn, ct, buf, len))
1525                         return -1;
1526                 break;
1527         case SERVER_HELLO_DONE:
1528                 if (tls_process_server_hello_done(conn, ct, buf, len))
1529                         return -1;
1530                 break;
1531         case SERVER_CHANGE_CIPHER_SPEC:
1532                 if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
1533                         return -1;
1534                 break;
1535         case SERVER_FINISHED:
1536                 if (tls_process_server_finished(conn, ct, buf, len))
1537                         return -1;
1538                 break;
1539         case ACK_FINISHED:
1540                 if (out_data &&
1541                     tls_process_application_data(conn, ct, buf, len, out_data,
1542                                                  out_len))
1543                         return -1;
1544                 break;
1545         default:
1546                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
1547                            "while processing received message",
1548                            conn->state);
1549                 return -1;
1550         }
1551
1552         if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1553                 tls_verify_hash_add(&conn->verify, buf, *len);
1554
1555         return 0;
1556 }