Botan 3.4.0
Crypto and TLS for C&
eme.cpp
Go to the documentation of this file.
1/*
2* EME Base Class
3* (C) 1999-2008 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/internal/eme.h>
9
10#include <botan/exceptn.h>
11#include <botan/internal/parsing.h>
12#include <botan/internal/scan_name.h>
13
14#if defined(BOTAN_HAS_EME_OAEP)
15 #include <botan/internal/oaep.h>
16#endif
17
18#if defined(BOTAN_HAS_EME_PKCS1)
19 #include <botan/internal/eme_pkcs.h>
20#endif
21
22#if defined(BOTAN_HAS_EME_RAW)
23 #include <botan/internal/eme_raw.h>
24#endif
25
26namespace Botan {
27
28std::unique_ptr<EME> EME::create(std::string_view algo_spec) {
29#if defined(BOTAN_HAS_EME_RAW)
30 if(algo_spec == "Raw") {
31 return std::make_unique<EME_Raw>();
32 }
33#endif
34
35#if defined(BOTAN_HAS_EME_PKCS1)
36 if(algo_spec == "PKCS1v15" || algo_spec == "EME-PKCS1-v1_5") {
37 return std::make_unique<EME_PKCS1v15>();
38 }
39#endif
40
41#if defined(BOTAN_HAS_EME_OAEP)
42 SCAN_Name req(algo_spec);
43
44 if(req.algo_name() == "OAEP" || req.algo_name() == "EME-OAEP" || req.algo_name() == "EME1") {
45 if(req.arg_count() == 1 || ((req.arg_count() == 2 || req.arg_count() == 3) && req.arg(1) == "MGF1")) {
46 if(auto hash = HashFunction::create(req.arg(0))) {
47 return std::make_unique<OAEP>(std::move(hash), req.arg(2, ""));
48 }
49 } else if(req.arg_count() == 2 || req.arg_count() == 3) {
50 auto mgf_params = parse_algorithm_name(req.arg(1));
51
52 if(mgf_params.size() == 2 && mgf_params[0] == "MGF1") {
53 auto hash = HashFunction::create(req.arg(0));
54 auto mgf1_hash = HashFunction::create(mgf_params[1]);
55
56 if(hash && mgf1_hash) {
57 return std::make_unique<OAEP>(std::move(hash), std::move(mgf1_hash), req.arg(2, ""));
58 }
59 }
60 }
61 }
62#endif
63
64 throw Algorithm_Not_Found(algo_spec);
65}
66
67/*
68* Encode a message
69*/
71 size_t msg_len,
72 size_t key_bits,
73 RandomNumberGenerator& rng) const {
74 return pad(msg, msg_len, key_bits, rng);
75}
76
77/*
78* Encode a message
79*/
81 size_t key_bits,
82 RandomNumberGenerator& rng) const {
83 return pad(msg.data(), msg.size(), key_bits, rng);
84}
85
86} // namespace Botan
secure_vector< uint8_t > encode(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator &rng) const
Definition eme.cpp:70
virtual secure_vector< uint8_t > pad(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator &rng) const =0
static std::unique_ptr< EME > create(std::string_view algo_spec)
Definition eme.cpp:28
static std::unique_ptr< HashFunction > create(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:107
std::string arg(size_t i) const
size_t arg_count() const
Definition scan_name.h:49
const std::string & algo_name() const
Definition scan_name.h:44
std::vector< std::string > parse_algorithm_name(std::string_view namex)
Definition parsing.cpp:57
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:61