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