Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / src / tls / tlsv1_server_write.c
1 /*
2  * TLSv1 server - write 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 "crypto/random.h"
17 #include "x509v3.h"
18 #include "tlsv1_common.h"
19 #include "tlsv1_record.h"
20 #include "tlsv1_server.h"
21 #include "tlsv1_server_i.h"
22
23
24 static size_t tls_server_cert_chain_der_len(struct tlsv1_server *conn)
25 {
26         size_t len = 0;
27         struct x509_certificate *cert;
28
29         cert = conn->cred->cert;
30         while (cert) {
31                 len += 3 + cert->cert_len;
32                 if (x509_certificate_self_signed(cert))
33                         break;
34                 cert = x509_certificate_get_subject(conn->cred->trusted_certs,
35                                                     &cert->issuer);
36         }
37
38         return len;
39 }
40
41
42 static int tls_write_server_hello(struct tlsv1_server *conn,
43                                   u8 **msgpos, u8 *end)
44 {
45         u8 *pos, *rhdr, *hs_start, *hs_length;
46         struct os_time now;
47         size_t rlen;
48
49         pos = *msgpos;
50
51         tlsv1_server_log(conn, "Send ServerHello");
52         rhdr = pos;
53         pos += TLS_RECORD_HEADER_LEN;
54
55         os_get_time(&now);
56         WPA_PUT_BE32(conn->server_random, now.sec);
57         if (random_get_bytes(conn->server_random + 4, TLS_RANDOM_LEN - 4)) {
58                 wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
59                            "server_random");
60                 return -1;
61         }
62         wpa_hexdump(MSG_MSGDUMP, "TLSv1: server_random",
63                     conn->server_random, TLS_RANDOM_LEN);
64
65         conn->session_id_len = TLS_SESSION_ID_MAX_LEN;
66         if (random_get_bytes(conn->session_id, conn->session_id_len)) {
67                 wpa_printf(MSG_ERROR, "TLSv1: Could not generate "
68                            "session_id");
69                 return -1;
70         }
71         wpa_hexdump(MSG_MSGDUMP, "TLSv1: session_id",
72                     conn->session_id, conn->session_id_len);
73
74         /* opaque fragment[TLSPlaintext.length] */
75
76         /* Handshake */
77         hs_start = pos;
78         /* HandshakeType msg_type */
79         *pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO;
80         /* uint24 length (to be filled) */
81         hs_length = pos;
82         pos += 3;
83         /* body - ServerHello */
84         /* ProtocolVersion server_version */
85         WPA_PUT_BE16(pos, conn->rl.tls_version);
86         pos += 2;
87         /* Random random: uint32 gmt_unix_time, opaque random_bytes */
88         os_memcpy(pos, conn->server_random, TLS_RANDOM_LEN);
89         pos += TLS_RANDOM_LEN;
90         /* SessionID session_id */
91         *pos++ = conn->session_id_len;
92         os_memcpy(pos, conn->session_id, conn->session_id_len);
93         pos += conn->session_id_len;
94         /* CipherSuite cipher_suite */
95         WPA_PUT_BE16(pos, conn->cipher_suite);
96         pos += 2;
97         /* CompressionMethod compression_method */
98         *pos++ = TLS_COMPRESSION_NULL;
99
100         if (conn->session_ticket && conn->session_ticket_cb) {
101                 int res = conn->session_ticket_cb(
102                         conn->session_ticket_cb_ctx,
103                         conn->session_ticket, conn->session_ticket_len,
104                         conn->client_random, conn->server_random,
105                         conn->master_secret);
106                 if (res < 0) {
107                         tlsv1_server_log(conn, "SessionTicket callback indicated failure");
108                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
109                                            TLS_ALERT_HANDSHAKE_FAILURE);
110                         return -1;
111                 }
112                 conn->use_session_ticket = res;
113
114                 if (conn->use_session_ticket) {
115                         if (tlsv1_server_derive_keys(conn, NULL, 0) < 0) {
116                                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to "
117                                            "derive keys");
118                                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
119                                                    TLS_ALERT_INTERNAL_ERROR);
120                                 return -1;
121                         }
122                 }
123
124                 /*
125                  * RFC 4507 specifies that server would include an empty
126                  * SessionTicket extension in ServerHello and a
127                  * NewSessionTicket message after the ServerHello. However,
128                  * EAP-FAST (RFC 4851), i.e., the only user of SessionTicket
129                  * extension at the moment, does not use such extensions.
130                  *
131                  * TODO: Add support for configuring RFC 4507 behavior and make
132                  * EAP-FAST disable it.
133                  */
134         }
135
136         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
137         tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
138
139         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
140                               rhdr, end - rhdr, hs_start, pos - hs_start,
141                               &rlen) < 0) {
142                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create TLS record");
143                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
144                                    TLS_ALERT_INTERNAL_ERROR);
145                 return -1;
146         }
147         pos = rhdr + rlen;
148
149         *msgpos = pos;
150
151         return 0;
152 }
153
154
155 static int tls_write_server_certificate(struct tlsv1_server *conn,
156                                         u8 **msgpos, u8 *end)
157 {
158         u8 *pos, *rhdr, *hs_start, *hs_length, *cert_start;
159         size_t rlen;
160         struct x509_certificate *cert;
161         const struct tls_cipher_suite *suite;
162
163         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
164         if (suite && suite->key_exchange == TLS_KEY_X_DH_anon) {
165                 wpa_printf(MSG_DEBUG, "TLSv1: Do not send Certificate when "
166                            "using anonymous DH");
167                 return 0;
168         }
169
170         pos = *msgpos;
171
172         tlsv1_server_log(conn, "Send Certificate");
173         rhdr = pos;
174         pos += TLS_RECORD_HEADER_LEN;
175
176         /* opaque fragment[TLSPlaintext.length] */
177
178         /* Handshake */
179         hs_start = pos;
180         /* HandshakeType msg_type */
181         *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE;
182         /* uint24 length (to be filled) */
183         hs_length = pos;
184         pos += 3;
185         /* body - Certificate */
186         /* uint24 length (to be filled) */
187         cert_start = pos;
188         pos += 3;
189         cert = conn->cred->cert;
190         while (cert) {
191                 if (pos + 3 + cert->cert_len > end) {
192                         wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space "
193                                    "for Certificate (cert_len=%lu left=%lu)",
194                                    (unsigned long) cert->cert_len,
195                                    (unsigned long) (end - pos));
196                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
197                                            TLS_ALERT_INTERNAL_ERROR);
198                         return -1;
199                 }
200                 WPA_PUT_BE24(pos, cert->cert_len);
201                 pos += 3;
202                 os_memcpy(pos, cert->cert_start, cert->cert_len);
203                 pos += cert->cert_len;
204
205                 if (x509_certificate_self_signed(cert))
206                         break;
207                 cert = x509_certificate_get_subject(conn->cred->trusted_certs,
208                                                     &cert->issuer);
209         }
210         if (cert == conn->cred->cert || cert == NULL) {
211                 /*
212                  * Server was not configured with all the needed certificates
213                  * to form a full certificate chain. The client may fail to
214                  * validate the chain unless it is configured with all the
215                  * missing CA certificates.
216                  */
217                 wpa_printf(MSG_DEBUG, "TLSv1: Full server certificate chain "
218                            "not configured - validation may fail");
219         }
220         WPA_PUT_BE24(cert_start, pos - cert_start - 3);
221
222         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
223
224         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
225                               rhdr, end - rhdr, hs_start, pos - hs_start,
226                               &rlen) < 0) {
227                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
228                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
229                                    TLS_ALERT_INTERNAL_ERROR);
230                 return -1;
231         }
232         pos = rhdr + rlen;
233
234         tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
235
236         *msgpos = pos;
237
238         return 0;
239 }
240
241
242 static int tls_write_server_key_exchange(struct tlsv1_server *conn,
243                                          u8 **msgpos, u8 *end)
244 {
245         tls_key_exchange keyx;
246         const struct tls_cipher_suite *suite;
247         u8 *pos, *rhdr, *hs_start, *hs_length, *server_params;
248         size_t rlen;
249         u8 *dh_ys;
250         size_t dh_ys_len;
251         const u8 *dh_p;
252         size_t dh_p_len;
253
254         suite = tls_get_cipher_suite(conn->rl.cipher_suite);
255         if (suite == NULL)
256                 keyx = TLS_KEY_X_NULL;
257         else
258                 keyx = suite->key_exchange;
259
260         if (!tls_server_key_exchange_allowed(conn->rl.cipher_suite)) {
261                 wpa_printf(MSG_DEBUG, "TLSv1: No ServerKeyExchange needed");
262                 return 0;
263         }
264
265         if (keyx != TLS_KEY_X_DH_anon && keyx != TLS_KEY_X_DHE_RSA) {
266                 wpa_printf(MSG_DEBUG, "TLSv1: ServerKeyExchange not yet "
267                            "supported with key exchange type %d", keyx);
268                 return -1;
269         }
270
271         if (conn->cred == NULL || conn->cred->dh_p == NULL ||
272             conn->cred->dh_g == NULL) {
273                 wpa_printf(MSG_DEBUG, "TLSv1: No DH parameters available for "
274                            "ServerKeyExhcange");
275                 return -1;
276         }
277
278         tlsv1_server_get_dh_p(conn, &dh_p, &dh_p_len);
279
280         os_free(conn->dh_secret);
281         conn->dh_secret_len = dh_p_len;
282         conn->dh_secret = os_malloc(conn->dh_secret_len);
283         if (conn->dh_secret == NULL) {
284                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate "
285                            "memory for secret (Diffie-Hellman)");
286                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
287                                    TLS_ALERT_INTERNAL_ERROR);
288                 return -1;
289         }
290         if (random_get_bytes(conn->dh_secret, conn->dh_secret_len)) {
291                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to get random "
292                            "data for Diffie-Hellman");
293                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
294                                    TLS_ALERT_INTERNAL_ERROR);
295                 os_free(conn->dh_secret);
296                 conn->dh_secret = NULL;
297                 return -1;
298         }
299
300         if (os_memcmp(conn->dh_secret, dh_p, conn->dh_secret_len) > 0)
301                 conn->dh_secret[0] = 0; /* make sure secret < p */
302
303         pos = conn->dh_secret;
304         while (pos + 1 < conn->dh_secret + conn->dh_secret_len && *pos == 0)
305                 pos++;
306         if (pos != conn->dh_secret) {
307                 os_memmove(conn->dh_secret, pos,
308                            conn->dh_secret_len - (pos - conn->dh_secret));
309                 conn->dh_secret_len -= pos - conn->dh_secret;
310         }
311         wpa_hexdump_key(MSG_DEBUG, "TLSv1: DH server's secret value",
312                         conn->dh_secret, conn->dh_secret_len);
313
314         /* Ys = g^secret mod p */
315         dh_ys_len = dh_p_len;
316         dh_ys = os_malloc(dh_ys_len);
317         if (dh_ys == NULL) {
318                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to allocate memory for "
319                            "Diffie-Hellman");
320                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
321                                    TLS_ALERT_INTERNAL_ERROR);
322                 return -1;
323         }
324         if (crypto_mod_exp(conn->cred->dh_g, conn->cred->dh_g_len,
325                            conn->dh_secret, conn->dh_secret_len,
326                            dh_p, dh_p_len, dh_ys, &dh_ys_len)) {
327                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
328                                    TLS_ALERT_INTERNAL_ERROR);
329                 os_free(dh_ys);
330                 return -1;
331         }
332
333         wpa_hexdump(MSG_DEBUG, "TLSv1: DH Ys (server's public value)",
334                     dh_ys, dh_ys_len);
335
336         /*
337          * struct {
338          *    select (KeyExchangeAlgorithm) {
339          *       case diffie_hellman:
340          *          ServerDHParams params;
341          *          Signature signed_params;
342          *       case rsa:
343          *          ServerRSAParams params;
344          *          Signature signed_params;
345          *    };
346          * } ServerKeyExchange;
347          *
348          * struct {
349          *    opaque dh_p<1..2^16-1>;
350          *    opaque dh_g<1..2^16-1>;
351          *    opaque dh_Ys<1..2^16-1>;
352          * } ServerDHParams;
353          */
354
355         pos = *msgpos;
356
357         tlsv1_server_log(conn, "Send ServerKeyExchange");
358         rhdr = pos;
359         pos += TLS_RECORD_HEADER_LEN;
360
361         /* opaque fragment[TLSPlaintext.length] */
362
363         /* Handshake */
364         hs_start = pos;
365         /* HandshakeType msg_type */
366         *pos++ = TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE;
367         /* uint24 length (to be filled) */
368         hs_length = pos;
369         pos += 3;
370
371         /* body - ServerDHParams */
372         server_params = pos;
373         /* dh_p */
374         if (pos + 2 + dh_p_len > end) {
375                 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
376                            "dh_p");
377                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
378                                    TLS_ALERT_INTERNAL_ERROR);
379                 os_free(dh_ys);
380                 return -1;
381         }
382         WPA_PUT_BE16(pos, dh_p_len);
383         pos += 2;
384         os_memcpy(pos, dh_p, dh_p_len);
385         pos += dh_p_len;
386
387         /* dh_g */
388         if (pos + 2 + conn->cred->dh_g_len > end) {
389                 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
390                            "dh_g");
391                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
392                                    TLS_ALERT_INTERNAL_ERROR);
393                 os_free(dh_ys);
394                 return -1;
395         }
396         WPA_PUT_BE16(pos, conn->cred->dh_g_len);
397         pos += 2;
398         os_memcpy(pos, conn->cred->dh_g, conn->cred->dh_g_len);
399         pos += conn->cred->dh_g_len;
400
401         /* dh_Ys */
402         if (pos + 2 + dh_ys_len > end) {
403                 wpa_printf(MSG_DEBUG, "TLSv1: Not enough buffer space for "
404                            "dh_Ys");
405                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
406                                    TLS_ALERT_INTERNAL_ERROR);
407                 os_free(dh_ys);
408                 return -1;
409         }
410         WPA_PUT_BE16(pos, dh_ys_len);
411         pos += 2;
412         os_memcpy(pos, dh_ys, dh_ys_len);
413         pos += dh_ys_len;
414         os_free(dh_ys);
415
416         /*
417          * select (SignatureAlgorithm)
418          * {   case anonymous: struct { };
419          *     case rsa:
420          *         digitally-signed struct {
421          *             opaque md5_hash[16];
422          *             opaque sha_hash[20];
423          *         };
424          *     case dsa:
425          *         digitally-signed struct {
426          *             opaque sha_hash[20];
427          *         };
428          * } Signature;
429          *
430          * md5_hash
431          *     MD5(ClientHello.random + ServerHello.random + ServerParams);
432          *
433          * sha_hash
434          *     SHA(ClientHello.random + ServerHello.random + ServerParams);
435          */
436
437         if (keyx == TLS_KEY_X_DHE_RSA) {
438                 u8 hash[100];
439                 u8 *signed_start;
440                 size_t clen;
441                 int hlen;
442
443                 if (conn->rl.tls_version >= TLS_VERSION_1_2) {
444 #ifdef CONFIG_TLSV12
445                         hlen = tlsv12_key_x_server_params_hash(
446                                 conn->rl.tls_version, conn->client_random,
447                                 conn->server_random, server_params,
448                                 pos - server_params, hash + 19);
449
450                         /*
451                          * RFC 5246, 4.7:
452                          * TLS v1.2 adds explicit indication of the used
453                          * signature and hash algorithms.
454                          *
455                          * struct {
456                          *   HashAlgorithm hash;
457                          *   SignatureAlgorithm signature;
458                          * } SignatureAndHashAlgorithm;
459                          */
460                         if (hlen < 0 || pos + 2 > end) {
461                                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
462                                                    TLS_ALERT_INTERNAL_ERROR);
463                                 return -1;
464                         }
465                         *pos++ = TLS_HASH_ALG_SHA256;
466                         *pos++ = TLS_SIGN_ALG_RSA;
467
468                         /*
469                          * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
470                          *
471                          * DigestInfo ::= SEQUENCE {
472                          *   digestAlgorithm DigestAlgorithm,
473                          *   digest OCTET STRING
474                          * }
475                          *
476                          * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
477                          *
478                          * DER encoded DigestInfo for SHA256 per RFC 3447:
479                          * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00
480                          * 04 20 || H
481                          */
482                         hlen += 19;
483                         os_memcpy(hash,
484                                   "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65"
485                                   "\x03\x04\x02\x01\x05\x00\x04\x20", 19);
486
487 #else /* CONFIG_TLSV12 */
488                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
489                                            TLS_ALERT_INTERNAL_ERROR);
490                         return -1;
491 #endif /* CONFIG_TLSV12 */
492                 } else {
493                         hlen = tls_key_x_server_params_hash(
494                                 conn->rl.tls_version, conn->client_random,
495                                 conn->server_random, server_params,
496                                 pos - server_params, hash);
497                 }
498
499                 if (hlen < 0) {
500                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
501                                            TLS_ALERT_INTERNAL_ERROR);
502                         return -1;
503                 }
504
505                 wpa_hexdump(MSG_MSGDUMP, "TLS: ServerKeyExchange signed_params hash",
506                             hash, hlen);
507 #ifdef CONFIG_TESTING_OPTIONS
508                 if (conn->test_flags & TLS_BREAK_SRV_KEY_X_HASH) {
509                         tlsv1_server_log(conn, "TESTING: Break ServerKeyExchange signed params hash");
510                         hash[hlen - 1] ^= 0x80;
511                 }
512 #endif /* CONFIG_TESTING_OPTIONS */
513
514                 /*
515                  * RFC 2246, 4.7:
516                  * In digital signing, one-way hash functions are used as input
517                  * for a signing algorithm. A digitally-signed element is
518                  * encoded as an opaque vector <0..2^16-1>, where the length is
519                  * specified by the signing algorithm and key.
520                  *
521                  * In RSA signing, a 36-byte structure of two hashes (one SHA
522                  * and one MD5) is signed (encrypted with the private key). It
523                  * is encoded with PKCS #1 block type 0 or type 1 as described
524                  * in [PKCS1].
525                  */
526                 signed_start = pos; /* length to be filled */
527                 pos += 2;
528                 clen = end - pos;
529                 if (conn->cred == NULL ||
530                     crypto_private_key_sign_pkcs1(conn->cred->key, hash, hlen,
531                                                   pos, &clen) < 0) {
532                         wpa_printf(MSG_DEBUG, "TLSv1: Failed to sign hash (PKCS #1)");
533                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
534                                            TLS_ALERT_INTERNAL_ERROR);
535                         return -1;
536                 }
537                 WPA_PUT_BE16(signed_start, clen);
538 #ifdef CONFIG_TESTING_OPTIONS
539                 if (conn->test_flags & TLS_BREAK_SRV_KEY_X_SIGNATURE) {
540                         tlsv1_server_log(conn, "TESTING: Break ServerKeyExchange signed params signature");
541                         pos[clen - 1] ^= 0x80;
542                 }
543 #endif /* CONFIG_TESTING_OPTIONS */
544
545                 pos += clen;
546         }
547
548         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
549
550         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
551                               rhdr, end - rhdr, hs_start, pos - hs_start,
552                               &rlen) < 0) {
553                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
554                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
555                                    TLS_ALERT_INTERNAL_ERROR);
556                 return -1;
557         }
558         pos = rhdr + rlen;
559
560         tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
561
562         *msgpos = pos;
563
564         return 0;
565 }
566
567
568 static int tls_write_server_certificate_request(struct tlsv1_server *conn,
569                                                 u8 **msgpos, u8 *end)
570 {
571         u8 *pos, *rhdr, *hs_start, *hs_length;
572         size_t rlen;
573
574         if (!conn->verify_peer) {
575                 wpa_printf(MSG_DEBUG, "TLSv1: No CertificateRequest needed");
576                 return 0;
577         }
578
579         pos = *msgpos;
580
581         tlsv1_server_log(conn, "Send CertificateRequest");
582         rhdr = pos;
583         pos += TLS_RECORD_HEADER_LEN;
584
585         /* opaque fragment[TLSPlaintext.length] */
586
587         /* Handshake */
588         hs_start = pos;
589         /* HandshakeType msg_type */
590         *pos++ = TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST;
591         /* uint24 length (to be filled) */
592         hs_length = pos;
593         pos += 3;
594         /* body - CertificateRequest */
595
596         /*
597          * enum {
598          *   rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),
599          *   (255)
600          * } ClientCertificateType;
601          * ClientCertificateType certificate_types<1..2^8-1>
602          */
603         *pos++ = 1;
604         *pos++ = 1; /* rsa_sign */
605
606         /*
607          * opaque DistinguishedName<1..2^16-1>
608          * DistinguishedName certificate_authorities<3..2^16-1>
609          */
610         /* TODO: add support for listing DNs for trusted CAs */
611         WPA_PUT_BE16(pos, 0);
612         pos += 2;
613
614         WPA_PUT_BE24(hs_length, pos - hs_length - 3);
615
616         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
617                               rhdr, end - rhdr, hs_start, pos - hs_start,
618                               &rlen) < 0) {
619                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
620                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
621                                    TLS_ALERT_INTERNAL_ERROR);
622                 return -1;
623         }
624         pos = rhdr + rlen;
625
626         tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
627
628         *msgpos = pos;
629
630         return 0;
631 }
632
633
634 static int tls_write_server_hello_done(struct tlsv1_server *conn,
635                                        u8 **msgpos, u8 *end)
636 {
637         u8 *pos;
638         size_t rlen;
639         u8 payload[4];
640
641         tlsv1_server_log(conn, "Send ServerHelloDone");
642
643         /* opaque fragment[TLSPlaintext.length] */
644
645         /* Handshake */
646         pos = payload;
647         /* HandshakeType msg_type */
648         *pos++ = TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE;
649         /* uint24 length */
650         WPA_PUT_BE24(pos, 0);
651         pos += 3;
652         /* body - ServerHelloDone (empty) */
653
654         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
655                               *msgpos, end - *msgpos, payload, pos - payload,
656                               &rlen) < 0) {
657                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate a record");
658                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
659                                    TLS_ALERT_INTERNAL_ERROR);
660                 return -1;
661         }
662
663         tls_verify_hash_add(&conn->verify, payload, pos - payload);
664
665         *msgpos += rlen;
666
667         return 0;
668 }
669
670
671 static int tls_write_server_change_cipher_spec(struct tlsv1_server *conn,
672                                                u8 **msgpos, u8 *end)
673 {
674         size_t rlen;
675         u8 payload[1];
676
677         tlsv1_server_log(conn, "Send ChangeCipherSpec");
678
679         payload[0] = TLS_CHANGE_CIPHER_SPEC;
680
681         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC,
682                               *msgpos, end - *msgpos, payload, sizeof(payload),
683                               &rlen) < 0) {
684                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
685                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
686                                    TLS_ALERT_INTERNAL_ERROR);
687                 return -1;
688         }
689
690         if (tlsv1_record_change_write_cipher(&conn->rl) < 0) {
691                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to set write cipher for "
692                            "record layer");
693                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
694                                    TLS_ALERT_INTERNAL_ERROR);
695                 return -1;
696         }
697
698         *msgpos += rlen;
699
700         return 0;
701 }
702
703
704 static int tls_write_server_finished(struct tlsv1_server *conn,
705                                      u8 **msgpos, u8 *end)
706 {
707         u8 *pos, *hs_start;
708         size_t rlen, hlen;
709         u8 verify_data[1 + 3 + TLS_VERIFY_DATA_LEN];
710         u8 hash[MD5_MAC_LEN + SHA1_MAC_LEN];
711
712         pos = *msgpos;
713
714         tlsv1_server_log(conn, "Send Finished");
715
716         /* Encrypted Handshake Message: Finished */
717
718 #ifdef CONFIG_TLSV12
719         if (conn->rl.tls_version >= TLS_VERSION_1_2) {
720                 hlen = SHA256_MAC_LEN;
721                 if (conn->verify.sha256_server == NULL ||
722                     crypto_hash_finish(conn->verify.sha256_server, hash, &hlen)
723                     < 0) {
724                         conn->verify.sha256_server = NULL;
725                         tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
726                                            TLS_ALERT_INTERNAL_ERROR);
727                         return -1;
728                 }
729                 conn->verify.sha256_server = NULL;
730         } else {
731 #endif /* CONFIG_TLSV12 */
732
733         hlen = MD5_MAC_LEN;
734         if (conn->verify.md5_server == NULL ||
735             crypto_hash_finish(conn->verify.md5_server, hash, &hlen) < 0) {
736                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
737                                    TLS_ALERT_INTERNAL_ERROR);
738                 conn->verify.md5_server = NULL;
739                 crypto_hash_finish(conn->verify.sha1_server, NULL, NULL);
740                 conn->verify.sha1_server = NULL;
741                 return -1;
742         }
743         conn->verify.md5_server = NULL;
744         hlen = SHA1_MAC_LEN;
745         if (conn->verify.sha1_server == NULL ||
746             crypto_hash_finish(conn->verify.sha1_server, hash + MD5_MAC_LEN,
747                                &hlen) < 0) {
748                 conn->verify.sha1_server = NULL;
749                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
750                                    TLS_ALERT_INTERNAL_ERROR);
751                 return -1;
752         }
753         conn->verify.sha1_server = NULL;
754         hlen = MD5_MAC_LEN + SHA1_MAC_LEN;
755
756 #ifdef CONFIG_TLSV12
757         }
758 #endif /* CONFIG_TLSV12 */
759
760         if (tls_prf(conn->rl.tls_version,
761                     conn->master_secret, TLS_MASTER_SECRET_LEN,
762                     "server finished", hash, hlen,
763                     verify_data + 1 + 3, TLS_VERIFY_DATA_LEN)) {
764                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to generate verify_data");
765                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
766                                    TLS_ALERT_INTERNAL_ERROR);
767                 return -1;
768         }
769         wpa_hexdump_key(MSG_DEBUG, "TLSv1: verify_data (server)",
770                         verify_data + 1 + 3, TLS_VERIFY_DATA_LEN);
771 #ifdef CONFIG_TESTING_OPTIONS
772         if (conn->test_flags & TLS_BREAK_VERIFY_DATA) {
773                 tlsv1_server_log(conn, "TESTING: Break verify_data (server)");
774                 verify_data[1 + 3 + 1] ^= 0x80;
775         }
776 #endif /* CONFIG_TESTING_OPTIONS */
777
778         /* Handshake */
779         pos = hs_start = verify_data;
780         /* HandshakeType msg_type */
781         *pos++ = TLS_HANDSHAKE_TYPE_FINISHED;
782         /* uint24 length */
783         WPA_PUT_BE24(pos, TLS_VERIFY_DATA_LEN);
784         pos += 3;
785         pos += TLS_VERIFY_DATA_LEN;
786         tls_verify_hash_add(&conn->verify, hs_start, pos - hs_start);
787
788         if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_HANDSHAKE,
789                               *msgpos, end - *msgpos, hs_start, pos - hs_start,
790                               &rlen) < 0) {
791                 wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record");
792                 tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL,
793                                    TLS_ALERT_INTERNAL_ERROR);
794                 return -1;
795         }
796
797         *msgpos += rlen;
798
799         return 0;
800 }
801
802
803 static u8 * tls_send_server_hello(struct tlsv1_server *conn, size_t *out_len)
804 {
805         u8 *msg, *end, *pos;
806         size_t msglen;
807
808         *out_len = 0;
809
810         msglen = 1000 + tls_server_cert_chain_der_len(conn);
811
812         msg = os_malloc(msglen);
813         if (msg == NULL)
814                 return NULL;
815
816         pos = msg;
817         end = msg + msglen;
818
819         if (tls_write_server_hello(conn, &pos, end) < 0) {
820                 os_free(msg);
821                 return NULL;
822         }
823
824         if (conn->use_session_ticket) {
825                 /* Abbreviated handshake using session ticket; RFC 4507 */
826                 if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||
827                     tls_write_server_finished(conn, &pos, end) < 0) {
828                         os_free(msg);
829                         return NULL;
830                 }
831
832                 *out_len = pos - msg;
833
834                 conn->state = CHANGE_CIPHER_SPEC;
835
836                 return msg;
837         }
838
839         /* Full handshake */
840         if (tls_write_server_certificate(conn, &pos, end) < 0 ||
841             tls_write_server_key_exchange(conn, &pos, end) < 0 ||
842             tls_write_server_certificate_request(conn, &pos, end) < 0 ||
843             tls_write_server_hello_done(conn, &pos, end) < 0) {
844                 os_free(msg);
845                 return NULL;
846         }
847
848         *out_len = pos - msg;
849
850         conn->state = CLIENT_CERTIFICATE;
851
852         return msg;
853 }
854
855
856 static u8 * tls_send_change_cipher_spec(struct tlsv1_server *conn,
857                                         size_t *out_len)
858 {
859         u8 *msg, *end, *pos;
860
861         *out_len = 0;
862
863         msg = os_malloc(1000);
864         if (msg == NULL)
865                 return NULL;
866
867         pos = msg;
868         end = msg + 1000;
869
870         if (tls_write_server_change_cipher_spec(conn, &pos, end) < 0 ||
871             tls_write_server_finished(conn, &pos, end) < 0) {
872                 os_free(msg);
873                 return NULL;
874         }
875
876         *out_len = pos - msg;
877
878         tlsv1_server_log(conn, "Handshake completed successfully");
879         conn->state = ESTABLISHED;
880
881         return msg;
882 }
883
884
885 u8 * tlsv1_server_handshake_write(struct tlsv1_server *conn, size_t *out_len)
886 {
887         switch (conn->state) {
888         case SERVER_HELLO:
889                 return tls_send_server_hello(conn, out_len);
890         case SERVER_CHANGE_CIPHER_SPEC:
891                 return tls_send_change_cipher_spec(conn, out_len);
892         default:
893                 if (conn->state == ESTABLISHED && conn->use_session_ticket) {
894                         /* Abbreviated handshake was already completed. */
895                         return NULL;
896                 }
897                 tlsv1_server_log(conn, "Unexpected state %d while generating reply",
898                                  conn->state);
899                 return NULL;
900         }
901 }
902
903
904 u8 * tlsv1_server_send_alert(struct tlsv1_server *conn, u8 level,
905                              u8 description, size_t *out_len)
906 {
907         u8 *alert, *pos, *length;
908
909         tlsv1_server_log(conn, "Send Alert(%d:%d)", level, description);
910         *out_len = 0;
911
912         alert = os_malloc(10);
913         if (alert == NULL)
914                 return NULL;
915
916         pos = alert;
917
918         /* TLSPlaintext */
919         /* ContentType type */
920         *pos++ = TLS_CONTENT_TYPE_ALERT;
921         /* ProtocolVersion version */
922         WPA_PUT_BE16(pos, conn->rl.tls_version ? conn->rl.tls_version :
923                      TLS_VERSION);
924         pos += 2;
925         /* uint16 length (to be filled) */
926         length = pos;
927         pos += 2;
928         /* opaque fragment[TLSPlaintext.length] */
929
930         /* Alert */
931         /* AlertLevel level */
932         *pos++ = level;
933         /* AlertDescription description */
934         *pos++ = description;
935
936         WPA_PUT_BE16(length, pos - length - 2);
937         *out_len = pos - alert;
938
939         return alert;
940 }