pub mod entropy;
pub mod error;
pub mod hash;
pub mod hsm;
pub mod merkle;
pub mod signature;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum HashAlgorithm {
#[default]
Sha256,
Sha512,
Blake3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum SignatureAlgorithm {
RsaPss2048,
RsaPss4096,
#[default]
Ed25519,
EcdsaP256,
EcdsaP384,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyMetadata {
pub key_id: String,
pub algorithm: SignatureAlgorithm,
pub created_at: i64,
pub key_type: KeyType,
pub hsm_slot: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum KeyType {
Signing,
Verification,
Encryption,
HsmBacked,
}
#[derive(Debug, thiserror::Error)]
pub enum CryptoError {
#[error("Hash error: {0}")]
HashError(String),
#[error("Signature error: {0}")]
SignatureError(String),
#[error("Key error: {0}")]
KeyError(String),
#[error("HSM error: {0}")]
HsmError(String),
#[error("Verification failed")]
VerificationFailed,
#[error("Invalid key")]
InvalidKey,
}
impl serde::Serialize for CryptoError {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
pub type Result<T> = std::result::Result<T, CryptoError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_hash_algorithm() {
let algo: HashAlgorithm = serde_json::from_str("\"SHA256\"").unwrap();
assert_eq!(algo, HashAlgorithm::Sha256);
}
#[test]
fn test_default_signature_algorithm() {
let algo: SignatureAlgorithm = serde_json::from_str("\"ED25519\"").unwrap();
assert_eq!(algo, SignatureAlgorithm::Ed25519);
}
}