1use crate::{Error, Message, MessageId, PublicKey, Result, Signature};
11use multibase::{self, Base};
12use serde::{de::DeserializeOwned, Serialize};
13use unwrap::unwrap;
14
15pub fn verify_signature(
17 signature: &Signature,
18 public_key: &PublicKey,
19 request: &Message,
20 message_id: &MessageId,
21) -> Result<()> {
22 let message = serialise(&(request, *message_id));
23 public_key.verify(signature, message)
24}
25
26pub(crate) fn serialise<T: Serialize>(data: &T) -> Vec<u8> {
28 unwrap!(bincode::serialize(data))
29}
30
31pub(crate) fn encode<T: Serialize>(data: &T) -> String {
33 let serialised = serialise(&data);
34 multibase::encode(Base::Base32Z, &serialised)
35}
36
37pub(crate) fn decode<I: AsRef<str>, O: DeserializeOwned>(encoded: I) -> Result<O> {
39 let (base, decoded) =
40 multibase::decode(encoded).map_err(|e| Error::FailedToParse(e.to_string()))?;
41 if base != Base::Base32Z {
42 return Err(Error::FailedToParse(format!(
43 "Expected z-base-32 encoding, but got {:?}",
44 base
45 )));
46 }
47 Ok(bincode::deserialize(&decoded).map_err(|e| Error::FailedToParse(e.to_string()))?)
48}