use serde::{Deserialize, Serialize};
use std::fmt;
use thiserror::Error;
#[derive(Error, Debug, Clone)]
pub enum HsmError {
#[error("Invalid parameters: {0}")]
InvalidParameters(String),
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("HSM initialization error: {0}")]
InitializationError(String),
#[error("Access denied: {0}")]
AccessDenied(String),
#[error("Key not found: {0}")]
KeyNotFound(String),
#[error("Invalid key type: {0}")]
InvalidKeyType(String),
#[error("Invalid key data: {0}")]
InvalidKeyData(String),
#[error("Key generation error: {0}")]
KeyGenerationError(String),
#[error("Signing error: {0}")]
SigningError(String),
#[error("Verification error: {0}")]
VerificationError(String),
#[error("Encryption error: {0}")]
EncryptionError(String),
#[error("Decryption error: {0}")]
DecryptionError(String),
#[error("Provider error: {0}")]
ProviderError(String),
#[error("Provider not found: {0}")]
ProviderNotFound(String),
#[error("Provider not supported: {0}")]
ProviderNotSupported(String),
#[error("Invalid data: {0}")]
InvalidData(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("Unsupported operation: {0}")]
UnsupportedOperation(String),
#[error("Invalid operation: {0}")]
InvalidOperation(String),
#[error("Unsupported key type")]
UnsupportedKeyType,
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("IO error: {0}")]
IoError(String),
#[error("Invalid key size: {0}")]
InvalidKeySize(usize),
#[error("Authentication error: {0}")]
AuthenticationError(String),
#[error("Device locked: {0}")]
DeviceLocked(String),
#[error("Device disconnected: {0}")]
DeviceDisconnected(String),
#[error("Hardware failure: {0}")]
HardwareFailure(String),
#[error("Deserialization error: {0}")]
DeserializationError(String),
#[error("HSM is disabled: {0}")]
Disabled(String),
#[error("HSM is not ready: {0}")]
NotReady(String),
#[error("Key rotation failed: {0}")]
RotateKey(String),
#[error("Network error: {0}")]
NetworkError(String),
#[error("Transaction error: {0}")]
TransactionError(String),
#[error("PIN locked: {0}")]
PinLocked(String),
#[error("Timeout error: {0}")]
TimeoutError(String),
#[error("Bitcoin error: {0}")]
BitcoinError(String),
#[error("Device communication error: {0}")]
DeviceCommunicationError(String),
#[error("Firmware error: {0}")]
FirmwareError(String),
#[error("Signature verification failed")]
SignatureVerificationFailed,
#[error("Transaction rejected by user")]
TransactionRejected,
#[error("Device needs firmware update: {0}")]
FirmwareUpdateRequired(String),
#[error("Session expired")]
SessionExpired,
#[error("Invalid address: {0}")]
InvalidAddress(String),
#[error("Invalid PSBT: {0}")]
InvalidPsbt(String),
#[error("Audit storage error: {0}")]
AuditStorageError(String),
#[error("HSM audit event error: {0}")]
HsmAuditEventError(String),
#[error("HSM overflow: {0}")]
HsmOverflow(String),
#[error("Internal error: {0}")]
InternalError(String),
#[error("Not implemented: {0}")]
NotImplemented(String),
#[error("Operation not supported: {0}")]
OperationNotSupported(String),
#[error("Invalid key: {0}")]
InvalidKey(String),
}
impl From<std::io::Error> for HsmError {
fn from(error: std::io::Error) -> Self {
HsmError::IoError(error.to_string())
}
}
impl From<bitcoin::sighash::P2wpkhError> for HsmError {
fn from(error: bitcoin::sighash::P2wpkhError) -> Self {
HsmError::BitcoinError(format!("P2WPKH sighash error: {}", error))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AuditEventType {
HsmInitialize,
Initialization,
KeyGeneration,
KeyDeletion,
KeyRotation,
KeyExport,
KeyImport,
Sign,
Verify,
Encrypt,
Decrypt,
Authentication,
ConfigChange,
PolicyChange,
FirmwareUpdate,
Backup,
Restore,
UserManagement,
RoleManagement,
SecurityAlert,
AuditLogAccess,
OperationRequest,
OperationResponse,
HsmOperation,
HealthCheck,
Custom(String),
}
impl fmt::Display for AuditEventType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AuditEventType::HsmInitialize => write!(f, "hsm.initialize"),
AuditEventType::Initialization => write!(f, "hsm.initialize"), AuditEventType::KeyGeneration => write!(f, "key.generation"),
AuditEventType::KeyDeletion => write!(f, "key.deletion"),
AuditEventType::KeyRotation => write!(f, "key.rotation"),
AuditEventType::KeyExport => write!(f, "key.export"),
AuditEventType::KeyImport => write!(f, "key.import"),
AuditEventType::Sign => write!(f, "operation.sign"),
AuditEventType::Verify => write!(f, "operation.verify"),
AuditEventType::Encrypt => write!(f, "operation.encrypt"),
AuditEventType::Decrypt => write!(f, "operation.decrypt"),
AuditEventType::Authentication => write!(f, "security.authentication"),
AuditEventType::ConfigChange => write!(f, "config.change"),
AuditEventType::PolicyChange => write!(f, "policy.change"),
AuditEventType::FirmwareUpdate => write!(f, "firmware.update"),
AuditEventType::Backup => write!(f, "maintenance.backup"),
AuditEventType::Restore => write!(f, "maintenance.restore"),
AuditEventType::UserManagement => write!(f, "user.management"),
AuditEventType::RoleManagement => write!(f, "role.management"),
AuditEventType::SecurityAlert => write!(f, "security.alert"),
AuditEventType::AuditLogAccess => write!(f, "audit.access"),
AuditEventType::OperationRequest => write!(f, "operation.request"),
AuditEventType::OperationResponse => write!(f, "operation.response"),
AuditEventType::HsmOperation => write!(f, "hsm.operation"),
AuditEventType::HealthCheck => write!(f, "hsm.health_check"),
AuditEventType::Custom(name) => write!(f, "custom.{}", name),
}
}
}
impl std::str::FromStr for AuditEventType {
type Err = HsmError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"hsm.initialize" => Ok(AuditEventType::HsmInitialize),
"key.generation" => Ok(AuditEventType::KeyGeneration),
"key.deletion" => Ok(AuditEventType::KeyDeletion),
"key.rotation" => Ok(AuditEventType::KeyRotation),
"key.export" => Ok(AuditEventType::KeyExport),
"key.import" => Ok(AuditEventType::KeyImport),
"operation.sign" => Ok(AuditEventType::Sign),
"operation.verify" => Ok(AuditEventType::Verify),
"operation.encrypt" => Ok(AuditEventType::Encrypt),
"operation.decrypt" => Ok(AuditEventType::Decrypt),
"security.authentication" => Ok(AuditEventType::Authentication),
"config.change" => Ok(AuditEventType::ConfigChange),
"policy.change" => Ok(AuditEventType::PolicyChange),
"firmware.update" => Ok(AuditEventType::FirmwareUpdate),
"maintenance.backup" => Ok(AuditEventType::Backup),
"maintenance.restore" => Ok(AuditEventType::Restore),
"user.management" => Ok(AuditEventType::UserManagement),
"role.management" => Ok(AuditEventType::RoleManagement),
"security.alert" => Ok(AuditEventType::SecurityAlert),
"audit.access" => Ok(AuditEventType::AuditLogAccess),
"operation.request" => Ok(AuditEventType::OperationRequest),
"operation.response" => Ok(AuditEventType::OperationResponse),
"hsm.operation" => Ok(AuditEventType::HsmOperation),
"hsm.health_check" => Ok(AuditEventType::HealthCheck),
_ => {
if s.starts_with("custom.") {
let custom_name = s.strip_prefix("custom.").unwrap_or(s);
Ok(AuditEventType::Custom(custom_name.to_string()))
} else {
Err(HsmError::HsmAuditEventError(format!(
"Unknown audit event type: {}",
s
)))
}
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AuditEventResult {
Success,
Failure,
InProgress,
Canceled,
Rejected,
Timeout,
Unknown,
}
impl fmt::Display for AuditEventResult {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AuditEventResult::Success => write!(f, "success"),
AuditEventResult::Failure => write!(f, "failure"),
AuditEventResult::InProgress => write!(f, "in_progress"),
AuditEventResult::Canceled => write!(f, "canceled"),
AuditEventResult::Rejected => write!(f, "rejected"),
AuditEventResult::Timeout => write!(f, "timeout"),
AuditEventResult::Unknown => write!(f, "unknown"),
}
}
}
impl std::str::FromStr for AuditEventResult {
type Err = HsmError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"success" => Ok(AuditEventResult::Success),
"failure" => Ok(AuditEventResult::Failure),
"in_progress" => Ok(AuditEventResult::InProgress),
"canceled" => Ok(AuditEventResult::Canceled),
"rejected" => Ok(AuditEventResult::Rejected),
"timeout" => Ok(AuditEventResult::Timeout),
_ => Err(HsmError::HsmAuditEventError(format!(
"Unknown audit event result: {}",
s
))),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AuditEventSeverity {
Debug,
Info,
Warning,
Error,
Critical,
Alert,
Emergency,
}
impl fmt::Display for AuditEventSeverity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AuditEventSeverity::Debug => write!(f, "debug"),
AuditEventSeverity::Info => write!(f, "info"),
AuditEventSeverity::Warning => write!(f, "warning"),
AuditEventSeverity::Error => write!(f, "error"),
AuditEventSeverity::Critical => write!(f, "critical"),
AuditEventSeverity::Alert => write!(f, "alert"),
AuditEventSeverity::Emergency => write!(f, "emergency"),
}
}
}
impl std::str::FromStr for AuditEventSeverity {
type Err = HsmError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"debug" => Ok(AuditEventSeverity::Debug),
"info" => Ok(AuditEventSeverity::Info),
"warning" => Ok(AuditEventSeverity::Warning),
"error" => Ok(AuditEventSeverity::Error),
"critical" => Ok(AuditEventSeverity::Critical),
"alert" => Ok(AuditEventSeverity::Alert),
"emergency" => Ok(AuditEventSeverity::Emergency),
_ => Err(HsmError::HsmAuditEventError(format!(
"Unknown audit event severity: {}",
s
))),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HsmAuditEvent {
pub event_type: AuditEventType,
pub result: AuditEventResult,
pub severity: AuditEventSeverity,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub id: String,
pub user_id: Option<String>,
pub key_id: Option<String>,
pub parameters: Option<serde_json::Value>,
pub error: Option<String>,
pub metadata: Option<serde_json::Value>,
}
impl HsmAuditEvent {
pub fn new(
event_type: AuditEventType,
result: AuditEventResult,
severity: AuditEventSeverity,
) -> Self {
Self {
event_type,
result,
severity,
timestamp: chrono::Utc::now(),
id: uuid::Uuid::new_v4().to_string(),
user_id: None,
key_id: None,
parameters: None,
error: None,
metadata: None,
}
}
pub fn success(event_type: AuditEventType) -> Self {
Self::new(
event_type,
AuditEventResult::Success,
AuditEventSeverity::Info,
)
}
pub fn failure(event_type: AuditEventType, error: impl Into<String>) -> Self {
let mut event = Self::new(
event_type,
AuditEventResult::Failure,
AuditEventSeverity::Error,
);
event.error = Some(error.into());
event
}
pub fn with_user(mut self, user_id: impl Into<String>) -> Self {
self.user_id = Some(user_id.into());
self
}
pub fn with_key(mut self, key_id: impl Into<String>) -> Self {
self.key_id = Some(key_id.into());
self
}
pub fn with_parameters<T: Serialize>(mut self, parameters: &T) -> Result<Self, HsmError> {
self.parameters = Some(serde_json::to_value(parameters).map_err(|e| {
HsmError::SerializationError(format!("Failed to serialize parameters: {}", e))
})?);
Ok(self)
}
pub fn with_metadata<T: Serialize>(mut self, metadata: &T) -> Result<Self, HsmError> {
self.metadata = Some(serde_json::to_value(metadata).map_err(|e| {
HsmError::SerializationError(format!("Failed to serialize metadata: {}", e))
})?);
Ok(self)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HsmKeyType {
Aes,
Ecdsa,
EdDsa,
Rsa,
Hmac,
Symmetric,
Asymmetric,
Custom(u8),
}
impl fmt::Display for HsmKeyType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HsmKeyType::Aes => write!(f, "aes"),
HsmKeyType::Ecdsa => write!(f, "ecdsa"),
HsmKeyType::EdDsa => write!(f, "eddsa"),
HsmKeyType::Rsa => write!(f, "rsa"),
HsmKeyType::Hmac => write!(f, "hmac"),
HsmKeyType::Symmetric => write!(f, "symmetric"),
HsmKeyType::Asymmetric => write!(f, "asymmetric"),
HsmKeyType::Custom(id) => write!(f, "custom-{}", id),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HsmOperationType {
GenerateKey,
Sign,
Verify,
Encrypt,
Decrypt,
DeriveKey,
WrapKey,
UnwrapKey,
ExportKey,
ImportKey,
DeleteKey,
ListKeys,
Custom(u8),
}
impl fmt::Display for HsmOperationType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HsmOperationType::GenerateKey => write!(f, "generate_key"),
HsmOperationType::Sign => write!(f, "sign"),
HsmOperationType::Verify => write!(f, "verify"),
HsmOperationType::Encrypt => write!(f, "encrypt"),
HsmOperationType::Decrypt => write!(f, "decrypt"),
HsmOperationType::DeriveKey => write!(f, "derive_key"),
HsmOperationType::WrapKey => write!(f, "wrap_key"),
HsmOperationType::UnwrapKey => write!(f, "unwrap_key"),
HsmOperationType::ExportKey => write!(f, "export_key"),
HsmOperationType::ImportKey => write!(f, "import_key"),
HsmOperationType::DeleteKey => write!(f, "delete_key"),
HsmOperationType::ListKeys => write!(f, "list_keys"),
HsmOperationType::Custom(id) => write!(f, "custom-{}", id),
}
}
}