Botan  1.11.11
Public Member Functions | List of all members
Botan::PK_Signer Class Reference

#include <pubkey.h>

Public Member Functions

 PK_Signer (const Private_Key &key, const std::string &emsa, Signature_Format format=IEEE_1363, Fault_Protection prot=ENABLE_FAULT_PROTECTION)
 
void set_output_format (Signature_Format format)
 
std::vector< bytesign_message (const byte in[], size_t length, RandomNumberGenerator &rng)
 
std::vector< bytesign_message (const std::vector< byte > &in, RandomNumberGenerator &rng)
 
std::vector< bytesign_message (const secure_vector< byte > &in, RandomNumberGenerator &rng)
 
std::vector< bytesignature (RandomNumberGenerator &rng)
 
void update (byte in)
 
void update (const byte in[], size_t length)
 
void update (const std::vector< byte > &in)
 

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 128 of file pubkey.h.

Constructor & Destructor Documentation

Botan::PK_Signer::PK_Signer ( const Private_Key key,
const std::string &  emsa,
Signature_Format  format = IEEE_1363,
Fault_Protection  prot = ENABLE_FAULT_PROTECTION 
)

Construct a PK Signer.

Parameters
keythe key to use inside this signer
emsathe EMSA to use An example would be "EMSA1(SHA-224)".
formatthe signature format to use
protsays if fault protection should be enabled

Definition at line 123 of file pubkey.cpp.

References Botan::Public_Key::algo_name(), Botan::DISABLE_FAULT_PROTECTION, Botan::ENABLE_FAULT_PROTECTION, Botan::get_emsa(), Botan::Library_State::global_rng(), Botan::Global_State_Management::global_state(), and Botan::Algorithm_Factory::Engine_Iterator::next().

127  {
128  Algorithm_Factory::Engine_Iterator i(global_state().algorithm_factory());
129  RandomNumberGenerator& rng = global_state().global_rng();
130 
131  m_op = nullptr;
132  m_verify_op = nullptr;
133 
134  while(const Engine* engine = i.next())
135  {
136  if(!m_op)
137  m_op.reset(engine->get_signature_op(key, emsa_name, rng));
138 
139  if(!m_verify_op && prot == ENABLE_FAULT_PROTECTION)
140  m_verify_op.reset(engine->get_verify_op(key, emsa_name, rng));
141 
142  if(m_op && (m_verify_op || prot == DISABLE_FAULT_PROTECTION))
143  break;
144  }
145 
146  if(!m_op || (!m_verify_op && prot == ENABLE_FAULT_PROTECTION))
147  throw Lookup_Error("Signing with " + key.algo_name() + " not supported");
148 
149  m_emsa.reset(get_emsa(emsa_name));
150  m_sig_format = format;
151  }
RandomNumberGenerator & global_rng()
Definition: libstate.cpp:56
friend class Engine_Iterator
Definition: algo_factory.h:205
Library_State & global_state()
BOTAN_DLL EMSA * get_emsa(const std::string &algo_spec)
Definition: get_pk_pad.cpp:50

Member Function Documentation

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 186 of file pubkey.h.

186 { m_sig_format = format; }
std::vector< byte > Botan::PK_Signer::sign_message ( const byte  in[],
size_t  length,
RandomNumberGenerator rng 
)

Sign a message.

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

Definition at line 156 of file pubkey.cpp.

References signature(), and update().

Referenced by Botan::TLS::Certificate_Verify::Certificate_Verify(), Botan::EAC1_1_ADO::make_signed(), Botan::X509_Object::make_signed(), Botan::EAC1_1_gen_CVC< Derived >::make_signed(), and Botan::KeyPair::signature_consistency_check().

158  {
159  update(msg, length);
160  return signature(rng);
161  }
std::vector< byte > signature(RandomNumberGenerator &rng)
Definition: pubkey.cpp:206
void update(byte in)
Definition: pubkey.h:159
std::vector<byte> Botan::PK_Signer::sign_message ( const std::vector< byte > &  in,
RandomNumberGenerator rng 
)
inline

Sign a message.

Parameters
inthe message to sign
rngthe rng to use
Returns
signature

Definition at line 147 of file pubkey.h.

149  { return sign_message(&in[0], in.size(), rng); }
std::vector< byte > sign_message(const byte in[], size_t length, RandomNumberGenerator &rng)
Definition: pubkey.cpp:156
std::vector<byte> Botan::PK_Signer::sign_message ( const secure_vector< byte > &  in,
RandomNumberGenerator rng 
)
inline

Definition at line 151 of file pubkey.h.

153  { return sign_message(&in[0], in.size(), rng); }
std::vector< byte > sign_message(const byte in[], size_t length, RandomNumberGenerator &rng)
Definition: pubkey.cpp:156
std::vector< byte > Botan::PK_Signer::signature ( RandomNumberGenerator rng)

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

Parameters
rngthe rng to use
Returns
signature of the total message

Definition at line 206 of file pubkey.cpp.

References BOTAN_ASSERT, Botan::DER_SEQUENCE, Botan::DER_Encoder::encode_list(), Botan::DER_Encoder::end_cons(), Botan::DER_Encoder::get_contents_unlocked(), Botan::IEEE_1363, Botan::SEQUENCE, Botan::DER_Encoder::start_cons(), Botan::ASN1::to_string(), and Botan::unlock().

Referenced by Botan::TLS::Server_Key_Exchange::Server_Key_Exchange(), and sign_message().

207  {
208  std::vector<byte> encoded = unlock(m_emsa->encoding_of(m_emsa->raw_data(),
209  m_op->max_input_bits(),
210  rng));
211 
212  std::vector<byte> plain_sig = unlock(m_op->sign(&encoded[0], encoded.size(), rng));
213 
214  BOTAN_ASSERT(self_test_signature(encoded, plain_sig), "Signature was consistent");
215 
216  if(m_op->message_parts() == 1 || m_sig_format == IEEE_1363)
217  return plain_sig;
218 
219  if(m_sig_format == DER_SEQUENCE)
220  {
221  if(plain_sig.size() % m_op->message_parts())
222  throw Encoding_Error("PK_Signer: strange signature size found");
223  const size_t SIZE_OF_PART = plain_sig.size() / m_op->message_parts();
224 
225  std::vector<BigInt> sig_parts(m_op->message_parts());
226  for(size_t j = 0; j != sig_parts.size(); ++j)
227  sig_parts[j].binary_decode(&plain_sig[SIZE_OF_PART*j], SIZE_OF_PART);
228 
229  return DER_Encoder()
230  .start_cons(SEQUENCE)
231  .encode_list(sig_parts)
232  .end_cons()
233  .get_contents_unlocked();
234  }
235  else
236  throw Encoding_Error("PK_Signer: Unknown signature format " +
237  std::to_string(m_sig_format));
238  }
std::string to_string(const BER_Object &obj)
Definition: asn1_obj.cpp:46
#define BOTAN_ASSERT(expr, assertion_made)
Definition: assert.h:27
std::vector< T > unlock(const secure_vector< T > &in)
Definition: secmem.h:95
void Botan::PK_Signer::update ( byte  in)
inline

Add a message part (single byte).

Parameters
inthe byte to add

Definition at line 159 of file pubkey.h.

References update().

Referenced by Botan::TLS::Server_Key_Exchange::Server_Key_Exchange(), sign_message(), and update().

159 { update(&in, 1); }
void update(byte in)
Definition: pubkey.h:159
void Botan::PK_Signer::update ( const byte  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 166 of file pubkey.cpp.

167  {
168  m_emsa->update(in, length);
169  }
void Botan::PK_Signer::update ( const std::vector< byte > &  in)
inline

Add a message part.

Parameters
inthe message part to add

Definition at line 172 of file pubkey.h.

References update().

Referenced by update().

172 { update(&in[0], in.size()); }
void update(byte in)
Definition: pubkey.h:159

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