Skip to main content

defuse_core/payload/
raw.rs

1use defuse_crypto::{
2    Curve,
3    ed25519::{Ed25519, Ed25519PublicKey, Ed25519Signature},
4};
5use defuse_digest::{Digest, sha2::Sha256};
6use serde::{Deserialize, Serialize, de::DeserializeOwned};
7
8use crate::payload::{Payload, SignedPayload};
9
10use super::ExtractDefusePayload;
11
12#[cfg_attr(feature = "schemars-v0_8", derive(::schemars::JsonSchema))]
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct SignedRawEd25519Payload {
15    pub payload: String,
16
17    pub public_key: Ed25519PublicKey,
18    pub signature: Ed25519Signature,
19}
20
21impl Payload for SignedRawEd25519Payload {
22    #[inline]
23    fn hash(&self) -> [u8; 32] {
24        Sha256::digest(self.payload.as_bytes()).into()
25    }
26}
27
28impl SignedPayload for SignedRawEd25519Payload {
29    type PublicKey = Ed25519PublicKey;
30
31    #[inline]
32    fn verify(&self) -> Option<Self::PublicKey> {
33        Ed25519::verify(
34            &self.public_key.try_into().ok()?,
35            self.payload.as_bytes(),
36            &self.signature.into(),
37        )
38        .then_some(&self.public_key)
39        .copied()
40    }
41}
42
43impl<T> ExtractDefusePayload<T> for SignedRawEd25519Payload
44where
45    T: DeserializeOwned,
46{
47    type Error = serde_json::Error;
48
49    fn extract_defuse_payload(self) -> Result<super::DefusePayload<T>, Self::Error> {
50        serde_json::from_str(&self.payload)
51    }
52}