Botan 3.6.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#include <botan/internal/scan_name.h>
11
12#if defined(BOTAN_HAS_SHAKE_XOF)
13 #include <botan/internal/shake_xof.h>
14#endif
15
16#include <botan/exceptn.h>
17#include <botan/internal/fmt.h>
18
19namespace Botan {
20
21//static
22std::unique_ptr<XOF> XOF::create(std::string_view algo_spec, std::string_view provider) {
23 const SCAN_Name req(algo_spec);
24
25 if(!provider.empty() && provider != "base") {
26 return nullptr; // unknown provider
27 }
28
29#if defined(BOTAN_HAS_SHAKE_XOF)
30 if(req.algo_name() == "SHAKE-128" && req.arg_count() == 0) {
31 return std::make_unique<SHAKE_128_XOF>();
32 }
33 if(req.algo_name() == "SHAKE-256" && req.arg_count() == 0) {
34 return std::make_unique<SHAKE_256_XOF>();
35 }
36#endif
37
38 return nullptr;
39}
40
41//static
42std::unique_ptr<XOF> XOF::create_or_throw(std::string_view algo_spec, std::string_view provider) {
43 if(auto xof = XOF::create(algo_spec, provider)) {
44 return xof;
45 }
46 throw Lookup_Error("XOF", algo_spec, provider);
47}
48
49// static
50std::vector<std::string> XOF::providers(std::string_view algo_spec) {
51 return probe_providers_of<XOF>(algo_spec, {"base"});
52}
53
54std::string XOF::provider() const {
55 return "base";
56}
57
58void XOF::start(std::span<const uint8_t> salt, std::span<const uint8_t> key) {
59 if(!key_spec().valid_keylength(key.size())) {
60 throw Invalid_Key_Length(name(), key.size());
61 }
62
63 if(!valid_salt_length(salt.size())) {
64 throw Invalid_Argument(fmt("{} cannot accept a salt length of {}", name(), salt.size()));
65 }
66
67 m_xof_started = true;
68 start_msg(salt, key);
69}
70
71void XOF::start_msg(std::span<const uint8_t> salt, std::span<const uint8_t> key) {
72 BOTAN_UNUSED(salt, key);
73}
74
75} // namespace Botan
#define BOTAN_UNUSED
Definition assert.h:118
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:42
virtual std::string provider() const
Definition xof.cpp:54
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:22
virtual std::string name() const =0
void start(std::span< const uint8_t > salt={}, std::span< const uint8_t > key={})
Definition xof.cpp:58
static std::vector< std::string > providers(std::string_view algo_spec)
Definition xof.cpp:50
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