Skip to content

Commit

Permalink
Allow creating a FullViewingKey from a given SpendValidatingKey
Browse files Browse the repository at this point in the history
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 zcash#431

see related zcash#430

PR Suggestions
  • Loading branch information
pacu committed Aug 17, 2024
1 parent ce1be62 commit f3a03b9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ and this project adheres to Rust's notion of
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
- 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

## [0.9.1] - 2024-08-13

Expand Down
28 changes: 28 additions & 0 deletions src/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -333,6 +335,32 @@ impl From<FullViewingKey> 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
}
Expand Down

0 comments on commit f3a03b9

Please sign in to comment.