// -*- mode: rust; -*- // // This file is part of redjubjub. // Copyright (c) 2019-2021 Zcash Foundation // See LICENSE for licensing information. // // Authors: // - Deirdre Connolly // - Henry de Valence #![doc(html_root_url = "https://docs.rs/redjubjub/0.2.2")] #![cfg_attr(feature = "nightly", feature(external_doc))] #![cfg_attr(feature = "nightly", doc(include = "../README.md"))] #![deny(missing_docs)] //! Docs require the `nightly` feature until RFC 1990 lands. pub mod batch; mod constants; mod error; pub mod frost; mod hash; mod scalar_mul; mod signature; mod signing_key; mod verification_key; /// An element of the JubJub scalar field used for randomization of public and secret keys. pub type Randomizer = jubjub::Fr; /// A better name than Fr. // XXX-jubjub: upstream this name type Scalar = jubjub::Fr; use hash::HStar; pub use error::Error; pub use signature::Signature; pub use signing_key::SigningKey; pub use verification_key::{VerificationKey, VerificationKeyBytes}; /// Abstracts over different RedJubJub parameter choices, [`Binding`] /// and [`SpendAuth`]. /// /// As described [at the end of ยง5.4.6][concretereddsa] of the Zcash /// protocol specification, the generator used in RedJubjub is left as /// an unspecified parameter, chosen differently for each of /// `BindingSig` and `SpendAuthSig`. /// /// To handle this, we encode the parameter choice as a genuine type /// parameter. /// /// [concretereddsa]: https://zips.z.cash/protocol/protocol.pdf#concretereddsa pub trait SigType: private::Sealed {} /// A type variable corresponding to Zcash's `BindingSig`. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum Binding {} impl SigType for Binding {} /// A type variable corresponding to Zcash's `SpendAuthSig`. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum SpendAuth {} impl SigType for SpendAuth {} pub(crate) mod private { use super::*; pub trait Sealed: Copy + Clone + Eq + PartialEq + std::fmt::Debug { fn basepoint() -> jubjub::ExtendedPoint; } impl Sealed for Binding { fn basepoint() -> jubjub::ExtendedPoint { jubjub::AffinePoint::from_bytes(constants::BINDINGSIG_BASEPOINT_BYTES) .unwrap() .into() } } impl Sealed for SpendAuth { fn basepoint() -> jubjub::ExtendedPoint { jubjub::AffinePoint::from_bytes(constants::SPENDAUTHSIG_BASEPOINT_BYTES) .unwrap() .into() } } }