Botan 3.13.0
Crypto and TLS for C&
Botan::PK_Signer Class Referencefinal

#include <pubkey.h>

Public Member Functions

AlgorithmIdentifier algorithm_identifier () const
std::string hash_function () const
PK_Signeroperator= (const PK_Signer &)=delete
PK_Signeroperator= (PK_Signer &&) noexcept
 PK_Signer (const PK_Signer &)=delete
 PK_Signer (const Private_Key &key, RandomNumberGenerator &rng, std::string_view padding, Signature_Format format=Signature_Format::Standard, std::string_view provider="")
 PK_Signer (PK_Signer &&) noexcept
void set_output_format (Signature_Format format)
std::vector< uint8_t > sign_message (const uint8_t in[], size_t length, RandomNumberGenerator &rng)
std::vector< uint8_t > sign_message (std::span< const uint8_t > in, RandomNumberGenerator &rng)
std::vector< uint8_t > signature (RandomNumberGenerator &rng)
size_t signature_length () const
void update (const uint8_t in[], size_t length)
void update (std::span< const uint8_t > in)
void update (std::string_view in)
void update (uint8_t in)
 ~PK_Signer ()

Detailed Description

Public Key Signer. Use the sign_message() functions for small messages. Use multiple calls update() to process large messages and generate the signature by finally calling signature().

Definition at line 160 of file pubkey.h.

Constructor & Destructor Documentation

◆ PK_Signer() [1/3]

Botan::PK_Signer::PK_Signer ( const Private_Key & key,
RandomNumberGenerator & rng,
std::string_view padding,
Signature_Format format = Signature_Format::Standard,
std::string_view provider = "" )

Construct a PK Signer.

Parameters
keythe key to use inside this signer
Random Number Generatorsthe random generator to use
paddingthe padding/hash to use, eg "SHA-512" or "PSS(SHA-256)"
formatthe signature format to use
providerthe provider to use

Definition at line 255 of file pubkey.cpp.

259 :
260 m_sig_format(format), m_sig_element_size(key._signature_element_size_for_DER_encoding()) {
261 if(m_sig_format == Signature_Format::DerSequence) {
262 BOTAN_ARG_CHECK(m_sig_element_size.has_value(), "This key does not support DER signatures");
263 }
264
265 m_op = key.create_signature_op(rng, padding, provider);
266 if(!m_op) {
267 throw Invalid_Argument(fmt("Key type {} does not support signature generation", key.algo_name()));
268 }
269}
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53

References Botan::Asymmetric_Key::algo_name(), BOTAN_ARG_CHECK, Botan::Private_Key::create_signature_op(), Botan::DerSequence, and Botan::fmt().

Referenced by operator=(), operator=(), PK_Signer(), PK_Signer(), and update().

◆ ~PK_Signer()

Botan::PK_Signer::~PK_Signer ( )
default

◆ PK_Signer() [2/3]

Botan::PK_Signer::PK_Signer ( const PK_Signer & )
delete

References PK_Signer().

◆ PK_Signer() [3/3]

Botan::PK_Signer::PK_Signer ( PK_Signer && )
defaultnoexcept

References PK_Signer().

Member Function Documentation

◆ algorithm_identifier()

AlgorithmIdentifier Botan::PK_Signer::algorithm_identifier ( ) const

Return an AlgorithmIdentifier appropriate for identifying the signature method being generated by this PK_Signer. Throws an exception if this is not available for the current signature scheme.

Definition at line 271 of file pubkey.cpp.

271 {
272 return m_op->algorithm_identifier();
273}

◆ hash_function()

std::string Botan::PK_Signer::hash_function ( ) const

Return the hash function which is being used to create signatures. This should never return an empty string however it may return a string which does not map directly to a hash function, in particular if "Raw" (unhashed) encoding is being used.

Definition at line 275 of file pubkey.cpp.

275 {
276 return m_op->hash_function();
277}

◆ operator=() [1/2]

PK_Signer & Botan::PK_Signer::operator= ( const PK_Signer & )
delete

References PK_Signer().

◆ operator=() [2/2]

PK_Signer & Botan::PK_Signer::operator= ( PK_Signer && )
defaultnoexcept

References PK_Signer().

◆ set_output_format()

void Botan::PK_Signer::set_output_format ( Signature_Format format)
inline

Set the output format of the signature.

Parameters
formatthe signature format to use

Definition at line 243 of file pubkey.h.

243{ m_sig_format = format; }

◆ sign_message() [1/2]

std::vector< uint8_t > Botan::PK_Signer::sign_message ( const uint8_t in[],
size_t length,
RandomNumberGenerator & rng )
inline

Sign a message all in one go

Parameters
inthe message to sign as a byte array
lengththe length of the above byte array
Random Number Generatorsthe rng to use
Returns
signature

Definition at line 191 of file pubkey.h.

191 {
192 this->update(in, length);
193 return this->signature(rng);
194 }
void update(uint8_t in)
Definition pubkey.h:210
std::vector< uint8_t > signature(RandomNumberGenerator &rng)
Definition pubkey.cpp:357

References sign_message(), signature(), and update().

Referenced by Botan::X509_Object::make_signed(), sign_message(), sign_message(), Botan::KeyPair::signature_consistency_check(), and Botan::TLS::Callbacks::tls_sign_message().

◆ sign_message() [2/2]

std::vector< uint8_t > Botan::PK_Signer::sign_message ( std::span< const uint8_t > in,
RandomNumberGenerator & rng )
inline

Sign a message.

Parameters
inthe message to sign
Random Number Generatorsthe rng to use
Returns
signature

Definition at line 202 of file pubkey.h.

202 {
203 return sign_message(in.data(), in.size(), rng);
204 }
std::vector< uint8_t > sign_message(const uint8_t in[], size_t length, RandomNumberGenerator &rng)
Definition pubkey.h:191

References sign_message().

◆ signature()

std::vector< uint8_t > Botan::PK_Signer::signature ( RandomNumberGenerator & rng)

Get the signature of the so far processed message (provided by the calls to update()).

Parameters
Random Number Generatorsthe rng to use
Returns
signature of the total message

Definition at line 357 of file pubkey.cpp.

357 {
358 std::vector<uint8_t> sig = m_op->sign(rng);
359
360 if(m_sig_format == Signature_Format::Standard) {
361 return sig;
362 } else if(m_sig_format == Signature_Format::DerSequence) {
363 BOTAN_ASSERT_NOMSG(m_sig_element_size.has_value());
364 return der_encode_signature(sig, 2, m_sig_element_size.value());
365 } else {
366 throw Internal_Error("PK_Signer: Invalid signature format enum");
367 }
368}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

References BOTAN_ASSERT_NOMSG, Botan::DerSequence, and Botan::Standard.

Referenced by sign_message().

◆ signature_length()

size_t Botan::PK_Signer::signature_length ( ) const

Return an upper bound on the length of the signatures this PK_Signer will produce

Definition at line 313 of file pubkey.cpp.

313 {
314 if(m_sig_format == Signature_Format::Standard) {
315 return m_op->signature_length();
316 } else if(m_sig_format == Signature_Format::DerSequence) {
317 const size_t sig_len = m_op->signature_length();
318
319 const size_t der_overhead = [sig_len]() {
320 /*
321 This was computed by DER encoding of some maximal value signatures
322 (since DER is variable length)
323
324 The first two cases covers all EC schemes since groups are at most 521
325 bits.
326
327 The other cases are only for finite field DSA which practically is only
328 used up to 3072 bit groups but the calculation is correct up to a
329 262096 (!) bit group so allow it. There are some intermediate sizes but
330 this function is allowed to (and indeed must) return an over-estimate
331 rather than an exact value since the actual length will change based on
332 the computed signature.
333 */
334
335 if(sig_len <= 120) {
336 // EC signatures <= 480 bits
337 return 8;
338 } else if(sig_len <= 248) {
339 // EC signatures > 480 bits (or very small DSA groups...)
340 return 9;
341 } else {
342 // Everything else. This is an over-estimate for groups under
343 // 2040 bits but exact otherwise
344
345 // This requires 15 bytes DER overhead and should never happen
346 BOTAN_ASSERT_NOMSG(sig_len < 65524);
347 return 14;
348 }
349 }();
350
351 return sig_len + der_overhead;
352 } else {
353 throw Internal_Error("PK_Signer: Invalid signature format enum");
354 }
355}

References BOTAN_ASSERT_NOMSG, Botan::DerSequence, and Botan::Standard.

◆ update() [1/4]

void Botan::PK_Signer::update ( const uint8_t in[],
size_t length )

Add a message part.

Parameters
inthe message part to add as a byte array
lengththe length of the above byte array

Definition at line 288 of file pubkey.cpp.

288 {
289 m_op->update({in, length});
290}

◆ update() [2/4]

void Botan::PK_Signer::update ( std::span< const uint8_t > in)
inline

Add a message part.

Parameters
inthe message part to add

Definition at line 223 of file pubkey.h.

223{ update(in.data(), in.size()); }

References update().

Referenced by update().

◆ update() [3/4]

void Botan::PK_Signer::update ( std::string_view in)

Add a message part.

Parameters
inthe message part to add

Definition at line 284 of file pubkey.cpp.

284 {
285 this->update(as_span_of_bytes(in));
286}
std::span< const uint8_t > as_span_of_bytes(const char *s, size_t len)
Definition mem_utils.h:59

References Botan::as_span_of_bytes(), PK_Signer(), and update().

◆ update() [4/4]

void Botan::PK_Signer::update ( uint8_t in)
inline

Add a message part (single byte).

Parameters
inthe byte to add

Definition at line 210 of file pubkey.h.

210{ update(&in, 1); }

References update().

Referenced by sign_message(), update(), and update().


The documentation for this class was generated from the following files: