2 * Copyright (C) 2010 Martin Willi
3 * Copyright (C) 2010 revosec AG
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "tls_server.h"
20 #include <utils/debug.h>
21 #include <credentials/certificates/x509.h>
23 typedef struct private_tls_server_t private_tls_server_t
;
26 * Size of a session ID
28 #define SESSION_ID_SIZE 16
35 STATE_KEY_EXCHANGE_SENT
,
39 STATE_KEY_EXCHANGE_RECEIVED
,
40 STATE_CERT_VERIFY_RECEIVED
,
41 STATE_CIPHERSPEC_CHANGED_IN
,
42 STATE_FINISHED_RECEIVED
,
43 STATE_CIPHERSPEC_CHANGED_OUT
,
48 * Private data of an tls_server_t object.
50 struct private_tls_server_t
{
53 * Public tls_server_t interface.
75 identification_t
*server
;
78 * Peer identity, NULL for no client authentication
80 identification_t
*peer
;
83 * Is it acceptable if we couldn't verify the peer certificate?
85 bool peer_auth_optional
;
93 * Hello random data selected by client
95 char client_random
[32];
98 * Hello random data selected by server
100 char server_random
[32];
103 * Auth helper for peer authentication
105 auth_cfg_t
*peer_auth
;
108 * Auth helper for server authentication
110 auth_cfg_t
*server_auth
;
115 private_key_t
*private;
120 diffie_hellman_t
*dh
;
123 * Selected TLS cipher suite
125 tls_cipher_suite_t suite
;
128 * Offered TLS version of the client
130 tls_version_t client_version
;
133 * TLS session identifier
138 * Do we resume a session?
143 * Hash and signature algorithms supported by peer
148 * Elliptic curves supported by peer
153 * Did we receive the curves from the client?
155 bool curves_received
;
159 * Find a cipher suite and a server key
161 static bool select_suite_and_key(private_tls_server_t
*this,
162 tls_cipher_suite_t
*suites
, int count
)
167 key
= lib
->credmgr
->get_private(lib
->credmgr
, KEY_ANY
, this->server
,
171 DBG1(DBG_TLS
, "no usable TLS server certificate found for '%Y'",
175 this->suite
= this->crypto
->select_cipher_suite(this->crypto
,
176 suites
, count
, key
->get_type(key
));
178 { /* no match for this key, try to find another type */
179 if (key
->get_type(key
) == KEY_ECDSA
)
189 this->suite
= this->crypto
->select_cipher_suite(this->crypto
,
190 suites
, count
, type
);
193 DBG1(DBG_TLS
, "received cipher suites unacceptable");
196 this->server_auth
->destroy(this->server_auth
);
197 this->server_auth
= auth_cfg_create();
198 key
= lib
->credmgr
->get_private(lib
->credmgr
, type
, this->server
,
202 DBG1(DBG_TLS
, "received cipher suites unacceptable");
211 * Process client hello message
213 static status_t
process_client_hello(private_tls_server_t
*this,
214 bio_reader_t
*reader
)
216 uint16_t version
, extension
;
217 chunk_t random
, session
, ciphers
, compression
, ext
= chunk_empty
;
218 bio_reader_t
*extensions
;
219 tls_cipher_suite_t
*suites
;
223 this->crypto
->append_handshake(this->crypto
,
224 TLS_CLIENT_HELLO
, reader
->peek(reader
));
226 if (!reader
->read_uint16(reader
, &version
) ||
227 !reader
->read_data(reader
, sizeof(this->client_random
), &random
) ||
228 !reader
->read_data8(reader
, &session
) ||
229 !reader
->read_data16(reader
, &ciphers
) ||
230 !reader
->read_data8(reader
, &compression
) ||
231 (reader
->remaining(reader
) && !reader
->read_data16(reader
, &ext
)))
233 DBG1(DBG_TLS
, "received invalid ClientHello");
234 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
240 extensions
= bio_reader_create(ext
);
241 while (extensions
->remaining(extensions
))
243 if (!extensions
->read_uint16(extensions
, &extension
) ||
244 !extensions
->read_data16(extensions
, &ext
))
246 DBG1(DBG_TLS
, "received invalid ClientHello Extensions");
247 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
248 extensions
->destroy(extensions
);
251 DBG2(DBG_TLS
, "received TLS '%N' extension",
252 tls_extension_names
, extension
);
253 DBG3(DBG_TLS
, "%B", &ext
);
256 case TLS_EXT_SIGNATURE_ALGORITHMS
:
257 this->hashsig
= chunk_clone(ext
);
259 case TLS_EXT_ELLIPTIC_CURVES
:
260 this->curves_received
= TRUE
;
261 this->curves
= chunk_clone(ext
);
267 extensions
->destroy(extensions
);
270 memcpy(this->client_random
, random
.ptr
, sizeof(this->client_random
));
272 htoun32(&this->server_random
, time(NULL
));
273 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_WEAK
);
275 !rng
->get_bytes(rng
, sizeof(this->server_random
) - 4,
276 this->server_random
+ 4))
278 DBG1(DBG_TLS
, "failed to generate server random");
279 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
285 if (!this->tls
->set_version(this->tls
, version
))
287 DBG1(DBG_TLS
, "negotiated version %N not supported",
288 tls_version_names
, version
);
289 this->alert
->add(this->alert
, TLS_FATAL
, TLS_PROTOCOL_VERSION
);
293 this->client_version
= version
;
294 this->suite
= this->crypto
->resume_session(this->crypto
, session
, this->peer
,
295 chunk_from_thing(this->client_random
),
296 chunk_from_thing(this->server_random
));
299 this->session
= chunk_clone(session
);
301 DBG1(DBG_TLS
, "resumed %N using suite %N",
302 tls_version_names
, this->tls
->get_version(this->tls
),
303 tls_cipher_suite_names
, this->suite
);
307 count
= ciphers
.len
/ sizeof(uint16_t);
308 suites
= alloca(count
* sizeof(tls_cipher_suite_t
));
309 DBG2(DBG_TLS
, "received %d TLS cipher suites:", count
);
310 for (i
= 0; i
< count
; i
++)
312 suites
[i
] = untoh16(&ciphers
.ptr
[i
* sizeof(uint16_t)]);
313 DBG2(DBG_TLS
, " %N", tls_cipher_suite_names
, suites
[i
]);
315 if (!select_suite_and_key(this, suites
, count
))
317 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
320 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_STRONG
);
321 if (!rng
|| !rng
->allocate_bytes(rng
, SESSION_ID_SIZE
, &this->session
))
323 DBG1(DBG_TLS
, "generating TLS session identifier failed, skipped");
326 DBG1(DBG_TLS
, "negotiated %N using suite %N",
327 tls_version_names
, this->tls
->get_version(this->tls
),
328 tls_cipher_suite_names
, this->suite
);
330 this->state
= STATE_HELLO_RECEIVED
;
335 * Process certificate
337 static status_t
process_certificate(private_tls_server_t
*this,
338 bio_reader_t
*reader
)
345 this->crypto
->append_handshake(this->crypto
,
346 TLS_CERTIFICATE
, reader
->peek(reader
));
348 if (!reader
->read_data24(reader
, &data
))
350 DBG1(DBG_TLS
, "certificate message header invalid");
351 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
354 certs
= bio_reader_create(data
);
355 while (certs
->remaining(certs
))
357 if (!certs
->read_data24(certs
, &data
))
359 DBG1(DBG_TLS
, "certificate message invalid");
360 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
361 certs
->destroy(certs
);
364 cert
= lib
->creds
->create(lib
->creds
, CRED_CERTIFICATE
, CERT_X509
,
365 BUILD_BLOB_ASN1_DER
, data
, BUILD_END
);
370 this->peer_auth
->add(this->peer_auth
,
371 AUTH_HELPER_SUBJECT_CERT
, cert
);
372 DBG1(DBG_TLS
, "received TLS peer certificate '%Y'",
373 cert
->get_subject(cert
));
375 if (this->peer
== NULL
)
376 { /* apply identity to authenticate */
377 this->peer
= cert
->get_subject(cert
);
378 this->peer
= this->peer
->clone(this->peer
);
379 this->peer_auth_optional
= TRUE
;
384 DBG1(DBG_TLS
, "received TLS intermediate certificate '%Y'",
385 cert
->get_subject(cert
));
386 this->peer_auth
->add(this->peer_auth
, AUTH_HELPER_IM_CERT
, cert
);
391 DBG1(DBG_TLS
, "parsing TLS certificate failed, skipped");
392 this->alert
->add(this->alert
, TLS_WARNING
, TLS_BAD_CERTIFICATE
);
395 certs
->destroy(certs
);
396 this->state
= STATE_CERT_RECEIVED
;
401 * Process Client Key Exchange, using premaster encryption
403 static status_t
process_key_exchange_encrypted(private_tls_server_t
*this,
404 bio_reader_t
*reader
)
406 chunk_t encrypted
, decrypted
;
410 this->crypto
->append_handshake(this->crypto
,
411 TLS_CLIENT_KEY_EXCHANGE
, reader
->peek(reader
));
413 if (!reader
->read_data16(reader
, &encrypted
))
415 DBG1(DBG_TLS
, "received invalid Client Key Exchange");
416 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
420 htoun16(premaster
, this->client_version
);
421 /* pre-randomize premaster for failure cases */
422 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_WEAK
);
423 if (!rng
|| !rng
->get_bytes(rng
, sizeof(premaster
) - 2, premaster
+ 2))
425 DBG1(DBG_TLS
, "failed to generate premaster secret");
426 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
433 this->private->decrypt(this->private,
434 ENCRYPT_RSA_PKCS1
, encrypted
, &decrypted
))
436 if (decrypted
.len
== sizeof(premaster
) &&
437 untoh16(decrypted
.ptr
) == this->client_version
)
439 memcpy(premaster
+ 2, decrypted
.ptr
+ 2, sizeof(premaster
) - 2);
443 DBG1(DBG_TLS
, "decrypted premaster has invalid length/version");
445 chunk_clear(&decrypted
);
449 DBG1(DBG_TLS
, "decrypting Client Key Exchange failed");
452 if (!this->crypto
->derive_secrets(this->crypto
, chunk_from_thing(premaster
),
453 this->session
, this->peer
,
454 chunk_from_thing(this->client_random
),
455 chunk_from_thing(this->server_random
)))
457 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
461 this->state
= STATE_KEY_EXCHANGE_RECEIVED
;
466 * Process client key exchange, using DHE exchange
468 static status_t
process_key_exchange_dhe(private_tls_server_t
*this,
469 bio_reader_t
*reader
)
471 chunk_t premaster
, pub
;
474 this->crypto
->append_handshake(this->crypto
,
475 TLS_CLIENT_KEY_EXCHANGE
, reader
->peek(reader
));
477 ec
= diffie_hellman_group_is_ec(this->dh
->get_dh_group(this->dh
));
478 if ((ec
&& !reader
->read_data8(reader
, &pub
)) ||
479 (!ec
&& (!reader
->read_data16(reader
, &pub
) || pub
.len
== 0)))
481 DBG1(DBG_TLS
, "received invalid Client Key Exchange");
482 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
488 if (pub
.ptr
[0] != TLS_ANSI_UNCOMPRESSED
)
490 DBG1(DBG_TLS
, "DH point format '%N' not supported",
491 tls_ansi_point_format_names
, pub
.ptr
[0]);
492 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
495 pub
= chunk_skip(pub
, 1);
497 if (!this->dh
->set_other_public_value(this->dh
, pub
))
499 DBG1(DBG_TLS
, "applying DH public value failed");
500 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
503 if (!this->dh
->get_shared_secret(this->dh
, &premaster
))
505 DBG1(DBG_TLS
, "calculating premaster from DH failed");
506 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
510 if (!this->crypto
->derive_secrets(this->crypto
, premaster
,
511 this->session
, this->peer
,
512 chunk_from_thing(this->client_random
),
513 chunk_from_thing(this->server_random
)))
515 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
516 chunk_clear(&premaster
);
519 chunk_clear(&premaster
);
521 this->state
= STATE_KEY_EXCHANGE_RECEIVED
;
526 * Process Client Key Exchange
528 static status_t
process_key_exchange(private_tls_server_t
*this,
529 bio_reader_t
*reader
)
533 return process_key_exchange_dhe(this, reader
);
535 return process_key_exchange_encrypted(this, reader
);
539 * Process Certificate verify
541 static status_t
process_cert_verify(private_tls_server_t
*this,
542 bio_reader_t
*reader
)
544 bool verified
= FALSE
;
545 enumerator_t
*enumerator
;
546 public_key_t
*public;
550 enumerator
= lib
->credmgr
->create_public_enumerator(lib
->credmgr
,
551 KEY_ANY
, this->peer
, this->peer_auth
, TRUE
);
552 while (enumerator
->enumerate(enumerator
, &public, &auth
))
554 sig
= bio_reader_create(reader
->peek(reader
));
555 verified
= this->crypto
->verify_handshake(this->crypto
, public, sig
);
559 this->peer_auth
->merge(this->peer_auth
, auth
, FALSE
);
562 DBG1(DBG_TLS
, "signature verification failed, trying another key");
564 enumerator
->destroy(enumerator
);
568 DBG1(DBG_TLS
, "no trusted certificate found for '%Y' to verify TLS peer",
570 if (!this->peer_auth_optional
)
571 { /* client authentication is required */
572 this->alert
->add(this->alert
, TLS_FATAL
, TLS_CERTIFICATE_UNKNOWN
);
575 /* reset peer identity, we couldn't authenticate it */
576 this->peer
->destroy(this->peer
);
578 this->state
= STATE_KEY_EXCHANGE_RECEIVED
;
582 this->state
= STATE_CERT_VERIFY_RECEIVED
;
584 this->crypto
->append_handshake(this->crypto
,
585 TLS_CERTIFICATE_VERIFY
, reader
->peek(reader
));
590 * Process finished message
592 static status_t
process_finished(private_tls_server_t
*this,
593 bio_reader_t
*reader
)
598 if (!reader
->read_data(reader
, sizeof(buf
), &received
))
600 DBG1(DBG_TLS
, "received client finished too short");
601 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
604 if (!this->crypto
->calculate_finished(this->crypto
, "client finished", buf
))
606 DBG1(DBG_TLS
, "calculating client finished failed");
607 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
610 if (!chunk_equals_const(received
, chunk_from_thing(buf
)))
612 DBG1(DBG_TLS
, "received client finished invalid");
613 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECRYPT_ERROR
);
617 this->crypto
->append_handshake(this->crypto
, TLS_FINISHED
, received
);
618 this->state
= STATE_FINISHED_RECEIVED
;
622 METHOD(tls_handshake_t
, process
, status_t
,
623 private_tls_server_t
*this, tls_handshake_type_t type
, bio_reader_t
*reader
)
625 tls_handshake_type_t expected
;
630 if (type
== TLS_CLIENT_HELLO
)
632 return process_client_hello(this, reader
);
634 expected
= TLS_CLIENT_HELLO
;
636 case STATE_HELLO_DONE
:
637 if (type
== TLS_CERTIFICATE
)
639 return process_certificate(this, reader
);
643 expected
= TLS_CERTIFICATE
;
646 /* otherwise fall through to next state */
647 case STATE_CERT_RECEIVED
:
648 if (type
== TLS_CLIENT_KEY_EXCHANGE
)
650 return process_key_exchange(this, reader
);
652 expected
= TLS_CLIENT_KEY_EXCHANGE
;
654 case STATE_KEY_EXCHANGE_RECEIVED
:
655 if (type
== TLS_CERTIFICATE_VERIFY
)
657 return process_cert_verify(this, reader
);
661 expected
= TLS_CERTIFICATE_VERIFY
;
664 return INVALID_STATE
;
665 case STATE_CIPHERSPEC_CHANGED_IN
:
666 if (type
== TLS_FINISHED
)
668 return process_finished(this, reader
);
670 expected
= TLS_FINISHED
;
673 DBG1(DBG_TLS
, "TLS %N not expected in current state",
674 tls_handshake_type_names
, type
);
675 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
678 DBG1(DBG_TLS
, "TLS %N expected, but received %N",
679 tls_handshake_type_names
, expected
, tls_handshake_type_names
, type
);
680 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
685 * Send ServerHello message
687 static status_t
send_server_hello(private_tls_server_t
*this,
688 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
691 writer
->write_uint16(writer
, this->tls
->get_version(this->tls
));
692 writer
->write_data(writer
, chunk_from_thing(this->server_random
));
694 /* session identifier if we have one */
695 writer
->write_data8(writer
, this->session
);
697 /* add selected TLS cipher suite */
698 writer
->write_uint16(writer
, this->suite
);
700 /* NULL compression only */
701 writer
->write_uint8(writer
, 0);
703 *type
= TLS_SERVER_HELLO
;
704 this->state
= STATE_HELLO_SENT
;
705 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
712 static status_t
send_certificate(private_tls_server_t
*this,
713 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
715 enumerator_t
*enumerator
;
721 /* generate certificate payload */
722 certs
= bio_writer_create(256);
723 cert
= this->server_auth
->get(this->server_auth
, AUTH_RULE_SUBJECT_CERT
);
726 if (cert
->get_encoding(cert
, CERT_ASN1_DER
, &data
))
728 DBG1(DBG_TLS
, "sending TLS server certificate '%Y'",
729 cert
->get_subject(cert
));
730 certs
->write_data24(certs
, data
);
734 enumerator
= this->server_auth
->create_enumerator(this->server_auth
);
735 while (enumerator
->enumerate(enumerator
, &rule
, &cert
))
737 if (rule
== AUTH_RULE_IM_CERT
)
739 if (cert
->get_encoding(cert
, CERT_ASN1_DER
, &data
))
741 DBG1(DBG_TLS
, "sending TLS intermediate certificate '%Y'",
742 cert
->get_subject(cert
));
743 certs
->write_data24(certs
, data
);
748 enumerator
->destroy(enumerator
);
750 writer
->write_data24(writer
, certs
->get_buf(certs
));
751 certs
->destroy(certs
);
753 *type
= TLS_CERTIFICATE
;
754 this->state
= STATE_CERT_SENT
;
755 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
760 * Send Certificate Request
762 static status_t
send_certificate_request(private_tls_server_t
*this,
763 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
765 bio_writer_t
*authorities
, *supported
;
766 enumerator_t
*enumerator
;
769 identification_t
*id
;
771 supported
= bio_writer_create(4);
772 /* we propose both RSA and ECDSA */
773 supported
->write_uint8(supported
, TLS_RSA_SIGN
);
774 supported
->write_uint8(supported
, TLS_ECDSA_SIGN
);
775 writer
->write_data8(writer
, supported
->get_buf(supported
));
776 supported
->destroy(supported
);
777 if (this->tls
->get_version(this->tls
) >= TLS_1_2
)
779 this->crypto
->get_signature_algorithms(this->crypto
, writer
);
782 authorities
= bio_writer_create(64);
783 enumerator
= lib
->credmgr
->create_cert_enumerator(lib
->credmgr
,
784 CERT_X509
, KEY_RSA
, NULL
, TRUE
);
785 while (enumerator
->enumerate(enumerator
, &cert
))
787 x509
= (x509_t
*)cert
;
788 if (x509
->get_flags(x509
) & X509_CA
)
790 id
= cert
->get_subject(cert
);
791 DBG1(DBG_TLS
, "sending TLS cert request for '%Y'", id
);
792 authorities
->write_data16(authorities
, id
->get_encoding(id
));
795 enumerator
->destroy(enumerator
);
796 writer
->write_data16(writer
, authorities
->get_buf(authorities
));
797 authorities
->destroy(authorities
);
799 *type
= TLS_CERTIFICATE_REQUEST
;
800 this->state
= STATE_CERTREQ_SENT
;
801 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
806 * Get the TLS curve of a given EC DH group
808 static tls_named_curve_t
ec_group_to_curve(private_tls_server_t
*this,
809 diffie_hellman_group_t group
)
811 diffie_hellman_group_t current
;
812 tls_named_curve_t curve
;
813 enumerator_t
*enumerator
;
815 enumerator
= this->crypto
->create_ec_enumerator(this->crypto
);
816 while (enumerator
->enumerate(enumerator
, ¤t
, &curve
))
818 if (current
== group
)
820 enumerator
->destroy(enumerator
);
824 enumerator
->destroy(enumerator
);
829 * Check if the peer supports a given TLS curve
831 bool peer_supports_curve(private_tls_server_t
*this, tls_named_curve_t curve
)
833 bio_reader_t
*reader
;
836 if (!this->curves_received
)
837 { /* none received, assume yes */
840 reader
= bio_reader_create(this->curves
);
841 while (reader
->remaining(reader
) && reader
->read_uint16(reader
, ¤t
))
843 if (current
== curve
)
845 reader
->destroy(reader
);
849 reader
->destroy(reader
);
854 * Try to find a curve supported by both, client and server
856 static bool find_supported_curve(private_tls_server_t
*this,
857 tls_named_curve_t
*curve
)
859 tls_named_curve_t current
;
860 enumerator_t
*enumerator
;
862 enumerator
= this->crypto
->create_ec_enumerator(this->crypto
);
863 while (enumerator
->enumerate(enumerator
, NULL
, ¤t
))
865 if (peer_supports_curve(this, current
))
868 enumerator
->destroy(enumerator
);
872 enumerator
->destroy(enumerator
);
877 * Send Server key Exchange
879 static status_t
send_server_key_exchange(private_tls_server_t
*this,
880 tls_handshake_type_t
*type
, bio_writer_t
*writer
,
881 diffie_hellman_group_t group
)
883 diffie_hellman_params_t
*params
= NULL
;
884 tls_named_curve_t curve
;
887 if (diffie_hellman_group_is_ec(group
))
889 curve
= ec_group_to_curve(this, group
);
890 if (!curve
|| (!peer_supports_curve(this, curve
) &&
891 !find_supported_curve(this, &curve
)))
893 DBG1(DBG_TLS
, "no EC group supported by client and server");
894 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
897 DBG2(DBG_TLS
, "selected ECDH group %N", tls_named_curve_names
, curve
);
898 writer
->write_uint8(writer
, TLS_ECC_NAMED_CURVE
);
899 writer
->write_uint16(writer
, curve
);
903 params
= diffie_hellman_get_params(group
);
906 DBG1(DBG_TLS
, "no parameters found for DH group %N",
907 diffie_hellman_group_names
, group
);
908 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
911 DBG2(DBG_TLS
, "selected DH group %N", diffie_hellman_group_names
, group
);
912 writer
->write_data16(writer
, params
->prime
);
913 writer
->write_data16(writer
, params
->generator
);
915 this->dh
= lib
->crypto
->create_dh(lib
->crypto
, group
);
918 DBG1(DBG_TLS
, "DH group %N not supported",
919 diffie_hellman_group_names
, group
);
920 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
923 if (!this->dh
->get_my_public_value(this->dh
, &chunk
))
925 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
930 writer
->write_data16(writer
, chunk
);
933 { /* ECP uses 8bit length header only, but a point format */
934 writer
->write_uint8(writer
, chunk
.len
+ 1);
935 writer
->write_uint8(writer
, TLS_ANSI_UNCOMPRESSED
);
936 writer
->write_data(writer
, chunk
);
940 chunk
= chunk_cat("ccc", chunk_from_thing(this->client_random
),
941 chunk_from_thing(this->server_random
), writer
->get_buf(writer
));
942 if (!this->private || !this->crypto
->sign(this->crypto
, this->private,
943 writer
, chunk
, this->hashsig
))
945 DBG1(DBG_TLS
, "signing DH parameters failed");
946 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
951 *type
= TLS_SERVER_KEY_EXCHANGE
;
952 this->state
= STATE_KEY_EXCHANGE_SENT
;
953 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
960 static status_t
send_hello_done(private_tls_server_t
*this,
961 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
963 *type
= TLS_SERVER_HELLO_DONE
;
964 this->state
= STATE_HELLO_DONE
;
965 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
972 static status_t
send_finished(private_tls_server_t
*this,
973 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
977 if (!this->crypto
->calculate_finished(this->crypto
, "server finished", buf
))
979 DBG1(DBG_TLS
, "calculating server finished data failed");
980 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
984 writer
->write_data(writer
, chunk_from_thing(buf
));
986 *type
= TLS_FINISHED
;
987 this->state
= STATE_FINISHED_SENT
;
988 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
993 METHOD(tls_handshake_t
, build
, status_t
,
994 private_tls_server_t
*this, tls_handshake_type_t
*type
, bio_writer_t
*writer
)
996 diffie_hellman_group_t group
;
1000 case STATE_HELLO_RECEIVED
:
1001 return send_server_hello(this, type
, writer
);
1002 case STATE_HELLO_SENT
:
1003 return send_certificate(this, type
, writer
);
1004 case STATE_CERT_SENT
:
1005 group
= this->crypto
->get_dh_group(this->crypto
);
1008 return send_server_key_exchange(this, type
, writer
, group
);
1010 /* otherwise fall through to next state */
1011 case STATE_KEY_EXCHANGE_SENT
:
1012 return send_certificate_request(this, type
, writer
);
1013 case STATE_CERTREQ_SENT
:
1014 return send_hello_done(this, type
, writer
);
1015 case STATE_CIPHERSPEC_CHANGED_OUT
:
1016 return send_finished(this, type
, writer
);
1017 case STATE_FINISHED_SENT
:
1018 return INVALID_STATE
;
1020 return INVALID_STATE
;
1024 METHOD(tls_handshake_t
, cipherspec_changed
, bool,
1025 private_tls_server_t
*this, bool inbound
)
1031 return this->state
== STATE_FINISHED_SENT
;
1035 return this->state
== STATE_CERT_VERIFY_RECEIVED
;
1037 return this->state
== STATE_KEY_EXCHANGE_RECEIVED
;
1043 return this->state
== STATE_HELLO_SENT
;
1045 return this->state
== STATE_FINISHED_RECEIVED
;
1050 METHOD(tls_handshake_t
, change_cipherspec
, void,
1051 private_tls_server_t
*this, bool inbound
)
1053 this->crypto
->change_cipher(this->crypto
, inbound
);
1056 this->state
= STATE_CIPHERSPEC_CHANGED_IN
;
1060 this->state
= STATE_CIPHERSPEC_CHANGED_OUT
;
1064 METHOD(tls_handshake_t
, finished
, bool,
1065 private_tls_server_t
*this)
1069 return this->state
== STATE_FINISHED_RECEIVED
;
1071 return this->state
== STATE_FINISHED_SENT
;
1074 METHOD(tls_handshake_t
, get_peer_id
, identification_t
*,
1075 private_tls_server_t
*this)
1080 METHOD(tls_handshake_t
, get_server_id
, identification_t
*,
1081 private_tls_server_t
*this)
1083 return this->server
;
1086 METHOD(tls_handshake_t
, get_auth
, auth_cfg_t
*,
1087 private_tls_server_t
*this)
1089 return this->peer_auth
;
1092 METHOD(tls_handshake_t
, destroy
, void,
1093 private_tls_server_t
*this)
1095 DESTROY_IF(this->private);
1096 DESTROY_IF(this->dh
);
1097 DESTROY_IF(this->peer
);
1098 this->server
->destroy(this->server
);
1099 this->peer_auth
->destroy(this->peer_auth
);
1100 this->server_auth
->destroy(this->server_auth
);
1101 free(this->hashsig
.ptr
);
1102 free(this->curves
.ptr
);
1103 free(this->session
.ptr
);
1110 tls_server_t
*tls_server_create(tls_t
*tls
,
1111 tls_crypto_t
*crypto
, tls_alert_t
*alert
,
1112 identification_t
*server
, identification_t
*peer
)
1114 private_tls_server_t
*this;
1119 .process
= _process
,
1121 .cipherspec_changed
= _cipherspec_changed
,
1122 .change_cipherspec
= _change_cipherspec
,
1123 .finished
= _finished
,
1124 .get_peer_id
= _get_peer_id
,
1125 .get_server_id
= _get_server_id
,
1126 .get_auth
= _get_auth
,
1127 .destroy
= _destroy
,
1133 .server
= server
->clone(server
),
1134 .peer
= peer ? peer
->clone(peer
) : NULL
,
1135 .state
= STATE_INIT
,
1136 .peer_auth
= auth_cfg_create(),
1137 .server_auth
= auth_cfg_create(),
1140 return &this->public;