tatami 0.1.5

A library for creating satellites and interacting with Tatami protocols.
Documentation
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)]
/// These should already be checked
pub struct PeerMessage {
	pub payload: Vec<u8>,
	pub peer: PeerId,
}