use libp2p::{
identity::{Keypair, PublicKey},
PeerId,
};
use serde::{Deserialize, Serialize};
use crate::TatamiError;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Message {
pub payload: Vec<u8>,
pub public_key: Vec<u8>,
pub signature: Vec<u8>,
}
impl Message {
pub fn source(&self) -> Result<PeerId, TatamiError> {
Ok(self.public_key()?.to_peer_id())
}
pub fn public_key(&self) -> Result<PublicKey, TatamiError> {
PublicKey::from_protobuf_encoding(&self.public_key).or(Err(TatamiError::Generic))
}
pub fn verify(&self) -> Result<bool, TatamiError> {
let public_key = self.public_key()?;
Ok(public_key.verify(&self.payload, &self.signature))
}
pub fn create(payload: Vec<u8>, keypair: Keypair) -> Result<Self, TatamiError> {
let local_public_key = keypair.public();
let signature = keypair.sign(&payload).or(Err(TatamiError::Generic))?;
Ok(Self {
payload,
public_key: local_public_key.to_protobuf_encoding(),
signature,
})
}
}
#[derive(Debug, Clone)]
pub struct PeerMessage {
pub payload: Vec<u8>,
pub peer: PeerId,
}