Botan 3.9.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/pss_params.h>
9
10#include <botan/assert.h>
11#include <botan/ber_dec.h>
12#include <botan/der_enc.h>
13#include <botan/internal/fmt.h>
14#include <botan/internal/scan_name.h>
15
16namespace Botan {
17
18//static
19PSS_Params PSS_Params::from_padding_name(std::string_view padding_name) {
20 SCAN_Name scanner(padding_name);
21
22 if((scanner.algo_name() != "PSS" && scanner.algo_name() != "PSS_Raw") || scanner.arg_count() != 3) {
23 throw Invalid_Argument(fmt("PSS_Params::from_padding_name unexpected param '{}'", padding_name));
24 }
25
26 const std::string hash_fn = scanner.arg(0);
27 BOTAN_ASSERT_NOMSG(scanner.arg(1) == "MGF1");
28 const size_t salt_len = scanner.arg_as_integer(2);
29 return PSS_Params(hash_fn, salt_len);
30}
31
32PSS_Params::PSS_Params(std::string_view hash_fn, size_t salt_len) :
33 m_hash(hash_fn, AlgorithmIdentifier::USE_NULL_PARAM),
34 m_mgf("MGF1", m_hash.BER_encode()),
35 m_mgf_hash(m_hash),
36 m_salt_len(salt_len),
37 m_trailer_field(1) {}
38
39PSS_Params::PSS_Params(std::span<const uint8_t> der) : m_salt_len(0), m_trailer_field(1) {
40 BER_Decoder decoder(der);
41 this->decode_from(decoder);
42}
43
44std::vector<uint8_t> PSS_Params::serialize() const {
45 std::vector<uint8_t> output;
46 DER_Encoder(output).encode(*this);
47 return output;
48}
49
53 .encode(m_hash)
54 .end_cons()
56 .encode(m_mgf)
57 .end_cons()
59 .encode(m_salt_len)
60 .end_cons()
61 .end_cons();
62}
63
64void PSS_Params::decode_from(BER_Decoder& from) {
66 const AlgorithmIdentifier default_mgf("MGF1", default_hash.BER_encode());
67 const size_t default_salt_len = 20;
68 const size_t default_trailer = 1;
69
70 from.start_sequence()
73 .decode_optional(m_salt_len, ASN1_Type(2), ASN1_Class::ExplicitContextSpecific, default_salt_len)
74 .decode_optional(m_trailer_field, ASN1_Type(3), ASN1_Class::ExplicitContextSpecific, default_trailer)
75 .end_cons();
76
77 BER_Decoder(m_mgf.parameters()).decode(m_mgf_hash);
78}
79
80} // namespace Botan
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
std::vector< uint8_t > BER_encode() const
Definition asn1_obj.cpp:19
const std::vector< uint8_t > & parameters() const
Definition asn1_obj.h:481
BER_Decoder & decode(bool &out)
Definition ber_dec.h:188
BER_Decoder & end_cons()
Definition ber_dec.cpp:312
BER_Decoder start_sequence()
Definition ber_dec.h:125
BER_Decoder & decode_optional(T &out, ASN1_Type type_tag, ASN1_Class class_tag, const T &default_value=T())
Definition ber_dec.h:253
DER_Encoder & start_context_specific(uint32_t tag)
Definition der_enc.h:69
DER_Encoder & start_sequence()
Definition der_enc.h:65
DER_Encoder & end_cons()
Definition der_enc.cpp:173
DER_Encoder & encode(bool b)
Definition der_enc.cpp:252
static PSS_Params from_padding_name(std::string_view padding_name)
void encode_into(DER_Encoder &to) const override
std::vector< uint8_t > serialize() const
PSS_Params(std::string_view hash_fn, size_t salt_len)
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
size_t arg_as_integer(size_t i, size_t def_value) const
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53
ASN1_Type
Definition asn1_obj.h:43