From 99119f04fada41551541102a343680aed69ecdf8 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Thu, 6 Jan 2022 23:11:37 +0800 Subject: [PATCH] Derive internal full viewing key. --- src/keys.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/keys.rs b/src/keys.rs index 5572024c..253a2748 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -418,6 +418,22 @@ impl FullViewingKey { Some(FullViewingKey { ak, nk, rivk }) } + + /// Derives an internal full viewing key from a full viewing key, as specified in [ZIP32][orchardinternalfullviewingkey] + /// + /// [orchardinternalfullviewingkey]: https://zips.z.cash/zip-0032#orchard-internal-key-derivation + pub fn derive_internal(&self) -> Option { + let k = self.rivk().to_bytes(); + let rivk_internal = PrfExpand::OrchardRivkInternal + .with_ad_slices(&k, &[&self.ak.clone().to_bytes(), &self.nk().to_bytes()]); + let rivk_internal = CommitIvkRandomness::from_bytes(&rivk_internal)?; + + Some(FullViewingKey { + ak: self.ak.clone(), + nk: self.nk, + rivk: rivk_internal, + }) + } } /// A key that provides the capability to derive a sequence of diversifiers.