Botan 2.19.2
Crypto and TLS for C&
blinding.cpp
Go to the documentation of this file.
1/*
2* Blinding for public key operations
3* (C) 1999-2010,2015 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/blinding.h>
9
10namespace Botan {
11
12Blinder::Blinder(const BigInt& modulus,
14 std::function<BigInt (const BigInt&)> fwd,
15 std::function<BigInt (const BigInt&)> inv) :
16 m_reducer(modulus),
17 m_rng(rng),
18 m_fwd_fn(fwd),
19 m_inv_fn(inv),
20 m_modulus_bits(modulus.bits()),
21 m_e{},
22 m_d{},
23 m_counter{}
24 {
25 const BigInt k = blinding_nonce();
26 m_e = m_fwd_fn(k);
27 m_d = m_inv_fn(k);
28 }
29
30BigInt Blinder::blinding_nonce() const
31 {
32 return BigInt(m_rng, m_modulus_bits - 1);
33 }
34
36 {
37 if(!m_reducer.initialized())
38 throw Invalid_State("Blinder not initialized, cannot blind");
39
40 ++m_counter;
41
42 if((BOTAN_BLINDING_REINIT_INTERVAL > 0) && (m_counter > BOTAN_BLINDING_REINIT_INTERVAL))
43 {
44 const BigInt k = blinding_nonce();
45 m_e = m_fwd_fn(k);
46 m_d = m_inv_fn(k);
47 m_counter = 0;
48 }
49 else
50 {
51 m_e = m_reducer.square(m_e);
52 m_d = m_reducer.square(m_d);
53 }
54
55 return m_reducer.multiply(i, m_e);
56 }
57
59 {
60 if(!m_reducer.initialized())
61 throw Invalid_State("Blinder not initialized, cannot unblind");
62
63 return m_reducer.multiply(i, m_d);
64 }
65
66}
BigInt blind(const BigInt &x) const
Definition: blinding.cpp:35
Blinder(const BigInt &modulus, RandomNumberGenerator &rng, std::function< BigInt(const BigInt &)> fwd_func, std::function< BigInt(const BigInt &)> inv_func)
Definition: blinding.cpp:12
BigInt unblind(const BigInt &x) const
Definition: blinding.cpp:58
BigInt square(const BigInt &x) const
Definition: reducer.h:39
BigInt multiply(const BigInt &x, const BigInt &y) const
Definition: reducer.h:31
bool initialized() const
Definition: reducer.h:58
Definition: alg_id.cpp:13