use bincode::{deserialize, serialize};
use serde::{Deserialize, Serialize};
use threshold_crypto::{PublicKey, SecretKey, Signature};
#[derive(Deserialize, Serialize)]
struct SignedMsg {
msg: Vec<u8>,
sig: Signature,
}
#[derive(Debug)]
struct KeyPair {
sk: SecretKey,
pk: PublicKey,
}
impl KeyPair {
fn random() -> Self {
let sk = SecretKey::random();
let pk = sk.public_key();
KeyPair { sk, pk }
}
fn create_signed_msg(&self, msg: &[u8]) -> SignedMsg {
let sig = self.sk.sign(msg);
let msg = msg.to_vec();
SignedMsg { msg, sig }
}
}
fn main() {
let alice = KeyPair::random();
let bob = KeyPair::random();
let msg = b"let's get pizza";
let signed_msg = bob.create_signed_msg(msg);
let serialized = serialize(&signed_msg).expect("Failed to serialize `SignedMsg`");
let ciphertext = alice.pk.encrypt(&serialized);
let decrypted = alice.sk.decrypt(&ciphertext).expect("Invalid ciphertext");
let deserialized: SignedMsg =
deserialize(&decrypted).expect("Failed to deserialize bytes to `SignedMsg`");
assert!(bob.pk.verify(&deserialized.sig, &deserialized.msg));
assert_eq!(msg, &deserialized.msg[..]);
}