]> Git Repo - VerusCoin.git/blob - src/zcash/zip32.h
Merge pull request #97 from miketout/dev
[VerusCoin.git] / src / zcash / zip32.h
1 // Copyright (c) 2018 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 #ifndef ZCASH_ZIP32_H
6 #define ZCASH_ZIP32_H
7
8 #include "serialize.h"
9 #include "support/allocators/secure.h"
10 #include "uint256.h"
11 #include "zcash/Address.hpp"
12
13 #include <boost/optional.hpp>
14
15 const uint32_t ZIP32_HARDENED_KEY_LIMIT = 0x80000000;
16 const size_t ZIP32_XFVK_SIZE = 169;
17 const size_t ZIP32_XSK_SIZE = 169;
18
19 typedef std::vector<unsigned char, secure_allocator<unsigned char>> RawHDSeed;
20
21 class HDSeed {
22 private:
23     RawHDSeed seed;
24
25 public:
26     HDSeed() {}
27     HDSeed(RawHDSeed& seedIn) : seed(seedIn) {}
28
29     static HDSeed Random(size_t len = 32);
30     bool IsNull() const { return seed.empty(); };
31     uint256 Fingerprint() const;
32     RawHDSeed RawSeed() const { return seed; }
33
34     friend bool operator==(const HDSeed& a, const HDSeed& b)
35     {
36         return a.seed == b.seed;
37     }
38
39     friend bool operator!=(const HDSeed& a, const HDSeed& b)
40     {
41         return !(a == b);
42     }
43 };
44
45 // This is not part of ZIP 32, but is here because it's linked to the HD seed.
46 uint256 ovkForShieldingFromTaddr(HDSeed& seed);
47
48 namespace libzcash {
49
50 typedef blob88 diversifier_index_t;
51
52 struct SaplingExtendedFullViewingKey {
53     uint8_t depth;
54     uint32_t parentFVKTag;
55     uint32_t childIndex;
56     uint256 chaincode;
57     libzcash::SaplingFullViewingKey fvk;
58     uint256 dk;
59
60     ADD_SERIALIZE_METHODS;
61
62     template <typename Stream, typename Operation>
63     inline void SerializationOp(Stream& s, Operation ser_action) {
64         READWRITE(depth);
65         READWRITE(parentFVKTag);
66         READWRITE(childIndex);
67         READWRITE(chaincode);
68         READWRITE(fvk);
69         READWRITE(dk);
70     }
71
72     boost::optional<SaplingExtendedFullViewingKey> Derive(uint32_t i) const;
73
74     // Returns the first index starting from j that generates a valid
75     // payment address, along with the corresponding address. Returns
76     // an error if the diversifier space is exhausted.
77     boost::optional<std::pair<diversifier_index_t, libzcash::SaplingPaymentAddress>>
78         Address(diversifier_index_t j) const;
79
80     libzcash::SaplingPaymentAddress DefaultAddress() const;
81
82     friend inline bool operator==(const SaplingExtendedFullViewingKey& a, const SaplingExtendedFullViewingKey& b) {
83         return (
84             a.depth == b.depth &&
85             a.parentFVKTag == b.parentFVKTag &&
86             a.childIndex == b.childIndex &&
87             a.chaincode == b.chaincode &&
88             a.fvk == b.fvk &&
89             a.dk == b.dk);
90     }
91     friend inline bool operator<(const SaplingExtendedFullViewingKey& a, const SaplingExtendedFullViewingKey& b) {
92         return (a.depth < b.depth ||
93             (a.depth == b.depth && a.childIndex < b.childIndex) ||
94             (a.depth == b.depth && a.childIndex == b.childIndex && a.fvk < b.fvk));
95     }
96 };
97
98 struct SaplingExtendedSpendingKey {
99     uint8_t depth;
100     uint32_t parentFVKTag;
101     uint32_t childIndex;
102     uint256 chaincode;
103     libzcash::SaplingExpandedSpendingKey expsk;
104     uint256 dk;
105
106     ADD_SERIALIZE_METHODS;
107
108     template <typename Stream, typename Operation>
109     inline void SerializationOp(Stream& s, Operation ser_action) {
110         READWRITE(depth);
111         READWRITE(parentFVKTag);
112         READWRITE(childIndex);
113         READWRITE(chaincode);
114         READWRITE(expsk);
115         READWRITE(dk);
116     }
117
118     static SaplingExtendedSpendingKey Master(const HDSeed& seed);
119
120     SaplingExtendedSpendingKey Derive(uint32_t i) const;
121
122     SaplingExtendedFullViewingKey ToXFVK() const;
123
124     libzcash::SaplingPaymentAddress DefaultAddress() const;
125
126     friend bool operator==(const SaplingExtendedSpendingKey& a, const SaplingExtendedSpendingKey& b)
127     {
128         return a.depth == b.depth &&
129             a.parentFVKTag == b.parentFVKTag &&
130             a.childIndex == b.childIndex &&
131             a.chaincode == b.chaincode &&
132             a.expsk == b.expsk &&
133             a.dk == b.dk;
134     }
135 };
136
137 typedef boost::variant<InvalidEncoding, SproutSpendingKey, SaplingExtendedSpendingKey> SpendingKey;
138
139 }
140
141 /** Check whether a SpendingKey is not an InvalidEncoding. */
142 bool IsValidSpendingKey(const libzcash::SpendingKey& zkey);
143
144 #endif // ZCASH_ZIP32_H
This page took 0.032746 seconds and 4 git commands to generate.