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 .
5 #include "wallet/paymentdisclosure.h"
10 std::string PaymentDisclosureInfo::ToString() const {
11 return strprintf("PaymentDisclosureInfo(version=%d, esk=%s, joinSplitPrivKey=<omitted>, address=%s)",
12 version, esk.ToString(), EncodePaymentAddress(zaddr));
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);
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);
25 PaymentDisclosure::PaymentDisclosure(const uint256 &joinSplitPubKey, const PaymentDisclosureKey &key, const PaymentDisclosureInfo &info, const std::string &message)
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;
33 payload.zaddr = info.zaddr;
34 payload.message = message;
36 // Serialize and hash the payload to generate a signature
37 uint256 dataToBeSigned = SerializeHash(payload, SER_GETHASH, 0);
39 LogPrint("paymentdisclosure", "Payment Disclosure: signing raw payload = %s\n", dataToBeSigned.ToString());
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);
46 // Compute payload signature member variable
47 if (!(crypto_sign_detached(payloadSig.data(), NULL,
48 dataToBeSigned.begin(), 32,
52 throw std::runtime_error("crypto_sign_detached failed");
56 if (!(crypto_sign_verify_detached(payloadSig.data(),
57 dataToBeSigned.begin(), 32,
58 joinSplitPubKey.begin()) == 0))
60 throw std::runtime_error("crypto_sign_verify_detached failed");
63 std::string sigString = HexStr(payloadSig.data(), payloadSig.data() + payloadSig.size());
64 LogPrint("paymentdisclosure", "Payment Disclosure: signature = %s\n", sigString);