LCOV - code coverage report
Current view: top level - src/test - key_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 93 93 100.0 %
Date: 2025-02-23 09:33:43 Functions: 2 2 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2012-2013 The Bitcoin Core developers
       2             : // Copyright (c) 2017-2021 The PIVX Core developers
       3             : // Distributed under the MIT/X11 software license, see the accompanying
       4             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5             : 
       6             : #include "key.h"
       7             : 
       8             : #include "base58.h"
       9             : #include "key_io.h"
      10             : #include "uint256.h"
      11             : #include "util/system.h"
      12             : #include "utilstrencodings.h"
      13             : #include "test_pivx.h"
      14             : 
      15             : #include <string>
      16             : #include <vector>
      17             : 
      18             : #include <boost/test/unit_test.hpp>
      19             : 
      20             : 
      21             : static const std::string strSecret1  = "87vK7Vayi3QLsuiva5yWSuVwSMhMcRM9dBsaD6JXMD1P5vnjRFn";
      22             : static const std::string strSecret2  = "87FGYGFDg5SYfdD4XL593hr7do6f52czPecVsYSAXi8N4RGeS9i";
      23             : static const std::string strSecret1C = "YRYJwfAyJ9c2jhi3T2xQyLijGvM7yLTw4izDaNQLxBzgUYrQiPmJ";
      24             : static const std::string strSecret2C = "YNZyazHkwUbkmUpEYsBGWwHnHQTy2n9rJy1gS5k54YXVx3pE8n6N";
      25             : static const std::string addr1 = "DBFi8XAE1rcdCQfkv9w22n8Y9RxgaJnrDD";
      26             : static const std::string addr2 = "DPvKfv1FVp69yZMDzeuugvfZ9pzYiMv1bs";
      27             : static const std::string addr1C = "DNPrHK9ezAAUVExFDpZ7EE1xWpPskgp1gP";
      28             : static const std::string addr2C = "DNBVSAoc2whPFjZVAZ1pQbXPJk1LRrDC8Q";
      29             : 
      30             : 
      31             : static const std::string strAddressBad ="Xta1praZQjyELweyMByXyiREw1ZRsjXzVP";
      32             : 
      33             : 
      34             : BOOST_FIXTURE_TEST_SUITE(key_tests, TestingSetup)
      35             : 
      36           2 : BOOST_AUTO_TEST_CASE(key_test1)
      37             : {
      38           1 :     CKey key1  = KeyIO::DecodeSecret(strSecret1);
      39           1 :     BOOST_CHECK(key1.IsValid() && !key1.IsCompressed());
      40           2 :     CKey key2  = KeyIO::DecodeSecret(strSecret2);
      41           2 :     BOOST_CHECK(key2.IsValid() && !key2.IsCompressed());
      42           2 :     CKey key1C = KeyIO::DecodeSecret(strSecret1C);
      43           2 :     BOOST_CHECK(key1C.IsValid() && key1C.IsCompressed());
      44           2 :     CKey key2C = KeyIO::DecodeSecret(strSecret2C);
      45           2 :     BOOST_CHECK(key2C.IsValid() && key2C.IsCompressed());
      46           2 :     CKey bad_key = KeyIO::DecodeSecret(strAddressBad);
      47           2 :     BOOST_CHECK(!bad_key.IsValid());
      48             : 
      49           1 :     CPubKey pubkey1  = key1. GetPubKey();
      50           1 :     CPubKey pubkey2  = key2. GetPubKey();
      51           1 :     CPubKey pubkey1C = key1C.GetPubKey();
      52           1 :     CPubKey pubkey2C = key2C.GetPubKey();
      53             : 
      54           2 :     BOOST_CHECK(key1.VerifyPubKey(pubkey1));
      55           2 :     BOOST_CHECK(!key1.VerifyPubKey(pubkey1C));
      56           2 :     BOOST_CHECK(!key1.VerifyPubKey(pubkey2));
      57           2 :     BOOST_CHECK(!key1.VerifyPubKey(pubkey2C));
      58             : 
      59           2 :     BOOST_CHECK(!key1C.VerifyPubKey(pubkey1));
      60           2 :     BOOST_CHECK(key1C.VerifyPubKey(pubkey1C));
      61           2 :     BOOST_CHECK(!key1C.VerifyPubKey(pubkey2));
      62           2 :     BOOST_CHECK(!key1C.VerifyPubKey(pubkey2C));
      63             : 
      64           2 :     BOOST_CHECK(!key2.VerifyPubKey(pubkey1));
      65           2 :     BOOST_CHECK(!key2.VerifyPubKey(pubkey1C));
      66           2 :     BOOST_CHECK(key2.VerifyPubKey(pubkey2));
      67           2 :     BOOST_CHECK(!key2.VerifyPubKey(pubkey2C));
      68             : 
      69           2 :     BOOST_CHECK(!key2C.VerifyPubKey(pubkey1));
      70           2 :     BOOST_CHECK(!key2C.VerifyPubKey(pubkey1C));
      71           2 :     BOOST_CHECK(!key2C.VerifyPubKey(pubkey2));
      72           2 :     BOOST_CHECK(key2C.VerifyPubKey(pubkey2C));
      73             : 
      74           2 :     BOOST_CHECK(DecodeDestination(addr1)  == CTxDestination(pubkey1.GetID()));
      75           2 :     BOOST_CHECK(DecodeDestination(addr2)  == CTxDestination(pubkey2.GetID()));
      76           2 :     BOOST_CHECK(DecodeDestination(addr1C) == CTxDestination(pubkey1C.GetID()));
      77           2 :     BOOST_CHECK(DecodeDestination(addr2C) == CTxDestination(pubkey2C.GetID()));
      78             : 
      79          17 :     for (int n=0; n<16; n++)
      80             :     {
      81          32 :         std::string strMsg = strprintf("Very secret message %i: 11", n);
      82          16 :         uint256 hashMsg = Hash(strMsg.begin(), strMsg.end());
      83             : 
      84             :         // normal signatures
      85             : 
      86          80 :         std::vector<unsigned char> sign1, sign2, sign1C, sign2C;
      87             : 
      88          32 :         BOOST_CHECK(key1.Sign (hashMsg, sign1));
      89          32 :         BOOST_CHECK(key2.Sign (hashMsg, sign2));
      90          32 :         BOOST_CHECK(key1C.Sign(hashMsg, sign1C));
      91          32 :         BOOST_CHECK(key2C.Sign(hashMsg, sign2C));
      92             : 
      93          32 :         BOOST_CHECK( pubkey1.Verify(hashMsg, sign1));
      94          32 :         BOOST_CHECK(!pubkey1.Verify(hashMsg, sign2));
      95          32 :         BOOST_CHECK( pubkey1.Verify(hashMsg, sign1C));
      96          32 :         BOOST_CHECK(!pubkey1.Verify(hashMsg, sign2C));
      97             : 
      98          32 :         BOOST_CHECK(!pubkey2.Verify(hashMsg, sign1));
      99          32 :         BOOST_CHECK( pubkey2.Verify(hashMsg, sign2));
     100          32 :         BOOST_CHECK(!pubkey2.Verify(hashMsg, sign1C));
     101          32 :         BOOST_CHECK( pubkey2.Verify(hashMsg, sign2C));
     102             : 
     103          32 :         BOOST_CHECK( pubkey1C.Verify(hashMsg, sign1));
     104          32 :         BOOST_CHECK(!pubkey1C.Verify(hashMsg, sign2));
     105          32 :         BOOST_CHECK( pubkey1C.Verify(hashMsg, sign1C));
     106          32 :         BOOST_CHECK(!pubkey1C.Verify(hashMsg, sign2C));
     107             : 
     108          32 :         BOOST_CHECK(!pubkey2C.Verify(hashMsg, sign1));
     109          32 :         BOOST_CHECK( pubkey2C.Verify(hashMsg, sign2));
     110          32 :         BOOST_CHECK(!pubkey2C.Verify(hashMsg, sign1C));
     111          32 :         BOOST_CHECK( pubkey2C.Verify(hashMsg, sign2C));
     112             : 
     113             :         // compact signatures (with key recovery)
     114             : 
     115          80 :         std::vector<unsigned char> csign1, csign2, csign1C, csign2C;
     116             : 
     117          32 :         BOOST_CHECK(key1.SignCompact (hashMsg, csign1));
     118          32 :         BOOST_CHECK(key2.SignCompact (hashMsg, csign2));
     119          32 :         BOOST_CHECK(key1C.SignCompact(hashMsg, csign1C));
     120          32 :         BOOST_CHECK(key2C.SignCompact(hashMsg, csign2C));
     121             : 
     122          16 :         CPubKey rkey1, rkey2, rkey1C, rkey2C;
     123             : 
     124          32 :         BOOST_CHECK(rkey1.RecoverCompact (hashMsg, csign1));
     125          32 :         BOOST_CHECK(rkey2.RecoverCompact (hashMsg, csign2));
     126          32 :         BOOST_CHECK(rkey1C.RecoverCompact(hashMsg, csign1C));
     127          32 :         BOOST_CHECK(rkey2C.RecoverCompact(hashMsg, csign2C));
     128             : 
     129          32 :         BOOST_CHECK(rkey1  == pubkey1);
     130          32 :         BOOST_CHECK(rkey2  == pubkey2);
     131          32 :         BOOST_CHECK(rkey1C == pubkey1C);
     132          32 :         BOOST_CHECK(rkey2C == pubkey2C);
     133             :     }
     134             : 
     135             :     // test deterministic signing
     136             : 
     137           3 :     std::vector<unsigned char> detsig, detsigc;
     138           2 :     std::string strMsg = "Very deterministic message";
     139           1 :     uint256 hashMsg = Hash(strMsg.begin(), strMsg.end());
     140           2 :     BOOST_CHECK(key1.Sign(hashMsg, detsig));
     141           2 :     BOOST_CHECK(key1C.Sign(hashMsg, detsigc));
     142           2 :     BOOST_CHECK(detsig == detsigc);
     143           3 :     BOOST_CHECK(detsig == ParseHex("30450221009071d4fead181ea197d6a23106c48ee5de25e023b38afaf71c170e3088e5238a02200dcbc7f1aad626a5ee812e08ef047114642538e423a94b4bd6a272731cf500d0"));
     144           2 :     BOOST_CHECK(key2.Sign(hashMsg, detsig));
     145           2 :     BOOST_CHECK(key2C.Sign(hashMsg, detsigc));
     146           2 :     BOOST_CHECK(detsig == detsigc);
     147           3 :     BOOST_CHECK(detsig == ParseHex("304402204f304f1b05599f88bc517819f6d43c69503baea5f253c55ea2d791394f7ce0de02204f23c0d4c1f4d7a89bf130fed755201d22581911a8a44cf594014794231d325a"));
     148           2 :     BOOST_CHECK(key1.SignCompact(hashMsg, detsig));
     149           2 :     BOOST_CHECK(key1C.SignCompact(hashMsg, detsigc));
     150           3 :     BOOST_CHECK(detsig == ParseHex("1b9071d4fead181ea197d6a23106c48ee5de25e023b38afaf71c170e3088e5238a0dcbc7f1aad626a5ee812e08ef047114642538e423a94b4bd6a272731cf500d0"));
     151           3 :     BOOST_CHECK(detsigc == ParseHex("1f9071d4fead181ea197d6a23106c48ee5de25e023b38afaf71c170e3088e5238a0dcbc7f1aad626a5ee812e08ef047114642538e423a94b4bd6a272731cf500d0"));
     152           2 :     BOOST_CHECK(key2.SignCompact(hashMsg, detsig));
     153           2 :     BOOST_CHECK(key2C.SignCompact(hashMsg, detsigc));
     154           3 :     BOOST_CHECK(detsig == ParseHex("1b4f304f1b05599f88bc517819f6d43c69503baea5f253c55ea2d791394f7ce0de4f23c0d4c1f4d7a89bf130fed755201d22581911a8a44cf594014794231d325a"));
     155           3 :     BOOST_CHECK(detsigc == ParseHex("1f4f304f1b05599f88bc517819f6d43c69503baea5f253c55ea2d791394f7ce0de4f23c0d4c1f4d7a89bf130fed755201d22581911a8a44cf594014794231d325a"));
     156           1 : }
     157             : 
     158             : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 1.14