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