Botan 3.0.0
Crypto and TLS for C&
pss_params.cpp
Go to the documentation of this file.
1/*
2* (C) 2017 Daniel Neus
3* 2023 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/internal/pss_params.h>
9#include <botan/internal/scan_name.h>
10#include <botan/internal/fmt.h>
11#include <botan/der_enc.h>
12#include <botan/ber_dec.h>
13
14namespace Botan {
15
16//static
17PSS_Params PSS_Params::from_emsa_name(std::string_view emsa_name)
18 {
19 SCAN_Name scanner(emsa_name);
20
21 if((scanner.algo_name() != "EMSA4" && scanner.algo_name() != "PSSR") ||
22 scanner.arg_count() != 3)
23 {
24 throw Invalid_Argument(fmt("PSS_Params::from_emsa_name unexpected param '{}'", emsa_name));
25 }
26
27 const std::string hash_fn = scanner.arg(0);
28 BOTAN_ASSERT_NOMSG(scanner.arg(1) == "MGF1");
29 const size_t salt_len = scanner.arg_as_integer(2);
30 return PSS_Params(hash_fn, salt_len);
31 }
32
33PSS_Params::PSS_Params(std::string_view hash_fn, size_t salt_len) :
34 m_hash(hash_fn, AlgorithmIdentifier::USE_NULL_PARAM),
35 m_mgf("MGF1", m_hash.BER_encode()),
36 m_mgf_hash(m_hash),
37 m_salt_len(salt_len)
38 {
39 }
40
41PSS_Params::PSS_Params(const uint8_t der[], size_t der_len)
42 {
43 BER_Decoder decoder(der, der_len);
44 this->decode_from(decoder);
45 }
46
47std::vector<uint8_t> PSS_Params::serialize() const
48 {
49 std::vector<uint8_t> output;
50 DER_Encoder(output).encode(*this);
51 return output;
52 }
53
55 {
56 const size_t trailer_field = 1;
57
61 .start_context_specific(2).encode(m_salt_len).end_cons()
63 .end_cons();
64 }
65
67 {
69 const AlgorithmIdentifier default_mgf("MGF1", default_hash.BER_encode());
70 const size_t default_salt_len = 20;
71 const size_t default_trailer = 1;
72
73 from.start_sequence()
76 .decode_optional(m_salt_len, ASN1_Type(2), ASN1_Class::ExplicitContextSpecific, default_salt_len)
77 .decode_optional(m_trailer_field, ASN1_Type(3), ASN1_Class::ExplicitContextSpecific, default_trailer)
78 .end_cons();
79
80 BER_Decoder(m_mgf.parameters()).decode(m_mgf_hash);
81 }
82
83}
#define BOTAN_ASSERT_NOMSG(expr)
Definition: assert.h:67
std::vector< uint8_t > BER_encode() const
Definition: asn1_obj.cpp:17
const std::vector< uint8_t > & parameters() const
Definition: asn1_obj.h:478
BER_Decoder & decode(bool &out)
Definition: ber_dec.h:193
BER_Decoder & end_cons()
Definition: ber_dec.cpp:304
BER_Decoder start_sequence()
Definition: ber_dec.h:117
BER_Decoder & decode_optional(T &out, ASN1_Type type_tag, ASN1_Class class_tag, const T &default_value=T())
Definition: ber_dec.h:371
DER_Encoder & start_context_specific(uint32_t tag)
Definition: der_enc.h:76
DER_Encoder & start_sequence()
Definition: der_enc.h:66
DER_Encoder & end_cons()
Definition: der_enc.cpp:196
DER_Encoder & encode(bool b)
Definition: der_enc.cpp:290
void encode_into(DER_Encoder &to) const override
Definition: pss_params.cpp:54
size_t trailer_field() const
Definition: pss_params.h:36
std::vector< uint8_t > serialize() const
Definition: pss_params.cpp:47
PSS_Params(std::string_view hash_fn, size_t salt_len)
Definition: pss_params.cpp:33
static PSS_Params from_emsa_name(std::string_view emsa_name)
Definition: pss_params.cpp:17
void decode_from(BER_Decoder &from) override
Definition: pss_params.cpp:66
std::string arg(size_t i) const
Definition: scan_name.cpp:129
size_t arg_count() const
Definition: scan_name.h:50
const std::string algo_name() const
Definition: scan_name.h:45
size_t arg_as_integer(size_t i, size_t def_value) const
Definition: scan_name.cpp:144
Definition: alg_id.cpp:12
std::string fmt(std::string_view format, const T &... args)
Definition: fmt.h:60
ASN1_Type
Definition: asn1_obj.h:43