Skip to content

Commit 88f52f0

Browse files
committed
Auto merge of zcash#3492 - str4d:zip32, r=str4d
Use ZIP 32 for all Sapling spending keys The wallet now only stores Sapling extended spending keys, and thus can only be used with keys generated from an HDSeed via ZIP 32. This means that all Sapling keys and addresses generated by users can be recovered as long as they have a backup that includes the seed. Depends on zcash/librustzcash#29 Closes zcash#3380.
2 parents edd3216 + 9454932 commit 88f52f0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1308
-136
lines changed

depends/packages/crate_aes.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_aes
2+
$(package)_crate_name=aes
3+
$(package)_version=0.2.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=e6fb1737cdc8da3db76e90ca817a194249a38fcb500c2e6ecec39b29448aa873
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_aes_soft.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_aes_soft
2+
$(package)_crate_name=aes-soft
3+
$(package)_version=0.2.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=67cc03b0a090a05cb01e96998a01905d7ceedce1bc23b756c0bb7faa0682ccb1
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_aesni.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_aesni
2+
$(package)_crate_name=aesni
3+
$(package)_version=0.4.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=f2838c142db62c0c6aea0a24054c46d35488532fdaea0f51dbeba430f0985df5
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_block_cipher_trait
2+
$(package)_crate_name=block-cipher-trait
3+
$(package)_version=0.5.3
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=370424437b9459f3dfd68428ed9376ddfe03d8b70ede29cc533b3557df186ab4
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_byte_tools.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_byte_tools
2+
$(package)_crate_name=byte-tools
3+
$(package)_version=0.2.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_fpe.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_fpe
2+
$(package)_crate_name=fpe
3+
$(package)_version=0.1.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=ce3371c82bfbd984f624cab093f55e7336f5a6e589f8518e1258f54f011b89ad
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_num_bigint.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_num_bigint
2+
$(package)_crate_name=num-bigint
3+
$(package)_version=0.2.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=3eceac7784c5dc97c2d6edf30259b4e153e6e2b42b3c85e9a6e9f45d06caef6e
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_num_integer.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_num_integer
2+
$(package)_crate_name=num-integer
3+
$(package)_version=0.1.39
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_num_traits.mk

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_num_traits
2+
$(package)_crate_name=num-traits
3+
$(package)_version=0.2.5
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_opaque_debug
2+
$(package)_crate_name=opaque-debug
3+
$(package)_version=0.1.1
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=d620c9c26834b34f039489ac0dfdb12c7ac15ccaf818350a64c9b5334a452ad7
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package=crate_stream_cipher
2+
$(package)_crate_name=stream-cipher
3+
$(package)_version=0.1.0
4+
$(package)_download_path=https://static.crates.io/crates/$($(package)_crate_name)
5+
$(package)_file_name=$($(package)_crate_name)-$($(package)_version).crate
6+
$(package)_sha256_hash=ac49bc6cb2847200d18bfb738ce89448570f4aa1c34ac0348db6205ee69a0777
7+
$(package)_crate_versioned_name=$($(package)_crate_name)
8+
9+
define $(package)_preprocess_cmds
10+
$(call generate_crate_checksum,$(package))
11+
endef
12+
13+
define $(package)_stage_cmds
14+
$(call vendor_crate_source,$(package))
15+
endef

depends/packages/crate_zip32.mk

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package=crate_zip32
2+
$(package)_crate_name=zip32
3+
$(package)_download_path=https://github.com/zcash-hackworks/$($(package)_crate_name)/archive/
4+
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
5+
$(package)_download_file=$($(package)_git_commit).tar.gz
6+
$(package)_sha256_hash=b0b011ea96524f0d918a44c7ab8a3dec6270879d1ff03d7dbda6c676d25caa7e
7+
$(package)_git_commit=176470ef41583b5bd0bd749bd1b61d417aa8ec79
8+
$(package)_crate_versioned_name=$($(package)_crate_name)
9+
10+
define $(package)_preprocess_cmds
11+
$(call generate_unpackaged_crate_checksum,$(package))
12+
endef
13+
14+
define $(package)_stage_cmds
15+
$(call vendor_crate_source,$(package))
16+
endef

depends/packages/librustzcash.mk

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ $(package)_version=0.1
33
$(package)_download_path=https://github.com/zcash/$(package)/archive/
44
$(package)_file_name=$(package)-$($(package)_git_commit).tar.gz
55
$(package)_download_file=$($(package)_git_commit).tar.gz
6-
$(package)_sha256_hash=4d022b66e554efbf6db01b2a282e312e8a1b492c4680299ae8c26629882eb46b
7-
$(package)_git_commit=f5d2afb4eabac29b1b1cc860d66e45a5b48b4f88
6+
$(package)_sha256_hash=e9a488a8bbecf7fb237a32dadd65133211ef61616d44cf55609e029837a41004
7+
$(package)_git_commit=f5e5cb24e1bd756a02fc4a3fd2b824238ccd15ad
88
$(package)_dependencies=rust $(rust_crates)
99
$(package)_patches=cargo.config
1010

depends/packages/packages.mk

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
rust_crates := \
2+
crate_aes \
3+
crate_aesni \
4+
crate_aes_soft \
25
crate_arrayvec \
36
crate_bellman \
47
crate_bitflags \
58
crate_bit_vec \
69
crate_blake2_rfc \
10+
crate_block_cipher_trait \
11+
crate_byte_tools \
712
crate_byteorder \
813
crate_constant_time_eq \
914
crate_crossbeam \
1015
crate_digest \
16+
crate_fpe \
1117
crate_fuchsia_zircon \
1218
crate_fuchsia_zircon_sys \
1319
crate_futures_cpupool \
@@ -16,14 +22,20 @@ rust_crates := \
1622
crate_lazy_static \
1723
crate_libc \
1824
crate_nodrop \
25+
crate_num_bigint \
1926
crate_num_cpus \
27+
crate_num_integer \
28+
crate_num_traits \
29+
crate_opaque_debug \
2030
crate_pairing \
2131
crate_rand \
2232
crate_sapling_crypto \
33+
crate_stream_cipher \
2334
crate_typenum \
2435
crate_winapi_i686_pc_windows_gnu \
2536
crate_winapi \
26-
crate_winapi_x86_64_pc_windows_gnu
37+
crate_winapi_x86_64_pc_windows_gnu \
38+
crate_zip32
2739
rust_packages := rust $(rust_crates) librustzcash
2840
proton_packages := proton
2941
zcash_packages := libgmp libsodium

depends/patches/librustzcash/cargo.config

+5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ git = "https://github.com/zcash-hackworks/sapling-crypto"
1111
rev = "21084bde2019c04bd34208e63c3560fe2c02fb0e"
1212
replace-with = "vendored-sources"
1313

14+
[source."https://github.com/zcash-hackworks/zip32"]
15+
git = "https://github.com/zcash-hackworks/zip32"
16+
rev = "176470ef41583b5bd0bd749bd1b61d417aa8ec79"
17+
replace-with = "vendored-sources"
18+
1419
[source.vendored-sources]
1520
directory = "CRATE_REGISTRY"
1621

doc/release-notes.md

+13
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,16 @@ release-notes at release time)
44
Notable changes
55
===============
66

7+
Hierarchical Deterministic Key Generation for Sapling
8+
-----------------------------------------------------
9+
All Sapling addresses will use hierarchical deterministic key generation
10+
according to ZIP 32 (keypath m/32'/133'/k' on mainnet). Transparent and
11+
Sprout addresses will still use traditional key generation.
12+
13+
Backups of HD wallets, regardless of when they have been created, can
14+
therefore be used to re-generate all possible Sapling private keys, even the
15+
ones which haven't already been generated during the time of the backup.
16+
Regular backups are still necessary, however, in order to ensure that
17+
transparent and Sprout addresses are not lost.
18+
19+
[Pull request](https://github.com/zcash/zcash/pull/3492), [ZIP 32](https://github.com/zcash/zips/blob/master/zip-0032.mediawiki)

qa/pull-tester/rpc-tests.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ testScripts=(
2121
'wallet_mergetoaddress.py'
2222
'wallet.py'
2323
'wallet_overwintertx.py'
24-
'wallet_nullifiers.py'
24+
# 'wallet_nullifiers.py'
2525
'wallet_1941.py'
2626
'wallet_addresses.py'
2727
'wallet_sapling.py'
@@ -41,7 +41,7 @@ testScripts=(
4141
'zapwallettxes.py'
4242
'proxy_test.py'
4343
'merkle_blocks.py'
44-
'fundrawtransaction.py'
44+
# 'fundrawtransaction.py'
4545
'signrawtransactions.py'
4646
'walletbackup.py'
4747
'key_import_export.py'

src/Makefile.am

+3-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ LIBZCASH_H = \
108108
zcash/prf.h \
109109
zcash/Proof.hpp \
110110
zcash/util.h \
111-
zcash/Zcash.h
111+
zcash/Zcash.h \
112+
zcash/zip32.h
112113

113114
.PHONY: FORCE collate-libsnark check-symbols check-security
114115
# bitcoin core #
@@ -520,6 +521,7 @@ libzcash_a_SOURCES = \
520521
zcash/Note.cpp \
521522
zcash/prf.cpp \
522523
zcash/util.cpp \
524+
zcash/zip32.cpp \
523525
zcash/circuit/commitment.tcc \
524526
zcash/circuit/gadget.tcc \
525527
zcash/circuit/merkle.tcc \

src/Makefile.gtest.include

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ zcash_gtest_SOURCES += \
4444
gtest/test_proofs.cpp \
4545
gtest/test_paymentdisclosure.cpp \
4646
gtest/test_pedersen_hash.cpp \
47-
gtest/test_checkblock.cpp
47+
gtest/test_checkblock.cpp \
48+
gtest/test_zip32.cpp
4849
if ENABLE_WALLET
4950
zcash_gtest_SOURCES += \
5051
wallet/gtest/test_wallet.cpp

src/chainparams.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class CMainParams : public CChainParams {
158158
bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "zs";
159159
bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviews";
160160
bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivks";
161-
bech32HRPs[SAPLING_SPENDING_KEY] = "secret-spending-key-main";
161+
bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-main";
162162

163163
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
164164

@@ -329,7 +329,7 @@ class CTestNetParams : public CChainParams {
329329
bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ztestsapling";
330330
bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewtestsapling";
331331
bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivktestsapling";
332-
bech32HRPs[SAPLING_SPENDING_KEY] = "secret-spending-key-test";
332+
bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-test";
333333

334334
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
335335

@@ -457,7 +457,7 @@ class CRegTestParams : public CChainParams {
457457
bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "zregtestsapling";
458458
bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewregtestsapling";
459459
bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivkregtestsapling";
460-
bech32HRPs[SAPLING_SPENDING_KEY] = "secret-spending-key-regtest";
460+
bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-regtest";
461461

462462
// Founders reward script expects a vector of 2-of-3 multisig addresses
463463
vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };

src/chainparams.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class CChainParams
6060
SAPLING_PAYMENT_ADDRESS,
6161
SAPLING_FULL_VIEWING_KEY,
6262
SAPLING_INCOMING_VIEWING_KEY,
63-
SAPLING_SPENDING_KEY,
63+
SAPLING_EXTENDED_SPEND_KEY,
6464

6565
MAX_BECH32_TYPES
6666
};

src/gtest/test_keys.cpp

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
11
#include <chainparams.h>
22
#include <key_io.h>
33
#include <zcash/Address.hpp>
4+
#include <zcash/zip32.h>
45

56
#include <gtest/gtest.h>
67

78
TEST(Keys, DISABLED_EncodeAndDecodeSapling)
89
{
910
SelectParams(CBaseChainParams::MAIN);
1011

11-
for (size_t i = 0; i < 1000; i++) {
12-
auto sk = libzcash::SaplingSpendingKey::random();
12+
std::vector<unsigned char, secure_allocator<unsigned char>> rawSeed(32);
13+
HDSeed seed(rawSeed);
14+
auto m = libzcash::SaplingExtendedSpendingKey::Master(seed);
15+
16+
for (uint32_t i = 0; i < 1000; i++) {
17+
auto sk = m.Derive(i);
1318
{
1419
std::string sk_string = EncodeSpendingKey(sk);
1520
EXPECT_EQ(
1621
sk_string.substr(0, 24),
17-
Params().Bech32HRP(CChainParams::SAPLING_SPENDING_KEY));
22+
Params().Bech32HRP(CChainParams::SAPLING_EXTENDED_SPEND_KEY));
1823

1924
auto spendingkey2 = DecodeSpendingKey(sk_string);
2025
EXPECT_TRUE(IsValidSpendingKey(spendingkey2));
2126

22-
ASSERT_TRUE(boost::get<libzcash::SaplingSpendingKey>(&spendingkey2) != nullptr);
23-
auto sk2 = boost::get<libzcash::SaplingSpendingKey>(spendingkey2);
27+
ASSERT_TRUE(boost::get<libzcash::SaplingExtendedSpendingKey>(&spendingkey2) != nullptr);
28+
auto sk2 = boost::get<libzcash::SaplingExtendedSpendingKey>(spendingkey2);
2429
EXPECT_EQ(sk, sk2);
2530
}
2631
{
27-
auto addr = sk.default_address();
32+
auto addr = sk.DefaultAddress();
2833

2934
std::string addr_string = EncodePaymentAddress(addr);
3035
EXPECT_EQ(

0 commit comments

Comments
 (0)