Botan 3.10.0
Crypto and TLS for C&
shake.cpp
Go to the documentation of this file.
1/*
2* SHAKE-128/256 as a hash
3* (C) 2016 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/internal/shake.h>
9
10#include <botan/exceptn.h>
11#include <botan/internal/fmt.h>
12
13namespace Botan {
14
15SHAKE_128::SHAKE_128(size_t output_bits) :
16 m_keccak({.capacity_bits = 256, .padding = KeccakPadding::shake()}), m_output_bits(output_bits) {
17 if(output_bits % 8 != 0) {
18 throw Invalid_Argument(fmt("SHAKE_128: Invalid output length {}", output_bits));
19 }
20}
21
22std::string SHAKE_128::name() const {
23 return fmt("SHAKE-128({})", m_output_bits);
24}
25
26std::unique_ptr<HashFunction> SHAKE_128::new_object() const {
27 return std::make_unique<SHAKE_128>(m_output_bits);
28}
29
30std::unique_ptr<HashFunction> SHAKE_128::copy_state() const {
31 return std::make_unique<SHAKE_128>(*this);
32}
33
34void SHAKE_128::add_data(std::span<const uint8_t> input) {
35 m_keccak.absorb(input);
36}
37
38void SHAKE_128::final_result(std::span<uint8_t> output) {
39 m_keccak.finish();
40 m_keccak.squeeze(output);
41 clear();
42}
43
44SHAKE_256::SHAKE_256(size_t output_bits) :
45 m_keccak({.capacity_bits = 512, .padding = KeccakPadding::shake()}), m_output_bits(output_bits) {
46 if(output_bits % 8 != 0) {
47 throw Invalid_Argument(fmt("SHAKE_256: Invalid output length {}", output_bits));
48 }
49}
50
51std::string SHAKE_256::name() const {
52 return fmt("SHAKE-256({})", m_output_bits);
53}
54
55std::unique_ptr<HashFunction> SHAKE_256::new_object() const {
56 return std::make_unique<SHAKE_256>(m_output_bits);
57}
58
59std::unique_ptr<HashFunction> SHAKE_256::copy_state() const {
60 return std::make_unique<SHAKE_256>(*this);
61}
62
63void SHAKE_256::add_data(std::span<const uint8_t> input) {
64 m_keccak.absorb(input);
65}
66
67void SHAKE_256::final_result(std::span<uint8_t> output) {
68 m_keccak.finish();
69 m_keccak.squeeze(output);
70 clear();
71}
72
73} // namespace Botan
void squeeze(std::span< uint8_t > output)
Expand output data from the current Keccak state.
void absorb(std::span< const uint8_t > input)
Absorb input data into the Keccak sponge.
void finish()
Add final padding (as provided in the constructor) and permute.
std::unique_ptr< HashFunction > new_object() const override
Definition shake.cpp:26
SHAKE_128(size_t output_bits)
Definition shake.cpp:15
void clear() override
Definition shake.h:37
std::string name() const override
Definition shake.cpp:22
std::unique_ptr< HashFunction > copy_state() const override
Definition shake.cpp:30
std::unique_ptr< HashFunction > new_object() const override
Definition shake.cpp:55
void clear() override
Definition shake.h:68
SHAKE_256(size_t output_bits)
Definition shake.cpp:44
std::string name() const override
Definition shake.cpp:51
std::unique_ptr< HashFunction > copy_state() const override
Definition shake.cpp:59
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
static constexpr KeccakPadding shake()
NIST FIPS 202 Section 6.2.
Definition keccak_perm.h:27