pub struct StatelessMerkleSignatureScheme { /* private fields */ }Expand description
Stateless Merkle signatures, as described in Section 14.6.3 in the textbook by Boneh & Shoup.
Builds a tree of depth depth and width q. For each signature,
a pseudo-random path is selected.
Then, the signature contains a series of q-indexed signatures,
each signing the public key of the next one. The leaf node signs
the hash of the message.
§Examples
use hash_based_signatures::signature::stateless_merkle::StatelessMerkleSignatureScheme;
use hash_based_signatures::signature::SignatureScheme;
use hash_based_signatures::signature::winternitz::d::D;
let mut signature_scheme = StatelessMerkleSignatureScheme::new([0; 32], 16, 5, D::new(255));
let signature0 = signature_scheme.sign([0u8; 32]);
let signature1 = signature_scheme.sign([1u8; 32]);
assert!(StatelessMerkleSignatureScheme::verify(
signature_scheme.public_key(),
[0u8; 32],
&signature0
));
assert!(StatelessMerkleSignatureScheme::verify(
signature_scheme.public_key(),
[1u8; 32],
&signature1
));
assert!(!StatelessMerkleSignatureScheme::verify(
signature_scheme.public_key(),
[2u8; 32],
&signature1
));Implementations§
Source§impl StatelessMerkleSignatureScheme
impl StatelessMerkleSignatureScheme
Sourcepub fn new(seed: HashType, q: usize, depth: usize, d: D) -> Self
pub fn new(seed: HashType, q: usize, depth: usize, d: D) -> Self
Instantiates the new stateless Merkle signature scheme as a tree with width q and depth depth.
The resulting tree will have q**depth leafs. Because the scheme is broken if the same leaf is
chosen for two different messages, the expected number of signed messages should not exceed
sqrt(q**depth).
§Panics
Panics if q is not a power of two.
pub fn from_private_key(key: &StatelessMerklePrivateKey) -> Result<Self>
pub fn private_key(&self) -> StatelessMerklePrivateKey
Trait Implementations§
Source§impl SignatureScheme<[u8; 32], [u8; 32], StatelessMerkleSignature> for StatelessMerkleSignatureScheme
impl SignatureScheme<[u8; 32], [u8; 32], StatelessMerkleSignature> for StatelessMerkleSignatureScheme
Source§fn public_key(&self) -> HashType
fn public_key(&self) -> HashType
Returns a copy of the public key
Source§fn sign(&mut self, message: HashType) -> StatelessMerkleSignature
fn sign(&mut self, message: HashType) -> StatelessMerkleSignature
Signs a message
Source§fn verify(
pk: HashType,
message: HashType,
signature: &StatelessMerkleSignature,
) -> bool
fn verify( pk: HashType, message: HashType, signature: &StatelessMerkleSignature, ) -> bool
Verifies a signature.
Note that this function does not require need
self, hence does not need
an instance of the signature scheme.
This is because an instance of a signature scheme contains the signing key
which is typically not available for the verifier.Auto Trait Implementations§
impl Freeze for StatelessMerkleSignatureScheme
impl RefUnwindSafe for StatelessMerkleSignatureScheme
impl Send for StatelessMerkleSignatureScheme
impl Sync for StatelessMerkleSignatureScheme
impl Unpin for StatelessMerkleSignatureScheme
impl UnwindSafe for StatelessMerkleSignatureScheme
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more