1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
/*
* (C) 2014,2015 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#include "tests.h"
#if defined(BOTAN_HAS_RFC6979_GENERATOR)
#include <botan/rfc6979.h>
#include <botan/hex.h>
#endif
#include <iostream>
namespace {
size_t rfc6979_testcase(const std::string& q_str,
const std::string& x_str,
const std::string& h_str,
const std::string& exp_k_str,
const std::string& hash,
size_t testcase)
{
size_t fails = 0;
#if defined(BOTAN_HAS_RFC6979_GENERATOR)
using namespace Botan;
const BigInt q(q_str);
const BigInt x(x_str);
const BigInt h(h_str);
const BigInt exp_k(exp_k_str);
const BigInt gen_k = generate_rfc6979_nonce(x, q, h, hash);
if(gen_k != exp_k)
{
std::cout << "RFC 6979 test #" << testcase << " failed; generated k="
<< std::hex << gen_k << "\n";
++fails;
}
RFC6979_Nonce_Generator gen(hash, q, x);
const BigInt gen_0 = gen.nonce_for(h);
if(gen_0 != exp_k)
{
std::cout << "RFC 6979 test #" << testcase << " failed; generated k="
<< std::hex << gen_0 << " (gen_0)\n";
++fails;
}
const BigInt gen_1 = gen.nonce_for(h+1);
if(gen_1 == exp_k)
{
std::cout << "RFC 6979 test #" << testcase << " failed; generated k="
<< std::hex << gen_1 << " (gen_1)\n";
++fails;
}
const BigInt gen_2 = gen.nonce_for(h);
if(gen_2 != exp_k)
{
std::cout << "RFC 6979 test #" << testcase << " failed; generated k="
<< std::hex << gen_2 << " (gen_2)\n";
++fails;
}
#endif
return fails;
}
}
size_t test_rfc6979()
{
using namespace Botan;
size_t fails = 0;
#if defined(BOTAN_HAS_RFC6979_GENERATOR)
// From RFC 6979 A.1.1
fails += rfc6979_testcase("0x4000000000000000000020108A2E0CC0D99F8A5EF",
"0x09A4D6792295A7F730FC3F2B49CBC0F62E862272F",
"0x01795EDF0D54DB760F156D0DAC04C0322B3A204224",
"0x23AF4074C90A02B3FE61D286D5C87F425E6BDD81B",
"SHA-256", 1);
// DSA 1024 bits test #1
fails += rfc6979_testcase("0x996F967F6C8E388D9E28D01E205FBA957A5698B1",
"0x411602CB19A6CCC34494D79D98EF1E7ED5AF25F7",
"0x8151325DCDBAE9E0FF95F9F9658432DBEDFDB209",
"0x7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B",
"SHA-1", 2);
#endif
test_report("RFC 6979", 2, fails);
return fails;
}
|