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