diff --git a/Cargo.lock b/Cargo.lock index 5cabd2c1e..874259926 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,7 +10,19 @@ checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" dependencies = [ "aes-soft", "aesni", - "cipher", + "cipher 0.2.5", +] + +[[package]] +name = "aes" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "495ee669413bfbe9e8cace80f4d3d78e6d8c8d99579f97fb93bde351b185f2d4" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug", ] [[package]] @@ -19,7 +31,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" dependencies = [ - "cipher", + "cipher 0.2.5", "opaque-debug", ] @@ -29,7 +41,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" dependencies = [ - "cipher", + "cipher 0.2.5", "opaque-debug", ] @@ -137,15 +149,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bip0039" version = "0.8.0" @@ -216,7 +219,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" dependencies = [ "block-padding", - "cipher", + "cipher 0.2.5", +] + +[[package]] +name = "block-modes" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" +dependencies = [ + "block-padding", + "cipher 0.3.0", ] [[package]] @@ -293,6 +306,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -546,7 +568,7 @@ checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" [[package]] name = "equihash" version = "0.1.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ "blake2b_simd", "byteorder", @@ -575,9 +597,23 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a25080721bbcd2cd4d765b7d607ea350425fa087ce53cd3e31afcacdab850352" dependencies = [ - "aes", - "block-modes", - "num-bigint", + "aes 0.6.0", + "block-modes 0.7.0", + "num-bigint 0.3.2", + "num-integer", + "num-traits", +] + +[[package]] +name = "fpe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf3e40fc9accc7218e082db8a75aeea244b8f5db73e591774ef93b4276365e6" +dependencies = [ + "block-modes 0.8.1", + "cipher 0.3.0", + "libm", + "num-bigint 0.4.0", "num-integer", "num-traits", ] @@ -789,7 +825,7 @@ dependencies = [ [[package]] name = "incrementalmerkletree" version = "0.1.0" -source = "git+https://github.com/zcash/incrementalmerkletree?rev=8b59049f1746827ffa3763efa8af948f680491d0#8b59049f1746827ffa3763efa8af948f680491d0" +source = "git+https://github.com/zcash/incrementalmerkletree?rev=b7bd6246122a6e9ace8edb51553fbf5228906cbb#b7bd6246122a6e9ace8edb51553fbf5228906cbb" dependencies = [ "serde", ] @@ -850,12 +886,17 @@ version = "0.2.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" +[[package]] +name = "libm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" + [[package]] name = "librustzcash" version = "0.2.0" dependencies = [ "bellman", - "bincode", "blake2b_simd", "blake2s_simd", "bls12_381", @@ -1073,6 +1114,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.44" @@ -1117,15 +1169,15 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "orchard" version = "0.0.0" -source = "git+https://github.com/zcash/orchard.git?rev=8454f86d423edbf0b53a1d5d32df1c691f8b7188#8454f86d423edbf0b53a1d5d32df1c691f8b7188" +source = "git+https://github.com/zcash/orchard.git?rev=d0baa18fc6105df4a7847de2b6dc50c5919b3123#d0baa18fc6105df4a7847de2b6dc50c5919b3123" dependencies = [ - "aes", + "aes 0.6.0", "arrayvec 0.7.1", "bigint", "bitvec", "blake2b_simd", "ff", - "fpe", + "fpe 0.4.0", "group", "halo2", "incrementalmerkletree", @@ -1802,7 +1854,7 @@ dependencies = [ [[package]] name = "zcash_address" version = "0.0.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ "bech32", "blake2b_simd", @@ -1812,7 +1864,7 @@ dependencies = [ [[package]] name = "zcash_history" version = "0.2.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ "bigint", "blake2b_simd", @@ -1822,7 +1874,7 @@ dependencies = [ [[package]] name = "zcash_note_encryption" version = "0.0.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ "blake2b_simd", "byteorder", @@ -1836,9 +1888,9 @@ dependencies = [ [[package]] name = "zcash_primitives" version = "0.5.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ - "aes", + "aes 0.7.4", "bip0039", "bitvec", "blake2b_simd", @@ -1848,9 +1900,10 @@ dependencies = [ "crypto_api_chachapoly", "equihash", "ff", - "fpe", + "fpe 0.5.0", "group", "hex", + "incrementalmerkletree", "jubjub", "lazy_static", "log", @@ -1867,7 +1920,7 @@ dependencies = [ [[package]] name = "zcash_proofs" version = "0.5.0" -source = "git+https://github.com/zcash/librustzcash.git?rev=98dc330cdb1c96e980e62b5bc901edbaa128fea2#98dc330cdb1c96e980e62b5bc901edbaa128fea2" +source = "git+https://github.com/zcash/librustzcash.git?rev=19a97f16945c68c33aedcc89f2a4f4d398658b05#19a97f16945c68c33aedcc89f2a4f4d398658b05" dependencies = [ "bellman", "blake2b_simd", diff --git a/Cargo.toml b/Cargo.toml index 80f8f7ebc..6be4d0aa8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,6 @@ crate-type = ["staticlib"] [dependencies] bellman = "0.10" -bincode = "1.3" blake2b_simd = "0.5" blake2s_simd = "0.5" bls12_381 = "0.5" @@ -65,11 +64,11 @@ codegen-units = 1 [patch.crates-io] ed25519-zebra = { git = "https://github.com/ZcashFoundation/ed25519-zebra.git", rev = "d3512400227a362d08367088ffaa9bd4142a69c7" } halo2 = { git = "https://github.com/zcash/halo2.git", rev = "27c4187673a9c6ade13fbdbd4f20955530c22d7f" } -incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree", rev = "8b59049f1746827ffa3763efa8af948f680491d0" } +incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree", rev = "b7bd6246122a6e9ace8edb51553fbf5228906cbb" } jubjub = { git = "https://github.com/zkcrypto/jubjub.git", rev = "96ab4162b83303378eae32a326b54d88b75bffc2" } -orchard = { git = "https://github.com/zcash/orchard.git", rev = "8454f86d423edbf0b53a1d5d32df1c691f8b7188" } -zcash_address = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } -zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } -zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } -zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } -zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "98dc330cdb1c96e980e62b5bc901edbaa128fea2" } +orchard = { git = "https://github.com/zcash/orchard.git", rev = "d0baa18fc6105df4a7847de2b6dc50c5919b3123" } +zcash_address = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" } +zcash_history = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" } +zcash_note_encryption = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" } +zcash_primitives = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" } +zcash_proofs = { git = "https://github.com/zcash/librustzcash.git", rev = "19a97f16945c68c33aedcc89f2a4f4d398658b05" } diff --git a/src/rust/src/orchard_ffi/incremental_sinsemilla_tree_ffi.rs b/src/rust/src/orchard_ffi/incremental_sinsemilla_tree_ffi.rs index 4a1cc8b17..9a2468a82 100644 --- a/src/rust/src/orchard_ffi/incremental_sinsemilla_tree_ffi.rs +++ b/src/rust/src/orchard_ffi/incremental_sinsemilla_tree_ffi.rs @@ -1,14 +1,18 @@ -use bincode; use incrementalmerkletree::{ bridgetree::{self, BridgeTree}, Altitude, Frontier, Hashable, Tree, }; +use std::convert::TryFrom; +use std::io; use std::mem::size_of_val; use std::ptr; use orchard::{bundle::Authorized, tree::MerkleCrhOrchardOutput}; -use zcash_primitives::transaction::components::Amount; +use zcash_primitives::{ + merkle_tree::incremental::{read_frontier_v1, read_tree, write_frontier_v1, write_tree}, + transaction::components::Amount, +}; use crate::orchard_ffi::{error, CppStreamReader, CppStreamWriter, ReadCb, StreamObj, WriteCb}; @@ -22,7 +26,7 @@ pub const MAX_CHECKPOINTS: usize = 100; #[no_mangle] pub extern "C" fn orchard_merkle_frontier_empty( ) -> *mut bridgetree::Frontier { - let empty_tree = bridgetree::Frontier::::new(); + let empty_tree = bridgetree::Frontier::::empty(); Box::into_raw(Box::new(empty_tree)) } @@ -51,7 +55,14 @@ pub extern "C" fn orchard_merkle_frontier_parse( ) -> *mut bridgetree::Frontier { let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap()); - match bincode::deserialize_from(reader) { + match read_frontier_v1(reader).and_then(|nf| { + bridgetree::Frontier::try_from(nf).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidInput, + format!("Parsing resulted in an invalid Merkle frontier: {:?}", e), + ) + }) + }) { Ok(parsed) => Box::into_raw(Box::new(parsed)), Err(e) => { error!("Failed to parse Orchard bundle: {}", e); @@ -62,17 +73,18 @@ pub extern "C" fn orchard_merkle_frontier_parse( #[no_mangle] pub extern "C" fn orchard_merkle_frontier_serialize( - tree: *const bridgetree::Frontier, + frontier: *const bridgetree::Frontier, stream: Option, write_cb: Option, ) -> bool { - let tree = unsafe { - tree.as_ref() + let frontier = unsafe { + frontier + .as_ref() .expect("Orchard note commitment tree pointer may not be null.") }; let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap()); - match bincode::serialize_into(writer, tree) { + match write_frontier_v1(writer, frontier) { Ok(()) => true, Err(e) => { error!("{}", e); @@ -130,7 +142,7 @@ pub extern "C" fn orchard_merkle_frontier_num_leaves( .expect("Orchard note commitment tree pointer may not be null.") }; - tree.position().map_or(0, |p| ::from(p) + 1) + tree.position().map_or(0, |p| (::from(p) + 1) as usize) } #[no_mangle] @@ -182,7 +194,7 @@ pub extern "C" fn incremental_sinsemilla_tree_parse( ) -> *mut BridgeTree { let reader = CppStreamReader::from_raw_parts(stream, read_cb.unwrap()); - match bincode::deserialize_from(reader) { + match read_tree(reader) { Ok(parsed) => Box::into_raw(Box::new(parsed)), Err(e) => { error!("Failed to parse Orchard bundle: {}", e); @@ -203,7 +215,7 @@ pub extern "C" fn incremental_sinsemilla_tree_serialize( }; let writer = CppStreamWriter::from_raw_parts(stream, write_cb.unwrap()); - match bincode::serialize_into(writer, tree) { + match write_tree(writer, tree) { Ok(()) => true, Err(e) => { error!("{}", e);