mirror of
https://github.com/Qortal/pirate-librustzcash.git
synced 2025-02-12 10:05:47 +00:00
Force personalization of Pedersen hashes.
This commit is contained in:
parent
39175a0c2a
commit
d779f31ccd
@ -10,18 +10,42 @@ use bellman::{
|
|||||||
};
|
};
|
||||||
use super::lookup::*;
|
use super::lookup::*;
|
||||||
|
|
||||||
|
pub enum Personalization {
|
||||||
|
NoteCommitment,
|
||||||
|
AnotherPersonalization
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Personalization {
|
||||||
|
fn get_constant_bools(&self) -> Vec<Boolean> {
|
||||||
|
self.get_bits()
|
||||||
|
.into_iter()
|
||||||
|
.map(|e| Boolean::constant(e))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_bits(&self) -> Vec<bool> {
|
||||||
|
match *self {
|
||||||
|
Personalization::NoteCommitment =>
|
||||||
|
vec![false, false, false, false, false, false],
|
||||||
|
Personalization::AnotherPersonalization =>
|
||||||
|
vec![false, false, false, false, false, true],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn pedersen_hash<E: JubjubEngine, CS>(
|
pub fn pedersen_hash<E: JubjubEngine, CS>(
|
||||||
mut cs: CS,
|
mut cs: CS,
|
||||||
|
personalization: Personalization,
|
||||||
bits: &[Boolean],
|
bits: &[Boolean],
|
||||||
params: &E::Params
|
params: &E::Params
|
||||||
) -> Result<EdwardsPoint<E>, SynthesisError>
|
) -> Result<EdwardsPoint<E>, SynthesisError>
|
||||||
where CS: ConstraintSystem<E>
|
where CS: ConstraintSystem<E>
|
||||||
{
|
{
|
||||||
// Unnecessary if forced personalization is introduced
|
let personalization = personalization.get_constant_bools();
|
||||||
assert!(bits.len() > 0);
|
assert_eq!(personalization.len(), 6);
|
||||||
|
|
||||||
let mut edwards_result = None;
|
let mut edwards_result = None;
|
||||||
let mut bits = bits.iter();
|
let mut bits = personalization.iter().chain(bits.iter());
|
||||||
let mut segment_generators = params.pedersen_circuit_generators().iter();
|
let mut segment_generators = params.pedersen_circuit_generators().iter();
|
||||||
let boolean_false = Boolean::constant(false);
|
let boolean_false = Boolean::constant(false);
|
||||||
|
|
||||||
@ -124,12 +148,13 @@ mod test {
|
|||||||
|
|
||||||
pedersen_hash(
|
pedersen_hash(
|
||||||
cs.namespace(|| "pedersen hash"),
|
cs.namespace(|| "pedersen hash"),
|
||||||
|
Personalization::NoteCommitment,
|
||||||
&input_bools,
|
&input_bools,
|
||||||
params
|
params
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
|
||||||
assert!(cs.is_satisfied());
|
assert!(cs.is_satisfied());
|
||||||
assert_eq!(cs.num_constraints(), 1539);
|
assert_eq!(cs.num_constraints(), 1551);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -151,6 +176,7 @@ mod test {
|
|||||||
|
|
||||||
let res = pedersen_hash(
|
let res = pedersen_hash(
|
||||||
cs.namespace(|| "pedersen hash"),
|
cs.namespace(|| "pedersen hash"),
|
||||||
|
Personalization::NoteCommitment,
|
||||||
&input_bools,
|
&input_bools,
|
||||||
params
|
params
|
||||||
).unwrap();
|
).unwrap();
|
||||||
@ -158,12 +184,23 @@ mod test {
|
|||||||
assert!(cs.is_satisfied());
|
assert!(cs.is_satisfied());
|
||||||
|
|
||||||
let expected = ::pedersen_hash::pedersen_hash::<Bls12, _>(
|
let expected = ::pedersen_hash::pedersen_hash::<Bls12, _>(
|
||||||
input.into_iter(),
|
Personalization::NoteCommitment,
|
||||||
|
input.clone().into_iter(),
|
||||||
params
|
params
|
||||||
).into_xy();
|
).into_xy();
|
||||||
|
|
||||||
assert_eq!(res.x.get_value().unwrap(), expected.0);
|
assert_eq!(res.x.get_value().unwrap(), expected.0);
|
||||||
assert_eq!(res.y.get_value().unwrap(), expected.1);
|
assert_eq!(res.y.get_value().unwrap(), expected.1);
|
||||||
|
|
||||||
|
// Test against the output of a different personalization
|
||||||
|
let unexpected = ::pedersen_hash::pedersen_hash::<Bls12, _>(
|
||||||
|
Personalization::AnotherPersonalization,
|
||||||
|
input.into_iter(),
|
||||||
|
params
|
||||||
|
).into_xy();
|
||||||
|
|
||||||
|
assert!(res.x.get_value().unwrap() != unexpected.0);
|
||||||
|
assert!(res.y.get_value().unwrap() != unexpected.1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
use jubjub::*;
|
use jubjub::*;
|
||||||
use pairing::*;
|
use pairing::*;
|
||||||
|
|
||||||
|
use circuit::pedersen_hash::Personalization;
|
||||||
|
|
||||||
pub fn pedersen_hash<E, I>(
|
pub fn pedersen_hash<E, I>(
|
||||||
|
personalization: Personalization,
|
||||||
bits: I,
|
bits: I,
|
||||||
params: &E::Params
|
params: &E::Params
|
||||||
) -> edwards::Point<E, PrimeOrder>
|
) -> edwards::Point<E, PrimeOrder>
|
||||||
where I: IntoIterator<Item=bool>,
|
where I: IntoIterator<Item=bool>,
|
||||||
E: JubjubEngine
|
E: JubjubEngine
|
||||||
{
|
{
|
||||||
let mut bits = bits.into_iter();
|
let mut bits = personalization.get_bits().into_iter().chain(bits.into_iter());
|
||||||
|
|
||||||
let mut result = edwards::Point::zero();
|
let mut result = edwards::Point::zero();
|
||||||
let mut generators = params.pedersen_hash_generators().iter();
|
let mut generators = params.pedersen_hash_generators().iter();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user