libsumatracrypt-rs 0.4.3

A Rust Library For Cryptography
Documentation
use pqcrypto_traits::sign::*;
use pqcrypto_falcon::falcon512;
use pqcrypto_falcon::falcon1024;
use hex::*;
use bs58;

use serde::{Serialize,Deserialize};
use zeroize::{Zeroize,ZeroizeOnDrop};

pub struct SumatraFalcon512;
pub struct SumatraFalcon1024;

#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon512PublicKey(String);
#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon512SecretKey(String);
#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon512Signature(String);

#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon1024PublicKey(String);

#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon1024SecretKey(String);

#[derive(Clone, Zeroize, ZeroizeOnDrop,Serialize,Deserialize)]
pub struct Falcon1024Signature(String);


impl SumatraFalcon512 {
    pub fn new() -> (Falcon512SecretKey,Falcon512PublicKey) {
        let keypair = falcon512::keypair();
        let sk = hex::encode_upper(keypair.1.as_bytes());
        let pk = hex::encode_upper(keypair.0.as_bytes());
        return (Falcon512SecretKey(sk),Falcon512PublicKey(pk))
    }
}

impl SumatraFalcon1024 {
    pub fn new() -> (Falcon1024SecretKey,Falcon1024PublicKey) {
        let keypair = falcon1024::keypair();
        let sk = hex::encode_upper(keypair.1.as_bytes());
        let pk = hex::encode_upper(keypair.0.as_bytes());
        return (Falcon1024SecretKey(sk),Falcon1024PublicKey(pk))
    }
}

impl Falcon1024SecretKey {
    pub fn to_pqcrtop(&self) -> falcon1024::SecretKey {
        let bytes = self.to_bytes();
        return falcon1024::SecretKey::from_bytes(&bytes).expect("Failed To Decode Falcon1024 From Bytes")
    }
    pub fn to_bytes(&self) -> Vec<u8> {
        let bytes = hex::decode(&self.0).expect("Failed To Decode");
        return bytes
    }
    pub fn sign<T: AsRef<[u8]>>(&self, msg: T) -> Falcon1024Signature {
        let sk = self.to_pqcrtop();
        let signature = falcon1024::detached_sign(msg.as_ref(), &sk);
        return Falcon1024Signature(hex::encode_upper(signature.as_bytes()));
    }
}

impl Falcon1024PublicKey {
    pub fn to_bytes(&self) -> Vec<u8> {
        let bytes = hex::decode(&self.0).expect("Failed To Convert");
        return bytes
    }
    pub fn to_pqcrtop(&self) -> falcon1024::PublicKey {
        let bytes = self.to_bytes();
        return falcon1024::PublicKey::from_bytes(&bytes).expect("Failed To Convert From Bytes")
    }
    pub fn verify<T: AsRef<[u8]>>(&self, sig: Falcon1024Signature, msg: T) -> bool {
        let pk = self.to_pqcrtop();
        return falcon1024::verify_detached_signature(&sig.to_pqcrtop(), msg.as_ref(), &pk).is_ok()
    }
}

impl Falcon1024Signature {
    pub fn to_bytes(&self) -> Vec<u8> {
        return hex::decode(&self.0).expect("Failed To Decode From Hex")
    }
    pub fn to_pqcrtop(&self) -> falcon1024::DetachedSignature {
        let bytes = self.to_bytes();
        return falcon1024::DetachedSignature::from_bytes(&bytes).expect("Failed To Get Falcon1024 Signature")
    }
    pub fn to_bs58(&self) -> String {
        let bytes = self.to_bytes();
        return bs58::encode(bytes).into_string()
    }
    pub fn from_bs58<T: AsRef<str>>(sig: T) -> Self {
        let bytes = bs58::decode(sig.as_ref()).into_vec().expect("Failed To Convert From Base58");
        Self(hex::encode_upper(bytes))
    }
}