Feathercoin  0.5.0
P2P Digital Currency
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
key_tests.cpp
Go to the documentation of this file.
1 #include <boost/test/unit_test.hpp>
2 
3 #include <string>
4 #include <vector>
5 
6 #include "key.h"
7 #include "base58.h"
8 #include "uint256.h"
9 #include "util.h"
10 
11 using namespace std;
12 
13 static const string strSecret1 ("6uu5bsZLA2Lm6yCxgwxDxHyZmhYeqBMLQT83Fyq738YhYucQPQf");
14 static const string strSecret2 ("6vZDRwYgTNidWzmKs9x8QzQGeWCqbdUtNRpEKZMaP67ZSn8XMjb");
15 static const string strSecret1C ("T6UsJv9hYpvDfM5noKYkB3vfeHxhyegkeWJ4y7qKeQJuyXMK11XX");
16 static const string strSecret2C ("T9PBs5kq9QrkBPxeGNWKitMi4XuFVr25jaXTnuopLVZxCUAJbixA");
17 static const CBitcoinAddress addr1 ("LWaFezDtucfCA4xcVEfs3R3xfgGWjSwcZr");
18 static const CBitcoinAddress addr2 ("LXwHM6mRd432EzLJYwuKQMPhTzrgr7ur9K");
19 static const CBitcoinAddress addr1C("LZWK8h7C166niP6GmpUmiGrvn4oxPqQgFV");
20 static const CBitcoinAddress addr2C("Lgb6tdqmdW3n5E12johSuEAqRMt4kAr7yu");
21 
22 
23 static const string strAddressBad("LRjyUS2uuieEPkhZNdQz8hE5YycxVEqSXA");
24 
25 
26 #ifdef KEY_TESTS_DUMPINFO
27 void dumpKeyInfo(uint256 privkey)
28 {
29  CKey key;
30  key.resize(32);
31  memcpy(&secret[0], &privkey, 32);
32  vector<unsigned char> sec;
33  sec.resize(32);
34  memcpy(&sec[0], &secret[0], 32);
35  printf(" * secret (hex): %s\n", HexStr(sec).c_str());
36 
37  for (int nCompressed=0; nCompressed<2; nCompressed++)
38  {
39  bool fCompressed = nCompressed == 1;
40  printf(" * %s:\n", fCompressed ? "compressed" : "uncompressed");
41  CBitcoinSecret bsecret;
42  bsecret.SetSecret(secret, fCompressed);
43  printf(" * secret (base58): %s\n", bsecret.ToString().c_str());
44  CKey key;
45  key.SetSecret(secret, fCompressed);
46  vector<unsigned char> vchPubKey = key.GetPubKey();
47  printf(" * pubkey (hex): %s\n", HexStr(vchPubKey).c_str());
48  printf(" * address (base58): %s\n", CBitcoinAddress(vchPubKey).ToString().c_str());
49  }
50 }
51 #endif
52 
53 
54 BOOST_AUTO_TEST_SUITE(key_tests)
55 
57 {
58  CBitcoinSecret bsecret1, bsecret2, bsecret1C, bsecret2C, baddress1;
59  BOOST_CHECK( bsecret1.SetString (strSecret1));
60  BOOST_CHECK( bsecret2.SetString (strSecret2));
61  BOOST_CHECK( bsecret1C.SetString(strSecret1C));
62  BOOST_CHECK( bsecret2C.SetString(strSecret2C));
63  BOOST_CHECK(!baddress1.SetString(strAddressBad));
64 
65  CKey key1 = bsecret1.GetKey();
66  BOOST_CHECK(key1.IsCompressed() == false);
67  CKey key2 = bsecret2.GetKey();
68  BOOST_CHECK(key2.IsCompressed() == false);
69  CKey key1C = bsecret1C.GetKey();
70  BOOST_CHECK(key1C.IsCompressed() == true);
71  CKey key2C = bsecret2C.GetKey();
72  BOOST_CHECK(key1C.IsCompressed() == true);
73 
74  CPubKey pubkey1 = key1. GetPubKey();
75  CPubKey pubkey2 = key2. GetPubKey();
76  CPubKey pubkey1C = key1C.GetPubKey();
77  CPubKey pubkey2C = key2C.GetPubKey();
78 
79  BOOST_CHECK(addr1.Get() == CTxDestination(pubkey1.GetID()));
80  BOOST_CHECK(addr2.Get() == CTxDestination(pubkey2.GetID()));
81  BOOST_CHECK(addr1C.Get() == CTxDestination(pubkey1C.GetID()));
82  BOOST_CHECK(addr2C.Get() == CTxDestination(pubkey2C.GetID()));
83 
84  for (int n=0; n<16; n++)
85  {
86  string strMsg = strprintf("Very secret message %i: 11", n);
87  uint256 hashMsg = Hash(strMsg.begin(), strMsg.end());
88 
89  // normal signatures
90 
91  vector<unsigned char> sign1, sign2, sign1C, sign2C;
92 
93  BOOST_CHECK(key1.Sign (hashMsg, sign1));
94  BOOST_CHECK(key2.Sign (hashMsg, sign2));
95  BOOST_CHECK(key1C.Sign(hashMsg, sign1C));
96  BOOST_CHECK(key2C.Sign(hashMsg, sign2C));
97 
98  BOOST_CHECK( pubkey1.Verify(hashMsg, sign1));
99  BOOST_CHECK(!pubkey1.Verify(hashMsg, sign2));
100  BOOST_CHECK( pubkey1.Verify(hashMsg, sign1C));
101  BOOST_CHECK(!pubkey1.Verify(hashMsg, sign2C));
102 
103  BOOST_CHECK(!pubkey2.Verify(hashMsg, sign1));
104  BOOST_CHECK( pubkey2.Verify(hashMsg, sign2));
105  BOOST_CHECK(!pubkey2.Verify(hashMsg, sign1C));
106  BOOST_CHECK( pubkey2.Verify(hashMsg, sign2C));
107 
108  BOOST_CHECK( pubkey1C.Verify(hashMsg, sign1));
109  BOOST_CHECK(!pubkey1C.Verify(hashMsg, sign2));
110  BOOST_CHECK( pubkey1C.Verify(hashMsg, sign1C));
111  BOOST_CHECK(!pubkey1C.Verify(hashMsg, sign2C));
112 
113  BOOST_CHECK(!pubkey2C.Verify(hashMsg, sign1));
114  BOOST_CHECK( pubkey2C.Verify(hashMsg, sign2));
115  BOOST_CHECK(!pubkey2C.Verify(hashMsg, sign1C));
116  BOOST_CHECK( pubkey2C.Verify(hashMsg, sign2C));
117 
118  // compact signatures (with key recovery)
119 
120  vector<unsigned char> csign1, csign2, csign1C, csign2C;
121 
122  BOOST_CHECK(key1.SignCompact (hashMsg, csign1));
123  BOOST_CHECK(key2.SignCompact (hashMsg, csign2));
124  BOOST_CHECK(key1C.SignCompact(hashMsg, csign1C));
125  BOOST_CHECK(key2C.SignCompact(hashMsg, csign2C));
126 
127  CPubKey rkey1, rkey2, rkey1C, rkey2C;
128 
129  BOOST_CHECK(rkey1.RecoverCompact (hashMsg, csign1));
130  BOOST_CHECK(rkey2.RecoverCompact (hashMsg, csign2));
131  BOOST_CHECK(rkey1C.RecoverCompact(hashMsg, csign1C));
132  BOOST_CHECK(rkey2C.RecoverCompact(hashMsg, csign2C));
133 
134  BOOST_CHECK(rkey1 == pubkey1);
135  BOOST_CHECK(rkey2 == pubkey2);
136  BOOST_CHECK(rkey1C == pubkey1C);
137  BOOST_CHECK(rkey2C == pubkey2C);
138  }
139 }
140 
141 BOOST_AUTO_TEST_SUITE_END()
#define strprintf(format,...)
Definition: util.h:169
BOOST_AUTO_TEST_CASE(key_test1)
Definition: key_tests.cpp:56
CKey GetKey()
Definition: base58.h:415
CTxDestination Get() const
Definition: base58.h:345
bool SetString(const char *pszSecret)
Definition: base58.h:440
#define printf
Definition: rpcdump.cpp:12
CPubKey GetPubKey() const
Definition: key.cpp:312
A base58-encoded secret key.
Definition: base58.h:398
An encapsulated public key.
Definition: key.h:40
std::string ToString() const
Definition: base58.h:229
uint256 Hash(const T1 pbegin, const T1 pend)
Definition: hash.h:16
256-bit unsigned integer
Definition: uint256.h:537
boost::variant< CNoDestination, CKeyID, CScriptID > CTxDestination
A txout script template with a specific destination.
Definition: script.h:62
An encapsulated private key.
Definition: key.h:172
bool Verify(const uint256 &hash, const std::vector< unsigned char > &vchSig) const
Definition: key.cpp:343
std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
Definition: util.h:292
CKeyID GetID() const
Definition: key.h:129