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