// SPDX-License-Identifier: MIT OR Apache-2.0 // Copyright (c) VexaHub and contributors. // Copyright (c) Meta Platforms, Inc. and affiliates. //! PureEdDSA implementation for [`SigmaI`](crate::SigmaI). Currently only //! supports [`Ed25519`](crate::Ed25519). use core::marker::PhantomData; use generic_array::GenericArray; use rand::{CryptoRng, Rng}; use zeroize::Zeroize; use self::implementation::PureEddsaImpl; use super::{Message, MessageBuilder, SignatureProtocol}; use crate::ciphersuite::CipherSuite; use crate::errors::ProtocolError; use crate::key_exchange::group::Group; use crate::key_exchange::sigma_i::CachedMessage; /// PureEdDSA for [`SigmaI`](crate::SigmaI). /// /// The ["verification state"](Self::VerifyState) is a [`CachedMessage`], /// created by calling [`Message::to_cached()`]. pub struct PureEddsa(PhantomData); impl SignatureProtocol for PureEddsa { type Group = G; type Signature = G::Signature; type SignatureLen = G::SignatureLen; type VerifyState = CachedMessage; fn sign<'a, R: CryptoRng + Rng, CS: CipherSuite, KE: Group>( sk: &G::Sk, _: &mut R, message: &Message, ) -> (Self::Signature, Self::VerifyState) { G::sign(sk, message) } fn verify( pk: &G::Pk, message_builder: MessageBuilder<'_, CS>, state: Self::VerifyState, signature: &Self::Signature, ) -> Result<(), ProtocolError> { G::verify(pk, message_builder, state, signature) } fn serialize_signature(signature: &Self::Signature) -> GenericArray { G::serialize_signature(signature) } fn deserialize_take_signature(bytes: &mut &[u8]) -> Result { G::deserialize_take_signature(bytes) } } pub(in super::super) mod implementation { use generic_array::ArrayLength; use super::*; pub trait PureEddsaImpl: Group { type Signature: Clone + Zeroize; type SignatureLen: ArrayLength; fn sign( sk: &Self::Sk, message: &Message, ) -> (Self::Signature, CachedMessage); fn verify( pk: &Self::Pk, message_builder: MessageBuilder<'_, CS>, state: CachedMessage, signature: &Self::Signature, ) -> Result<(), ProtocolError>; fn deserialize_take_signature(bytes: &mut &[u8]) -> Result; fn serialize_signature(signature: &Self::Signature) -> GenericArray; } }