use serde::{Deserialize, Serialize};
use zeroize::Zeroize;
pub mod kyber;
pub mod falcon;
pub mod symmetric;
pub mod hash;
pub mod certificate;
use crate::QsslResult;
pub fn init() -> QsslResult<()> {
let _ = rand::thread_rng();
Ok(())
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u16)]
pub enum CipherSuite {
SphincsKemFalcon512Aes128 = 0x0010,
SphincsKemFalcon512Aes256 = 0x0011,
SphincsKemFalcon1024Aes256 = 0x0012,
SphincsKemSphincs256fAes256 = 0x0013,
SphincsKemFalcon512ChaCha20 = 0x0014,
Kyber512Falcon512Aes128 = 0x0001,
Kyber768Falcon512Aes256 = 0x0002,
Kyber1024Falcon1024Aes256 = 0x0003,
Kyber512Sphincs128fAes128 = 0x0004,
Kyber768Sphincs256fAes256 = 0x0005,
Kyber1024Dilithium3Aes256 = 0x0006,
Kyber768Falcon512ChaCha20 = 0x0007,
}
impl CipherSuite {
pub fn kem_algorithm(&self) -> KemAlgorithm {
use CipherSuite::*;
match self {
SphincsKemFalcon512Aes128 | SphincsKemFalcon512Aes256 |
SphincsKemFalcon1024Aes256 | SphincsKemSphincs256fAes256 |
SphincsKemFalcon512ChaCha20 => KemAlgorithm::SphincsKem,
Kyber512Falcon512Aes128 | Kyber512Sphincs128fAes128 => KemAlgorithm::Kyber512,
Kyber768Falcon512Aes256 | Kyber768Sphincs256fAes256 | Kyber768Falcon512ChaCha20 => {
KemAlgorithm::Kyber768
}
Kyber1024Falcon1024Aes256 | Kyber1024Dilithium3Aes256 => KemAlgorithm::Kyber1024,
}
}
pub fn signature_algorithm(&self) -> SignatureAlgorithm {
use CipherSuite::*;
match self {
SphincsKemFalcon512Aes128 | SphincsKemFalcon512Aes256 |
SphincsKemFalcon512ChaCha20 => SignatureAlgorithm::Falcon512,
SphincsKemFalcon1024Aes256 => SignatureAlgorithm::Falcon1024,
SphincsKemSphincs256fAes256 => SignatureAlgorithm::Sphincs256f,
Kyber512Falcon512Aes128 | Kyber768Falcon512Aes256 | Kyber768Falcon512ChaCha20 => {
SignatureAlgorithm::Falcon512
}
Kyber1024Falcon1024Aes256 => SignatureAlgorithm::Falcon1024,
Kyber512Sphincs128fAes128 => SignatureAlgorithm::Sphincs128f,
Kyber768Sphincs256fAes256 => SignatureAlgorithm::Sphincs256f,
Kyber1024Dilithium3Aes256 => SignatureAlgorithm::Dilithium3,
}
}
pub fn symmetric_cipher(&self) -> SymmetricCipher {
use CipherSuite::*;
match self {
SphincsKemFalcon512Aes128 => SymmetricCipher::Aes128Gcm,
SphincsKemFalcon512Aes256 | SphincsKemFalcon1024Aes256 |
SphincsKemSphincs256fAes256 => SymmetricCipher::Aes256Gcm,
SphincsKemFalcon512ChaCha20 => SymmetricCipher::ChaCha20Poly1305,
Kyber512Falcon512Aes128 | Kyber512Sphincs128fAes128 => SymmetricCipher::Aes128Gcm,
Kyber768Falcon512Aes256 | Kyber1024Falcon1024Aes256 | Kyber768Sphincs256fAes256
| Kyber1024Dilithium3Aes256 => SymmetricCipher::Aes256Gcm,
Kyber768Falcon512ChaCha20 => SymmetricCipher::ChaCha20Poly1305,
}
}
pub fn hash_algorithm(&self) -> HashAlgorithm {
use CipherSuite::*;
match self {
SphincsKemFalcon512Aes128 => HashAlgorithm::Sha256,
SphincsKemFalcon512Aes256 | SphincsKemSphincs256fAes256 |
SphincsKemFalcon512ChaCha20 => HashAlgorithm::Sha384,
SphincsKemFalcon1024Aes256 => HashAlgorithm::Sha512,
Kyber512Falcon512Aes128 | Kyber512Sphincs128fAes128 => HashAlgorithm::Sha256,
Kyber768Falcon512Aes256 | Kyber768Sphincs256fAes256 | Kyber768Falcon512ChaCha20 => {
HashAlgorithm::Sha384
}
Kyber1024Falcon1024Aes256 | Kyber1024Dilithium3Aes256 => HashAlgorithm::Sha512,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum KemAlgorithm {
SphincsKem, Kyber512, Kyber768, Kyber1024, }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SignatureAlgorithm {
Falcon512,
Falcon1024,
Dilithium2,
Dilithium3,
Dilithium5,
Sphincs128f,
Sphincs256f,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SymmetricCipher {
Aes128Gcm,
Aes256Gcm,
ChaCha20Poly1305,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HashAlgorithm {
Sha256,
Sha384,
Sha512,
Sha3_256,
Sha3_512,
}
#[derive(Zeroize)]
#[zeroize(drop)]
pub struct MasterSecret {
secret: Vec<u8>,
}
impl MasterSecret {
pub fn new(secret: Vec<u8>) -> Self {
Self { secret }
}
pub fn as_bytes(&self) -> &[u8] {
&self.secret
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cipher_suite_algorithms() {
let suite = CipherSuite::Kyber768Falcon512Aes256;
assert_eq!(suite.kem_algorithm(), KemAlgorithm::Kyber768);
assert_eq!(suite.signature_algorithm(), SignatureAlgorithm::Falcon512);
assert_eq!(suite.symmetric_cipher(), SymmetricCipher::Aes256Gcm);
assert_eq!(suite.hash_algorithm(), HashAlgorithm::Sha384);
}
}