Botan  1.11.10
emsa1.cpp
Go to the documentation of this file.
1 /*
2 * EMSA1
3 * (C) 1999-2007 Jack Lloyd
4 *
5 * Distributed under the terms of the Botan license
6 */
7 
8 #include <botan/emsa1.h>
9 
10 namespace Botan {
11 
12 namespace {
13 
14 secure_vector<byte> emsa1_encoding(const secure_vector<byte>& msg,
15  size_t output_bits)
16  {
17  if(8*msg.size() <= output_bits)
18  return msg;
19 
20  size_t shift = 8*msg.size() - output_bits;
21 
22  size_t byte_shift = shift / 8, bit_shift = shift % 8;
23  secure_vector<byte> digest(msg.size() - byte_shift);
24 
25  for(size_t j = 0; j != msg.size() - byte_shift; ++j)
26  digest[j] = msg[j];
27 
28  if(bit_shift)
29  {
30  byte carry = 0;
31  for(size_t j = 0; j != digest.size(); ++j)
32  {
33  byte temp = digest[j];
34  digest[j] = (temp >> bit_shift) | carry;
35  carry = (temp << (8 - bit_shift));
36  }
37  }
38  return digest;
39  }
40 
41 }
42 
43 void EMSA1::update(const byte input[], size_t length)
44  {
45  m_hash->update(input, length);
46  }
47 
48 secure_vector<byte> EMSA1::raw_data()
49  {
50  return m_hash->final();
51  }
52 
53 secure_vector<byte> EMSA1::encoding_of(const secure_vector<byte>& msg,
54  size_t output_bits,
55  RandomNumberGenerator&)
56  {
57  if(msg.size() != hash_output_length())
58  throw Encoding_Error("EMSA1::encoding_of: Invalid size for input");
59  return emsa1_encoding(msg, output_bits);
60  }
61 
62 bool EMSA1::verify(const secure_vector<byte>& coded,
63  const secure_vector<byte>& raw, size_t key_bits)
64  {
65  try {
66  if(raw.size() != m_hash->output_length())
67  throw Encoding_Error("EMSA1::encoding_of: Invalid size for input");
68 
69  secure_vector<byte> our_coding = emsa1_encoding(raw, key_bits);
70 
71  if(our_coding == coded) return true;
72  if(our_coding.empty() || our_coding[0] != 0) return false;
73  if(our_coding.size() <= coded.size()) return false;
74 
75  size_t offset = 0;
76  while(offset < our_coding.size() && our_coding[offset] == 0)
77  ++offset;
78  if(our_coding.size() - offset != coded.size())
79  return false;
80 
81  for(size_t j = 0; j != coded.size(); ++j)
82  if(coded[j] != our_coding[j+offset])
83  return false;
84 
85  return true;
86  }
87  catch(Invalid_Argument)
88  {
89  return false;
90  }
91  }
92 
93 }
size_t hash_output_length() const
Definition: emsa1.h:29
std::invalid_argument Invalid_Argument
Definition: exceptn.h:20
uint8_t byte
Definition: types.h:30