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