]> Git Repo - VerusCoin.git/blob - src/wallet/paymentdisclosure.cpp
Merge pull request #97 from miketout/dev
[VerusCoin.git] / src / wallet / paymentdisclosure.cpp
1 // Copyright (c) 2017 The Zcash developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or https://www.opensource.org/licenses/mit-license.php .
4
5 #include "wallet/paymentdisclosure.h"
6
7 #include "key_io.h"
8 #include "util.h"
9
10 std::string PaymentDisclosureInfo::ToString() const {
11     return strprintf("PaymentDisclosureInfo(version=%d, esk=%s, joinSplitPrivKey=<omitted>, address=%s)",
12         version, esk.ToString(), EncodePaymentAddress(zaddr));
13 }
14
15 std::string PaymentDisclosure::ToString() const {
16     std::string s = HexStr(payloadSig.begin(), payloadSig.end());
17     return strprintf("PaymentDisclosure(payload=%s, payloadSig=%s)", payload.ToString(), s);
18 }
19
20 std::string PaymentDisclosurePayload::ToString() const {
21     return strprintf("PaymentDisclosurePayload(version=%d, esk=%s, txid=%s, js=%d, n=%d, address=%s, message=%s)",
22         version, esk.ToString(), txid.ToString(), js, n, EncodePaymentAddress(zaddr), message);
23 }
24
25 PaymentDisclosure::PaymentDisclosure(const uint256 &joinSplitPubKey, const PaymentDisclosureKey &key, const PaymentDisclosureInfo &info, const std::string &message)
26 {
27     // Populate payload member variable
28     payload.version = info.version; // experimental = 0, production = 1 etc.
29     payload.esk = info.esk;
30     payload.txid = key.hash;
31     payload.js = key.js;
32     payload.n = key.n;
33     payload.zaddr = info.zaddr;
34     payload.message = message;
35
36     // Serialize and hash the payload to generate a signature
37     uint256 dataToBeSigned = SerializeHash(payload, SER_GETHASH, 0);
38
39     LogPrint("paymentdisclosure", "Payment Disclosure: signing raw payload = %s\n", dataToBeSigned.ToString());
40
41     // Prepare buffer to store ed25519 key pair in libsodium-compatible format
42     unsigned char bufferKeyPair[64];
43     memcpy(&bufferKeyPair[0], info.joinSplitPrivKey.begin(), 32);
44     memcpy(&bufferKeyPair[32], joinSplitPubKey.begin(), 32);
45
46     // Compute payload signature member variable
47     if (!(crypto_sign_detached(payloadSig.data(), NULL,
48                                dataToBeSigned.begin(), 32,
49                                &bufferKeyPair[0]
50                                ) == 0))
51     {
52         throw std::runtime_error("crypto_sign_detached failed");
53     }
54
55     // Sanity check
56     if (!(crypto_sign_verify_detached(payloadSig.data(),
57                                       dataToBeSigned.begin(), 32,
58                                       joinSplitPubKey.begin()) == 0))
59     {
60         throw std::runtime_error("crypto_sign_verify_detached failed");
61     }
62
63     std::string sigString = HexStr(payloadSig.data(), payloadSig.data() + payloadSig.size());
64     LogPrint("paymentdisclosure", "Payment Disclosure: signature = %s\n", sigString);
65 }
This page took 0.028285 seconds and 4 git commands to generate.