]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/src/tls/tlsv1_client_read.c
Update hostapd/wpa_supplicant to 2.8 to fix multiple vulnerabilities.
[FreeBSD/FreeBSD.git] / contrib / wpa / 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 && 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_memdup(pos, conn->dh_p_len);
689         if (conn->dh_p == NULL)
690                 goto fail;
691         pos += conn->dh_p_len;
692         wpa_hexdump(MSG_DEBUG, "TLSv1: DH p (prime)",
693                     conn->dh_p, conn->dh_p_len);
694
695         if (end - pos < 3)
696                 goto fail;
697         val = WPA_GET_BE16(pos);
698         pos += 2;
699         if (val == 0 || val > (size_t) (end - pos))
700                 goto fail;
701         conn->dh_g_len = val;
702         conn->dh_g = os_memdup(pos, conn->dh_g_len);
703         if (conn->dh_g == NULL)
704                 goto fail;
705         pos += conn->dh_g_len;
706         wpa_hexdump(MSG_DEBUG, "TLSv1: DH g (generator)",
707                     conn->dh_g, conn->dh_g_len);
708         if (conn->dh_g_len == 1 && conn->dh_g[0] < 2)
709                 goto fail;
710
711         if (end - pos < 3)
712                 goto fail;
713         val = WPA_GET_BE16(pos);
714         pos += 2;
715         if (val == 0 || val > (size_t) (end - pos))
716                 goto fail;
717         conn->dh_ys_len = val;
718         conn->dh_ys = os_memdup(pos, conn->dh_ys_len);
719         if (conn->dh_ys == NULL)
720                 goto fail;
721         pos += conn->dh_ys_len;
722         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
723                     conn->dh_ys, conn->dh_ys_len);
724         server_params_end = pos;
725
726         if (key_exchange == TLS_KEY_X_DHE_RSA) {
727                 u8 hash[64];
728                 int hlen;
729
730                 if (conn->rl.tls_version == TLS_VERSION_1_2) {
731 #ifdef CONFIG_TLSV12
732                         /*
733                          * RFC 5246, 4.7:
734                          * TLS v1.2 adds explicit indication of the used
735                          * signature and hash algorithms.
736                          *
737                          * struct {
738                          *   HashAlgorithm hash;
739                          *   SignatureAlgorithm signature;
740                          * } SignatureAndHashAlgorithm;
741                          */
742                         if (end - pos < 2)
743                                 goto fail;
744                         if ((pos[0] != TLS_HASH_ALG_SHA256 &&
745                              pos[0] != TLS_HASH_ALG_SHA384 &&
746                              pos[0] != TLS_HASH_ALG_SHA512) ||
747                             pos[1] != TLS_SIGN_ALG_RSA) {
748                                 wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/signature(%u) algorithm",
749                                            pos[0], pos[1]);
750                                 goto fail;
751                         }
752
753                         hlen = tlsv12_key_x_server_params_hash(
754                                 conn->rl.tls_version, pos[0],
755                                 conn->client_random,
756                                 conn->server_random, server_params,
757                                 server_params_end - server_params, hash);
758                         pos += 2;
759 #else /* CONFIG_TLSV12 */
760                         goto fail;
761 #endif /* CONFIG_TLSV12 */
762                 } else {
763                         hlen = tls_key_x_server_params_hash(
764                                 conn->rl.tls_version, conn->client_random,
765                                 conn->server_random, server_params,
766                                 server_params_end - server_params, hash);
767                 }
768
769                 if (hlen < 0)
770                         goto fail;
771                 wpa_hexdump(MSG_MSGDUMP, "TLSv1: ServerKeyExchange hash",
772                             hash, hlen);
773
774                 if (tls_verify_signature(conn->rl.tls_version,
775                                          conn->server_rsa_key,
776                                          hash, hlen, pos, end - pos,
777                                          &alert) < 0)
778                         goto fail;
779         }
780
781         return 0;
782
783 fail:
784         wpa_printf(MSG_DEBUG, "TLSv1: Processing DH params failed");
785         tlsv1_client_free_dh(conn);
786         return -1;
787 }
788
789
790 static enum tls_ocsp_result
791 tls_process_certificate_status_ocsp_response(struct tlsv1_client *conn,
792                                              const u8 *pos, size_t len)
793 {
794         const u8 *end = pos + len;
795         u32 ocsp_resp_len;
796
797         /* opaque OCSPResponse<1..2^24-1>; */
798         if (end - pos < 3) {
799                 wpa_printf(MSG_INFO, "TLSv1: Too short OCSPResponse");
800                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
801                 return TLS_OCSP_INVALID;
802         }
803         ocsp_resp_len = WPA_GET_BE24(pos);
804         pos += 3;
805         if (end - pos < ocsp_resp_len) {
806                 wpa_printf(MSG_INFO, "TLSv1: Truncated OCSPResponse");
807                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
808                 return TLS_OCSP_INVALID;
809         }
810
811         return tls_process_ocsp_response(conn, pos, ocsp_resp_len);
812 }
813
814
815 static int tls_process_certificate_status(struct tlsv1_client *conn, u8 ct,
816                                            const u8 *in_data, size_t *in_len)
817 {
818         const u8 *pos, *end;
819         size_t left, len;
820         u8 type, status_type;
821         enum tls_ocsp_result res;
822         struct x509_certificate *cert;
823         int depth;
824
825         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
826                 wpa_printf(MSG_DEBUG,
827                            "TLSv1: Expected Handshake; received content type 0x%x",
828                            ct);
829                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
830                           TLS_ALERT_UNEXPECTED_MESSAGE);
831                 return -1;
832         }
833
834         pos = in_data;
835         left = *in_len;
836
837         if (left < 4) {
838                 wpa_printf(MSG_DEBUG,
839                            "TLSv1: Too short CertificateStatus (left=%lu)",
840                            (unsigned long) left);
841                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
842                 return -1;
843         }
844
845         type = *pos++;
846         len = WPA_GET_BE24(pos);
847         pos += 3;
848         left -= 4;
849
850         if (len > left) {
851                 wpa_printf(MSG_DEBUG,
852                            "TLSv1: Mismatch in CertificateStatus length (len=%lu != left=%lu)",
853                            (unsigned long) len, (unsigned long) left);
854                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
855                 return -1;
856         }
857
858         end = pos + len;
859
860         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS) {
861                 wpa_printf(MSG_DEBUG,
862                            "TLSv1: Received unexpected handshake message %d (expected CertificateStatus)",
863                            type);
864                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
865                           TLS_ALERT_UNEXPECTED_MESSAGE);
866                 return -1;
867         }
868
869         wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateStatus");
870
871         /*
872          * struct {
873          *     CertificateStatusType status_type;
874          *     select (status_type) {
875          *         case ocsp: OCSPResponse;
876          *         case ocsp_multi: OCSPResponseList;
877          *     } response;
878          * } CertificateStatus;
879          */
880         if (end - pos < 1) {
881                 wpa_printf(MSG_INFO, "TLSv1: Too short CertificateStatus");
882                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
883                 return -1;
884         }
885         status_type = *pos++;
886         wpa_printf(MSG_DEBUG, "TLSv1: CertificateStatus status_type %u",
887                    status_type);
888
889         if (status_type == 1 /* ocsp */) {
890                 res = tls_process_certificate_status_ocsp_response(
891                         conn, pos, end - pos);
892         } else if (status_type == 2 /* ocsp_multi */) {
893                 int good = 0, revoked = 0;
894                 u32 resp_len;
895
896                 res = TLS_OCSP_NO_RESPONSE;
897
898                 /*
899                  * opaque OCSPResponse<0..2^24-1>;
900                  *
901                  * struct {
902                  *   OCSPResponse ocsp_response_list<1..2^24-1>;
903                  * } OCSPResponseList;
904                  */
905                 if (end - pos < 3) {
906                         wpa_printf(MSG_DEBUG,
907                                    "TLSv1: Truncated OCSPResponseList");
908                         res = TLS_OCSP_INVALID;
909                         goto done;
910                 }
911                 resp_len = WPA_GET_BE24(pos);
912                 pos += 3;
913                 if (end - pos < resp_len) {
914                         wpa_printf(MSG_DEBUG,
915                                    "TLSv1: Truncated OCSPResponseList(len=%u)",
916                                    resp_len);
917                         res = TLS_OCSP_INVALID;
918                         goto done;
919                 }
920                 end = pos + resp_len;
921
922                 while (end - pos >= 3) {
923                         resp_len = WPA_GET_BE24(pos);
924                         pos += 3;
925                         if (resp_len > end - pos) {
926                                 wpa_printf(MSG_DEBUG,
927                                            "TLSv1: Truncated OCSPResponse(len=%u; left=%d) in ocsp_multi",
928                                            resp_len, (int) (end - pos));
929                                 res = TLS_OCSP_INVALID;
930                                 break;
931                         }
932                         if (!resp_len)
933                                 continue; /* Skip an empty response */
934                         res = tls_process_certificate_status_ocsp_response(
935                                 conn, pos - 3, resp_len + 3);
936                         if (res == TLS_OCSP_REVOKED)
937                                 revoked++;
938                         else if (res == TLS_OCSP_GOOD)
939                                 good++;
940                         pos += resp_len;
941                 }
942
943                 if (revoked)
944                         res = TLS_OCSP_REVOKED;
945                 else if (good)
946                         res = TLS_OCSP_GOOD;
947         } else {
948                 wpa_printf(MSG_DEBUG,
949                            "TLSv1: Ignore unsupported CertificateStatus");
950                 goto skip;
951         }
952
953 done:
954         if (res == TLS_OCSP_REVOKED) {
955                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
956                           TLS_ALERT_CERTIFICATE_REVOKED);
957                 for (cert = conn->server_cert, depth = 0; cert;
958                      cert = cert->next, depth++) {
959                         if (cert->ocsp_revoked) {
960                                 tls_cert_chain_failure_event(
961                                         conn, depth, cert, TLS_FAIL_REVOKED,
962                                         "certificate revoked");
963                         }
964                 }
965                 return -1;
966         }
967
968         if (conn->flags & TLS_CONN_REQUIRE_OCSP_ALL) {
969                 /*
970                  * Verify that each certificate on the chain that is not part
971                  * of the trusted certificates has a good status. If not,
972                  * terminate handshake.
973                  */
974                 for (cert = conn->server_cert, depth = 0; cert;
975                      cert = cert->next, depth++) {
976                         if (!cert->ocsp_good) {
977                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
978                                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
979                                 tls_cert_chain_failure_event(
980                                         conn, depth, cert,
981                                         TLS_FAIL_UNSPECIFIED,
982                                         "bad certificate status response");
983                                 return -1;
984                         }
985                         if (cert->issuer_trusted)
986                                 break;
987                 }
988         }
989
990         if ((conn->flags & TLS_CONN_REQUIRE_OCSP) && res != TLS_OCSP_GOOD) {
991                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
992                           res == TLS_OCSP_INVALID ? TLS_ALERT_DECODE_ERROR :
993                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
994                 if (conn->server_cert)
995                         tls_cert_chain_failure_event(
996                                 conn, 0, conn->server_cert,
997                                 TLS_FAIL_UNSPECIFIED,
998                                 "bad certificate status response");
999                 return -1;
1000         }
1001
1002         conn->ocsp_resp_received = 1;
1003
1004 skip:
1005         *in_len = end - in_data;
1006
1007         conn->state = SERVER_KEY_EXCHANGE;
1008
1009         return 0;
1010 }
1011
1012
1013 static int tls_process_server_key_exchange(struct tlsv1_client *conn, u8 ct,
1014                                            const u8 *in_data, size_t *in_len)
1015 {
1016         const u8 *pos, *end;
1017         size_t left, len;
1018         u8 type;
1019         const struct tls_cipher_suite *suite;
1020
1021         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1022                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1023                            "received content type 0x%x", ct);
1024                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1025                           TLS_ALERT_UNEXPECTED_MESSAGE);
1026                 return -1;
1027         }
1028
1029         pos = in_data;
1030         left = *in_len;
1031
1032         if (left < 4) {
1033                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerKeyExchange "
1034                            "(Left=%lu)", (unsigned long) left);
1035                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1036                 return -1;
1037         }
1038
1039         type = *pos++;
1040         len = WPA_GET_BE24(pos);
1041         pos += 3;
1042         left -= 4;
1043
1044         if (len > left) {
1045                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerKeyExchange "
1046                            "length (len=%lu != left=%lu)",
1047                            (unsigned long) len, (unsigned long) left);
1048                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1049                 return -1;
1050         }
1051
1052         end = pos + len;
1053
1054         if ((conn->flags & TLS_CONN_REQUEST_OCSP) &&
1055             type == TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS)
1056                 return tls_process_certificate_status(conn, ct, in_data,
1057                                                       in_len);
1058         if (type == TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST)
1059                 return tls_process_certificate_request(conn, ct, in_data,
1060                                                        in_len);
1061         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1062                 return tls_process_server_hello_done(conn, ct, in_data,
1063                                                      in_len);
1064         if (type != TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE) {
1065                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1066                            "message %d (expected ServerKeyExchange/"
1067                            "CertificateRequest/ServerHelloDone%s)", type,
1068                            (conn->flags & TLS_CONN_REQUEST_OCSP) ?
1069                            "/CertificateStatus" : "");
1070                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1071                           TLS_ALERT_UNEXPECTED_MESSAGE);
1072                 return -1;
1073         }
1074
1075         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerKeyExchange");
1076
1077         if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
1078                 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not allowed "
1079                            "with the selected cipher suite");
1080                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1081                           TLS_ALERT_UNEXPECTED_MESSAGE);
1082                 return -1;
1083         }
1084
1085         wpa_hexdump(MSG_DEBUG, "TLSv1: ServerKeyExchange", pos, len);
1086         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
1087         if (suite && (suite->key_exchange == TLS_KEY_X_DH_anon ||
1088                       suite->key_exchange == TLS_KEY_X_DHE_RSA)) {
1089                 if (tlsv1_process_diffie_hellman(conn, pos, len,
1090                                                  suite->key_exchange) < 0) {
1091                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1092                                   TLS_ALERT_DECODE_ERROR);
1093                         return -1;
1094                 }
1095         } else {
1096                 wpa_printf(MSG_DEBUG, "TLSv1: UnexpectedServerKeyExchange");
1097                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1098                           TLS_ALERT_UNEXPECTED_MESSAGE);
1099                 return -1;
1100         }
1101
1102         *in_len = end - in_data;
1103
1104         conn->state = SERVER_CERTIFICATE_REQUEST;
1105
1106         return 0;
1107 }
1108
1109
1110 static int tls_process_certificate_request(struct tlsv1_client *conn, u8 ct,
1111                                            const u8 *in_data, size_t *in_len)
1112 {
1113         const u8 *pos, *end;
1114         size_t left, len;
1115         u8 type;
1116
1117         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1118                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1119                            "received content type 0x%x", ct);
1120                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1121                           TLS_ALERT_UNEXPECTED_MESSAGE);
1122                 return -1;
1123         }
1124
1125         pos = in_data;
1126         left = *in_len;
1127
1128         if (left < 4) {
1129                 wpa_printf(MSG_DEBUG, "TLSv1: Too short CertificateRequest "
1130                            "(left=%lu)", (unsigned long) left);
1131                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1132                 return -1;
1133         }
1134
1135         type = *pos++;
1136         len = WPA_GET_BE24(pos);
1137         pos += 3;
1138         left -= 4;
1139
1140         if (len > left) {
1141                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in CertificateRequest "
1142                            "length (len=%lu != left=%lu)",
1143                            (unsigned long) len, (unsigned long) left);
1144                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1145                 return -1;
1146         }
1147
1148         end = pos + len;
1149
1150         if (type == TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE)
1151                 return tls_process_server_hello_done(conn, ct, in_data,
1152                                                      in_len);
1153         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST) {
1154                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1155                            "message %d (expected CertificateRequest/"
1156                            "ServerHelloDone)", type);
1157                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1158                           TLS_ALERT_UNEXPECTED_MESSAGE);
1159                 return -1;
1160         }
1161
1162         wpa_printf(MSG_DEBUG, "TLSv1: Received CertificateRequest");
1163
1164         conn->certificate_requested = 1;
1165
1166         *in_len = end - in_data;
1167
1168         conn->state = SERVER_HELLO_DONE;
1169
1170         return 0;
1171 }
1172
1173
1174 static int tls_process_server_hello_done(struct tlsv1_client *conn, u8 ct,
1175                                          const u8 *in_data, size_t *in_len)
1176 {
1177         const u8 *pos, *end;
1178         size_t left, len;
1179         u8 type;
1180
1181         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1182                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Handshake; "
1183                            "received content type 0x%x", ct);
1184                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1185                           TLS_ALERT_UNEXPECTED_MESSAGE);
1186                 return -1;
1187         }
1188
1189         pos = in_data;
1190         left = *in_len;
1191
1192         if (left < 4) {
1193                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ServerHelloDone "
1194                            "(left=%lu)", (unsigned long) left);
1195                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1196                 return -1;
1197         }
1198
1199         type = *pos++;
1200         len = WPA_GET_BE24(pos);
1201         pos += 3;
1202         left -= 4;
1203
1204         if (len > left) {
1205                 wpa_printf(MSG_DEBUG, "TLSv1: Mismatch in ServerHelloDone "
1206                            "length (len=%lu != left=%lu)",
1207                            (unsigned long) len, (unsigned long) left);
1208                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1209                 return -1;
1210         }
1211         end = pos + len;
1212
1213         if (type != TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE) {
1214                 wpa_printf(MSG_DEBUG, "TLSv1: Received unexpected handshake "
1215                            "message %d (expected ServerHelloDone)", type);
1216                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1217                           TLS_ALERT_UNEXPECTED_MESSAGE);
1218                 return -1;
1219         }
1220
1221         wpa_printf(MSG_DEBUG, "TLSv1: Received ServerHelloDone");
1222
1223         if ((conn->flags & TLS_CONN_REQUIRE_OCSP) &&
1224             !conn->ocsp_resp_received) {
1225                 wpa_printf(MSG_INFO,
1226                            "TLSv1: No OCSP response received - reject handshake");
1227                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1228                           TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE);
1229                 return -1;
1230         }
1231
1232         *in_len = end - in_data;
1233
1234         conn->state = CLIENT_KEY_EXCHANGE;
1235
1236         return 0;
1237 }
1238
1239
1240 static int tls_process_server_change_cipher_spec(struct tlsv1_client *conn,
1241                                                  u8 ct, const u8 *in_data,
1242                                                  size_t *in_len)
1243 {
1244         const u8 *pos;
1245         size_t left;
1246
1247         if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
1248                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1249                            "received content type 0x%x", ct);
1250                 if (conn->use_session_ticket) {
1251                         int res;
1252                         wpa_printf(MSG_DEBUG, "TLSv1: Server may have "
1253                                    "rejected SessionTicket");
1254                         conn->use_session_ticket = 0;
1255
1256                         /* Notify upper layers that SessionTicket failed */
1257                         res = conn->session_ticket_cb(
1258                                 conn->session_ticket_cb_ctx, NULL, 0, NULL,
1259                                 NULL, NULL);
1260                         if (res < 0) {
1261                                 wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket "
1262                                            "callback indicated failure");
1263                                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1264                                           TLS_ALERT_HANDSHAKE_FAILURE);
1265                                 return -1;
1266                         }
1267
1268                         conn->state = SERVER_CERTIFICATE;
1269                         return tls_process_certificate(conn, ct, in_data,
1270                                                        in_len);
1271                 }
1272                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1273                           TLS_ALERT_UNEXPECTED_MESSAGE);
1274                 return -1;
1275         }
1276
1277         pos = in_data;
1278         left = *in_len;
1279
1280         if (left < 1) {
1281                 wpa_printf(MSG_DEBUG, "TLSv1: Too short ChangeCipherSpec");
1282                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL, TLS_ALERT_DECODE_ERROR);
1283                 return -1;
1284         }
1285
1286         if (*pos != TLS_CHANGE_CIPHER_SPEC) {
1287                 wpa_printf(MSG_DEBUG, "TLSv1: Expected ChangeCipherSpec; "
1288                            "received data 0x%x", *pos);
1289                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1290                           TLS_ALERT_UNEXPECTED_MESSAGE);
1291                 return -1;
1292         }
1293
1294         wpa_printf(MSG_DEBUG, "TLSv1: Received ChangeCipherSpec");
1295         if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
1296                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
1297                            "for record layer");
1298                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1299                           TLS_ALERT_INTERNAL_ERROR);
1300                 return -1;
1301         }
1302
1303         *in_len = pos + 1 - in_data;
1304
1305         conn->state = SERVER_FINISHED;
1306
1307         return 0;
1308 }
1309
1310
1311 static int tls_process_server_finished(struct tlsv1_client *conn, u8 ct,
1312                                        const u8 *in_data, size_t *in_len)
1313 {
1314         const u8 *pos, *end;
1315         size_t left, len, hlen;
1316         u8 verify_data[TLS_VERIFY_DATA_LEN];
1317         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
1318
1319         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1320                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; "
1321                            "received content type 0x%x", ct);
1322                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1323                           TLS_ALERT_UNEXPECTED_MESSAGE);
1324                 return -1;
1325         }
1326
1327         pos = in_data;
1328         left = *in_len;
1329
1330         if (left < 4) {
1331                 wpa_printf(MSG_DEBUG, "TLSv1: Too short record (left=%lu) for "
1332                            "Finished",
1333                            (unsigned long) left);
1334                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1335                           TLS_ALERT_DECODE_ERROR);
1336                 return -1;
1337         }
1338
1339         if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
1340                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
1341                            "type 0x%x", pos[0]);
1342                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1343                           TLS_ALERT_UNEXPECTED_MESSAGE);
1344                 return -1;
1345         }
1346
1347         len = WPA_GET_BE24(pos + 1);
1348
1349         pos += 4;
1350         left -= 4;
1351
1352         if (len > left) {
1353                 wpa_printf(MSG_DEBUG, "TLSv1: Too short buffer for Finished "
1354                            "(len=%lu > left=%lu)",
1355                            (unsigned long) len, (unsigned long) left);
1356                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1357                           TLS_ALERT_DECODE_ERROR);
1358                 return -1;
1359         }
1360         end = pos + len;
1361         if (len != TLS_VERIFY_DATA_LEN) {
1362                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected verify_data length "
1363                            "in Finished: %lu (expected %d)",
1364                            (unsigned long) len, TLS_VERIFY_DATA_LEN);
1365                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1366                           TLS_ALERT_DECODE_ERROR);
1367                 return -1;
1368         }
1369         wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1370                     pos, TLS_VERIFY_DATA_LEN);
1371
1372 #ifdef CONFIG_TLSV12
1373         if (conn->rl.tls_version >= TLS_VERSION_1_2) {
1374                 hlen = SHA256_MAC_LEN;
1375                 if (conn->verify.sha256_server == NULL ||
1376                     crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
1377                     < 0) {
1378                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1379                                   TLS_ALERT_INTERNAL_ERROR);
1380                         conn->verify.sha256_server = NULL;
1381                         return -1;
1382                 }
1383                 conn->verify.sha256_server = NULL;
1384         } else {
1385 #endif /* CONFIG_TLSV12 */
1386
1387         hlen = MD5_MAC_LEN;
1388         if (conn->verify.md5_server == NULL ||
1389             crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
1390                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1391                           TLS_ALERT_INTERNAL_ERROR);
1392                 conn->verify.md5_server = NULL;
1393                 crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
1394                 conn->verify.sha1_server = NULL;
1395                 return -1;
1396         }
1397         conn->verify.md5_server = NULL;
1398         hlen = SHA1_MAC_LEN;
1399         if (conn->verify.sha1_server == NULL ||
1400             crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
1401                                &hlen) < 0) {
1402                 conn->verify.sha1_server = NULL;
1403                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1404                           TLS_ALERT_INTERNAL_ERROR);
1405                 return -1;
1406         }
1407         conn->verify.sha1_server = NULL;
1408         hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
1409
1410 #ifdef CONFIG_TLSV12
1411         }
1412 #endif /* CONFIG_TLSV12 */
1413
1414         if (tls_prf(conn->rl.tls_version,
1415                     conn->master_secret, TLS_MASTER_SECRET_LEN,
1416                     "server finished", hash, hlen,
1417                     verify_data, TLS_VERIFY_DATA_LEN)) {
1418                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1419                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1420                           TLS_ALERT_DECRYPT_ERROR);
1421                 return -1;
1422         }
1423         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
1424                         verify_data, TLS_VERIFY_DATA_LEN);
1425
1426         if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1427                 wpa_printf(MSG_INFO, "TLSv1: Mismatch in verify_data");
1428                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1429                           TLS_ALERT_DECRYPT_ERROR);
1430                 return -1;
1431         }
1432
1433         wpa_printf(MSG_DEBUG, "TLSv1: Received Finished");
1434
1435         *in_len = end - in_data;
1436
1437         conn->state = (conn->session_resumed || conn->use_session_ticket) ?
1438                 CHANGE_CIPHER_SPEC : ACK_FINISHED;
1439
1440         return 0;
1441 }
1442
1443
1444 static int tls_process_application_data(struct tlsv1_client *conn, u8 ct,
1445                                         const u8 *in_data, size_t *in_len,
1446                                         u8 **out_data, size_t *out_len)
1447 {
1448         const u8 *pos;
1449         size_t left;
1450
1451         if (ct != TLS_CONTENT_TYPE_APPLICATION_DATA) {
1452                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Application Data; "
1453                            "received content type 0x%x", ct);
1454                 tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1455                           TLS_ALERT_UNEXPECTED_MESSAGE);
1456                 return -1;
1457         }
1458
1459         pos = in_data;
1460         left = *in_len;
1461
1462         wpa_hexdump(MSG_DEBUG, "TLSv1: Application Data included in Handshake",
1463                     pos, left);
1464
1465         *out_data = os_malloc(left);
1466         if (*out_data) {
1467                 os_memcpy(*out_data, pos, left);
1468                 *out_len = left;
1469         }
1470
1471         return 0;
1472 }
1473
1474
1475 int tlsv1_client_process_handshake(struct tlsv1_client *conn, u8 ct,
1476                                    const u8 *buf, size_t *len,
1477                                    u8 **out_data, size_t *out_len)
1478 {
1479         if (ct == TLS_CONTENT_TYPE_ALERT) {
1480                 if (*len < 2) {
1481                         wpa_printf(MSG_DEBUG, "TLSv1: Alert underflow");
1482                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1483                                   TLS_ALERT_DECODE_ERROR);
1484                         return -1;
1485                 }
1486                 wpa_printf(MSG_DEBUG, "TLSv1: Received alert %d:%d",
1487                            buf[0], buf[1]);
1488                 *len = 2;
1489                 conn->state = FAILED;
1490                 return -1;
1491         }
1492
1493         if (ct == TLS_CONTENT_TYPE_HANDSHAKE && *len >= 4 &&
1494             buf[0] == TLS_HANDSHAKE_TYPE_HELLO_REQUEST) {
1495                 size_t hr_len = WPA_GET_BE24(buf + 1);
1496                 if (hr_len > *len - 4) {
1497                         wpa_printf(MSG_DEBUG, "TLSv1: HelloRequest underflow");
1498                         tls_alert(conn, TLS_ALERT_LEVEL_FATAL,
1499                                   TLS_ALERT_DECODE_ERROR);
1500                         return -1;
1501                 }
1502                 wpa_printf(MSG_DEBUG, "TLSv1: Ignored HelloRequest");
1503                 *len = 4 + hr_len;
1504                 return 0;
1505         }
1506
1507         switch (conn->state) {
1508         case SERVER_HELLO:
1509                 if (tls_process_server_hello(conn, ct, buf, len))
1510                         return -1;
1511                 break;
1512         case SERVER_CERTIFICATE:
1513                 if (tls_process_certificate(conn, ct, buf, len))
1514                         return -1;
1515                 break;
1516         case SERVER_KEY_EXCHANGE:
1517                 if (tls_process_server_key_exchange(conn, ct, buf, len))
1518                         return -1;
1519                 break;
1520         case SERVER_CERTIFICATE_REQUEST:
1521                 if (tls_process_certificate_request(conn, ct, buf, len))
1522                         return -1;
1523                 break;
1524         case SERVER_HELLO_DONE:
1525                 if (tls_process_server_hello_done(conn, ct, buf, len))
1526                         return -1;
1527                 break;
1528         case SERVER_CHANGE_CIPHER_SPEC:
1529                 if (tls_process_server_change_cipher_spec(conn, ct, buf, len))
1530                         return -1;
1531                 break;
1532         case SERVER_FINISHED:
1533                 if (tls_process_server_finished(conn, ct, buf, len))
1534                         return -1;
1535                 break;
1536         case ACK_FINISHED:
1537                 if (out_data &&
1538                     tls_process_application_data(conn, ct, buf, len, out_data,
1539                                                  out_len))
1540                         return -1;
1541                 break;
1542         default:
1543                 wpa_printf(MSG_DEBUG, "TLSv1: Unexpected state %d "
1544                            "while processing received message",
1545                            conn->state);
1546                 return -1;
1547         }
1548
1549         if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1550                 tls_verify_hash_add(&conn->verify, buf, *len);
1551
1552         return 0;
1553 }