defuse_core/payload/
sep53.rs1use 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}