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