Refactor contextual random rseed generation into util method in zcash_primitives

This commit is contained in:
therealyingtong 2020-08-05 15:21:42 +08:00
parent a3ae1b273d
commit 2ed9b6f881
No known key found for this signature in database
GPG Key ID: 179F32A1503D607E
6 changed files with 54 additions and 50 deletions

View File

@ -191,12 +191,13 @@ mod tests {
use pairing::bls12_381::{Bls12, Fr};
use rand_core::{OsRng, RngCore};
use zcash_primitives::{
consensus::{NetworkUpgrade, Parameters},
consensus::NetworkUpgrade,
jubjub::{fs::Fs, FixedGenerators, JubjubParams, ToUniform},
merkle_tree::CommitmentTree,
note_encryption::{Memo, SaplingNoteEncryption},
primitives::{Note, Rseed},
primitives::Note,
transaction::components::Amount,
util::generate_random_rseed,
zip32::{ExtendedFullViewingKey, ExtendedSpendingKey},
JUBJUB,
};
@ -257,13 +258,11 @@ mod tests {
// Create a fake Note for the account
let mut rng = OsRng;
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let rseed = generate_random_rseed::<Network, OsRng>(
NetworkUpgrade::Canopy,
height as u32,
&mut rng,
);
let note = Note {
g_d: to.diversifier().g_d::<Bls12>(&JUBJUB).unwrap(),
pk_d: to.pk_d().clone(),

View File

@ -95,7 +95,7 @@ fn get_target_and_anchor_heights(data: &Connection) -> Result<(u32, u32), error:
#[cfg(test)]
mod tests {
use crate::Network;
use ff::{Field, PrimeField};
use ff::PrimeField;
use pairing::bls12_381::Bls12;
use protobuf::Message;
use rand_core::{OsRng, RngCore};
@ -106,11 +106,11 @@ mod tests {
};
use zcash_primitives::{
block::BlockHash,
consensus::{NetworkUpgrade, Parameters},
jubjub::fs::Fs,
consensus::NetworkUpgrade,
note_encryption::{Memo, SaplingNoteEncryption},
primitives::{Note, PaymentAddress, Rseed},
primitives::{Note, PaymentAddress},
transaction::components::Amount,
util::generate_random_rseed,
zip32::ExtendedFullViewingKey,
JUBJUB,
};
@ -127,13 +127,11 @@ mod tests {
// Create a fake Note for the account
let mut rng = OsRng;
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let rseed = generate_random_rseed::<Network, OsRng>(
NetworkUpgrade::Canopy,
height as u32,
&mut rng,
);
let note = Note {
g_d: to.diversifier().g_d::<Bls12>(&JUBJUB).unwrap(),
pk_d: to.pk_d().clone(),
@ -183,13 +181,11 @@ mod tests {
value: Amount,
) -> CompactBlock {
let mut rng = OsRng;
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let rseed = generate_random_rseed::<Network, OsRng>(
NetworkUpgrade::Canopy,
height as u32,
&mut rng,
);
// Create a fake CompactBlock containing the note
let mut cspend = CompactSpend::new();
@ -226,13 +222,11 @@ mod tests {
// Create a fake Note for the change
ctx.outputs.push({
let change_addr = extfvk.default_address().unwrap().1;
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height as u32) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(&mut rng))
};
let rseed = generate_random_rseed::<Network, OsRng>(
NetworkUpgrade::Canopy,
height as u32,
&mut rng,
);
let note = Note {
g_d: change_addr.diversifier().g_d::<Bls12>(&JUBJUB).unwrap(),
pk_d: change_addr.pk_d().clone(),

View File

@ -24,7 +24,7 @@ pub mod redjubjub;
pub mod sapling;
pub mod serialize;
pub mod transaction;
mod util;
pub mod util;
pub mod zip32;
#[cfg(test)]

View File

@ -593,6 +593,7 @@ mod tests {
PrimeOrder, Unknown,
},
primitives::{Diversifier, PaymentAddress, Rseed, ValueCommitment},
util::generate_random_rseed,
Network,
};
use crypto_api_chachapoly::ChachaPolyIetf;
@ -795,13 +796,7 @@ mod tests {
};
let cv = value_commitment.cm(&JUBJUB).into();
let rseed = if Network::is_nu_active(NetworkUpgrade::Canopy, height) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(rng))
};
let rseed = generate_random_rseed::<Network, R>(NetworkUpgrade::Canopy, height, &mut rng);
let note = pa.create_note(value, rseed, &JUBJUB).unwrap();
let cmu = note.cm(&JUBJUB);

View File

@ -25,6 +25,7 @@ use crate::{
components::{amount::DEFAULT_FEE, Amount, OutputDescription, SpendDescription, TxOut},
signature_hash_data, Transaction, TransactionData, SIGHASH_ALL,
},
util::generate_random_rseed,
Network, JUBJUB,
};
@ -103,13 +104,7 @@ impl SaplingOutput {
return Err(Error::InvalidAmount);
}
let rseed = if P::is_nu_active(NetworkUpgrade::Canopy, height) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(rng))
};
let rseed = generate_random_rseed::<P, R>(NetworkUpgrade::Canopy, height, rng);
let note = Note {
g_d,

View File

@ -1,6 +1,13 @@
use blake2b_simd::Params;
use crate::jubjub::{JubjubEngine, ToUniform};
use crate::{
consensus,
consensus::NetworkUpgrade,
jubjub::{fs::Fs, JubjubEngine, ToUniform},
primitives::Rseed,
};
use ff::Field;
use rand_core::{CryptoRng, RngCore};
pub fn hash_to_scalar<E: JubjubEngine>(persona: &[u8], a: &[u8], b: &[u8]) -> E::Fs {
let mut hasher = Params::new().hash_length(64).personal(persona).to_state();
@ -9,3 +16,17 @@ pub fn hash_to_scalar<E: JubjubEngine>(persona: &[u8], a: &[u8], b: &[u8]) -> E:
let ret = hasher.finalize();
E::Fs::to_uniform(ret.as_ref())
}
pub fn generate_random_rseed<P: consensus::Parameters, R: RngCore + CryptoRng>(
nu: NetworkUpgrade,
height: u32,
rng: &mut R,
) -> Rseed<Fs> {
if P::is_nu_active(nu, height) {
let mut buffer = [0u8; 32];
&rng.fill_bytes(&mut buffer);
Rseed::AfterZip212(buffer)
} else {
Rseed::BeforeZip212(Fs::random(rng))
}
}