vendor/wpa_supplicant: upgrade from 2.1 to 2.9
[dragonfly.git] / contrib / wpa_supplicant / src / tls / tlsv1_server_read.c
1 /*
2  * TLSv1 server - read handshake message
3  * Copyright (c) 2006-2014, 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_server.h"
20 #include "tlsv1_server_i.h"
21
22
23 static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct,
24                                            const u8 *in_data, size_t *in_len);
25 static int tls_process_change_cipher_spec(struct tlsv1_server *conn,
26                                           u8 ct, const u8 *in_data,
27                                           size_t *in_len);
28
29
30 static int testing_cipher_suite_filter(struct tlsv1_server *conn, u16 suite)
31 {
32 #ifdef CONFIG_TESTING_OPTIONS
33         if ((conn->test_flags &
34              (TLS_BREAK_SRV_KEY_X_HASH | TLS_BREAK_SRV_KEY_X_SIGNATURE |
35               TLS_DHE_PRIME_511B | TLS_DHE_PRIME_767B | TLS_DHE_PRIME_15 |
36               TLS_DHE_PRIME_58B | TLS_DHE_NON_PRIME)) &&
37             suite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 &&
38             suite != TLS_DHE_RSA_WITH_AES_256_CBC_SHA &&
39             suite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 &&
40             suite != TLS_DHE_RSA_WITH_AES_128_CBC_SHA &&
41             suite != TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
42                 return 1;
43 #endif /* CONFIG_TESTING_OPTIONS */
44
45         return 0;
46 }
47
48
49 static void tls_process_status_request_item(struct tlsv1_server *conn,
50                                             const u8 *req, size_t req_len)
51 {
52         const u8 *pos, *end;
53         u8 status_type;
54
55         pos = req;
56         end = req + req_len;
57
58         /*
59          * RFC 6961, 2.2:
60          * struct {
61          *   CertificateStatusType status_type;
62          *   uint16 request_length;
63          *   select (status_type) {
64          *     case ocsp: OCSPStatusRequest;
65          *     case ocsp_multi: OCSPStatusRequest;
66          *   } request;
67          * } CertificateStatusRequestItemV2;
68          *
69          * enum { ocsp(1), ocsp_multi(2), (255) } CertificateStatusType;
70          */
71
72         if (end - pos < 1)
73                 return; /* Truncated data */
74
75         status_type = *pos++;
76         wpa_printf(MSG_DEBUG, "TLSv1: CertificateStatusType %u", status_type);
77         if (status_type != 1 && status_type != 2)
78                 return; /* Unsupported status type */
79         /*
80          * For now, only OCSP stapling is supported, so ignore the specific
81          * request, if any.
82          */
83         wpa_hexdump(MSG_DEBUG, "TLSv1: OCSPStatusRequest", pos, end - pos);
84
85         if (status_type == 2)
86                 conn->status_request_multi = 1;
87 }
88
89
90 static void tls_process_status_request_v2(struct tlsv1_server *conn,
91                                           const u8 *ext, size_t ext_len)
92 {
93         const u8 *pos, *end;
94
95         conn->status_request_v2 = 1;
96
97         pos = ext;
98         end = ext + ext_len;
99
100         /*
101          * RFC 6961, 2.2:
102          * struct {
103          *   CertificateStatusRequestItemV2
104          *                    certificate_status_req_list<1..2^16-1>;
105          * } CertificateStatusRequestListV2;
106          */
107
108         while (end - pos >= 2) {
109                 u16 len;
110
111                 len = WPA_GET_BE16(pos);
112                 pos += 2;
113                 if (len > end - pos)
114                         break; /* Truncated data */
115                 tls_process_status_request_item(conn, pos, len);
116                 pos += len;
117         }
118 }
119
120
121 static int tls_process_client_hello(struct tlsv1_server *conn, u8 ct,
122                                     const u8 *in_data, size_t *in_len)
123 {
124         const u8 *pos, *end, *c;
125         size_t left, len, i, j;
126         u16 cipher_suite;
127         u16 num_suites;
128         int compr_null_found;
129         u16 ext_type, ext_len;
130
131         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
132                 tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
133                                  ct);
134                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
135                                    TLS_ALERT_UNEXPECTED_MESSAGE);
136                 return -1;
137         }
138
139         pos = in_data;
140         left = *in_len;
141
142         if (left < 4) {
143                 tlsv1_server_log(conn,
144                                  "Truncated handshake message (expected ClientHello)");
145                 goto decode_error;
146         }
147
148         /* HandshakeType msg_type */
149         if (*pos != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {
150                 tlsv1_server_log(conn, "Received unexpected handshake message %d (expected ClientHello)",
151                                  *pos);
152                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
153                                    TLS_ALERT_UNEXPECTED_MESSAGE);
154                 return -1;
155         }
156         tlsv1_server_log(conn, "Received ClientHello");
157         pos++;
158         /* uint24 length */
159         len = WPA_GET_BE24(pos);
160         pos += 3;
161         left -= 4;
162
163         if (len > left) {
164                 tlsv1_server_log(conn,
165                                  "Truncated ClientHello (len=%d left=%d)",
166                                  (int) len, (int) left);
167                 goto decode_error;
168         }
169
170         /* body - ClientHello */
171
172         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello", pos, len);
173         end = pos + len;
174
175         /* ProtocolVersion client_version */
176         if (end - pos < 2) {
177                 tlsv1_server_log(conn, "Truncated ClientHello/client_version");
178                 goto decode_error;
179         }
180         conn->client_version = WPA_GET_BE16(pos);
181         tlsv1_server_log(conn, "Client version %d.%d",
182                          conn->client_version >> 8,
183                          conn->client_version & 0xff);
184         if (conn->client_version < TLS_VERSION_1) {
185                 tlsv1_server_log(conn, "Unexpected protocol version in ClientHello %u.%u",
186                                  conn->client_version >> 8,
187                                  conn->client_version & 0xff);
188                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
189                                    TLS_ALERT_PROTOCOL_VERSION);
190                 return -1;
191         }
192         pos += 2;
193
194         if (TLS_VERSION == TLS_VERSION_1)
195                 conn->rl.tls_version = TLS_VERSION_1;
196 #ifdef CONFIG_TLSV12
197         else if (conn->client_version >= TLS_VERSION_1_2)
198                 conn->rl.tls_version = TLS_VERSION_1_2;
199 #endif /* CONFIG_TLSV12 */
200         else if (conn->client_version > TLS_VERSION_1_1)
201                 conn->rl.tls_version = TLS_VERSION_1_1;
202         else
203                 conn->rl.tls_version = conn->client_version;
204         tlsv1_server_log(conn, "Using TLS v%s",
205                          tls_version_str(conn->rl.tls_version));
206
207         /* Random random */
208         if (end - pos < TLS_RANDOM_LEN) {
209                 tlsv1_server_log(conn, "Truncated ClientHello/client_random");
210                 goto decode_error;
211         }
212
213         os_memcpy(conn->client_random, pos, TLS_RANDOM_LEN);
214         pos += TLS_RANDOM_LEN;
215         wpa_hexdump(MSG_MSGDUMP, "TLSv1: client_random",
216                     conn->client_random, TLS_RANDOM_LEN);
217
218         /* SessionID session_id */
219         if (end - pos < 1) {
220                 tlsv1_server_log(conn, "Truncated ClientHello/session_id len");
221                 goto decode_error;
222         }
223         if (end - pos < 1 + *pos || *pos > TLS_SESSION_ID_MAX_LEN) {
224                 tlsv1_server_log(conn, "Truncated ClientHello/session_id");
225                 goto decode_error;
226         }
227         wpa_hexdump(MSG_MSGDUMP, "TLSv1: client session_id", pos + 1, *pos);
228         pos += 1 + *pos;
229         /* TODO: add support for session resumption */
230
231         /* CipherSuite cipher_suites<2..2^16-1> */
232         if (end - pos < 2) {
233                 tlsv1_server_log(conn,
234                                  "Truncated ClientHello/cipher_suites len");
235                 goto decode_error;
236         }
237         num_suites = WPA_GET_BE16(pos);
238         pos += 2;
239         if (end - pos < num_suites) {
240                 tlsv1_server_log(conn, "Truncated ClientHello/cipher_suites");
241                 goto decode_error;
242         }
243         wpa_hexdump(MSG_MSGDUMP, "TLSv1: client cipher suites",
244                     pos, num_suites);
245         if (num_suites & 1) {
246                 tlsv1_server_log(conn, "Odd len ClientHello/cipher_suites");
247                 goto decode_error;
248         }
249         num_suites /= 2;
250
251         cipher_suite = 0;
252         for (i = 0; !cipher_suite && i < conn->num_cipher_suites; i++) {
253                 if (testing_cipher_suite_filter(conn, conn->cipher_suites[i]))
254                         continue;
255                 c = pos;
256                 for (j = 0; j < num_suites; j++) {
257                         u16 tmp = WPA_GET_BE16(c);
258                         c += 2;
259                         if (!cipher_suite && tmp == conn->cipher_suites[i]) {
260                                 cipher_suite = tmp;
261                                 break;
262                         }
263                 }
264         }
265         pos += num_suites * 2;
266         if (!cipher_suite) {
267                 tlsv1_server_log(conn, "No supported cipher suite available");
268                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
269                                    TLS_ALERT_ILLEGAL_PARAMETER);
270                 return -1;
271         }
272
273         if (tlsv1_record_set_cipher_suite(&conn->rl, cipher_suite) < 0) {
274                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set CipherSuite for "
275                            "record layer");
276                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
277                                    TLS_ALERT_INTERNAL_ERROR);
278                 return -1;
279         }
280
281         conn->cipher_suite = cipher_suite;
282
283         /* CompressionMethod compression_methods<1..2^8-1> */
284         if (end - pos < 1) {
285                 tlsv1_server_log(conn,
286                                  "Truncated ClientHello/compression_methods len");
287                 goto decode_error;
288         }
289         num_suites = *pos++;
290         if (end - pos < num_suites) {
291                 tlsv1_server_log(conn,
292                                  "Truncated ClientHello/compression_methods");
293                 goto decode_error;
294         }
295         wpa_hexdump(MSG_MSGDUMP, "TLSv1: client compression_methods",
296                     pos, num_suites);
297         compr_null_found = 0;
298         for (i = 0; i < num_suites; i++) {
299                 if (*pos++ == TLS_COMPRESSION_NULL)
300                         compr_null_found = 1;
301         }
302         if (!compr_null_found) {
303                 tlsv1_server_log(conn, "Client does not accept NULL compression");
304                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
305                                    TLS_ALERT_ILLEGAL_PARAMETER);
306                 return -1;
307         }
308
309         if (end - pos == 1) {
310                 tlsv1_server_log(conn, "Unexpected extra octet in the end of ClientHello: 0x%02x",
311                                  *pos);
312                 goto decode_error;
313         }
314
315         if (end - pos >= 2) {
316                 /* Extension client_hello_extension_list<0..2^16-1> */
317                 ext_len = WPA_GET_BE16(pos);
318                 pos += 2;
319
320                 tlsv1_server_log(conn, "%u bytes of ClientHello extensions",
321                                  ext_len);
322                 if (end - pos != ext_len) {
323                         tlsv1_server_log(conn, "Invalid ClientHello extension list length %u (expected %u)",
324                                          ext_len, (unsigned int) (end - pos));
325                         goto decode_error;
326                 }
327
328                 /*
329                  * struct {
330                  *   ExtensionType extension_type (0..65535)
331                  *   opaque extension_data<0..2^16-1>
332                  * } Extension;
333                  */
334
335                 while (pos < end) {
336                         if (end - pos < 2) {
337                                 tlsv1_server_log(conn, "Invalid extension_type field");
338                                 goto decode_error;
339                         }
340
341                         ext_type = WPA_GET_BE16(pos);
342                         pos += 2;
343
344                         if (end - pos < 2) {
345                                 tlsv1_server_log(conn, "Invalid extension_data length field");
346                                 goto decode_error;
347                         }
348
349                         ext_len = WPA_GET_BE16(pos);
350                         pos += 2;
351
352                         if (end - pos < ext_len) {
353                                 tlsv1_server_log(conn, "Invalid extension_data field");
354                                 goto decode_error;
355                         }
356
357                         tlsv1_server_log(conn, "ClientHello Extension type %u",
358                                          ext_type);
359                         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientHello "
360                                     "Extension data", pos, ext_len);
361
362                         if (ext_type == TLS_EXT_SESSION_TICKET) {
363                                 os_free(conn->session_ticket);
364                                 conn->session_ticket = os_malloc(ext_len);
365                                 if (conn->session_ticket) {
366                                         os_memcpy(conn->session_ticket, pos,
367                                                   ext_len);
368                                         conn->session_ticket_len = ext_len;
369                                 }
370                         } else if (ext_type == TLS_EXT_STATUS_REQUEST) {
371                                 conn->status_request = 1;
372                         } else if (ext_type == TLS_EXT_STATUS_REQUEST_V2) {
373                                 tls_process_status_request_v2(conn, pos,
374                                                               ext_len);
375                         }
376
377                         pos += ext_len;
378                 }
379         }
380
381         *in_len = end - in_data;
382
383         tlsv1_server_log(conn, "ClientHello OK - proceed to ServerHello");
384         conn->state = SERVER_HELLO;
385
386         return 0;
387
388 decode_error:
389         tlsv1_server_log(conn, "Failed to decode ClientHello");
390         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
391                            TLS_ALERT_DECODE_ERROR);
392         return -1;
393 }
394
395
396 static int tls_process_certificate(struct tlsv1_server *conn, u8 ct,
397                                    const u8 *in_data, size_t *in_len)
398 {
399         const u8 *pos, *end;
400         size_t left, len, list_len, cert_len, idx;
401         u8 type;
402         struct x509_certificate *chain = NULL, *last = NULL, *cert;
403         int reason;
404
405         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
406                 tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
407                                  ct);
408                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
409                                    TLS_ALERT_UNEXPECTED_MESSAGE);
410                 return -1;
411         }
412
413         pos = in_data;
414         left = *in_len;
415
416         if (left < 4) {
417                 tlsv1_server_log(conn, "Too short Certificate message (len=%lu)",
418                                  (unsigned long) left);
419                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
420                                    TLS_ALERT_DECODE_ERROR);
421                 return -1;
422         }
423
424         type = *pos++;
425         len = WPA_GET_BE24(pos);
426         pos += 3;
427         left -= 4;
428
429         if (len > left) {
430                 tlsv1_server_log(conn, "Unexpected Certificate message length (len=%lu != left=%lu)",
431                                  (unsigned long) len, (unsigned long) left);
432                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
433                                    TLS_ALERT_DECODE_ERROR);
434                 return -1;
435         }
436
437         if (type == TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) {
438                 if (conn->verify_peer) {
439                         tlsv1_server_log(conn, "Client did not include Certificate");
440                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
441                                            TLS_ALERT_UNEXPECTED_MESSAGE);
442                         return -1;
443                 }
444
445                 return tls_process_client_key_exchange(conn, ct, in_data,
446                                                        in_len);
447         }
448         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE) {
449                 tlsv1_server_log(conn, "Received unexpected handshake message %d (expected Certificate/ClientKeyExchange)",
450                                  type);
451                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
452                                    TLS_ALERT_UNEXPECTED_MESSAGE);
453                 return -1;
454         }
455
456         tlsv1_server_log(conn, "Received Certificate (certificate_list len %lu)",
457                          (unsigned long) len);
458
459         /*
460          * opaque ASN.1Cert<2^24-1>;
461          *
462          * struct {
463          *     ASN.1Cert certificate_list<1..2^24-1>;
464          * } Certificate;
465          */
466
467         end = pos + len;
468
469         if (end - pos < 3) {
470                 tlsv1_server_log(conn, "Too short Certificate (left=%lu)",
471                                  (unsigned long) left);
472                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
473                                    TLS_ALERT_DECODE_ERROR);
474                 return -1;
475         }
476
477         list_len = WPA_GET_BE24(pos);
478         pos += 3;
479
480         if ((size_t) (end - pos) != list_len) {
481                 tlsv1_server_log(conn, "Unexpected certificate_list length (len=%lu left=%lu)",
482                                  (unsigned long) list_len,
483                                  (unsigned long) (end - pos));
484                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
485                                    TLS_ALERT_DECODE_ERROR);
486                 return -1;
487         }
488
489         idx = 0;
490         while (pos < end) {
491                 if (end - pos < 3) {
492                         tlsv1_server_log(conn, "Failed to parse certificate_list");
493                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
494                                            TLS_ALERT_DECODE_ERROR);
495                         x509_certificate_chain_free(chain);
496                         return -1;
497                 }
498
499                 cert_len = WPA_GET_BE24(pos);
500                 pos += 3;
501
502                 if ((size_t) (end - pos) < cert_len) {
503                         tlsv1_server_log(conn, "Unexpected certificate length (len=%lu left=%lu)",
504                                          (unsigned long) cert_len,
505                                          (unsigned long) (end - pos));
506                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
507                                            TLS_ALERT_DECODE_ERROR);
508                         x509_certificate_chain_free(chain);
509                         return -1;
510                 }
511
512                 tlsv1_server_log(conn, "Certificate %lu (len %lu)",
513                                  (unsigned long) idx, (unsigned long) cert_len);
514
515                 if (idx == 0) {
516                         crypto_public_key_free(conn->client_rsa_key);
517                         if (tls_parse_cert(pos, cert_len,
518                                            &conn->client_rsa_key)) {
519                                 tlsv1_server_log(conn, "Failed to parse the certificate");
520                                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
521                                                    TLS_ALERT_BAD_CERTIFICATE);
522                                 x509_certificate_chain_free(chain);
523                                 return -1;
524                         }
525                 }
526
527                 cert = x509_certificate_parse(pos, cert_len);
528                 if (cert == NULL) {
529                         tlsv1_server_log(conn, "Failed to parse the certificate");
530                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
531                                            TLS_ALERT_BAD_CERTIFICATE);
532                         x509_certificate_chain_free(chain);
533                         return -1;
534                 }
535
536                 if (last == NULL)
537                         chain = cert;
538                 else
539                         last->next = cert;
540                 last = cert;
541
542                 idx++;
543                 pos += cert_len;
544         }
545
546         if (x509_certificate_chain_validate(conn->cred->trusted_certs, chain,
547                                             &reason, 0) < 0) {
548                 int tls_reason;
549                 tlsv1_server_log(conn, "Server certificate chain validation failed (reason=%d)",
550                                  reason);
551                 switch (reason) {
552                 case X509_VALIDATE_BAD_CERTIFICATE:
553                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
554                         break;
555                 case X509_VALIDATE_UNSUPPORTED_CERTIFICATE:
556                         tls_reason = TLS_ALERT_UNSUPPORTED_CERTIFICATE;
557                         break;
558                 case X509_VALIDATE_CERTIFICATE_REVOKED:
559                         tls_reason = TLS_ALERT_CERTIFICATE_REVOKED;
560                         break;
561                 case X509_VALIDATE_CERTIFICATE_EXPIRED:
562                         tls_reason = TLS_ALERT_CERTIFICATE_EXPIRED;
563                         break;
564                 case X509_VALIDATE_CERTIFICATE_UNKNOWN:
565                         tls_reason = TLS_ALERT_CERTIFICATE_UNKNOWN;
566                         break;
567                 case X509_VALIDATE_UNKNOWN_CA:
568                         tls_reason = TLS_ALERT_UNKNOWN_CA;
569                         break;
570                 default:
571                         tls_reason = TLS_ALERT_BAD_CERTIFICATE;
572                         break;
573                 }
574                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, tls_reason);
575                 x509_certificate_chain_free(chain);
576                 return -1;
577         }
578
579         if (chain && (chain->extensions_present & X509_EXT_EXT_KEY_USAGE) &&
580             !(chain->ext_key_usage &
581               (X509_EXT_KEY_USAGE_ANY | X509_EXT_KEY_USAGE_CLIENT_AUTH))) {
582                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
583                                    TLS_ALERT_BAD_CERTIFICATE);
584                 x509_certificate_chain_free(chain);
585                 return -1;
586         }
587
588         x509_certificate_chain_free(chain);
589
590         *in_len = end - in_data;
591
592         conn->state = CLIENT_KEY_EXCHANGE;
593
594         return 0;
595 }
596
597
598 static int tls_process_client_key_exchange_rsa(
599         struct tlsv1_server *conn, const u8 *pos, const u8 *end)
600 {
601         u8 *out;
602         size_t outlen, outbuflen;
603         u16 encr_len;
604         int res;
605         int use_random = 0;
606
607         if (end - pos < 2) {
608                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
609                                    TLS_ALERT_DECODE_ERROR);
610                 return -1;
611         }
612
613         encr_len = WPA_GET_BE16(pos);
614         pos += 2;
615         if (pos + encr_len > end) {
616                 tlsv1_server_log(conn, "Invalid ClientKeyExchange format: encr_len=%u left=%u",
617                                  encr_len, (unsigned int) (end - pos));
618                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
619                                    TLS_ALERT_DECODE_ERROR);
620                 return -1;
621         }
622
623         outbuflen = outlen = end - pos;
624         out = os_malloc(outlen >= TLS_PRE_MASTER_SECRET_LEN ?
625                         outlen : TLS_PRE_MASTER_SECRET_LEN);
626         if (out == NULL) {
627                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
628                                    TLS_ALERT_INTERNAL_ERROR);
629                 return -1;
630         }
631
632         /*
633          * struct {
634          *   ProtocolVersion client_version;
635          *   opaque random[46];
636          * } PreMasterSecret;
637          *
638          * struct {
639          *   public-key-encrypted PreMasterSecret pre_master_secret;
640          * } EncryptedPreMasterSecret;
641          */
642
643         /*
644          * Note: To avoid Bleichenbacher attack, we do not report decryption or
645          * parsing errors from EncryptedPreMasterSecret processing to the
646          * client. Instead, a random pre-master secret is used to force the
647          * handshake to fail.
648          */
649
650         if (crypto_private_key_decrypt_pkcs1_v15(conn->cred->key,
651                                                  pos, encr_len,
652                                                  out, &outlen) < 0) {
653                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt "
654                            "PreMasterSecret (encr_len=%u outlen=%lu)",
655                            encr_len, (unsigned long) outlen);
656                 use_random = 1;
657         }
658
659         if (!use_random && outlen != TLS_PRE_MASTER_SECRET_LEN) {
660                 tlsv1_server_log(conn, "Unexpected PreMasterSecret length %lu",
661                                  (unsigned long) outlen);
662                 use_random = 1;
663         }
664
665         if (!use_random && WPA_GET_BE16(out) != conn->client_version) {
666                 tlsv1_server_log(conn, "Client version in ClientKeyExchange does not match with version in ClientHello");
667                 use_random = 1;
668         }
669
670         if (use_random) {
671                 wpa_printf(MSG_DEBUG, "TLSv1: Using random premaster secret "
672                            "to avoid revealing information about private key");
673                 outlen = TLS_PRE_MASTER_SECRET_LEN;
674                 if (os_get_random(out, outlen)) {
675                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
676                                    "data");
677                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
678                                            TLS_ALERT_INTERNAL_ERROR);
679                         os_free(out);
680                         return -1;
681                 }
682         }
683
684         res = tlsv1_server_derive_keys(conn, out, outlen);
685
686         /* Clear the pre-master secret since it is not needed anymore */
687         os_memset(out, 0, outbuflen);
688         os_free(out);
689
690         if (res) {
691                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
692                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
693                                    TLS_ALERT_INTERNAL_ERROR);
694                 return -1;
695         }
696
697         return 0;
698 }
699
700
701 static int tls_process_client_key_exchange_dh(
702         struct tlsv1_server *conn, const u8 *pos, const u8 *end)
703 {
704         const u8 *dh_yc;
705         u16 dh_yc_len;
706         u8 *shared;
707         size_t shared_len;
708         int res;
709         const u8 *dh_p;
710         size_t dh_p_len;
711
712         /*
713          * struct {
714          *   select (PublicValueEncoding) {
715          *     case implicit: struct { };
716          *     case explicit: opaque dh_Yc<1..2^16-1>;
717          *   } dh_public;
718          * } ClientDiffieHellmanPublic;
719          */
720
721         tlsv1_server_log(conn, "ClientDiffieHellmanPublic received");
722         wpa_hexdump(MSG_MSGDUMP, "TLSv1: ClientDiffieHellmanPublic",
723                     pos, end - pos);
724
725         if (end == pos) {
726                 wpa_printf(MSG_DEBUG, "TLSv1: Implicit public value encoding "
727                            "not supported");
728                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
729                                    TLS_ALERT_INTERNAL_ERROR);
730                 return -1;
731         }
732
733         if (end - pos < 3) {
734                 tlsv1_server_log(conn, "Invalid client public value length");
735                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
736                                    TLS_ALERT_DECODE_ERROR);
737                 return -1;
738         }
739
740         dh_yc_len = WPA_GET_BE16(pos);
741         dh_yc = pos + 2;
742
743         if (dh_yc_len > end - dh_yc) {
744                 tlsv1_server_log(conn, "Client public value overflow (length %d)",
745                                  dh_yc_len);
746                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
747                                    TLS_ALERT_DECODE_ERROR);
748                 return -1;
749         }
750
751         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Yc (client's public value)",
752                     dh_yc, dh_yc_len);
753
754         if (conn->cred == NULL || conn->cred->dh_p == NULL ||
755             conn->dh_secret == NULL) {
756                 wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available");
757                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
758                                    TLS_ALERT_INTERNAL_ERROR);
759                 return -1;
760         }
761
762         tlsv1_server_get_dh_p(conn, &dh_p, &dh_p_len);
763
764         shared_len = dh_p_len;
765         shared = os_malloc(shared_len);
766         if (shared == NULL) {
767                 wpa_printf(MSG_DEBUG, "TLSv1: Could not allocate memory for "
768                            "DH");
769                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
770                                    TLS_ALERT_INTERNAL_ERROR);
771                 return -1;
772         }
773
774         /* shared = Yc^secret mod p */
775         if (crypto_mod_exp(dh_yc, dh_yc_len, conn->dh_secret,
776                            conn->dh_secret_len, dh_p, dh_p_len,
777                            shared, &shared_len)) {
778                 os_free(shared);
779                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
780                                    TLS_ALERT_INTERNAL_ERROR);
781                 return -1;
782         }
783         wpa_hexdump_key(MSG_DEBUG, "TLSv1: Shared secret from DH key exchange",
784                         shared, shared_len);
785
786         os_memset(conn->dh_secret, 0, conn->dh_secret_len);
787         os_free(conn->dh_secret);
788         conn->dh_secret = NULL;
789
790         res = tlsv1_server_derive_keys(conn, shared, shared_len);
791
792         /* Clear the pre-master secret since it is not needed anymore */
793         os_memset(shared, 0, shared_len);
794         os_free(shared);
795
796         if (res) {
797                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive keys");
798                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
799                                    TLS_ALERT_INTERNAL_ERROR);
800                 return -1;
801         }
802
803         return 0;
804 }
805
806
807 static int tls_process_client_key_exchange(struct tlsv1_server *conn, u8 ct,
808                                            const u8 *in_data, size_t *in_len)
809 {
810         const u8 *pos, *end;
811         size_t left, len;
812         u8 type;
813         tls_key_exchange keyx;
814         const struct tls_cipher_suite *suite;
815
816         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
817                 tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
818                                  ct);
819                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
820                                    TLS_ALERT_UNEXPECTED_MESSAGE);
821                 return -1;
822         }
823
824         pos = in_data;
825         left = *in_len;
826
827         if (left < 4) {
828                 tlsv1_server_log(conn, "Too short ClientKeyExchange (Left=%lu)",
829                                  (unsigned long) left);
830                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
831                                    TLS_ALERT_DECODE_ERROR);
832                 return -1;
833         }
834
835         type = *pos++;
836         len = WPA_GET_BE24(pos);
837         pos += 3;
838         left -= 4;
839
840         if (len > left) {
841                 tlsv1_server_log(conn, "Mismatch in ClientKeyExchange length (len=%lu != left=%lu)",
842                                  (unsigned long) len, (unsigned long) left);
843                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
844                                    TLS_ALERT_DECODE_ERROR);
845                 return -1;
846         }
847
848         end = pos + len;
849
850         if (type != TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE) {
851                 tlsv1_server_log(conn, "Received unexpected handshake message %d (expected ClientKeyExchange)",
852                                  type);
853                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
854                                    TLS_ALERT_UNEXPECTED_MESSAGE);
855                 return -1;
856         }
857
858         tlsv1_server_log(conn, "Received ClientKeyExchange");
859
860         wpa_hexdump(MSG_DEBUG, "TLSv1: ClientKeyExchange", pos, len);
861
862         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
863         if (suite == NULL)
864                 keyx = TLS_KEY_X_NULL;
865         else
866                 keyx = suite->key_exchange;
867
868         if ((keyx == TLS_KEY_X_DH_anon || keyx == TLS_KEY_X_DHE_RSA) &&
869             tls_process_client_key_exchange_dh(conn, pos, end) < 0)
870                 return -1;
871
872         if (keyx != TLS_KEY_X_DH_anon && keyx != TLS_KEY_X_DHE_RSA &&
873             tls_process_client_key_exchange_rsa(conn, pos, end) < 0)
874                 return -1;
875
876         *in_len = end - in_data;
877
878         conn->state = CERTIFICATE_VERIFY;
879
880         return 0;
881 }
882
883
884 static int tls_process_certificate_verify(struct tlsv1_server *conn, u8 ct,
885                                           const u8 *in_data, size_t *in_len)
886 {
887         const u8 *pos, *end;
888         size_t left, len;
889         u8 type;
890         size_t hlen;
891         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN], *hpos;
892         u8 alert;
893
894         if (ct == TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
895                 if (conn->verify_peer) {
896                         tlsv1_server_log(conn, "Client did not include CertificateVerify");
897                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
898                                            TLS_ALERT_UNEXPECTED_MESSAGE);
899                         return -1;
900                 }
901
902                 return tls_process_change_cipher_spec(conn, ct, in_data,
903                                                       in_len);
904         }
905
906         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
907                 tlsv1_server_log(conn, "Expected Handshake; received content type 0x%x",
908                                  ct);
909                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
910                                    TLS_ALERT_UNEXPECTED_MESSAGE);
911                 return -1;
912         }
913
914         pos = in_data;
915         left = *in_len;
916
917         if (left < 4) {
918                 tlsv1_server_log(conn, "Too short CertificateVerify message (len=%lu)",
919                                  (unsigned long) left);
920                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
921                                    TLS_ALERT_DECODE_ERROR);
922                 return -1;
923         }
924
925         type = *pos++;
926         len = WPA_GET_BE24(pos);
927         pos += 3;
928         left -= 4;
929
930         if (len > left) {
931                 tlsv1_server_log(conn, "Unexpected CertificateVerify message length (len=%lu != left=%lu)",
932                                  (unsigned long) len, (unsigned long) left);
933                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
934                                    TLS_ALERT_DECODE_ERROR);
935                 return -1;
936         }
937
938         end = pos + len;
939
940         if (type != TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY) {
941                 tlsv1_server_log(conn, "Received unexpected handshake message %d (expected CertificateVerify)",
942                                  type);
943                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
944                                    TLS_ALERT_UNEXPECTED_MESSAGE);
945                 return -1;
946         }
947
948         tlsv1_server_log(conn, "Received CertificateVerify");
949
950         /*
951          * struct {
952          *   Signature signature;
953          * } CertificateVerify;
954          */
955
956         hpos = hash;
957
958 #ifdef CONFIG_TLSV12
959         if (conn->rl.tls_version == TLS_VERSION_1_2) {
960                 /*
961                  * RFC 5246, 4.7:
962                  * TLS v1.2 adds explicit indication of the used signature and
963                  * hash algorithms.
964                  *
965                  * struct {
966                  *   HashAlgorithm hash;
967                  *   SignatureAlgorithm signature;
968                  * } SignatureAndHashAlgorithm;
969                  */
970                 if (end - pos < 2) {
971                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
972                                            TLS_ALERT_DECODE_ERROR);
973                         return -1;
974                 }
975                 if (pos[0] != TLS_HASH_ALG_SHA256 ||
976                     pos[1] != TLS_SIGN_ALG_RSA) {
977                         wpa_printf(MSG_DEBUG, "TLSv1.2: Unsupported hash(%u)/"
978                                    "signature(%u) algorithm",
979                                    pos[0], pos[1]);
980                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
981                                            TLS_ALERT_INTERNAL_ERROR);
982                         return -1;
983                 }
984                 pos += 2;
985
986                 hlen = SHA256_MAC_LEN;
987                 if (conn->verify.sha256_cert == NULL ||
988                     crypto_hash_finish(conn->verify.sha256_cert, hpos, &hlen) <
989                     0) {
990                         conn->verify.sha256_cert = NULL;
991                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
992                                            TLS_ALERT_INTERNAL_ERROR);
993                         return -1;
994                 }
995                 conn->verify.sha256_cert = NULL;
996         } else {
997 #endif /* CONFIG_TLSV12 */
998
999         hlen = MD5_MAC_LEN;
1000         if (conn->verify.md5_cert == NULL ||
1001             crypto_hash_finish(conn->verify.md5_cert, hpos, &hlen) < 0) {
1002                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1003                                    TLS_ALERT_INTERNAL_ERROR);
1004                 conn->verify.md5_cert = NULL;
1005                 crypto_hash_finish(conn->verify.sha1_cert, NULL, NULL);
1006                 conn->verify.sha1_cert = NULL;
1007                 return -1;
1008         }
1009         hpos += MD5_MAC_LEN;
1010
1011         conn->verify.md5_cert = NULL;
1012         hlen = SHA1_MAC_LEN;
1013         if (conn->verify.sha1_cert == NULL ||
1014             crypto_hash_finish(conn->verify.sha1_cert, hpos, &hlen) < 0) {
1015                 conn->verify.sha1_cert = NULL;
1016                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1017                                    TLS_ALERT_INTERNAL_ERROR);
1018                 return -1;
1019         }
1020         conn->verify.sha1_cert = NULL;
1021
1022         hlen += MD5_MAC_LEN;
1023
1024 #ifdef CONFIG_TLSV12
1025         }
1026 #endif /* CONFIG_TLSV12 */
1027
1028         wpa_hexdump(MSG_MSGDUMP, "TLSv1: CertificateVerify hash", hash, hlen);
1029
1030         if (tls_verify_signature(conn->rl.tls_version, conn->client_rsa_key,
1031                                  hash, hlen, pos, end - pos, &alert) < 0) {
1032                 tlsv1_server_log(conn, "Invalid Signature in CertificateVerify");
1033                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, alert);
1034                 return -1;
1035         }
1036
1037         *in_len = end - in_data;
1038
1039         conn->state = CHANGE_CIPHER_SPEC;
1040
1041         return 0;
1042 }
1043
1044
1045 static int tls_process_change_cipher_spec(struct tlsv1_server *conn,
1046                                           u8 ct, const u8 *in_data,
1047                                           size_t *in_len)
1048 {
1049         const u8 *pos;
1050         size_t left;
1051
1052         if (ct != TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC) {
1053                 tlsv1_server_log(conn, "Expected ChangeCipherSpec; received content type 0x%x",
1054                                  ct);
1055                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1056                                    TLS_ALERT_UNEXPECTED_MESSAGE);
1057                 return -1;
1058         }
1059
1060         pos = in_data;
1061         left = *in_len;
1062
1063         if (left < 1) {
1064                 tlsv1_server_log(conn, "Too short ChangeCipherSpec");
1065                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1066                                    TLS_ALERT_DECODE_ERROR);
1067                 return -1;
1068         }
1069
1070         if (*pos != TLS_CHANGE_CIPHER_SPEC) {
1071                 tlsv1_server_log(conn, "Expected ChangeCipherSpec; received data 0x%x",
1072                                  *pos);
1073                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1074                                    TLS_ALERT_UNEXPECTED_MESSAGE);
1075                 return -1;
1076         }
1077
1078         tlsv1_server_log(conn, "Received ChangeCipherSpec");
1079         if (tlsv1_record_change_read_cipher(&conn->rl) < 0) {
1080                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to change read cipher "
1081                            "for record layer");
1082                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1083                                    TLS_ALERT_INTERNAL_ERROR);
1084                 return -1;
1085         }
1086
1087         *in_len = pos + 1 - in_data;
1088
1089         conn->state = CLIENT_FINISHED;
1090
1091         return 0;
1092 }
1093
1094
1095 static int tls_process_client_finished(struct tlsv1_server *conn, u8 ct,
1096                                        const u8 *in_data, size_t *in_len)
1097 {
1098         const u8 *pos, *end;
1099         size_t left, len, hlen;
1100         u8 verify_data[TLS_VERIFY_DATA_LEN];
1101         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
1102
1103 #ifdef CONFIG_TESTING_OPTIONS
1104         if ((conn->test_flags &
1105              (TLS_BREAK_SRV_KEY_X_HASH | TLS_BREAK_SRV_KEY_X_SIGNATURE)) &&
1106             !conn->test_failure_reported) {
1107                 tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after invalid ServerKeyExchange");
1108                 conn->test_failure_reported = 1;
1109         }
1110
1111         if ((conn->test_flags & TLS_DHE_PRIME_15) &&
1112             !conn->test_failure_reported) {
1113                 tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after bogus DHE \"prime\" 15");
1114                 conn->test_failure_reported = 1;
1115         }
1116
1117         if ((conn->test_flags & TLS_DHE_PRIME_58B) &&
1118             !conn->test_failure_reported) {
1119                 tlsv1_server_log(conn, "TEST-FAILURE: Client Finished received after short 58-bit DHE prime in long container");
1120                 conn->test_failure_reported = 1;
1121         }
1122
1123         if ((conn->test_flags & TLS_DHE_PRIME_511B) &&
1124             !conn->test_failure_reported) {
1125                 tlsv1_server_log(conn, "TEST-WARNING: Client Finished received after short 511-bit DHE prime (insecure)");
1126                 conn->test_failure_reported = 1;
1127         }
1128
1129         if ((conn->test_flags & TLS_DHE_PRIME_767B) &&
1130             !conn->test_failure_reported) {
1131                 tlsv1_server_log(conn, "TEST-NOTE: Client Finished received after 767-bit DHE prime (relatively insecure)");
1132                 conn->test_failure_reported = 1;
1133         }
1134
1135         if ((conn->test_flags & TLS_DHE_NON_PRIME) &&
1136             !conn->test_failure_reported) {
1137                 tlsv1_server_log(conn, "TEST-NOTE: Client Finished received after non-prime claimed as DHE prime");
1138                 conn->test_failure_reported = 1;
1139         }
1140 #endif /* CONFIG_TESTING_OPTIONS */
1141
1142         if (ct != TLS_CONTENT_TYPE_HANDSHAKE) {
1143                 tlsv1_server_log(conn, "Expected Finished; received content type 0x%x",
1144                                  ct);
1145                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1146                                    TLS_ALERT_UNEXPECTED_MESSAGE);
1147                 return -1;
1148         }
1149
1150         pos = in_data;
1151         left = *in_len;
1152
1153         if (left < 4) {
1154                 tlsv1_server_log(conn, "Too short record (left=%lu) forFinished",
1155                                  (unsigned long) left);
1156                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1157                                    TLS_ALERT_DECODE_ERROR);
1158                 return -1;
1159         }
1160
1161         if (pos[0] != TLS_HANDSHAKE_TYPE_FINISHED) {
1162                 wpa_printf(MSG_DEBUG, "TLSv1: Expected Finished; received "
1163                            "type 0x%x", pos[0]);
1164                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1165                                    TLS_ALERT_UNEXPECTED_MESSAGE);
1166                 return -1;
1167         }
1168
1169         len = WPA_GET_BE24(pos + 1);
1170
1171         pos += 4;
1172         left -= 4;
1173
1174         if (len > left) {
1175                 tlsv1_server_log(conn, "Too short buffer for Finished (len=%lu > left=%lu)",
1176                                  (unsigned long) len, (unsigned long) left);
1177                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1178                                    TLS_ALERT_DECODE_ERROR);
1179                 return -1;
1180         }
1181         end = pos + len;
1182         if (len != TLS_VERIFY_DATA_LEN) {
1183                 tlsv1_server_log(conn, "Unexpected verify_data length in Finished: %lu (expected %d)",
1184                                  (unsigned long) len, TLS_VERIFY_DATA_LEN);
1185                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1186                                    TLS_ALERT_DECODE_ERROR);
1187                 return -1;
1188         }
1189         wpa_hexdump(MSG_MSGDUMP, "TLSv1: verify_data in Finished",
1190                     pos, TLS_VERIFY_DATA_LEN);
1191
1192 #ifdef CONFIG_TLSV12
1193         if (conn->rl.tls_version >= TLS_VERSION_1_2) {
1194                 hlen = SHA256_MAC_LEN;
1195                 if (conn->verify.sha256_client == NULL ||
1196                     crypto_hash_finish(conn->verify.sha256_client, hash, &hlen)
1197                     < 0) {
1198                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1199                                            TLS_ALERT_INTERNAL_ERROR);
1200                         conn->verify.sha256_client = NULL;
1201                         return -1;
1202                 }
1203                 conn->verify.sha256_client = NULL;
1204         } else {
1205 #endif /* CONFIG_TLSV12 */
1206
1207         hlen = MD5_MAC_LEN;
1208         if (conn->verify.md5_client == NULL ||
1209             crypto_hash_finish(conn->verify.md5_client, hash, &hlen) < 0) {
1210                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1211                                    TLS_ALERT_INTERNAL_ERROR);
1212                 conn->verify.md5_client = NULL;
1213                 crypto_hash_finish(conn->verify.sha1_client, NULL, NULL);
1214                 conn->verify.sha1_client = NULL;
1215                 return -1;
1216         }
1217         conn->verify.md5_client = NULL;
1218         hlen = SHA1_MAC_LEN;
1219         if (conn->verify.sha1_client == NULL ||
1220             crypto_hash_finish(conn->verify.sha1_client, hash + MD5_MAC_LEN,
1221                                &hlen) < 0) {
1222                 conn->verify.sha1_client = NULL;
1223                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1224                                    TLS_ALERT_INTERNAL_ERROR);
1225                 return -1;
1226         }
1227         conn->verify.sha1_client = NULL;
1228         hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
1229
1230 #ifdef CONFIG_TLSV12
1231         }
1232 #endif /* CONFIG_TLSV12 */
1233
1234         if (tls_prf(conn->rl.tls_version,
1235                     conn->master_secret, TLS_MASTER_SECRET_LEN,
1236                     "client finished", hash, hlen,
1237                     verify_data, TLS_VERIFY_DATA_LEN)) {
1238                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive verify_data");
1239                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1240                                    TLS_ALERT_DECRYPT_ERROR);
1241                 return -1;
1242         }
1243         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (client)",
1244                         verify_data, TLS_VERIFY_DATA_LEN);
1245
1246         if (os_memcmp_const(pos, verify_data, TLS_VERIFY_DATA_LEN) != 0) {
1247                 tlsv1_server_log(conn, "Mismatch in verify_data");
1248                 conn->state = FAILED;
1249                 return -1;
1250         }
1251
1252         tlsv1_server_log(conn, "Received Finished");
1253
1254         *in_len = end - in_data;
1255
1256         if (conn->use_session_ticket) {
1257                 /* Abbreviated handshake using session ticket; RFC 4507 */
1258                 tlsv1_server_log(conn, "Abbreviated handshake completed successfully");
1259                 conn->state = ESTABLISHED;
1260         } else {
1261                 /* Full handshake */
1262                 conn->state = SERVER_CHANGE_CIPHER_SPEC;
1263         }
1264
1265         return 0;
1266 }
1267
1268
1269 int tlsv1_server_process_handshake(struct tlsv1_server *conn, u8 ct,
1270                                    const u8 *buf, size_t *len)
1271 {
1272         if (ct == TLS_CONTENT_TYPE_ALERT) {
1273                 if (*len < 2) {
1274                         tlsv1_server_log(conn, "Alert underflow");
1275                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
1276                                            TLS_ALERT_DECODE_ERROR);
1277                         return -1;
1278                 }
1279                 tlsv1_server_log(conn, "Received alert %d:%d", buf[0], buf[1]);
1280                 *len = 2;
1281                 conn->state = FAILED;
1282                 return -1;
1283         }
1284
1285         switch (conn->state) {
1286         case CLIENT_HELLO:
1287                 if (tls_process_client_hello(conn, ct, buf, len))
1288                         return -1;
1289                 break;
1290         case CLIENT_CERTIFICATE:
1291                 if (tls_process_certificate(conn, ct, buf, len))
1292                         return -1;
1293                 break;
1294         case CLIENT_KEY_EXCHANGE:
1295                 if (tls_process_client_key_exchange(conn, ct, buf, len))
1296                         return -1;
1297                 break;
1298         case CERTIFICATE_VERIFY:
1299                 if (tls_process_certificate_verify(conn, ct, buf, len))
1300                         return -1;
1301                 break;
1302         case CHANGE_CIPHER_SPEC:
1303                 if (tls_process_change_cipher_spec(conn, ct, buf, len))
1304                         return -1;
1305                 break;
1306         case CLIENT_FINISHED:
1307                 if (tls_process_client_finished(conn, ct, buf, len))
1308                         return -1;
1309                 break;
1310         default:
1311                 tlsv1_server_log(conn, "Unexpected state %d while processing received message",
1312                                  conn->state);
1313                 return -1;
1314         }
1315
1316         if (ct == TLS_CONTENT_TYPE_HANDSHAKE)
1317                 tls_verify_hash_add(&conn->verify, buf, *len);
1318
1319         return 0;
1320 }