use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CryptographicConfig {
pub aggregation_protocol: SecureAggregationProtocol,
pub homomorphic_encryption: HomomorphicEncryptionConfig,
pub secure_mpc: SecureMPCConfig,
pub signature_scheme: DigitalSignatureScheme,
pub key_exchange: KeyExchangeProtocol,
pub zero_knowledge_proofs: ZKProofConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SecureAggregationProtocol {
BasicSecureAggregation,
FederatedSecureAggregation,
PrivateFederatedLearning,
SecAggPlus,
Flamingo,
FATE,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HomomorphicEncryptionConfig {
pub scheme: HomomorphicScheme,
pub security_level: u16,
pub poly_modulus_degree: u32,
pub coeff_modulus: Vec<u64>,
pub plaintext_modulus: u64,
pub optimization_level: OptimizationLevel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HomomorphicScheme {
BFV,
CKKS,
BGV,
TFHE,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptimizationLevel {
None,
Basic,
Advanced,
Maximum,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecureMPCConfig {
pub protocol: MPCProtocol,
pub num_parties: u32,
pub threshold: u32,
pub security_parameter: u16,
pub communication_rounds: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MPCProtocol {
ShamirSecretSharing,
BGW,
GMW,
SPDZ,
ABY,
CrypTFlow,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DigitalSignatureScheme {
ECDSA,
EdDSA,
RSAPSS,
BLS,
RingSignature,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum KeyExchangeProtocol {
ECDH,
X25519,
Kyber,
NTRU,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZKProofConfig {
pub proof_system: ZKProofSystem,
pub circuit_complexity: u32,
pub proof_size_optimization: bool,
pub verification_key_caching: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ZKProofSystem {
ZkSNARKs,
ZkSTARKs,
Bulletproofs,
Plonk,
Marlin,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PostQuantumConfig {
pub kem: PostQuantumKEM,
pub signature: PostQuantumSignature,
pub security_level: u8,
pub quantum_safe_aggregation: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PostQuantumKEM {
Kyber,
NTRU,
SABER,
FrodoKEM,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PostQuantumSignature {
Dilithium,
Falcon,
SPHINCSPlus,
Rainbow,
}
impl Default for CryptographicConfig {
fn default() -> Self {
Self {
aggregation_protocol: SecureAggregationProtocol::SecAggPlus,
homomorphic_encryption: HomomorphicEncryptionConfig::default(),
secure_mpc: SecureMPCConfig::default(),
signature_scheme: DigitalSignatureScheme::EdDSA,
key_exchange: KeyExchangeProtocol::X25519,
zero_knowledge_proofs: ZKProofConfig::default(),
}
}
}
impl Default for HomomorphicEncryptionConfig {
fn default() -> Self {
Self {
scheme: HomomorphicScheme::CKKS,
security_level: 128,
poly_modulus_degree: 8192,
coeff_modulus: vec![60, 40, 40, 60],
plaintext_modulus: 40961,
optimization_level: OptimizationLevel::Advanced,
}
}
}
impl Default for SecureMPCConfig {
fn default() -> Self {
Self {
protocol: MPCProtocol::SPDZ,
num_parties: 3,
threshold: 2,
security_parameter: 128,
communication_rounds: 3,
}
}
}
impl Default for ZKProofConfig {
fn default() -> Self {
Self {
proof_system: ZKProofSystem::Plonk,
circuit_complexity: 1000000,
proof_size_optimization: true,
verification_key_caching: true,
}
}
}
impl Default for PostQuantumConfig {
fn default() -> Self {
Self {
kem: PostQuantumKEM::Kyber,
signature: PostQuantumSignature::Dilithium,
security_level: 3, quantum_safe_aggregation: true,
}
}
}
#[derive(Debug, Clone)]
pub struct CryptographicKeyManager {
pub master_public_key: Vec<u8>,
pub participant_keys: std::collections::HashMap<String, Vec<u8>>,
pub symmetric_keys: std::collections::HashMap<String, Vec<u8>>,
pub key_rotation_interval: std::time::Duration,
pub last_rotation: std::time::SystemTime,
}
impl CryptographicKeyManager {
pub fn new() -> Self {
Self {
master_public_key: Vec::new(),
participant_keys: std::collections::HashMap::new(),
symmetric_keys: std::collections::HashMap::new(),
key_rotation_interval: std::time::Duration::from_secs(86400), last_rotation: std::time::SystemTime::now(),
}
}
pub fn add_participant_key(&mut self, participant_id: String, public_key: Vec<u8>) {
self.participant_keys.insert(participant_id, public_key);
}
pub fn remove_participant_key(&mut self, participant_id: &str) {
self.participant_keys.remove(participant_id);
}
pub fn needs_key_rotation(&self) -> bool {
std::time::SystemTime::now()
.duration_since(self.last_rotation)
.unwrap_or_default() > self.key_rotation_interval
}
pub fn rotate_keys(&mut self) -> Result<(), String> {
self.last_rotation = std::time::SystemTime::now();
Ok(())
}
pub fn participant_count(&self) -> usize {
self.participant_keys.len()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cryptographic_config_default() {
let config = CryptographicConfig::default();
assert_eq!(config.aggregation_protocol, SecureAggregationProtocol::SecAggPlus);
assert_eq!(config.signature_scheme, DigitalSignatureScheme::EdDSA);
assert_eq!(config.key_exchange, KeyExchangeProtocol::X25519);
}
#[test]
fn test_homomorphic_encryption_config() {
let config = HomomorphicEncryptionConfig::default();
assert_eq!(config.scheme, HomomorphicScheme::CKKS);
assert_eq!(config.security_level, 128);
assert_eq!(config.poly_modulus_degree, 8192);
assert_eq!(config.optimization_level, OptimizationLevel::Advanced);
}
#[test]
fn test_mpc_config() {
let config = SecureMPCConfig::default();
assert_eq!(config.protocol, MPCProtocol::SPDZ);
assert_eq!(config.num_parties, 3);
assert_eq!(config.threshold, 2);
assert_eq!(config.security_parameter, 128);
}
#[test]
fn test_post_quantum_config() {
let config = PostQuantumConfig::default();
assert_eq!(config.kem, PostQuantumKEM::Kyber);
assert_eq!(config.signature, PostQuantumSignature::Dilithium);
assert_eq!(config.security_level, 3);
assert!(config.quantum_safe_aggregation);
}
#[test]
fn test_key_manager() {
let mut manager = CryptographicKeyManager::new();
assert_eq!(manager.participant_count(), 0);
manager.add_participant_key("participant1".to_string(), vec![1, 2, 3, 4]);
manager.add_participant_key("participant2".to_string(), vec![5, 6, 7, 8]);
assert_eq!(manager.participant_count(), 2);
manager.remove_participant_key("participant1");
assert_eq!(manager.participant_count(), 1);
assert!(manager.rotate_keys().is_ok());
}
#[test]
fn test_zk_proof_systems() {
let systems = [
ZKProofSystem::ZkSNARKs,
ZKProofSystem::ZkSTARKs,
ZKProofSystem::Bulletproofs,
ZKProofSystem::Plonk,
ZKProofSystem::Marlin,
];
for system in &systems {
let serialized = serde_json::to_string(system).expect("Operation failed");
let deserialized: ZKProofSystem = serde_json::from_str(&serialized).expect("Operation failed");
assert_eq!(*system, deserialized);
}
}
#[test]
fn test_homomorphic_schemes() {
let schemes = [
HomomorphicScheme::BFV,
HomomorphicScheme::CKKS,
HomomorphicScheme::BGV,
HomomorphicScheme::TFHE,
];
for scheme in &schemes {
let serialized = serde_json::to_string(scheme).expect("Operation failed");
let deserialized: HomomorphicScheme = serde_json::from_str(&serialized).expect("Operation failed");
assert_eq!(*scheme, deserialized);
}
}
#[test]
fn test_mpc_protocols() {
let protocols = [
MPCProtocol::ShamirSecretSharing,
MPCProtocol::BGW,
MPCProtocol::GMW,
MPCProtocol::SPDZ,
MPCProtocol::ABY,
MPCProtocol::CrypTFlow,
];
for protocol in &protocols {
let serialized = serde_json::to_string(protocol).expect("Operation failed");
let deserialized: MPCProtocol = serde_json::from_str(&serialized).expect("Operation failed");
assert_eq!(*protocol, deserialized);
}
}
}