sentinel_crypto/
crypto_config.rs1use std::sync::OnceLock;
2
3use tracing::{debug, trace};
4
5use crate::error::CryptoError;
6
7#[derive(Clone, Debug, Default, Eq, PartialEq)]
10pub enum HashAlgorithmChoice {
11 #[default]
13 Blake3,
14}
15
16#[derive(Clone, Debug, Default, Eq, PartialEq)]
18pub enum SignatureAlgorithmChoice {
19 #[default]
21 Ed25519,
22}
23
24#[derive(Clone, Debug, Default, Eq, PartialEq)]
26pub enum EncryptionAlgorithmChoice {
27 #[default]
29 XChaCha20Poly1305,
30 Aes256GcmSiv,
32 Ascon128,
35}
36
37#[derive(Clone, Debug, Default, Eq, PartialEq)]
39pub enum KeyDerivationAlgorithmChoice {
40 #[default]
42 Argon2id,
43 Pbkdf2,
45}
46
47#[derive(Clone, Debug, Eq, PartialEq)]
51pub struct CryptoConfig {
52 pub hash_algorithm: HashAlgorithmChoice,
53 pub signature_algorithm: SignatureAlgorithmChoice,
54 pub encryption_algorithm: EncryptionAlgorithmChoice,
55 pub key_derivation_algorithm: KeyDerivationAlgorithmChoice,
56}
57
58impl Default for CryptoConfig {
59 fn default() -> Self {
60 Self {
61 hash_algorithm: HashAlgorithmChoice::Blake3,
62 signature_algorithm: SignatureAlgorithmChoice::Ed25519,
63 encryption_algorithm: EncryptionAlgorithmChoice::XChaCha20Poly1305,
64 key_derivation_algorithm: KeyDerivationAlgorithmChoice::Argon2id,
65 }
66 }
67}
68
69static GLOBAL_CONFIG: OnceLock<CryptoConfig> = OnceLock::new();
71
72pub fn set_global_crypto_config(config: CryptoConfig) -> Result<(), CryptoError> {
77 trace!("Setting global crypto config: {:?}", config);
78 GLOBAL_CONFIG.set(config).map_err(|_| {
79 debug!("Global crypto config already set, cannot change");
80 CryptoError::ConfigAlreadySet
81 })?;
82 debug!("Global crypto config set successfully");
83 Ok(())
84}
85
86pub fn get_global_crypto_config() -> &'static CryptoConfig {
89 trace!("Retrieving global crypto config");
90 let config = GLOBAL_CONFIG.get_or_init(CryptoConfig::default);
91 debug!("Global crypto config retrieved: {:?}", config);
92 config
93}