2 * Copyright (C) 2020 Pascal Knecht
3 * HSR Hochschule fuer Technik Rapperswil
5 * Copyright (C) 2010 Martin Willi
6 * Copyright (C) 2010 revosec AG
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 #include "tls_server.h"
23 #include <utils/debug.h>
24 #include <credentials/certificates/x509.h>
25 #include <collections/array.h>
27 typedef struct private_tls_server_t private_tls_server_t
;
30 * Size of a session ID
32 #define SESSION_ID_SIZE 16
39 STATE_KEY_EXCHANGE_SENT
,
43 STATE_KEY_EXCHANGE_RECEIVED
,
44 STATE_CERT_VERIFY_RECEIVED
,
45 STATE_CIPHERSPEC_CHANGED_IN
,
46 STATE_FINISHED_RECEIVED
,
47 STATE_CIPHERSPEC_CHANGED_OUT
,
49 /* new states in TLS 1.3 */
50 STATE_ENCRYPTED_EXTENSIONS_SENT
,
51 STATE_CERT_VERIFY_SENT
,
52 STATE_KEY_UPDATE_REQUESTED
,
53 STATE_KEY_UPDATE_SENT
,
54 STATE_FINISHED_SENT_KEY_SWITCHED
,
58 * Private data of an tls_server_t object.
60 struct private_tls_server_t
{
63 * Public tls_server_t interface.
85 identification_t
*server
;
88 * Peer identity, NULL for no client authentication
90 identification_t
*peer
;
98 * Hello random data selected by client
100 char client_random
[32];
103 * Hello random data selected by server
105 char server_random
[32];
108 * Auth helper for peer authentication
110 auth_cfg_t
*peer_auth
;
113 * Auth helper for server authentication
115 auth_cfg_t
*server_auth
;
120 private_key_t
*private;
125 diffie_hellman_t
*dh
;
130 tls_named_group_t requested_curve
;
133 * Selected TLS cipher suite
135 tls_cipher_suite_t suite
;
138 * Offered TLS version of the client
140 tls_version_t client_version
;
143 * TLS session identifier
148 * Do we resume a session?
153 * Hash and signature algorithms supported by peer
158 * Elliptic curves supported by peer
163 * Did we receive the curves from the client?
165 bool curves_received
;
169 * Find a trusted public key to encrypt/verify key exchange data
171 public_key_t
*tls_find_public_key(auth_cfg_t
*peer_auth
)
173 public_key_t
*public = NULL
, *current
;
174 certificate_t
*cert
, *found
;
175 enumerator_t
*enumerator
;
178 cert
= peer_auth
->get(peer_auth
, AUTH_HELPER_SUBJECT_CERT
);
181 enumerator
= lib
->credmgr
->create_public_enumerator(lib
->credmgr
,
182 KEY_ANY
, cert
->get_subject(cert
),
184 while (enumerator
->enumerate(enumerator
, ¤t
, &auth
))
186 found
= auth
->get(auth
, AUTH_RULE_SUBJECT_CERT
);
187 if (found
&& cert
->equals(cert
, found
))
189 public = current
->get_ref(current
);
190 peer_auth
->merge(peer_auth
, auth
, FALSE
);
194 enumerator
->destroy(enumerator
);
200 * Create an array of an intersection of server and peer supported key types
202 static array_t
*create_common_key_types(chunk_t hashsig
,
203 tls_version_t version_min
,
204 tls_version_t version_max
)
207 enumerator_t
*enumerator
;
208 key_type_t v
, lookup
;
211 key_types
= array_create(sizeof(key_type_t
), 8);
212 enumerator
= tls_get_supported_key_types(version_min
, version_max
);
213 while (enumerator
->enumerate(enumerator
, &v
))
215 bio_reader_t
*reader
;
217 reader
= bio_reader_create(hashsig
);
218 while (reader
->remaining(reader
) &&
219 reader
->read_uint16(reader
, &sig_scheme
))
221 lookup
= tls_signature_scheme_to_key_type(sig_scheme
);
224 array_insert(key_types
, ARRAY_TAIL
, &lookup
);
228 reader
->destroy(reader
);
230 enumerator
->destroy(enumerator
);
235 * Find a cipher suite and a server key
237 static bool select_suite_and_key(private_tls_server_t
*this,
238 tls_cipher_suite_t
*suites
, int count
)
241 tls_version_t version_min
, version_max
;
245 version_min
= this->tls
->get_version_min(this->tls
);
246 version_max
= this->tls
->get_version_max(this->tls
);
247 key_types
= create_common_key_types(this->hashsig
, version_min
, version_max
);
248 if (!array_count(key_types
))
250 DBG1(DBG_TLS
, "no common signature algorithms found");
251 array_destroy(key_types
);
254 while (array_remove(key_types
, ARRAY_HEAD
, &type
))
256 key
= lib
->credmgr
->get_private(lib
->credmgr
, type
, this->server
,
265 DBG1(DBG_TLS
, "no usable TLS server certificate found for '%Y'",
267 array_destroy(key_types
);
271 if (version_max
>= TLS_1_3
)
273 this->suite
= this->crypto
->select_cipher_suite(this->crypto
, suites
,
278 this->suite
= this->crypto
->select_cipher_suite(this->crypto
, suites
,
280 while (!this->suite
&& array_remove(key_types
, ARRAY_HEAD
, &type
))
281 { /* find a key and cipher suite for one of the remaining key types */
283 this->server_auth
->destroy(this->server_auth
);
284 this->server_auth
= auth_cfg_create();
285 key
= lib
->credmgr
->get_private(lib
->credmgr
, type
, this->server
,
289 this->suite
= this->crypto
->select_cipher_suite(this->crypto
,
295 array_destroy(key_types
);
296 if (!this->suite
|| !key
)
298 DBG1(DBG_TLS
, "received cipher suites or signature schemes unacceptable");
301 DBG1(DBG_TLS
, "using key of type %N", key_type_names
, key
->get_type(key
));
307 * Check if the peer supports a given TLS curve
309 static bool peer_supports_curve(private_tls_server_t
*this,
310 tls_named_group_t curve
)
312 bio_reader_t
*reader
;
315 if (!this->curves_received
)
316 { /* none received, assume yes */
319 reader
= bio_reader_create(this->curves
);
320 while (reader
->remaining(reader
) && reader
->read_uint16(reader
, ¤t
))
322 if (current
== curve
)
324 reader
->destroy(reader
);
328 reader
->destroy(reader
);
333 * TLS 1.3 key exchange key share
341 * Check if peer sent a key share of a given TLS named DH group
343 static bool peer_offered_curve(array_t
*key_shares
, tls_named_group_t curve
,
349 for (i
= 0; i
< array_count(key_shares
); i
++)
351 array_get(key_shares
, i
, &peer
);
352 if (curve
== peer
.curve
)
365 * Check if client is currently retrying to connect to the server.
367 static bool retrying(private_tls_server_t
*this)
369 return this->state
== STATE_INIT
&& this->requested_curve
;
373 * Process client hello message
375 static status_t
process_client_hello(private_tls_server_t
*this,
376 bio_reader_t
*reader
)
378 uint16_t legacy_version
= 0, version
= 0, extension_type
= 0;
379 chunk_t random
, session
, ciphers
, versions
= chunk_empty
, compression
;
380 chunk_t ext
= chunk_empty
, key_shares
= chunk_empty
;
381 key_share_t peer
= {0};
382 chunk_t extension_data
= chunk_empty
;
383 bio_reader_t
*extensions
, *extension
;
384 tls_cipher_suite_t
*suites
;
388 this->crypto
->append_handshake(this->crypto
,
389 TLS_CLIENT_HELLO
, reader
->peek(reader
));
391 if (!reader
->read_uint16(reader
, &legacy_version
) ||
392 !reader
->read_data(reader
, sizeof(this->client_random
), &random
) ||
393 !reader
->read_data8(reader
, &session
) ||
394 !reader
->read_data16(reader
, &ciphers
) ||
395 !reader
->read_data8(reader
, &compression
) ||
396 (reader
->remaining(reader
) && !reader
->read_data16(reader
, &ext
)))
398 DBG1(DBG_TLS
, "received invalid ClientHello");
399 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
403 /* before we do anything version-related, determine our supported suites
404 * as that might change the min./max. versions */
405 this->crypto
->get_cipher_suites(this->crypto
, NULL
);
407 extensions
= bio_reader_create(ext
);
408 while (extensions
->remaining(extensions
))
410 if (!extensions
->read_uint16(extensions
, &extension_type
) ||
411 !extensions
->read_data16(extensions
, &extension_data
))
413 DBG1(DBG_TLS
, "received invalid ClientHello Extensions");
414 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
415 extensions
->destroy(extensions
);
418 extension
= bio_reader_create(extension_data
);
419 DBG2(DBG_TLS
, "received TLS '%N' extension",
420 tls_extension_names
, extension_type
);
421 DBG3(DBG_TLS
, "%B", &extension_data
);
422 switch (extension_type
)
424 case TLS_EXT_SIGNATURE_ALGORITHMS
:
425 if (!extension
->read_data16(extension
, &extension_data
))
427 DBG1(DBG_TLS
, "invalid %N extension",
428 tls_extension_names
, extension_type
);
429 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
430 extensions
->destroy(extensions
);
431 extension
->destroy(extension
);
434 chunk_free(&this->hashsig
);
435 this->hashsig
= chunk_clone(extension_data
);
437 case TLS_EXT_SUPPORTED_GROUPS
:
438 if (!extension
->read_data16(extension
, &extension_data
))
440 DBG1(DBG_TLS
, "invalid %N extension",
441 tls_extension_names
, extension_type
);
442 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
443 extensions
->destroy(extensions
);
444 extension
->destroy(extension
);
447 chunk_free(&this->curves
);
448 this->curves_received
= TRUE
;
449 this->curves
= chunk_clone(extension_data
);
451 case TLS_EXT_SUPPORTED_VERSIONS
:
452 if (!extension
->read_data8(extension
, &versions
))
454 DBG1(DBG_TLS
, "invalid %N extension",
455 tls_extension_names
, extension_type
);
456 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
457 extensions
->destroy(extensions
);
458 extension
->destroy(extension
);
462 case TLS_EXT_KEY_SHARE
:
463 if (!extension
->read_data16(extension
, &key_shares
))
465 DBG1(DBG_TLS
, "invalid %N extension",
466 tls_extension_names
, extension_type
);
467 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
468 extensions
->destroy(extensions
);
469 extension
->destroy(extension
);
476 extension
->destroy(extension
);
478 extensions
->destroy(extensions
);
480 if (this->tls
->get_version_max(this->tls
) >= TLS_1_3
&& !this->hashsig
.len
)
482 DBG1(DBG_TLS
, "no %N extension received", tls_extension_names
,
483 TLS_MISSING_EXTENSION
);
484 this->alert
->add(this->alert
, TLS_FATAL
, TLS_MISSING_EXTENSION
);
488 memcpy(this->client_random
, random
.ptr
, sizeof(this->client_random
));
490 htoun32(&this->server_random
, time(NULL
));
491 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_WEAK
);
493 !rng
->get_bytes(rng
, sizeof(this->server_random
) - 4,
494 this->server_random
+ 4))
496 DBG1(DBG_TLS
, "failed to generate server random");
497 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
505 bio_reader_t
*client_versions
;
507 client_versions
= bio_reader_create(versions
);
508 while (client_versions
->remaining(client_versions
))
510 if (client_versions
->read_uint16(client_versions
, &version
))
512 if (this->tls
->set_version(this->tls
, version
, version
))
514 this->client_version
= version
;
519 client_versions
->destroy(client_versions
);
523 version
= legacy_version
;
524 if (this->tls
->set_version(this->tls
, version
, version
))
526 this->client_version
= version
;
529 if (!this->client_version
)
531 DBG1(DBG_TLS
, "proposed version %N not supported", tls_version_names
,
533 this->alert
->add(this->alert
, TLS_FATAL
, TLS_PROTOCOL_VERSION
);
537 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
539 this->suite
= this->crypto
->resume_session(this->crypto
, session
,
541 chunk_from_thing(this->client_random
),
542 chunk_from_thing(this->server_random
));
547 this->session
= chunk_clone(session
);
549 DBG1(DBG_TLS
, "resumed %N using suite %N",
550 tls_version_names
, this->tls
->get_version_max(this->tls
),
551 tls_cipher_suite_names
, this->suite
);
555 count
= ciphers
.len
/ sizeof(uint16_t);
556 suites
= alloca(count
* sizeof(tls_cipher_suite_t
));
557 DBG2(DBG_TLS
, "received %d TLS cipher suites:", count
);
558 for (i
= 0; i
< count
; i
++)
560 suites
[i
] = untoh16(&ciphers
.ptr
[i
* sizeof(uint16_t)]);
561 DBG2(DBG_TLS
, " %N", tls_cipher_suite_names
, suites
[i
]);
563 if (!select_suite_and_key(this, suites
, count
))
565 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
568 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
570 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_STRONG
);
572 !rng
->allocate_bytes(rng
, SESSION_ID_SIZE
, &this->session
))
574 DBG1(DBG_TLS
, "generating TLS session identifier failed, skipped");
580 this->session
= chunk_clone(session
);
582 DBG1(DBG_TLS
, "negotiated %N using suite %N",
583 tls_version_names
, this->tls
->get_version_max(this->tls
),
584 tls_cipher_suite_names
, this->suite
);
587 if (this->tls
->get_version_max(this->tls
) >= TLS_1_3
)
589 diffie_hellman_group_t group
;
590 tls_named_group_t curve
, requesting_curve
= 0;
591 enumerator_t
*enumerator
;
592 chunk_t shared_secret
= chunk_empty
;
593 array_t
*peer_key_shares
;
595 peer_key_shares
= array_create(sizeof(key_share_t
), 1);
596 extension
= bio_reader_create(key_shares
);
597 while (extension
->remaining(extension
))
599 if (!extension
->read_uint16(extension
, &peer
.curve
) ||
600 !extension
->read_data16(extension
, &peer
.key_share
) ||
603 DBG1(DBG_TLS
, "invalid %N extension",
604 tls_extension_names
, extension_type
);
605 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
606 extension
->destroy(extension
);
607 array_destroy(peer_key_shares
);
610 array_insert(peer_key_shares
, ARRAY_TAIL
, &peer
);
612 extension
->destroy(extension
);
614 enumerator
= this->crypto
->create_ec_enumerator(this->crypto
);
615 while (enumerator
->enumerate(enumerator
, &group
, &curve
))
617 if (!requesting_curve
&&
618 peer_supports_curve(this, curve
) &&
619 !peer_offered_curve(peer_key_shares
, curve
, NULL
))
621 requesting_curve
= curve
;
623 if (peer_supports_curve(this, curve
) &&
624 peer_offered_curve(peer_key_shares
, curve
, &peer
))
626 DBG1(DBG_TLS
, "using key exchange %N",
627 tls_named_group_names
, curve
);
628 this->dh
= lib
->crypto
->create_dh(lib
->crypto
, group
);
632 enumerator
->destroy(enumerator
);
633 array_destroy(peer_key_shares
);
639 DBG1(DBG_TLS
, "already replied with a hello retry request");
640 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
644 if (!requesting_curve
)
646 DBG1(DBG_TLS
, "no mutual supported group in client hello");
647 this->alert
->add(this->alert
, TLS_FATAL
, TLS_ILLEGAL_PARAMETER
);
650 this->requested_curve
= requesting_curve
;
652 if (!this->crypto
->hash_handshake(this->crypto
, NULL
))
654 DBG1(DBG_TLS
, "failed to hash handshake messages");
655 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
661 if (peer
.key_share
.len
&&
662 peer
.curve
!= TLS_CURVE25519
&&
663 peer
.curve
!= TLS_CURVE448
)
664 { /* classic format (see RFC 8446, section 4.2.8.2) */
665 if (peer
.key_share
.ptr
[0] != TLS_ANSI_UNCOMPRESSED
)
667 DBG1(DBG_TLS
, "DH point format '%N' not supported",
668 tls_ansi_point_format_names
, peer
.key_share
.ptr
[0]);
669 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
672 peer
.key_share
= chunk_skip(peer
.key_share
, 1);
674 if (!peer
.key_share
.len
||
675 !this->dh
->set_other_public_value(this->dh
, peer
.key_share
))
677 DBG1(DBG_TLS
, "DH key derivation failed");
678 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
679 chunk_clear(&shared_secret
);
682 chunk_clear(&shared_secret
);
683 this->requested_curve
= 0;
687 this->state
= STATE_HELLO_RECEIVED
;
692 * Process certificate
694 static status_t
process_certificate(private_tls_server_t
*this,
695 bio_reader_t
*reader
)
702 this->crypto
->append_handshake(this->crypto
,
703 TLS_CERTIFICATE
, reader
->peek(reader
));
705 if (this->tls
->get_version_max(this->tls
) > TLS_1_2
)
707 if (!reader
->read_data8(reader
, &data
))
709 DBG1(DBG_TLS
, "certificate request context invalid");
710 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
715 if (!reader
->read_data24(reader
, &data
))
717 DBG1(DBG_TLS
, "certificate message header invalid");
718 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
721 certs
= bio_reader_create(data
);
722 if (!certs
->remaining(certs
))
724 DBG1(DBG_TLS
, "no certificate sent by peer");
725 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
728 while (certs
->remaining(certs
))
730 if (!certs
->read_data24(certs
, &data
))
732 DBG1(DBG_TLS
, "certificate message invalid");
733 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
734 certs
->destroy(certs
);
737 cert
= lib
->creds
->create(lib
->creds
, CRED_CERTIFICATE
, CERT_X509
,
738 BUILD_BLOB_ASN1_DER
, data
, BUILD_END
);
743 this->peer_auth
->add(this->peer_auth
,
744 AUTH_HELPER_SUBJECT_CERT
, cert
);
745 DBG1(DBG_TLS
, "received TLS peer certificate '%Y'",
746 cert
->get_subject(cert
));
751 DBG1(DBG_TLS
, "received TLS intermediate certificate '%Y'",
752 cert
->get_subject(cert
));
753 this->peer_auth
->add(this->peer_auth
, AUTH_HELPER_IM_CERT
, cert
);
758 DBG1(DBG_TLS
, "parsing TLS certificate failed, skipped");
759 this->alert
->add(this->alert
, TLS_WARNING
, TLS_BAD_CERTIFICATE
);
761 if (this->tls
->get_version_max(this->tls
) > TLS_1_2
)
763 if (!certs
->read_data16(certs
, &data
))
765 DBG1(DBG_TLS
, "failed to read extensions of CertificateEntry");
766 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
771 certs
->destroy(certs
);
772 this->state
= STATE_CERT_RECEIVED
;
777 * Process Client Key Exchange, using premaster encryption
779 static status_t
process_key_exchange_encrypted(private_tls_server_t
*this,
780 bio_reader_t
*reader
)
782 chunk_t encrypted
, decrypted
;
786 this->crypto
->append_handshake(this->crypto
,
787 TLS_CLIENT_KEY_EXCHANGE
, reader
->peek(reader
));
789 if (!reader
->read_data16(reader
, &encrypted
))
791 DBG1(DBG_TLS
, "received invalid Client Key Exchange");
792 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
796 htoun16(premaster
, this->client_version
);
797 /* pre-randomize premaster for failure cases */
798 rng
= lib
->crypto
->create_rng(lib
->crypto
, RNG_WEAK
);
799 if (!rng
|| !rng
->get_bytes(rng
, sizeof(premaster
) - 2, premaster
+ 2))
801 DBG1(DBG_TLS
, "failed to generate premaster secret");
802 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
809 this->private->decrypt(this->private,
810 ENCRYPT_RSA_PKCS1
, encrypted
, &decrypted
))
812 if (decrypted
.len
== sizeof(premaster
) &&
813 untoh16(decrypted
.ptr
) == this->client_version
)
815 memcpy(premaster
+ 2, decrypted
.ptr
+ 2, sizeof(premaster
) - 2);
819 DBG1(DBG_TLS
, "decrypted premaster has invalid length/version");
821 chunk_clear(&decrypted
);
825 DBG1(DBG_TLS
, "decrypting Client Key Exchange failed");
828 if (!this->crypto
->derive_secrets(this->crypto
, chunk_from_thing(premaster
),
829 this->session
, this->peer
,
830 chunk_from_thing(this->client_random
),
831 chunk_from_thing(this->server_random
)))
833 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
837 this->state
= STATE_KEY_EXCHANGE_RECEIVED
;
842 * Process client key exchange, using DHE exchange
844 static status_t
process_key_exchange_dhe(private_tls_server_t
*this,
845 bio_reader_t
*reader
)
847 chunk_t premaster
, pub
;
850 this->crypto
->append_handshake(this->crypto
,
851 TLS_CLIENT_KEY_EXCHANGE
, reader
->peek(reader
));
853 ec
= diffie_hellman_group_is_ec(this->dh
->get_dh_group(this->dh
));
854 if ((ec
&& !reader
->read_data8(reader
, &pub
)) ||
855 (!ec
&& (!reader
->read_data16(reader
, &pub
) || pub
.len
== 0)))
857 DBG1(DBG_TLS
, "received invalid Client Key Exchange");
858 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
864 if (pub
.ptr
[0] != TLS_ANSI_UNCOMPRESSED
)
866 DBG1(DBG_TLS
, "DH point format '%N' not supported",
867 tls_ansi_point_format_names
, pub
.ptr
[0]);
868 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
871 pub
= chunk_skip(pub
, 1);
873 if (!this->dh
->set_other_public_value(this->dh
, pub
))
875 DBG1(DBG_TLS
, "applying DH public value failed");
876 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
879 if (!this->dh
->get_shared_secret(this->dh
, &premaster
))
881 DBG1(DBG_TLS
, "calculating premaster from DH failed");
882 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
886 if (!this->crypto
->derive_secrets(this->crypto
, premaster
,
887 this->session
, this->peer
,
888 chunk_from_thing(this->client_random
),
889 chunk_from_thing(this->server_random
)))
891 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
892 chunk_clear(&premaster
);
895 chunk_clear(&premaster
);
897 this->state
= STATE_KEY_EXCHANGE_RECEIVED
;
902 * Process Client Key Exchange
904 static status_t
process_key_exchange(private_tls_server_t
*this,
905 bio_reader_t
*reader
)
909 return process_key_exchange_dhe(this, reader
);
911 return process_key_exchange_encrypted(this, reader
);
915 * Process Certificate verify
917 static status_t
process_cert_verify(private_tls_server_t
*this,
918 bio_reader_t
*reader
)
920 public_key_t
*public;
923 public = tls_find_public_key(this->peer_auth
);
926 DBG1(DBG_TLS
, "no trusted certificate found for '%Y' to verify TLS peer",
928 this->alert
->add(this->alert
, TLS_FATAL
, TLS_CERTIFICATE_UNKNOWN
);
932 msg
= reader
->peek(reader
);
933 if (!this->crypto
->verify_handshake(this->crypto
, public, reader
))
935 public->destroy(public);
936 DBG1(DBG_TLS
, "signature verification failed");
937 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECRYPT_ERROR
);
940 public->destroy(public);
941 this->state
= STATE_CERT_VERIFY_RECEIVED
;
942 this->crypto
->append_handshake(this->crypto
, TLS_CERTIFICATE_VERIFY
, msg
);
947 * Process finished message
949 static status_t
process_finished(private_tls_server_t
*this,
950 bio_reader_t
*reader
)
952 chunk_t received
, verify_data
;
955 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
957 if (!reader
->read_data(reader
, sizeof(buf
), &received
))
959 DBG1(DBG_TLS
, "received client finished too short");
960 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
963 if (!this->crypto
->calculate_finished_legacy(this->crypto
,
964 "client finished", buf
))
966 DBG1(DBG_TLS
, "calculating client finished failed");
967 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
970 verify_data
= chunk_from_thing(buf
);
974 received
= reader
->peek(reader
);
975 if (!this->crypto
->calculate_finished(this->crypto
, FALSE
, &verify_data
))
977 DBG1(DBG_TLS
, "calculating client finished failed");
978 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
981 this->crypto
->change_cipher(this->crypto
, TRUE
);
984 if (!chunk_equals_const(received
, verify_data
))
986 DBG1(DBG_TLS
, "received client finished invalid");
987 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECRYPT_ERROR
);
991 if (verify_data
.ptr
!= buf
)
993 chunk_free(&verify_data
);
996 this->crypto
->append_handshake(this->crypto
, TLS_FINISHED
, received
);
997 this->state
= STATE_FINISHED_RECEIVED
;
1002 * Process KeyUpdate message
1004 static status_t
process_key_update(private_tls_server_t
*this,
1005 bio_reader_t
*reader
)
1007 uint8_t update_requested
;
1009 if (!reader
->read_uint8(reader
, &update_requested
) ||
1010 update_requested
> 1)
1012 DBG1(DBG_TLS
, "received invalid KeyUpdate");
1013 this->alert
->add(this->alert
, TLS_FATAL
, TLS_DECODE_ERROR
);
1017 if (!this->crypto
->update_app_keys(this->crypto
, TRUE
))
1019 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1022 this->crypto
->change_cipher(this->crypto
, TRUE
);
1024 if (update_requested
)
1026 DBG1(DBG_TLS
, "client requested KeyUpdate");
1027 this->state
= STATE_KEY_UPDATE_REQUESTED
;
1032 METHOD(tls_handshake_t
, process
, status_t
,
1033 private_tls_server_t
*this, tls_handshake_type_t type
, bio_reader_t
*reader
)
1035 tls_handshake_type_t expected
;
1037 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1039 switch (this->state
)
1042 if (type
== TLS_CLIENT_HELLO
)
1044 return process_client_hello(this, reader
);
1046 expected
= TLS_CLIENT_HELLO
;
1048 case STATE_HELLO_DONE
:
1049 if (type
== TLS_CERTIFICATE
)
1051 return process_certificate(this, reader
);
1055 expected
= TLS_CERTIFICATE
;
1058 /* otherwise fall through to next state */
1059 case STATE_CERT_RECEIVED
:
1060 if (type
== TLS_CLIENT_KEY_EXCHANGE
)
1062 return process_key_exchange(this, reader
);
1064 expected
= TLS_CLIENT_KEY_EXCHANGE
;
1066 case STATE_KEY_EXCHANGE_RECEIVED
:
1067 if (type
== TLS_CERTIFICATE_VERIFY
)
1069 return process_cert_verify(this, reader
);
1073 expected
= TLS_CERTIFICATE_VERIFY
;
1076 return INVALID_STATE
;
1077 case STATE_CIPHERSPEC_CHANGED_IN
:
1078 if (type
== TLS_FINISHED
)
1080 return process_finished(this, reader
);
1082 expected
= TLS_FINISHED
;
1085 DBG1(DBG_TLS
, "TLS %N not expected in current state",
1086 tls_handshake_type_names
, type
);
1087 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
1093 switch (this->state
)
1096 if (type
== TLS_CLIENT_HELLO
)
1098 return process_client_hello(this, reader
);
1100 expected
= TLS_CLIENT_HELLO
;
1102 case STATE_CIPHERSPEC_CHANGED_IN
:
1103 case STATE_FINISHED_SENT
:
1104 case STATE_FINISHED_SENT_KEY_SWITCHED
:
1105 if (type
== TLS_CERTIFICATE
)
1107 return process_certificate(this, reader
);
1111 expected
= TLS_CERTIFICATE
;
1114 /* otherwise fall through to next state */
1115 case STATE_CERT_RECEIVED
:
1116 if (type
== TLS_CERTIFICATE_VERIFY
)
1118 return process_cert_verify(this, reader
);
1122 expected
= TLS_CERTIFICATE_VERIFY
;
1125 /* otherwise fall through to next state */
1126 case STATE_CERT_VERIFY_RECEIVED
:
1127 if (type
== TLS_FINISHED
)
1129 return process_finished(this, reader
);
1132 case STATE_FINISHED_RECEIVED
:
1133 if (type
== TLS_KEY_UPDATE
)
1135 return process_key_update(this, reader
);
1137 return INVALID_STATE
;
1139 DBG1(DBG_TLS
, "TLS %N not expected in current state",
1140 tls_handshake_type_names
, type
);
1141 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
1145 DBG1(DBG_TLS
, "TLS %N expected, but received %N",
1146 tls_handshake_type_names
, expected
, tls_handshake_type_names
, type
);
1147 this->alert
->add(this->alert
, TLS_FATAL
, TLS_UNEXPECTED_MESSAGE
);
1152 * Write public key into key share extension
1154 bool tls_write_key_share(bio_writer_t
**key_share
, diffie_hellman_t
*dh
)
1156 bio_writer_t
*writer
;
1157 tls_named_group_t curve
;
1164 curve
= tls_ec_group_to_curve(dh
->get_dh_group(dh
));
1165 if (!curve
|| !dh
->get_my_public_value(dh
, &pub
))
1169 *key_share
= writer
= bio_writer_create(pub
.len
+ 7);
1170 writer
->write_uint16(writer
, curve
);
1171 if (curve
== TLS_CURVE25519
||
1172 curve
== TLS_CURVE448
)
1174 writer
->write_data16(writer
, pub
);
1177 { /* classic format (see RFC 8446, section 4.2.8.2) */
1178 writer
->write_uint16(writer
, pub
.len
+ 1);
1179 writer
->write_uint8(writer
, TLS_ANSI_UNCOMPRESSED
);
1180 writer
->write_data(writer
, pub
);
1187 * Send ServerHello message
1189 static status_t
send_server_hello(private_tls_server_t
*this,
1190 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1192 bio_writer_t
*key_share
, *extensions
;
1193 tls_version_t version
;
1195 version
= this->tls
->get_version_max(this->tls
);
1197 /* cap legacy version at TLS 1.2 for middlebox compatibility */
1198 writer
->write_uint16(writer
, min(TLS_1_2
, version
));
1200 if (this->requested_curve
)
1202 writer
->write_data(writer
, tls_hello_retry_request_magic
);
1206 writer
->write_data(writer
, chunk_from_thing(this->server_random
));
1209 /* session identifier if we have one */
1210 writer
->write_data8(writer
, this->session
);
1212 /* add selected TLS cipher suite */
1213 writer
->write_uint16(writer
, this->suite
);
1215 /* NULL compression only */
1216 writer
->write_uint8(writer
, 0);
1218 if (version
>= TLS_1_3
)
1220 extensions
= bio_writer_create(32);
1222 DBG2(DBG_TLS
, "sending extension: %N",
1223 tls_extension_names
, TLS_EXT_SUPPORTED_VERSIONS
);
1224 extensions
->write_uint16(extensions
, TLS_EXT_SUPPORTED_VERSIONS
);
1225 extensions
->write_uint16(extensions
, 2);
1226 extensions
->write_uint16(extensions
, version
);
1228 DBG2(DBG_TLS
, "sending extension: %N",
1229 tls_extension_names
, TLS_EXT_KEY_SHARE
);
1230 extensions
->write_uint16(extensions
, TLS_EXT_KEY_SHARE
);
1231 if (this->requested_curve
)
1233 DBG1(DBG_TLS
, "requesting key exchange with %N",
1234 tls_named_group_names
, this->requested_curve
);
1235 extensions
->write_uint16(extensions
, 2);
1236 extensions
->write_uint16(extensions
, this->requested_curve
);
1240 if (!tls_write_key_share(&key_share
, this->dh
))
1242 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1243 extensions
->destroy(extensions
);
1246 extensions
->write_data16(extensions
, key_share
->get_buf(key_share
));
1247 key_share
->destroy(key_share
);
1250 writer
->write_data16(writer
, extensions
->get_buf(extensions
));
1251 extensions
->destroy(extensions
);
1254 *type
= TLS_SERVER_HELLO
;
1255 this->state
= this->requested_curve ? STATE_INIT
: STATE_HELLO_SENT
;
1256 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1261 * Send encrypted extensions message
1263 static status_t
send_encrypted_extensions(private_tls_server_t
*this,
1264 tls_handshake_type_t
*type
,
1265 bio_writer_t
*writer
)
1267 chunk_t shared_secret
= chunk_empty
;
1269 if (!this->dh
->get_shared_secret(this->dh
, &shared_secret
) ||
1270 !this->crypto
->derive_handshake_keys(this->crypto
, shared_secret
))
1272 DBG1(DBG_TLS
, "DH key derivation failed");
1273 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
1274 chunk_clear(&shared_secret
);
1277 chunk_clear(&shared_secret
);
1279 this->crypto
->change_cipher(this->crypto
, TRUE
);
1280 this->crypto
->change_cipher(this->crypto
, FALSE
);
1282 /* currently no extensions are supported */
1283 writer
->write_uint16(writer
, 0);
1285 *type
= TLS_ENCRYPTED_EXTENSIONS
;
1286 this->state
= STATE_ENCRYPTED_EXTENSIONS_SENT
;
1287 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1294 static status_t
send_certificate(private_tls_server_t
*this,
1295 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1297 enumerator_t
*enumerator
;
1298 certificate_t
*cert
;
1300 bio_writer_t
*certs
;
1303 /* certificate request context as described in RFC 8446, section 4.4.2 */
1304 if (this->tls
->get_version_max(this->tls
) > TLS_1_2
)
1306 writer
->write_uint8(writer
, 0);
1309 /* generate certificate payload */
1310 certs
= bio_writer_create(256);
1311 cert
= this->server_auth
->get(this->server_auth
, AUTH_RULE_SUBJECT_CERT
);
1314 if (cert
->get_encoding(cert
, CERT_ASN1_DER
, &data
))
1316 DBG1(DBG_TLS
, "sending TLS server certificate '%Y'",
1317 cert
->get_subject(cert
));
1318 certs
->write_data24(certs
, data
);
1321 /* extensions see RFC 8446, section 4.4.2 */
1322 if (this->tls
->get_version_max(this->tls
) > TLS_1_2
)
1324 certs
->write_uint16(certs
, 0);
1327 enumerator
= this->server_auth
->create_enumerator(this->server_auth
);
1328 while (enumerator
->enumerate(enumerator
, &rule
, &cert
))
1330 if (rule
== AUTH_RULE_IM_CERT
)
1332 if (cert
->get_encoding(cert
, CERT_ASN1_DER
, &data
))
1334 DBG1(DBG_TLS
, "sending TLS intermediate certificate '%Y'",
1335 cert
->get_subject(cert
));
1336 certs
->write_data24(certs
, data
);
1341 enumerator
->destroy(enumerator
);
1343 writer
->write_data24(writer
, certs
->get_buf(certs
));
1344 certs
->destroy(certs
);
1346 *type
= TLS_CERTIFICATE
;
1347 this->state
= STATE_CERT_SENT
;
1348 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1353 * Send Certificate Verify
1355 static status_t
send_certificate_verify(private_tls_server_t
*this,
1356 tls_handshake_type_t
*type
,
1357 bio_writer_t
*writer
)
1359 if (!this->crypto
->sign_handshake(this->crypto
, this->private, writer
,
1362 DBG1(DBG_TLS
, "signature generation failed");
1363 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1367 *type
= TLS_CERTIFICATE_VERIFY
;
1368 this->state
= STATE_CERT_VERIFY_SENT
;
1369 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1374 * Write all available certificate authorities to output writer
1376 static void write_certificate_authorities(bio_writer_t
*writer
)
1378 bio_writer_t
*authorities
;
1379 enumerator_t
*enumerator
;
1380 certificate_t
*cert
;
1382 identification_t
*id
;
1384 authorities
= bio_writer_create(64);
1385 enumerator
= lib
->credmgr
->create_cert_enumerator(lib
->credmgr
, CERT_X509
,
1386 KEY_RSA
, NULL
, TRUE
);
1387 while (enumerator
->enumerate(enumerator
, &cert
))
1389 x509
= (x509_t
*)cert
;
1390 if (x509
->get_flags(x509
) & X509_CA
)
1392 id
= cert
->get_subject(cert
);
1393 DBG1(DBG_TLS
, "sending TLS cert request for '%Y'", id
);
1394 authorities
->write_data16(authorities
, id
->get_encoding(id
));
1397 enumerator
->destroy(enumerator
);
1398 writer
->write_data16(writer
, authorities
->get_buf(authorities
));
1399 authorities
->destroy(authorities
);
1403 * Send Certificate Request
1405 static status_t
send_certificate_request(private_tls_server_t
*this,
1406 tls_handshake_type_t
*type
,
1407 bio_writer_t
*writer
)
1409 bio_writer_t
*authorities
, *supported
, *extensions
;
1411 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1413 supported
= bio_writer_create(4);
1414 /* we propose both RSA and ECDSA */
1415 supported
->write_uint8(supported
, TLS_RSA_SIGN
);
1416 supported
->write_uint8(supported
, TLS_ECDSA_SIGN
);
1417 writer
->write_data8(writer
, supported
->get_buf(supported
));
1418 supported
->destroy(supported
);
1419 if (this->tls
->get_version_max(this->tls
) >= TLS_1_2
)
1421 this->crypto
->get_signature_algorithms(this->crypto
, writer
, TRUE
);
1424 write_certificate_authorities(writer
);
1428 /* certificate request context as described in RFC 8446, section 4.3.2 */
1429 writer
->write_uint8(writer
, 0);
1431 extensions
= bio_writer_create(32);
1432 DBG2(DBG_TLS
, "sending extension: %N",
1433 tls_extension_names
, TLS_EXT_CERTIFICATE_AUTHORITIES
);
1434 authorities
= bio_writer_create(64);
1435 write_certificate_authorities(authorities
);
1436 extensions
->write_uint16(extensions
, TLS_EXT_CERTIFICATE_AUTHORITIES
);
1437 extensions
->write_data16(extensions
, authorities
->get_buf(authorities
));
1438 authorities
->destroy(authorities
);
1440 DBG2(DBG_TLS
, "sending extension: %N",
1441 tls_extension_names
, TLS_EXT_SIGNATURE_ALGORITHMS
);
1442 extensions
->write_uint16(extensions
, TLS_EXT_SIGNATURE_ALGORITHMS
);
1443 supported
= bio_writer_create(32);
1444 this->crypto
->get_signature_algorithms(this->crypto
, supported
, TRUE
);
1445 extensions
->write_data16(extensions
, supported
->get_buf(supported
));
1446 supported
->destroy(supported
);
1447 writer
->write_data16(writer
, extensions
->get_buf(extensions
));
1448 extensions
->destroy(extensions
);
1451 *type
= TLS_CERTIFICATE_REQUEST
;
1452 this->state
= STATE_CERTREQ_SENT
;
1453 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1458 * Try to find a curve supported by both, client and server
1460 static bool find_supported_curve(private_tls_server_t
*this,
1461 tls_named_group_t
*curve
)
1463 tls_named_group_t current
;
1464 enumerator_t
*enumerator
;
1466 enumerator
= this->crypto
->create_ec_enumerator(this->crypto
);
1467 while (enumerator
->enumerate(enumerator
, NULL
, ¤t
))
1469 if (peer_supports_curve(this, current
))
1472 enumerator
->destroy(enumerator
);
1476 enumerator
->destroy(enumerator
);
1481 * Send Server key Exchange
1483 static status_t
send_server_key_exchange(private_tls_server_t
*this,
1484 tls_handshake_type_t
*type
, bio_writer_t
*writer
,
1485 diffie_hellman_group_t group
)
1487 diffie_hellman_params_t
*params
= NULL
;
1488 tls_named_group_t curve
;
1491 if (diffie_hellman_group_is_ec(group
))
1493 curve
= tls_ec_group_to_curve(group
);
1494 if (!curve
|| (!peer_supports_curve(this, curve
) &&
1495 !find_supported_curve(this, &curve
)))
1497 DBG1(DBG_TLS
, "no EC group supported by client and server");
1498 this->alert
->add(this->alert
, TLS_FATAL
, TLS_HANDSHAKE_FAILURE
);
1501 DBG2(DBG_TLS
, "selected ECDH group %N", tls_named_group_names
, curve
);
1502 writer
->write_uint8(writer
, TLS_ECC_NAMED_CURVE
);
1503 writer
->write_uint16(writer
, curve
);
1507 params
= diffie_hellman_get_params(group
);
1510 DBG1(DBG_TLS
, "no parameters found for DH group %N",
1511 diffie_hellman_group_names
, group
);
1512 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1515 DBG2(DBG_TLS
, "selected DH group %N", diffie_hellman_group_names
, group
);
1516 writer
->write_data16(writer
, params
->prime
);
1517 writer
->write_data16(writer
, params
->generator
);
1519 this->dh
= lib
->crypto
->create_dh(lib
->crypto
, group
);
1522 DBG1(DBG_TLS
, "DH group %N not supported",
1523 diffie_hellman_group_names
, group
);
1524 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1527 if (!this->dh
->get_my_public_value(this->dh
, &chunk
))
1529 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1534 writer
->write_data16(writer
, chunk
);
1537 { /* ECP uses 8bit length header only, but a point format */
1538 writer
->write_uint8(writer
, chunk
.len
+ 1);
1539 writer
->write_uint8(writer
, TLS_ANSI_UNCOMPRESSED
);
1540 writer
->write_data(writer
, chunk
);
1544 chunk
= chunk_cat("ccc", chunk_from_thing(this->client_random
),
1545 chunk_from_thing(this->server_random
), writer
->get_buf(writer
));
1546 if (!this->private || !this->crypto
->sign(this->crypto
, this->private,
1547 writer
, chunk
, this->hashsig
))
1549 DBG1(DBG_TLS
, "signing DH parameters failed");
1550 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1555 *type
= TLS_SERVER_KEY_EXCHANGE
;
1556 this->state
= STATE_KEY_EXCHANGE_SENT
;
1557 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1564 static status_t
send_hello_done(private_tls_server_t
*this,
1565 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1567 *type
= TLS_SERVER_HELLO_DONE
;
1568 this->state
= STATE_HELLO_DONE
;
1569 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1576 static status_t
send_finished(private_tls_server_t
*this,
1577 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1579 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1583 if (!this->crypto
->calculate_finished_legacy(this->crypto
,
1584 "server finished", buf
))
1586 DBG1(DBG_TLS
, "calculating server finished data failed");
1587 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1591 writer
->write_data(writer
, chunk_from_thing(buf
));
1595 chunk_t verify_data
;
1597 if (!this->crypto
->calculate_finished(this->crypto
, TRUE
, &verify_data
))
1599 DBG1(DBG_TLS
, "calculating server finished data failed");
1600 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1604 writer
->write_data(writer
, verify_data
);
1605 chunk_free(&verify_data
);
1608 *type
= TLS_FINISHED
;
1609 this->state
= STATE_FINISHED_SENT
;
1610 this->crypto
->append_handshake(this->crypto
, *type
, writer
->get_buf(writer
));
1616 * Send KeyUpdate message
1618 static status_t
send_key_update(private_tls_server_t
*this,
1619 tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1621 *type
= TLS_KEY_UPDATE
;
1623 /* we currently only send this as reply, so we never request an update */
1624 writer
->write_uint8(writer
, 0);
1626 this->state
= STATE_KEY_UPDATE_SENT
;
1630 METHOD(tls_handshake_t
, build
, status_t
,
1631 private_tls_server_t
*this, tls_handshake_type_t
*type
, bio_writer_t
*writer
)
1633 diffie_hellman_group_t group
;
1635 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1637 switch (this->state
)
1639 case STATE_HELLO_RECEIVED
:
1640 return send_server_hello(this, type
, writer
);
1641 case STATE_HELLO_SENT
:
1642 return send_certificate(this, type
, writer
);
1643 case STATE_CERT_SENT
:
1644 group
= this->crypto
->get_dh_group(this->crypto
);
1647 return send_server_key_exchange(this, type
, writer
, group
);
1649 /* otherwise fall through to next state */
1650 case STATE_KEY_EXCHANGE_SENT
:
1653 return send_certificate_request(this, type
, writer
);
1655 /* otherwise fall through to next state */
1656 case STATE_CERTREQ_SENT
:
1657 return send_hello_done(this, type
, writer
);
1658 case STATE_CIPHERSPEC_CHANGED_OUT
:
1659 return send_finished(this, type
, writer
);
1660 case STATE_FINISHED_SENT
:
1661 return INVALID_STATE
;
1663 return INVALID_STATE
;
1668 switch (this->state
)
1670 case STATE_HELLO_RECEIVED
:
1671 return send_server_hello(this, type
, writer
);
1672 case STATE_HELLO_SENT
:
1673 case STATE_CIPHERSPEC_CHANGED_OUT
:
1674 return send_encrypted_extensions(this, type
, writer
);
1675 case STATE_ENCRYPTED_EXTENSIONS_SENT
:
1678 return send_certificate_request(this, type
, writer
);
1680 /* otherwise fall through to next state */
1681 case STATE_CERTREQ_SENT
:
1682 return send_certificate(this, type
, writer
);
1683 case STATE_CERT_SENT
:
1684 return send_certificate_verify(this, type
, writer
);
1685 case STATE_CERT_VERIFY_SENT
:
1686 return send_finished(this, type
, writer
);
1687 case STATE_FINISHED_SENT
:
1688 if (!this->crypto
->derive_app_keys(this->crypto
))
1690 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1693 /* inbound key switches after process client finished message */
1694 this->crypto
->change_cipher(this->crypto
, FALSE
);
1695 this->state
= STATE_FINISHED_SENT_KEY_SWITCHED
;
1696 return INVALID_STATE
;
1697 case STATE_KEY_UPDATE_REQUESTED
:
1698 return send_key_update(this, type
, writer
);
1699 case STATE_KEY_UPDATE_SENT
:
1700 if (!this->crypto
->update_app_keys(this->crypto
, FALSE
))
1702 this->alert
->add(this->alert
, TLS_FATAL
, TLS_INTERNAL_ERROR
);
1705 this->crypto
->change_cipher(this->crypto
, FALSE
);
1706 this->state
= STATE_FINISHED_RECEIVED
;
1708 return INVALID_STATE
;
1713 METHOD(tls_handshake_t
, cipherspec_changed
, bool,
1714 private_tls_server_t
*this, bool inbound
)
1716 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1722 return this->state
== STATE_FINISHED_SENT
;
1726 return this->state
== STATE_CERT_VERIFY_RECEIVED
;
1728 return this->state
== STATE_KEY_EXCHANGE_RECEIVED
;
1734 return this->state
== STATE_HELLO_SENT
;
1736 return this->state
== STATE_FINISHED_RECEIVED
;
1743 { /* accept ChangeCipherSpec after ServerFinish or HelloRetryRequest */
1744 return this->state
== STATE_FINISHED_SENT
||
1745 this->state
== STATE_FINISHED_SENT_KEY_SWITCHED
||
1750 return this->state
== STATE_HELLO_SENT
;
1755 METHOD(tls_handshake_t
, change_cipherspec
, void,
1756 private_tls_server_t
*this, bool inbound
)
1758 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1760 this->crypto
->change_cipher(this->crypto
, inbound
);
1764 { /* client might send a ChangeCipherSpec after a HelloRetryRequest and
1765 * before a new ClientHello which should not cause any state changes */
1771 this->state
= STATE_CIPHERSPEC_CHANGED_IN
;
1775 this->state
= STATE_CIPHERSPEC_CHANGED_OUT
;
1779 METHOD(tls_handshake_t
, finished
, bool,
1780 private_tls_server_t
*this)
1782 if (this->tls
->get_version_max(this->tls
) < TLS_1_3
)
1786 return this->state
== STATE_FINISHED_RECEIVED
;
1788 return this->state
== STATE_FINISHED_SENT
;
1792 return this->state
== STATE_FINISHED_RECEIVED
;
1796 METHOD(tls_handshake_t
, get_peer_id
, identification_t
*,
1797 private_tls_server_t
*this)
1802 METHOD(tls_handshake_t
, get_server_id
, identification_t
*,
1803 private_tls_server_t
*this)
1805 return this->server
;
1808 METHOD(tls_handshake_t
, get_auth
, auth_cfg_t
*,
1809 private_tls_server_t
*this)
1811 return this->peer_auth
;
1814 METHOD(tls_handshake_t
, destroy
, void,
1815 private_tls_server_t
*this)
1817 DESTROY_IF(this->private);
1818 DESTROY_IF(this->dh
);
1819 DESTROY_IF(this->peer
);
1820 this->server
->destroy(this->server
);
1821 this->peer_auth
->destroy(this->peer_auth
);
1822 this->server_auth
->destroy(this->server_auth
);
1823 free(this->hashsig
.ptr
);
1824 free(this->curves
.ptr
);
1825 free(this->session
.ptr
);
1832 tls_server_t
*tls_server_create(tls_t
*tls
,
1833 tls_crypto_t
*crypto
, tls_alert_t
*alert
,
1834 identification_t
*server
, identification_t
*peer
)
1836 private_tls_server_t
*this;
1841 .process
= _process
,
1843 .cipherspec_changed
= _cipherspec_changed
,
1844 .change_cipherspec
= _change_cipherspec
,
1845 .finished
= _finished
,
1846 .get_peer_id
= _get_peer_id
,
1847 .get_server_id
= _get_server_id
,
1848 .get_auth
= _get_auth
,
1849 .destroy
= _destroy
,
1855 .server
= server
->clone(server
),
1856 .peer
= peer ? peer
->clone(peer
) : NULL
,
1857 .state
= STATE_INIT
,
1858 .peer_auth
= auth_cfg_create(),
1859 .server_auth
= auth_cfg_create(),
1862 return &this->public;