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