Botan 3.10.0
Crypto and TLS for C&
kdf2.cpp
Go to the documentation of this file.
1/*
2* KDF2
3* (C) 1999-2007 Jack Lloyd
4* (C) 2024 René Meusel, Rohde & Schwarz Cybersecurity
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#include <botan/internal/kdf2.h>
10
11#include <botan/internal/bit_ops.h>
12#include <botan/internal/fmt.h>
13#include <botan/internal/stl_util.h>
14
15namespace Botan {
16
17std::string KDF2::name() const {
18 return fmt("KDF2({})", m_hash->name());
19}
20
21std::unique_ptr<KDF> KDF2::new_object() const {
22 return std::make_unique<KDF2>(m_hash->new_object());
23}
24
25void KDF2::perform_kdf(std::span<uint8_t> key,
26 std::span<const uint8_t> secret,
27 std::span<const uint8_t> salt,
28 std::span<const uint8_t> label) const {
29 if(key.empty()) {
30 return;
31 }
32
33 const size_t hash_output_length = m_hash->output_length();
34 const auto blocks_required = ceil_division<uint64_t /* for 32bit systems */>(key.size(), hash_output_length);
35
36 // This KDF uses a 32-bit counter for the hash blocks, initialized at 1.
37 // It will wrap around after 2^32 - 1 iterations limiting the theoretically
38 // possible output to 2^32 - 1 blocks.
39 BOTAN_ARG_CHECK(blocks_required <= 0xFFFFFFFE, "KDF2 maximum output length exceeded");
40
41 BufferStuffer k(key);
42 for(uint32_t counter = 1; !k.full(); ++counter) {
43 BOTAN_ASSERT_NOMSG(counter != 0); // no overflow
44
45 m_hash->update(secret);
46 m_hash->update_be(counter);
47 m_hash->update(label);
48 m_hash->update(salt);
49
50 // Write straight into the output buffer, except if the hash output needs
51 // a truncation in the final iteration.
52 if(k.remaining_capacity() >= hash_output_length) {
53 m_hash->final(k.next(hash_output_length));
54 } else {
55 const auto h = m_hash->final();
56 k.append(std::span{h}.first(k.remaining_capacity()));
57 }
58 }
59}
60
61} // namespace Botan
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
std::unique_ptr< KDF > new_object() const override
Definition kdf2.cpp:21
std::string name() const override
Definition kdf2.cpp:17
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
BOTAN_FORCE_INLINE constexpr T ceil_division(T a, T b)
Definition bit_ops.h:160