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