/src/botan/src/lib/pubkey/kyber/kyber_common/kyber_constants.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Crystals Kyber Constants |
3 | | * |
4 | | * (C) 2021-2024 Jack Lloyd |
5 | | * (C) 2021-2022 Manuel Glaser and Michael Boric, Rohde & Schwarz Cybersecurity |
6 | | * (C) 2021-2022 René Meusel and Hannes Rantzsch, neXenio GmbH |
7 | | * (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity |
8 | | * |
9 | | * Botan is released under the Simplified BSD License (see license.txt) |
10 | | */ |
11 | | |
12 | | #include <botan/internal/kyber_constants.h> |
13 | | |
14 | | #include <botan/internal/pqcrystals_helpers.h> |
15 | | |
16 | | #if defined(BOTAN_HAS_KYBER) |
17 | | #include <botan/internal/kyber_modern.h> |
18 | | #endif |
19 | | |
20 | | #if defined(BOTAN_HAS_KYBER_90S) |
21 | | #include <botan/internal/kyber_90s.h> |
22 | | #endif |
23 | | |
24 | | #if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S) |
25 | | #include <botan/internal/kyber_round3_impl.h> |
26 | | #endif |
27 | | |
28 | | #if defined(BOTAN_HAS_ML_KEM) |
29 | | #include <botan/internal/ml_kem_impl.h> |
30 | | #endif |
31 | | |
32 | | namespace Botan { |
33 | | |
34 | 21 | KyberConstants::KyberConstants(KyberMode mode) : m_mode(mode) { |
35 | 21 | switch(mode.mode()) { |
36 | 0 | case KyberMode::Kyber512_R3: |
37 | 0 | case KyberMode::Kyber512_90s: |
38 | 7 | case KyberMode::ML_KEM_512: |
39 | 7 | m_nist_strength = KyberStrength::_128; |
40 | 7 | m_k = 2; |
41 | 7 | m_eta1 = KyberEta::_3; |
42 | 7 | m_du = KyberDu::_10; |
43 | 7 | m_dv = KyberDv::_4; |
44 | 7 | break; |
45 | | |
46 | 0 | case KyberMode::Kyber768_R3: |
47 | 0 | case KyberMode::Kyber768_90s: |
48 | 7 | case KyberMode::ML_KEM_768: |
49 | 7 | m_nist_strength = KyberStrength::_192; |
50 | 7 | m_k = 3; |
51 | 7 | m_eta1 = KyberEta::_2; |
52 | 7 | m_du = KyberDu::_10; |
53 | 7 | m_dv = KyberDv::_4; |
54 | 7 | break; |
55 | | |
56 | 0 | case KyberMode::Kyber1024_R3: |
57 | 0 | case KyberMode::Kyber1024_90s: |
58 | 7 | case KyberMode::ML_KEM_1024: |
59 | 7 | m_nist_strength = KyberStrength::_256; |
60 | 7 | m_k = 4; |
61 | 7 | m_eta1 = KyberEta::_2; |
62 | 7 | m_du = KyberDu::_11; |
63 | 7 | m_dv = KyberDv::_5; |
64 | 7 | break; |
65 | | |
66 | 0 | default: |
67 | 0 | BOTAN_ASSERT_UNREACHABLE(); |
68 | 21 | } |
69 | | |
70 | 21 | #ifdef BOTAN_HAS_KYBER_90S |
71 | 21 | if(mode.is_kyber_round3() && mode.is_90s()) { |
72 | 0 | m_symmetric_primitives = std::make_unique<Kyber_90s_Symmetric_Primitives>(); |
73 | 0 | } |
74 | 21 | #endif |
75 | | |
76 | 21 | #ifdef BOTAN_HAS_KYBER |
77 | 21 | if(mode.is_kyber_round3() && mode.is_modern()) { |
78 | 0 | m_symmetric_primitives = std::make_unique<Kyber_Modern_Symmetric_Primitives>(); |
79 | 0 | } |
80 | 21 | #endif |
81 | | |
82 | 21 | #ifdef BOTAN_HAS_ML_KEM |
83 | 21 | if(mode.is_ml_kem()) { |
84 | 21 | m_symmetric_primitives = std::make_unique<ML_KEM_Symmetric_Primitives>(); |
85 | 21 | } |
86 | 21 | #endif |
87 | | |
88 | 21 | static_assert(N % 8 == 0); |
89 | 21 | m_polynomial_vector_bytes = (bitlen(Q) * (N / 8)) * k(); |
90 | 21 | m_polynomial_vector_compressed_bytes = d_u() * k() * (N / 8); |
91 | 21 | m_polynomial_compressed_bytes = d_v() * (N / 8); |
92 | 21 | m_expanded_private_key_bytes = |
93 | 21 | static_cast<uint32_t>(m_polynomial_vector_bytes + public_key_bytes() + PUBLIC_KEY_HASH_BYTES + SEED_BYTES); |
94 | 21 | m_seed_private_key_bytes = 2 * SEED_BYTES; |
95 | | |
96 | 21 | if(!m_symmetric_primitives) { |
97 | 0 | throw Not_Implemented("requested Kyber mode is not enabled in this build"); |
98 | 0 | } |
99 | 21 | } |
100 | | |
101 | 42 | KyberConstants::~KyberConstants() = default; |
102 | | |
103 | | } // namespace Botan |