From 4486d90d80d4fafc373f9444303714936555d5da Mon Sep 17 00:00:00 2001 From: Rene Meusel Date: Tue, 19 Sep 2023 08:53:17 +0200 Subject: [PATCH] FIX: review comments --- doc/api_ref/tls.rst | 2 ++ src/lib/tls/msg_client_hello.cpp | 2 +- src/lib/tls/tls13_pqc/hybrid_public_key.cpp | 7 +------ src/lib/tls/tls13_pqc/info.txt | 2 +- src/lib/tls/tls_algos.h | 4 ++++ 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/api_ref/tls.rst b/doc/api_ref/tls.rst index be3072a4f07..f0cebc59b60 100644 --- a/doc/api_ref/tls.rst +++ b/doc/api_ref/tls.rst @@ -1003,6 +1003,8 @@ The ``TLS::Protocol_Version`` class represents a specific version: Post-quantum-secure key exchange -------------------------------- +.. versionadded:: :: 3.2 + Botan allows TLS 1.3 handshakes using both pure post-quantum secure algorithms or a hybrid key exchange that combines a classical and a post-quantum secure algorithm. For the latter it implements the recent IETF diff --git a/src/lib/tls/msg_client_hello.cpp b/src/lib/tls/msg_client_hello.cpp index a86955c8b97..aa9d22a6cd7 100644 --- a/src/lib/tls/msg_client_hello.cpp +++ b/src/lib/tls/msg_client_hello.cpp @@ -423,7 +423,7 @@ void Client_Hello_12::add_tls12_supported_groups_extensions(const Policy& policy const std::vector kex_groups = policy.key_exchange_groups(); std::vector compatible_kex_groups; std::copy_if(kex_groups.begin(), kex_groups.end(), std::back_inserter(compatible_kex_groups), [](const auto group) { - return is_ecdh(group) || is_dh(group) || is_x25519(group); + return !is_post_quantum(group); }); auto supported_groups = std::make_unique(std::move(compatible_kex_groups)); diff --git a/src/lib/tls/tls13_pqc/hybrid_public_key.cpp b/src/lib/tls/tls13_pqc/hybrid_public_key.cpp index 6550e09c41d..d6fc9f4a1d4 100644 --- a/src/lib/tls/tls13_pqc/hybrid_public_key.cpp +++ b/src/lib/tls/tls13_pqc/hybrid_public_key.cpp @@ -308,12 +308,7 @@ secure_vector Hybrid_KEM_PrivateKey::private_key_bits() const { } std::unique_ptr Hybrid_KEM_PrivateKey::public_key() const { - std::vector> pks; - pks.reserve(m_private_keys.size()); - for(const auto& sk : m_private_keys) { - pks.push_back(sk->public_key()); - } - return std::make_unique(std::move(pks)); + return std::make_unique(extract_public_keys(m_private_keys)); } bool Hybrid_KEM_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { diff --git a/src/lib/tls/tls13_pqc/info.txt b/src/lib/tls/tls13_pqc/info.txt index 478ab2adf2e..cd2a4ab76e3 100644 --- a/src/lib/tls/tls13_pqc/info.txt +++ b/src/lib/tls/tls13_pqc/info.txt @@ -1,5 +1,5 @@ -TLS_13_PQC -> 20210721 +TLS_13_PQC -> 20230919 diff --git a/src/lib/tls/tls_algos.h b/src/lib/tls/tls_algos.h index 2905f65e0bd..f5b940de4a8 100644 --- a/src/lib/tls/tls_algos.h +++ b/src/lib/tls/tls_algos.h @@ -151,6 +151,10 @@ constexpr bool is_kem(const Group_Params group) { return is_pure_kyber(group) || is_hybrid(group); } +constexpr bool is_post_quantum(const Group_Params group) { + return is_pure_kyber(group) || is_hybrid(group); +} + std::string group_param_to_string(Group_Params group); Group_Params group_param_from_string(std::string_view group_name); std::vector> hybrid_group_param_to_algorithm_specs(Group_Params group);