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
  • Loading branch information
pacu committed Jul 31, 2024
1 parent 96bda92 commit dd2bcd8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ 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 `from_sk_and_ask::keys::FullViewingKey::from_sk_and_ask` under the
`unstable-frost` feature flag
- Added `from_sk_and_ask::keys::FullViewingKey::from_checked_parts` under the
`unstable-frost` feature flag

### Modified
- `CommitIvkRandomness` is pub for `unstable-frost` feature
- `NullifierDerivingKey` is pub for `unstable-frost` feature

## [0.8.0] - 2024-03-25

Expand Down
32 changes: 32 additions & 0 deletions src/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,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 @@ -264,6 +265,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 @@ -331,6 +333,36 @@ 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_ask(sk: &SpendingKey, ask: SpendValidatingKey) -> FullViewingKey {
FullViewingKey {
ak: ask,
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(
ask: SpendValidatingKey,
nk: NullifierDerivingKey,
rivk: CommitIvkRandomness,
) -> FullViewingKey {
FullViewingKey {
ak: ask,
nk,
rivk,
}
}

pub(crate) fn nk(&self) -> &NullifierDerivingKey {
&self.nk
}
Expand Down

0 comments on commit dd2bcd8

Please sign in to comment.