Skip to main content

defuse_core/payload/
sep53.rs

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