Botan 3.8.1
Crypto and TLS for C&
xof.cpp
Go to the documentation of this file.
1/*
2* Extendable Output Function Base Class
3* (C) 2023 Jack Lloyd
4* 2023 Fabian Albert, René Meusel - Rohde & Schwarz Cybersecurity
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#include <botan/xof.h>
10
11#include <botan/assert.h>
12#include <botan/internal/scan_name.h>
13
14#if defined(BOTAN_HAS_SHAKE_XOF)
15 #include <botan/internal/shake_xof.h>
16#endif
17
18#include <botan/exceptn.h>
19#include <botan/internal/fmt.h>
20
21namespace Botan {
22
23//static
24std::unique_ptr<XOF> XOF::create(std::string_view algo_spec, std::string_view provider) {
25 const SCAN_Name req(algo_spec);
26
27 if(!provider.empty() && provider != "base") {
28 return nullptr; // unknown provider
29 }
30
31#if defined(BOTAN_HAS_SHAKE_XOF)
32 if(req.algo_name() == "SHAKE-128" && req.arg_count() == 0) {
33 return std::make_unique<SHAKE_128_XOF>();
34 }
35 if(req.algo_name() == "SHAKE-256" && req.arg_count() == 0) {
36 return std::make_unique<SHAKE_256_XOF>();
37 }
38#endif
39
40 return nullptr;
41}
42
43//static
44std::unique_ptr<XOF> XOF::create_or_throw(std::string_view algo_spec, std::string_view provider) {
45 if(auto xof = XOF::create(algo_spec, provider)) {
46 return xof;
47 }
48 throw Lookup_Error("XOF", algo_spec, provider);
49}
50
51// static
52std::vector<std::string> XOF::providers(std::string_view algo_spec) {
53 return probe_providers_of<XOF>(algo_spec, {"base"});
54}
55
56std::string XOF::provider() const {
57 return "base";
58}
59
60void XOF::start(std::span<const uint8_t> salt, std::span<const uint8_t> key) {
61 if(!key_spec().valid_keylength(key.size())) {
62 throw Invalid_Key_Length(name(), key.size());
63 }
64
65 if(!valid_salt_length(salt.size())) {
66 throw Invalid_Argument(fmt("{} cannot accept a salt length of {}", name(), salt.size()));
67 }
68
69 m_xof_started = true;
70 start_msg(salt, key);
71}
72
73void XOF::start_msg(std::span<const uint8_t> salt, std::span<const uint8_t> key) {
74 BOTAN_UNUSED(salt, key);
75}
76
77} // namespace Botan
#define BOTAN_UNUSED
Definition assert.h:120
size_t arg_count() const
Definition scan_name.h:49
const std::string & algo_name() const
Definition scan_name.h:44
static std::unique_ptr< XOF > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition xof.cpp:44
virtual std::string provider() const
Definition xof.cpp:56
virtual bool valid_salt_length(size_t salt_len) const
Definition xof.h:91
virtual Key_Length_Specification key_spec() const
Definition xof.h:99
static std::unique_ptr< XOF > create(std::string_view algo_spec, std::string_view provider="")
Definition xof.cpp:24
virtual std::string name() const =0
void start(std::span< const uint8_t > salt={}, std::span< const uint8_t > key={})
Definition xof.cpp:60
static std::vector< std::string > providers(std::string_view algo_spec)
Definition xof.cpp:52
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
std::vector< std::string > probe_providers_of(std::string_view algo_spec, const std::vector< std::string > &possible={"base"})
Definition scan_name.h:105