diff --git a/zip32/src/lib.rs b/zip32/src/lib.rs index 1543e6217..2541c41d6 100644 --- a/zip32/src/lib.rs +++ b/zip32/src/lib.rs @@ -15,7 +15,7 @@ use fpe::ff1::{BinaryNumeralString, FF1}; use pairing::bls12_381::Bls12; use sapling_crypto::{ jubjub::{edwards, FixedGenerators, JubjubEngine, JubjubParams, ToUniform, Unknown}, - primitives::{Diversifier, PaymentAddress, ViewingKey}, + primitives::{Diversifier, PaymentAddress, ProofGenerationKey, ViewingKey}, }; use std::io::{self, Read, Write}; use zcash_primitives::JUBJUB; @@ -42,7 +42,7 @@ fn prf_expand_vec(sk: &[u8], ts: &[&[u8]]) -> Blake2bResult { /// An outgoing viewing key #[derive(Clone, Copy, PartialEq)] -struct OutgoingViewingKey([u8; 32]); +pub struct OutgoingViewingKey([u8; 32]); impl OutgoingViewingKey { fn derive_child(&self, i_l: &[u8]) -> Self { @@ -55,15 +55,15 @@ impl OutgoingViewingKey { /// A Sapling expanded spending key #[derive(Clone)] pub struct ExpandedSpendingKey { - ask: E::Fs, + pub ask: E::Fs, nsk: E::Fs, ovk: OutgoingViewingKey, } /// A Sapling full viewing key pub struct FullViewingKey { - vk: ViewingKey, - ovk: OutgoingViewingKey, + pub vk: ViewingKey, + pub ovk: OutgoingViewingKey, } impl ExpandedSpendingKey { @@ -76,6 +76,15 @@ impl ExpandedSpendingKey { ExpandedSpendingKey { ask, nsk, ovk } } + pub fn proof_generation_key(&self, params: &E::Params) -> ProofGenerationKey { + ProofGenerationKey { + ak: params + .generator(FixedGenerators::SpendingKeyGenerator) + .mul(self.ask, params), + nsk: self.nsk, + } + } + fn derive_child(&self, i_l: &[u8]) -> Self { let mut ask = E::Fs::to_uniform(prf_expand(i_l, &[0x13]).as_bytes()); let mut nsk = E::Fs::to_uniform(prf_expand(i_l, &[0x14]).as_bytes());