use oxicrypto_core::{AlgorithmId, Vec};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VersionInfo {
pub major: u32,
pub minor: u32,
pub patch: u32,
pub pre: &'static str,
}
impl core::fmt::Display for VersionInfo {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
if self.pre.is_empty() {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
} else {
write!(
f,
"{}.{}.{}-{}",
self.major, self.minor, self.patch, self.pre
)
}
}
}
#[must_use]
#[allow(clippy::vec_init_then_push)] pub fn enabled_features() -> Vec<&'static str> {
let mut features = Vec::new();
#[cfg(feature = "pure")]
features.push("pure");
#[cfg(feature = "simd")]
features.push("simd");
#[cfg(feature = "pq-preview")]
features.push("pq-preview");
#[cfg(feature = "std")]
features.push("std");
features
}
#[must_use]
pub fn version() -> VersionInfo {
VersionInfo {
major: env!("CARGO_PKG_VERSION_MAJOR")
.parse::<u32>()
.ok()
.unwrap_or(0),
minor: env!("CARGO_PKG_VERSION_MINOR")
.parse::<u32>()
.ok()
.unwrap_or(0),
patch: env!("CARGO_PKG_VERSION_PATCH")
.parse::<u32>()
.ok()
.unwrap_or(0),
pre: env!("CARGO_PKG_VERSION_PRE"),
}
}
#[must_use]
pub fn available_algorithms() -> Vec<AlgorithmId> {
let mut ids = Vec::new();
ids.extend_from_slice(&[
AlgorithmId::Sha256,
AlgorithmId::Sha384,
AlgorithmId::Sha512,
AlgorithmId::Sha3_256,
AlgorithmId::Sha3_384,
AlgorithmId::Sha3_512,
AlgorithmId::Blake3,
]);
ids.extend_from_slice(&[
AlgorithmId::Aes128Gcm,
AlgorithmId::Aes256Gcm,
AlgorithmId::ChaCha20Poly1305,
AlgorithmId::Aes128GcmSiv,
AlgorithmId::Aes256GcmSiv,
AlgorithmId::XChaCha20Poly1305,
AlgorithmId::Aes128Ccm,
AlgorithmId::Aes256Ccm,
AlgorithmId::DeoxysII128,
AlgorithmId::AesKeyWrap128,
AlgorithmId::AesKeyWrap256,
]);
ids.extend_from_slice(&[
AlgorithmId::HmacSha256,
AlgorithmId::HmacSha384,
AlgorithmId::HmacSha512,
AlgorithmId::HmacSha3_256,
AlgorithmId::HmacSha3_512,
AlgorithmId::Poly1305,
AlgorithmId::CmacAes128,
AlgorithmId::CmacAes256,
AlgorithmId::Kmac128,
AlgorithmId::Kmac256,
]);
ids.extend_from_slice(&[
AlgorithmId::Ed25519,
AlgorithmId::Ed448,
AlgorithmId::EcdsaP256,
AlgorithmId::EcdsaP384,
AlgorithmId::EcdsaP521,
AlgorithmId::RsaPkcs1v15Sha256,
AlgorithmId::RsaPkcs1v15Sha384,
AlgorithmId::RsaPkcs1v15Sha512,
AlgorithmId::RsaPssSha256,
AlgorithmId::SchnorrBip340,
]);
ids.extend_from_slice(&[
AlgorithmId::X25519,
AlgorithmId::EcdhP256,
AlgorithmId::EcdhP384,
AlgorithmId::EcdhP521,
]);
ids.extend_from_slice(&[
AlgorithmId::HkdfSha256,
AlgorithmId::HkdfSha384,
AlgorithmId::HkdfSha512,
AlgorithmId::Pbkdf2Sha256,
AlgorithmId::Pbkdf2Sha512,
AlgorithmId::Argon2id,
AlgorithmId::Scrypt,
AlgorithmId::Balloon,
]);
#[cfg(feature = "pq-preview")]
ids.extend_from_slice(&[
AlgorithmId::MlKem512,
AlgorithmId::MlKem768,
AlgorithmId::MlKem1024,
AlgorithmId::MlDsa44,
AlgorithmId::MlDsa65,
AlgorithmId::MlDsa87,
AlgorithmId::SlhDsaSha2_128s,
AlgorithmId::SlhDsaSha2_128f,
AlgorithmId::SlhDsaSha2_192s,
AlgorithmId::SlhDsaSha2_192f,
AlgorithmId::SlhDsaSha2_256s,
AlgorithmId::SlhDsaSha2_256f,
AlgorithmId::SlhDsaShake128s,
AlgorithmId::SlhDsaShake128f,
AlgorithmId::SlhDsaShake256s,
AlgorithmId::SlhDsaShake256f,
]);
ids
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Suite {
pub aead: crate::AeadAlgo,
pub mac: crate::MacAlgo,
pub hash: crate::HashAlgo,
pub kex: crate::KexAlgo,
pub kdf: crate::KdfAlgo,
}
impl Suite {
pub const TLS13: Suite = Suite {
aead: crate::AeadAlgo::Aes256Gcm,
mac: crate::MacAlgo::HmacSha384,
hash: crate::HashAlgo::Sha384,
kex: crate::KexAlgo::X25519,
kdf: crate::KdfAlgo::HkdfSha384,
};
}
impl core::fmt::Display for Suite {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"Suite {{ aead: {}, mac: {}, hash: {}, kex: {}, kdf: {} }}",
self.aead, self.mac, self.hash, self.kex, self.kdf
)
}
}
#[cfg(feature = "pq-preview")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PqSuite {
pub classical: Suite,
pub pq_kem: crate::PqKemAlgo,
pub pq_sig: crate::PqSigAlgo,
}
#[cfg(feature = "pq-preview")]
impl PqSuite {
pub const PQ_TLS13: PqSuite = PqSuite {
classical: Suite::TLS13,
pq_kem: crate::PqKemAlgo::MlKem768,
pq_sig: crate::PqSigAlgo::MlDsa65,
};
pub const PQ_TLS13_HASH_BASED: PqSuite = PqSuite {
classical: Suite::TLS13,
pq_kem: crate::PqKemAlgo::MlKem768,
pq_sig: crate::PqSigAlgo::SlhDsaShake128f,
};
}
#[cfg(feature = "pq-preview")]
impl core::fmt::Display for PqSuite {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"PqSuite {{ classical: {}, pq_kem: {}, pq_sig: {} }}",
self.classical, self.pq_kem, self.pq_sig
)
}
}