From a3a9ee26825265e15d6c7c061dff3c8c1ceeff7b Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 2 Jul 2019 00:07:48 +0100 Subject: [PATCH] Validate PaymentAddress diversifier when decoding --- zcash_client_backend/src/encoding.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/zcash_client_backend/src/encoding.rs b/zcash_client_backend/src/encoding.rs index 3a201ad..17ef335 100644 --- a/zcash_client_backend/src/encoding.rs +++ b/zcash_client_backend/src/encoding.rs @@ -167,6 +167,11 @@ pub fn decode_payment_address(hrp: &str, s: &str) -> Result(&JUBJUB).is_none() { + return None; + } + edwards::Point::::read(&data[11..], &JUBJUB) .ok()? .as_prime_order(&JUBJUB) @@ -227,4 +232,26 @@ mod tests { Some(addr) ); } + + #[test] + fn invalid_diversifier() { + let rng = &mut XorShiftRng::from_seed([0x3dbe6259, 0x8d313d76, 0x3237db17, 0xe5bc0654]); + + let addr = PaymentAddress { + diversifier: Diversifier([1u8; 11]), + pk_d: edwards::Point::::rand(rng, &JUBJUB).mul_by_cofactor(&JUBJUB), + }; + + let encoded_main = + encode_payment_address(constants::mainnet::HRP_SAPLING_PAYMENT_ADDRESS, &addr); + + assert_eq!( + decode_payment_address( + constants::mainnet::HRP_SAPLING_PAYMENT_ADDRESS, + &encoded_main + ) + .unwrap(), + None + ); + } }