From 6da15c1fda756735b2330430c55e7e1d577c79e6 Mon Sep 17 00:00:00 2001 From: Francisco Gindre Date: Wed, 31 Jul 2024 11:01:27 -0300 Subject: [PATCH] Allow creating a FullViewingKey from a given SpendValidatingKey Allows creating a FullViewingKey from a given SpendValidatingKey and from the other components which can be randomly generated, but there may be some utility in specifying them too like supporting FROST backup schemes that don't centralize spend authority closes #431 see related #430 PR Suggestions --- CHANGELOG.md | 11 ++++++++++- src/keys.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26792b0cd..77ecd154a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,16 @@ and this project adheres to Rust's notion of [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] -### Added +### added +- Added [Visibility crate](https://crates.io/crates/visibility) to modify +visibility of methods and struct for the `unstable-frost` feature. +- Added `SpendValidatingKey` serialization and deserialization from bytes +visibility under the `unstable-frost` feature + - `orchard::keys::SpendValidatingKey` +- Added `orchard::keys::FullViewingKey::from_sk_and_ak` under the +`unstable-frost` feature flag +- Added `orchard::keys::FullViewingKey::from_checked_parts` under the +`unstable-frost` feature flag - `orchard::keys::SpendValidatingKey::{from_bytes, to_bytes}` behind the `unstable-frost` feature flag. These are temporary APIs exposed for development purposes, and will be replaced by type-safe FROST APIs once ZIP 312 key diff --git a/src/keys.rs b/src/keys.rs index f66928eeb..1a6ed5351 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -225,6 +225,7 @@ impl SpendValidatingKey { /// [`Note`]: crate::note::Note /// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents #[derive(Copy, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "unstable-frost", visibility::make(pub))] pub(crate) struct NullifierDerivingKey(pallas::Base); impl NullifierDerivingKey { @@ -266,6 +267,7 @@ impl NullifierDerivingKey { /// /// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents #[derive(Copy, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "unstable-frost", visibility::make(pub))] pub(crate) struct CommitIvkRandomness(pallas::Scalar); impl From<&SpendingKey> for CommitIvkRandomness { @@ -333,6 +335,32 @@ impl From for SpendValidatingKey { } impl FullViewingKey { + /// Creates a `FullViewingKey` from a `SpendingKey` and `SpendValidatingKey`. + /// This is necessary for FROST key management. + /// + /// Note: See [FROST Book - Technical details](https://frost.zfnd.org/zcash/technical-details.html) + #[cfg(feature = "unstable-frost")] + pub fn from_sk_and_ak(sk: &SpendingKey, ak: SpendValidatingKey) -> FullViewingKey { + FullViewingKey { + ak, + nk: NullifierDerivingKey::from(sk), + rivk: CommitIvkRandomness::from(sk), + } + } + + /// Creates a `FullViewingKey` from its checked parts. This is necessary for FROST + /// key management in order to avoid centralizing spend authority in a backup scheme. + /// + /// Note: See [FROST Book - Technical details - Backing Up Key Shares](https://frost.zfnd.org/zcash/technical-details.html) + #[cfg(feature = "unstable-frost")] + pub fn from_checked_parts( + ak: SpendValidatingKey, + nk: NullifierDerivingKey, + rivk: CommitIvkRandomness, + ) -> FullViewingKey { + FullViewingKey { ak, nk, rivk } + } + pub(crate) fn nk(&self) -> &NullifierDerivingKey { &self.nk }