~ubuntu-branches/debian/sid/botan/sid

« back to all changes in this revision

Viewing changes to src/lib/pubkey/rfc6979/rfc6979.cpp

  • Committer: Package Import Robot
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2018-03-01 22:23:25 UTC
  • mfrom: (1.2.2)
  • Revision ID: package-import@ubuntu.com-20180301222325-7p7vc45gu3hta34d
Tags: 2.4.0-2
* Don't remove .doctrees from the manual if it doesn't exist.
* Don't specify parallel to debhelper.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
* RFC 6979 Deterministic Nonce Generator
 
3
* (C) 2014,2015 Jack Lloyd
 
4
*
 
5
* Botan is released under the Simplified BSD License (see license.txt)
 
6
*/
 
7
 
 
8
#include <botan/rfc6979.h>
 
9
#include <botan/hmac_drbg.h>
 
10
#include <botan/mac.h>
 
11
 
 
12
namespace Botan {
 
13
 
 
14
RFC6979_Nonce_Generator::RFC6979_Nonce_Generator(const std::string& hash,
 
15
                                                 const BigInt& order,
 
16
                                                 const BigInt& x) :
 
17
   m_order(order),
 
18
   m_qlen(m_order.bits()),
 
19
   m_rlen(m_qlen / 8 + (m_qlen % 8 ? 1 : 0)),
 
20
   m_rng_in(m_rlen * 2),
 
21
   m_rng_out(m_rlen)
 
22
   {
 
23
   m_hmac_drbg.reset(new HMAC_DRBG(MessageAuthenticationCode::create("HMAC(" + hash + ")")));
 
24
   BigInt::encode_1363(m_rng_in.data(), m_rlen, x);
 
25
   }
 
26
 
 
27
RFC6979_Nonce_Generator::~RFC6979_Nonce_Generator()
 
28
   {
 
29
   // for ~unique_ptr
 
30
   }
 
31
 
 
32
const BigInt& RFC6979_Nonce_Generator::nonce_for(const BigInt& m)
 
33
   {
 
34
   BigInt::encode_1363(&m_rng_in[m_rlen], m_rlen, m);
 
35
   m_hmac_drbg->clear();
 
36
   m_hmac_drbg->initialize_with(m_rng_in.data(), m_rng_in.size());
 
37
 
 
38
   do
 
39
      {
 
40
      m_hmac_drbg->randomize(m_rng_out.data(), m_rng_out.size());
 
41
      m_k.binary_decode(m_rng_out.data(), m_rng_out.size());
 
42
      m_k >>= (8*m_rlen - m_qlen);
 
43
      }
 
44
   while(m_k == 0 || m_k >= m_order);
 
45
 
 
46
   return m_k;
 
47
   }
 
48
 
 
49
BigInt generate_rfc6979_nonce(const BigInt& x,
 
50
                              const BigInt& q,
 
51
                              const BigInt& h,
 
52
                              const std::string& hash)
 
53
   {
 
54
   RFC6979_Nonce_Generator gen(hash, q, x);
 
55
   BigInt k = gen.nonce_for(h);
 
56
   return k;
 
57
   }
 
58
 
 
59
}