use base64;
use hex;
use serde::{Serialize, Deserialize};
use pqcrypto_traits::sign::{PublicKey,SecretKey,DetachedSignature,VerificationError};
use pqcrypto_falcon::falcon512;
use pqcrypto_falcon::falcon1024;
use pqcrypto_sphincsplus::sphincsshake256256srobust;
use pqcrypto_qtesla::qteslapiii;
pub trait Keypairs {
const ALGORITHM: &'static str;
const VERSION: &'static str;
const PUBLIC_KEY_SIZE: usize;
const SECRET_KEY_SIZE: usize;
const SIGNATURE_SIZE: usize;
fn new() -> Self;
fn export(&self) -> String;
fn import(yaml: &str) -> Self;
#[deprecated]
fn as_bytes(&self) -> (Vec<u8>,Vec<u8>);
fn public_key_as_bytes(&self) -> Vec<u8>;
fn secret_key_as_bytes(&self) -> Vec<u8>;
fn sign(&self,message: &str) -> Signature;
}
pub trait Signatures {
fn export(&self) -> String;
fn import(yaml: &str) -> Self;
fn verify(&self) -> bool;
fn signature_as_bytes(&self) -> Vec<u8>;
fn message_as_bytes(&self) -> &[u8];
}
#[derive(Serialize,Deserialize,Clone,Debug,PartialEq,PartialOrd,Hash,Default)]
struct qTeslaKeypair {
pub algorithm: String,
pub public_key: String,
pub private_key: String,
}
#[derive(Serialize,Deserialize,Clone,Debug,PartialEq,PartialOrd,Hash,Default)]
pub struct SphincsKeypair {
pub algorithm: String,
pub public_key: String,
pub private_key: String,
}
#[derive(Serialize,Deserialize,Clone,Debug,PartialEq,PartialOrd,Hash,Default)]
pub struct Falcon1024Keypair {
pub algorithm: String,
pub public_key: String,
pub private_key: String,
}
#[derive(Serialize,Deserialize,Clone,Debug,PartialEq,PartialOrd,Hash,Default)]
pub struct Falcon512Keypair {
pub algorithm: String,
pub public_key: String,
pub private_key: String,
}
#[derive(Serialize,Deserialize,Clone,Debug,PartialEq,PartialOrd,Hash,Default)]
pub struct Signature {
pub algorithm: String,
pub public_key: String,
pub message: String,
pub signature: String,
}
impl Keypairs for Falcon512Keypair {
const VERSION: &'static str = "1.00";
const ALGORITHM: &'static str = "FALCON512";
const PUBLIC_KEY_SIZE: usize = 897;
const SECRET_KEY_SIZE: usize = 1281;
const SIGNATURE_SIZE: usize = 660;
fn new() -> Self {
let (pk,sk) = falcon512::keypair();
Falcon512Keypair {
algorithm: String::from(Self::ALGORITHM),
public_key: hex::encode_upper(pk.as_bytes()),
private_key: hex::encode_upper(sk.as_bytes()),
}
}
fn export(&self) -> String {
return serde_yaml::to_string(&self).unwrap();
}
fn import(yaml: &str) -> Self {
let result: Falcon512Keypair = serde_yaml::from_str(yaml).unwrap();
return result
}
fn as_bytes(&self) -> (Vec<u8>,Vec<u8>){
return (hex::decode(&self.public_key).unwrap(), hex::decode(&self.private_key).unwrap())
}
fn public_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.public_key).unwrap()
}
fn secret_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.private_key).unwrap()
}
fn sign(&self,message: &str) -> Signature {
let x = falcon512::detached_sign(message.as_bytes(), &falcon512::SecretKey::from_bytes(&self.secret_key_as_bytes()).unwrap());
return Signature {
algorithm: String::from(Self::ALGORITHM),
public_key: self.public_key.clone(),
message: String::from(message),
signature: base64::encode(x.as_bytes()),
}
}
}
impl Keypairs for Falcon1024Keypair {
const VERSION: &'static str = "1.00";
const ALGORITHM: &'static str = "FALCON1024";
const PUBLIC_KEY_SIZE: usize = 1793;
const SECRET_KEY_SIZE: usize = 2305;
const SIGNATURE_SIZE: usize = 1280;
fn new() -> Self {
let (pk,sk) = falcon1024::keypair();
Falcon1024Keypair {
algorithm: String::from(Self::ALGORITHM),
public_key: hex::encode_upper(pk.as_bytes()),
private_key: hex::encode_upper(sk.as_bytes()),
}
}
fn export(&self) -> String {
return serde_yaml::to_string(&self).unwrap();
}
fn import(yaml: &str) -> Self {
let result: Falcon1024Keypair = serde_yaml::from_str(yaml).unwrap();
return result
}
fn as_bytes(&self) -> (Vec<u8>,Vec<u8>){
return (hex::decode(&self.public_key).unwrap(), hex::decode(&self.private_key).unwrap())
}
fn public_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.public_key).unwrap()
}
fn secret_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.private_key).unwrap()
}
fn sign(&self,message: &str) -> Signature {
let x = falcon1024::detached_sign(message.as_bytes(), &falcon1024::SecretKey::from_bytes(&self.secret_key_as_bytes()).unwrap());
return Signature {
algorithm: String::from(Self::ALGORITHM),
public_key: self.public_key.clone(),
message: String::from(message),
signature: base64::encode(x.as_bytes()),
}
}
}
impl Keypairs for SphincsKeypair {
const VERSION: &'static str = "1.00";
const ALGORITHM: &'static str = "SPHINCS+";
const PUBLIC_KEY_SIZE: usize = 64;
const SECRET_KEY_SIZE: usize = 128;
const SIGNATURE_SIZE: usize = 29_792;
fn new() -> Self {
let (pk,sk) = sphincsshake256256srobust::keypair();
SphincsKeypair {
algorithm: String::from(Self::ALGORITHM),
public_key: hex::encode_upper(pk.as_bytes()),
private_key: hex::encode_upper(sk.as_bytes()),
}
}
fn export(&self) -> String {
return serde_yaml::to_string(&self).unwrap();
}
fn import(yaml: &str) -> Self {
let result: SphincsKeypair = serde_yaml::from_str(yaml).unwrap();
return result
}
fn as_bytes(&self) -> (Vec<u8>,Vec<u8>){
return (hex::decode(&self.public_key).unwrap(), hex::decode(&self.private_key).unwrap())
}
fn public_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.public_key).unwrap()
}
fn secret_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.private_key).unwrap()
}
fn sign(&self,message: &str) -> Signature {
let x = sphincsshake256256srobust::detached_sign(message.as_bytes(), &sphincsshake256256srobust::SecretKey::from_bytes(&self.secret_key_as_bytes()).unwrap());
return Signature {
algorithm: String::from(Self::ALGORITHM),
public_key: self.public_key.clone(),
message: String::from(message),
signature: base64::encode(x.as_bytes()),
}
}
}
impl Keypairs for qTeslaKeypair {
const VERSION: &'static str = "1.00";
const ALGORITHM: &'static str = "qTesla";
const PUBLIC_KEY_SIZE: usize = 38_432;
const SECRET_KEY_SIZE: usize = 12_392;
const SIGNATURE_SIZE: usize = 5_664;
fn new() -> Self {
let (pk,sk) = qteslapiii::keypair();
qTeslaKeypair {
algorithm: String::from(Self::ALGORITHM),
public_key: hex::encode_upper(pk.as_bytes()),
private_key: hex::encode_upper(sk.as_bytes()),
}
}
fn export(&self) -> String {
return serde_yaml::to_string(&self).unwrap();
}
fn import(yaml: &str) -> Self {
let result: qTeslaKeypair = serde_yaml::from_str(yaml).unwrap();
return result
}
fn as_bytes(&self) -> (Vec<u8>,Vec<u8>){
return (hex::decode(&self.public_key).unwrap(), hex::decode(&self.private_key).unwrap())
}
fn public_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.public_key).unwrap()
}
fn secret_key_as_bytes(&self) -> Vec<u8> {
return hex::decode(&self.private_key).unwrap()
}
fn sign(&self,message: &str) -> Signature {
let x = qteslapiii::detached_sign(message.as_bytes(), &qteslapiii::SecretKey::from_bytes(&self.secret_key_as_bytes()).unwrap());
return Signature {
algorithm: String::from(Self::ALGORITHM),
public_key: self.public_key.clone(),
message: String::from(message),
signature: base64::encode(x.as_bytes()),
}
}
}
impl Signatures for Signature {
fn export(&self) -> String {
return serde_yaml::to_string(&self).unwrap();
}
fn import(yaml: &str) -> Self {
let result: Signature = serde_yaml::from_str(yaml).unwrap();
return result
}
fn message_as_bytes(&self) -> &[u8] {
return self.message.as_bytes()
}
fn signature_as_bytes(&self) -> Vec<u8> {
return base64::decode(&self.signature).unwrap()
}
fn verify(&self) -> bool {
if self.algorithm == "FALCON512" {
let v: Result<(),VerificationError> = falcon512::verify_detached_signature(&falcon512::DetachedSignature::from_bytes(&base64::decode(&self.signature).unwrap()).unwrap(), &self.message.as_bytes(), &falcon512::PublicKey::from_bytes(&hex::decode(&self.public_key).unwrap()).unwrap());
if v.is_err() {
return false
}
else {
return true
}
}
else if self.algorithm == "FALCON1024" {
let v: Result<(),VerificationError> = falcon1024::verify_detached_signature(&falcon1024::DetachedSignature::from_bytes(&base64::decode(&self.signature).unwrap()).unwrap(), &self.message.as_bytes(), &falcon1024::PublicKey::from_bytes(&hex::decode(&self.public_key).unwrap()).unwrap());
if v.is_err() {
return false
}
else {
return true
}
}
else if self.algorithm == "SPHINCS+" {
let v: Result<(),VerificationError> = sphincsshake256256srobust::verify_detached_signature(&sphincsshake256256srobust::DetachedSignature::from_bytes(&base64::decode(&self.signature).unwrap()).unwrap(), &self.message.as_bytes(), &sphincsshake256256srobust::PublicKey::from_bytes(&hex::decode(&self.public_key).unwrap()).unwrap());
if v.is_err() {
return false
}
else {
return true
}
}
else if self.algorithm == "qTesla" {
unimplemented!();
}
else {
panic!("Cannot Read Algorithm Type")
}
}
}