Botan 3.6.1
Crypto and TLS for C&
Botan::Kyber_KEM_Decryptor Class Referencefinal

#include <kyber_round3_impl.h>

Inheritance diagram for Botan::Kyber_KEM_Decryptor:
Botan::Kyber_KEM_Decryptor_Base Botan::PK_Ops::KEM_Decryption_with_KDF Botan::Kyber_KEM_Operation_Base Botan::PK_Ops::KEM_Decryption

Public Member Functions

size_t encapsulated_key_length () const override
 
void kem_decrypt (std::span< uint8_t > out_shared_key, std::span< const uint8_t > encapsulated_key, size_t desired_shared_key_len, std::span< const uint8_t > salt) final
 
 Kyber_KEM_Decryptor (std::shared_ptr< const Kyber_PrivateKeyInternal > private_key, std::shared_ptr< const Kyber_PublicKeyInternal > public_key, std::string_view kdf)
 
void raw_kem_decrypt (std::span< uint8_t > out_shared_key, std::span< const uint8_t > encapsulated_key) final
 
size_t raw_kem_shared_key_length () const override
 
size_t shared_key_length (size_t desired_shared_key_len) const final
 

Protected Member Functions

void decapsulate (StrongSpan< KyberSharedSecret > out_shared_key, StrongSpan< const KyberCompressedCiphertext > encapsulated_key) override
 
const KyberConstantsmode () const override
 
const KyberPolyMatprecomputed_matrix_At () const
 

Detailed Description

Definition at line 36 of file kyber_round3_impl.h.

Constructor & Destructor Documentation

◆ Kyber_KEM_Decryptor()

Botan::Kyber_KEM_Decryptor::Kyber_KEM_Decryptor ( std::shared_ptr< const Kyber_PrivateKeyInternal > private_key,
std::shared_ptr< const Kyber_PublicKeyInternal > public_key,
std::string_view kdf )
inline

Definition at line 38 of file kyber_round3_impl.h.

40 :
41 Kyber_KEM_Decryptor_Base(kdf, *public_key),
42 m_public_key(std::move(public_key)),
43 m_private_key(std::move(private_key)) {}
Kyber_KEM_Decryptor_Base(std::string_view kdf, const Kyber_PublicKeyInternal &pk)

Member Function Documentation

◆ decapsulate()

void Botan::Kyber_KEM_Decryptor::decapsulate ( StrongSpan< KyberSharedSecret > out_shared_key,
StrongSpan< const KyberCompressedCiphertext > encapsulated_key )
overrideprotectedvirtual

Crystals Kyber (Version 3.01), Algorithm 9 (Kyber.CCAKEM.Dec())

Implements Botan::Kyber_KEM_Decryptor_Base.

Definition at line 41 of file kyber_round3_impl.cpp.

42 {
43 auto scope = CT::scoped_poison(*m_private_key);
44
45 const auto& sym = m_public_key->mode().symmetric_primitives();
46
47 const auto& h = m_public_key->H_public_key_bits_raw();
48 const auto& z = m_private_key->z();
49
50 const auto m_prime = m_private_key->indcpa_decrypt(encapsulated_key);
51 const auto [K_bar_prime, r_prime] = sym.G(m_prime, h);
52
53 const auto c_prime = m_public_key->indcpa_encrypt(m_prime, r_prime, precomputed_matrix_At());
54
56 BOTAN_ASSERT_NOMSG(encapsulated_key.size() == c_prime.size());
57 BOTAN_ASSERT_NOMSG(K_bar_prime.size() == K.size());
58 const auto reencrypt_success = CT::is_equal(encapsulated_key.data(), c_prime.data(), encapsulated_key.size());
59 CT::conditional_copy_mem(reencrypt_success, K.data(), K_bar_prime.data(), z.data(), K_bar_prime.size());
60
61 sym.KDF(out_shared_key, K, sym.H(encapsulated_key));
62 CT::unpoison(out_shared_key);
63}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:59
static constexpr size_t SEED_BYTES
const KyberPolyMat & precomputed_matrix_At() const
constexpr auto scoped_poison(const Ts &... xs)
Definition ct_utils.h:216
constexpr Mask< T > conditional_copy_mem(Mask< T > mask, T *to, const T *from0, const T *from1, size_t elems)
Definition ct_utils.h:699
constexpr CT::Mask< T > is_equal(const T x[], const T y[], size_t len)
Definition ct_utils.h:759
constexpr void unpoison(const T *p, size_t n)
Definition ct_utils.h:64
Strong< secure_vector< uint8_t >, struct KyberSharedSecret_ > KyberSharedSecret
Shared secret value generated during encapsulation and recovered during decapsulation.
Definition kyber_types.h:54

References BOTAN_ASSERT_NOMSG, Botan::CT::conditional_copy_mem(), Botan::StrongSpan< T >::data(), Botan::CT::is_equal(), Botan::Kyber_KEM_Operation_Base::precomputed_matrix_At(), Botan::CT::scoped_poison(), Botan::KyberConstants::SEED_BYTES, Botan::StrongSpan< T >::size(), and Botan::CT::unpoison().

◆ encapsulated_key_length()

size_t Botan::Kyber_KEM_Decryptor_Base::encapsulated_key_length ( ) const
inlineoverridevirtualinherited

Implements Botan::PK_Ops::KEM_Decryption.

Definition at line 63 of file kyber_encaps_base.h.

63{ return mode().ciphertext_bytes(); }
size_t ciphertext_bytes() const
byte length of an encoded ciphertext
virtual const KyberConstants & mode() const =0

References Botan::KyberConstants::ciphertext_bytes(), and Botan::Kyber_KEM_Decryptor_Base::mode().

◆ kem_decrypt()

void Botan::PK_Ops::KEM_Decryption_with_KDF::kem_decrypt ( std::span< uint8_t > out_shared_key,
std::span< const uint8_t > encapsulated_key,
size_t desired_shared_key_len,
std::span< const uint8_t > salt )
finalvirtualinherited

Implements Botan::PK_Ops::KEM_Decryption.

Definition at line 219 of file pk_ops.cpp.

222 {
223 BOTAN_ARG_CHECK(salt.empty() || m_kdf, "PK_KEM_Decryptor::decrypt requires a KDF to use a salt");
224
225 if(m_kdf) {
227 out_shared_key.size(), desired_shared_key_len, "KDF output length and shared key length match");
228
230 this->raw_kem_decrypt(raw_shared, encapsulated_key);
231 m_kdf->derive_key(out_shared_key, raw_shared, salt, {});
232 } else {
233 BOTAN_ASSERT_EQUAL(out_shared_key.size(), raw_kem_shared_key_length(), "Shared key has raw KEM output length");
234 this->raw_kem_decrypt(out_shared_key, encapsulated_key);
235 }
236}
#define BOTAN_ASSERT_EQUAL(expr1, expr2, assertion_made)
Definition assert.h:68
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:29
virtual void raw_kem_decrypt(std::span< uint8_t > out_raw_shared_key, std::span< const uint8_t > encapsulated_key)=0
virtual size_t raw_kem_shared_key_length() const =0
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:61

References BOTAN_ARG_CHECK, and BOTAN_ASSERT_EQUAL.

◆ mode()

const KyberConstants & Botan::Kyber_KEM_Decryptor::mode ( ) const
inlineoverrideprotectedvirtual

Implements Botan::Kyber_KEM_Decryptor_Base.

Definition at line 49 of file kyber_round3_impl.h.

49{ return m_private_key->mode(); }

◆ precomputed_matrix_At()

const KyberPolyMat & Botan::Kyber_KEM_Operation_Base::precomputed_matrix_At ( ) const
inlineprotectedinherited

◆ raw_kem_decrypt()

void Botan::Kyber_KEM_Decryptor_Base::raw_kem_decrypt ( std::span< uint8_t > out_shared_key,
std::span< const uint8_t > encapsulated_key )
inlinefinalvirtualinherited

Implements Botan::PK_Ops::KEM_Decryption_with_KDF.

Definition at line 65 of file kyber_encaps_base.h.

65 {
66 decapsulate(StrongSpan<KyberSharedSecret>(out_shared_key),
67 StrongSpan<const KyberCompressedCiphertext>(encapsulated_key));
68 }
virtual void decapsulate(StrongSpan< KyberSharedSecret > out_shared_key, StrongSpan< const KyberCompressedCiphertext > encapsulated_key)=0

References Botan::Kyber_KEM_Decryptor_Base::decapsulate().

◆ raw_kem_shared_key_length()

size_t Botan::Kyber_KEM_Decryptor_Base::raw_kem_shared_key_length ( ) const
inlineoverridevirtualinherited

Implements Botan::PK_Ops::KEM_Decryption_with_KDF.

Definition at line 61 of file kyber_encaps_base.h.

61{ return mode().shared_key_bytes(); }
constexpr size_t shared_key_bytes() const
byte length of the shared key

References Botan::Kyber_KEM_Decryptor_Base::mode(), and Botan::KyberConstants::shared_key_bytes().

◆ shared_key_length()

size_t Botan::PK_Ops::KEM_Decryption_with_KDF::shared_key_length ( size_t desired_shared_key_len) const
finalvirtualinherited

Implements Botan::PK_Ops::KEM_Decryption.

Definition at line 211 of file pk_ops.cpp.

211 {
212 if(m_kdf) {
213 return desired_shared_key_len;
214 } else {
215 return this->raw_kem_shared_key_length();
216 }
217}

The documentation for this class was generated from the following files: