|
| 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 ("5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj"); |
| 14 | +static const string strSecret2 ("5KC4ejrDjv152FGwP386VD1i2NYc5KkfSMyv1nGy1VGDxGHqVY3"); |
| 15 | +static const string strSecret1C("Kwr371tjA9u2rFSMZjTNun2PXXP3WPZu2afRHTcta6KxEUdm1vEw"); |
| 16 | +static const string strSecret2C("L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g"); |
| 17 | + |
| 18 | +#ifdef KEY_TESTS_DUMPINFO |
| 19 | +void dumpKeyInfo(uint256 privkey) |
| 20 | +{ |
| 21 | + CSecret secret; |
| 22 | + secret.resize(32); |
| 23 | + memcpy(&secret[0], &privkey, 32); |
| 24 | + vector<unsigned char> sec; |
| 25 | + sec.resize(32); |
| 26 | + memcpy(&sec[0], &secret[0], 32); |
| 27 | + printf(" * secret (hex): %s\n", HexStr(sec).c_str()); |
| 28 | + |
| 29 | + for (int nCompressed=0; nCompressed<2; nCompressed++) |
| 30 | + { |
| 31 | + bool fCompressed = nCompressed == 1; |
| 32 | + printf(" * %s:\n", fCompressed ? "compressed" : "uncompressed"); |
| 33 | + CBitcoinSecret bsecret; |
| 34 | + bsecret.SetSecret(secret, fCompressed); |
| 35 | + printf(" * secret (base58): %s\n", bsecret.ToString().c_str()); |
| 36 | + CKey key; |
| 37 | + key.SetSecret(secret, fCompressed); |
| 38 | + vector<unsigned char> vchPubKey = key.GetPubKey(); |
| 39 | + printf(" * pubkey (hex): %s\n", HexStr(vchPubKey).c_str()); |
| 40 | + printf(" * address (base58): %s\n", CBitcoinAddress(vchPubKey).ToString().c_str()); |
| 41 | + } |
| 42 | +} |
| 43 | +#endif |
| 44 | + |
| 45 | + |
| 46 | +BOOST_AUTO_TEST_SUITE(key_tests) |
| 47 | + |
| 48 | +BOOST_AUTO_TEST_CASE(key_test1) |
| 49 | +{ |
| 50 | + CBitcoinSecret bsecret1, bsecret2, bsecret1C, bsecret2C; |
| 51 | + bsecret1.SetString (strSecret1); |
| 52 | + bsecret2.SetString (strSecret2); |
| 53 | + bsecret1C.SetString(strSecret1C); |
| 54 | + bsecret2C.SetString(strSecret2C); |
| 55 | + |
| 56 | + bool fCompressed; |
| 57 | + CSecret secret1 = bsecret1.GetSecret (fCompressed); |
| 58 | + BOOST_CHECK(fCompressed == false); |
| 59 | + CSecret secret2 = bsecret2.GetSecret (fCompressed); |
| 60 | + BOOST_CHECK(fCompressed == false); |
| 61 | + CSecret secret1C = bsecret1C.GetSecret(fCompressed); |
| 62 | + BOOST_CHECK(fCompressed == true); |
| 63 | + CSecret secret2C = bsecret2C.GetSecret(fCompressed); |
| 64 | + BOOST_CHECK(fCompressed == true); |
| 65 | + |
| 66 | + BOOST_CHECK(secret1 == secret1C); |
| 67 | + BOOST_CHECK(secret2 == secret2C); |
| 68 | + |
| 69 | + CKey key1, key2, key1C, key2C; |
| 70 | + key1.SetSecret(secret1, false); |
| 71 | + key2.SetSecret(secret2, false); |
| 72 | + key1C.SetSecret(secret1, true); |
| 73 | + key2C.SetSecret(secret2, true); |
| 74 | + |
| 75 | + BOOST_CHECK(CBitcoinAddress(key1.GetPubKey ()).ToString() == "1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ"); |
| 76 | + BOOST_CHECK(CBitcoinAddress(key2.GetPubKey ()).ToString() == "1F5y5E5FMc5YzdJtB9hLaUe43GDxEKXENJ"); |
| 77 | + BOOST_CHECK(CBitcoinAddress(key1C.GetPubKey()).ToString() == "1NoJrossxPBKfCHuJXT4HadJrXRE9Fxiqs"); |
| 78 | + BOOST_CHECK(CBitcoinAddress(key2C.GetPubKey()).ToString() == "1CRj2HyM1CXWzHAXLQtiGLyggNT9WQqsDs"); |
| 79 | + |
| 80 | + for (int n=0; n<16; n++) |
| 81 | + { |
| 82 | + string strMsg = strprintf("Very secret message %i: 11", n); |
| 83 | + uint256 hashMsg = Hash(strMsg.begin(), strMsg.end()); |
| 84 | + |
| 85 | + // normal signatures |
| 86 | + |
| 87 | + vector<unsigned char> sign1, sign2, sign1C, sign2C; |
| 88 | + |
| 89 | + BOOST_CHECK(key1.Sign (hashMsg, sign1)); |
| 90 | + BOOST_CHECK(key2.Sign (hashMsg, sign2)); |
| 91 | + BOOST_CHECK(key1C.Sign(hashMsg, sign1C)); |
| 92 | + BOOST_CHECK(key2C.Sign(hashMsg, sign2C)); |
| 93 | + |
| 94 | + BOOST_CHECK( key1.Verify(hashMsg, sign1)); |
| 95 | + BOOST_CHECK(!key1.Verify(hashMsg, sign2)); |
| 96 | + BOOST_CHECK( key1.Verify(hashMsg, sign1C)); |
| 97 | + BOOST_CHECK(!key1.Verify(hashMsg, sign2C)); |
| 98 | + |
| 99 | + BOOST_CHECK(!key2.Verify(hashMsg, sign1)); |
| 100 | + BOOST_CHECK( key2.Verify(hashMsg, sign2)); |
| 101 | + BOOST_CHECK(!key2.Verify(hashMsg, sign1C)); |
| 102 | + BOOST_CHECK( key2.Verify(hashMsg, sign2C)); |
| 103 | + |
| 104 | + BOOST_CHECK( key1C.Verify(hashMsg, sign1)); |
| 105 | + BOOST_CHECK(!key1C.Verify(hashMsg, sign2)); |
| 106 | + BOOST_CHECK( key1C.Verify(hashMsg, sign1C)); |
| 107 | + BOOST_CHECK(!key1C.Verify(hashMsg, sign2C)); |
| 108 | + |
| 109 | + BOOST_CHECK(!key2C.Verify(hashMsg, sign1)); |
| 110 | + BOOST_CHECK( key2C.Verify(hashMsg, sign2)); |
| 111 | + BOOST_CHECK(!key2C.Verify(hashMsg, sign1C)); |
| 112 | + BOOST_CHECK( key2C.Verify(hashMsg, sign2C)); |
| 113 | + |
| 114 | + // compact signatures (with key recovery) |
| 115 | + |
| 116 | + vector<unsigned char> csign1, csign2, csign1C, csign2C; |
| 117 | + |
| 118 | + BOOST_CHECK(key1.SignCompact (hashMsg, csign1)); |
| 119 | + BOOST_CHECK(key2.SignCompact (hashMsg, csign2)); |
| 120 | + BOOST_CHECK(key1C.SignCompact(hashMsg, csign1C)); |
| 121 | + BOOST_CHECK(key2C.SignCompact(hashMsg, csign2C)); |
| 122 | + |
| 123 | + CKey rkey1, rkey2, rkey1C, rkey2C; |
| 124 | + |
| 125 | + BOOST_CHECK(rkey1.SetCompactSignature (hashMsg, csign1)); |
| 126 | + BOOST_CHECK(rkey2.SetCompactSignature (hashMsg, csign2)); |
| 127 | + BOOST_CHECK(rkey1C.SetCompactSignature(hashMsg, csign1C)); |
| 128 | + BOOST_CHECK(rkey2C.SetCompactSignature(hashMsg, csign2C)); |
| 129 | + |
| 130 | + |
| 131 | + BOOST_CHECK(rkey1.GetPubKey() == key1.GetPubKey()); |
| 132 | + BOOST_CHECK(rkey2.GetPubKey() == key2.GetPubKey()); |
| 133 | + BOOST_CHECK(rkey1C.GetPubKey() == key1C.GetPubKey()); |
| 134 | + BOOST_CHECK(rkey2C.GetPubKey() == key2C.GetPubKey()); |
| 135 | + } |
| 136 | +} |
| 137 | + |
| 138 | +BOOST_AUTO_TEST_SUITE_END() |
0 commit comments