mirror of https://github.com/zcash/orchard.git
Add diversifier index decryption to DiversifierKey.
This commit is contained in:
parent
a061a861b3
commit
8c96640826
46
src/keys.rs
46
src/keys.rs
|
@ -452,6 +452,15 @@ impl DiversifierKey {
|
||||||
Diversifier(enc.to_bytes_le().try_into().unwrap())
|
Diversifier(enc.to_bytes_le().try_into().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the diversifier index obtained by decrypting the diversifier.
|
||||||
|
pub fn diversifier_index(&self, d: &Diversifier) -> DiversifierIndex {
|
||||||
|
let ff = FF1::<Aes256>::new(&self.0, 2).expect("valid radix");
|
||||||
|
let dec = ff
|
||||||
|
.decrypt(&[], &BinaryNumeralString::from_bytes_le(d.as_array()))
|
||||||
|
.unwrap();
|
||||||
|
DiversifierIndex::from(<[u8; 11]>::try_from(dec.to_bytes_le()).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
/// Return the raw bytes of the diversifier key
|
/// Return the raw bytes of the diversifier key
|
||||||
pub fn to_bytes(&self) -> &[u8; 32] {
|
pub fn to_bytes(&self) -> &[u8; 32] {
|
||||||
&self.0
|
&self.0
|
||||||
|
@ -796,10 +805,10 @@ impl SharedSecret {
|
||||||
pub mod testing {
|
pub mod testing {
|
||||||
use proptest::prelude::*;
|
use proptest::prelude::*;
|
||||||
|
|
||||||
use super::{EphemeralSecretKey, SpendingKey};
|
use super::{DiversifierIndex, DiversifierKey, EphemeralSecretKey, SpendingKey};
|
||||||
|
|
||||||
prop_compose! {
|
prop_compose! {
|
||||||
/// Generate a uniformly distributed fake note commitment value.
|
/// Generate a uniformly distributed Orchard spending key.
|
||||||
pub fn arb_spending_key()(
|
pub fn arb_spending_key()(
|
||||||
key in prop::array::uniform32(prop::num::u8::ANY)
|
key in prop::array::uniform32(prop::num::u8::ANY)
|
||||||
.prop_map(SpendingKey::from_bytes)
|
.prop_map(SpendingKey::from_bytes)
|
||||||
|
@ -813,7 +822,7 @@ pub mod testing {
|
||||||
}
|
}
|
||||||
|
|
||||||
prop_compose! {
|
prop_compose! {
|
||||||
/// Generate a uniformly distributed fake note commitment value.
|
/// Generate a uniformly distributed Orchard ephemeral secret key.
|
||||||
pub fn arb_esk()(
|
pub fn arb_esk()(
|
||||||
esk in prop::array::uniform32(prop::num::u8::ANY)
|
esk in prop::array::uniform32(prop::num::u8::ANY)
|
||||||
.prop_map(|b| EphemeralSecretKey::from_bytes(&b))
|
.prop_map(|b| EphemeralSecretKey::from_bytes(&b))
|
||||||
|
@ -825,6 +834,24 @@ pub mod testing {
|
||||||
esk.unwrap()
|
esk.unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prop_compose! {
|
||||||
|
/// Generate a uniformly distributed Orchard diversifier key.
|
||||||
|
pub fn arb_diversifier_key()(
|
||||||
|
dk_bytes in prop::array::uniform32(prop::num::u8::ANY)
|
||||||
|
) -> DiversifierKey {
|
||||||
|
DiversifierKey::from_bytes(dk_bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_compose! {
|
||||||
|
/// Generate a uniformly distributed diversifier index.
|
||||||
|
pub fn arb_diversifier_index()(
|
||||||
|
d_bytes in prop::array::uniform11(prop::num::u8::ANY)
|
||||||
|
) -> DiversifierIndex {
|
||||||
|
DiversifierIndex::from(d_bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -833,7 +860,7 @@ mod tests {
|
||||||
use proptest::prelude::*;
|
use proptest::prelude::*;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
testing::{arb_esk, arb_spending_key},
|
testing::{arb_diversifier_index, arb_diversifier_key, arb_esk, arb_spending_key},
|
||||||
*,
|
*,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -875,6 +902,17 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proptest! {
|
||||||
|
#[test]
|
||||||
|
fn diversifier_index(
|
||||||
|
dk in arb_diversifier_key(),
|
||||||
|
j in arb_diversifier_index(),
|
||||||
|
) {
|
||||||
|
let d = dk.get(j);
|
||||||
|
assert_eq!(j, dk.diversifier_index(&d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_vectors() {
|
fn test_vectors() {
|
||||||
for tv in crate::test_vectors::keys::test_vectors() {
|
for tv in crate::test_vectors::keys::test_vectors() {
|
||||||
|
|
Loading…
Reference in New Issue