diff --git a/bitchat/Identity/SecureIdentityStateManager.swift b/bitchat/Identity/SecureIdentityStateManager.swift index 3bd8b31c..2fda9a2d 100644 --- a/bitchat/Identity/SecureIdentityStateManager.swift +++ b/bitchat/Identity/SecureIdentityStateManager.swift @@ -129,7 +129,7 @@ final class SecureIdentityStateManager { // Try to load from keychain if let keyData = keychain.getIdentityKey(forKey: encryptionKeyName) { loadedKey = SymmetricKey(data: keyData) - SecureLogger.logKeyOperation("load", keyType: "identity cache encryption key", success: true) + SecureLogger.logKeyOperation(.load, keyType: "identity cache encryption key", success: true) } // Generate new key if needed else { @@ -137,7 +137,7 @@ final class SecureIdentityStateManager { let keyData = loadedKey.withUnsafeBytes { Data($0) } // Save to keychain let saved = keychain.saveIdentityKey(keyData, forKey: encryptionKeyName) - SecureLogger.logKeyOperation("generate", keyType: "identity cache encryption key", success: saved) + SecureLogger.logKeyOperation(.generate, keyType: "identity cache encryption key", success: saved) } self.encryptionKey = loadedKey @@ -529,7 +529,7 @@ final class SecureIdentityStateManager { // Delete from keychain let deleted = self.keychain.deleteIdentityKey(forKey: self.cacheKey) - SecureLogger.logKeyOperation("delete", keyType: "identity cache", success: deleted) + SecureLogger.logKeyOperation(.delete, keyType: "identity cache", success: deleted) } } diff --git a/bitchat/Services/KeychainManager.swift b/bitchat/Services/KeychainManager.swift index 5eb8fe98..39c70023 100644 --- a/bitchat/Services/KeychainManager.swift +++ b/bitchat/Services/KeychainManager.swift @@ -53,7 +53,7 @@ final class KeychainManager { func saveIdentityKey(_ keyData: Data, forKey key: String) -> Bool { let fullKey = "identity_\(key)" let result = saveData(keyData, forKey: fullKey) - SecureLogger.logKeyOperation("save", keyType: key, success: result) + SecureLogger.logKeyOperation(.save, keyType: key, success: result) return result } @@ -64,7 +64,7 @@ final class KeychainManager { func deleteIdentityKey(forKey key: String) -> Bool { let result = delete(forKey: "identity_\(key)") - SecureLogger.logKeyOperation("delete", keyType: key, success: result) + SecureLogger.logKeyOperation(.delete, keyType: key, success: result) return result } diff --git a/bitchat/Services/NoiseEncryptionService.swift b/bitchat/Services/NoiseEncryptionService.swift index 0f0b9238..25b97e69 100644 --- a/bitchat/Services/NoiseEncryptionService.swift +++ b/bitchat/Services/NoiseEncryptionService.swift @@ -190,7 +190,7 @@ final class NoiseEncryptionService { if let identityData = KeychainManager.shared.getIdentityKey(forKey: "noiseStaticKey"), let key = try? Curve25519.KeyAgreement.PrivateKey(rawRepresentation: identityData) { loadedKey = key - SecureLogger.logKeyOperation("load", keyType: "noiseStaticKey", success: true) + SecureLogger.logKeyOperation(.load, keyType: "noiseStaticKey", success: true) } // If no identity exists, create new one else { @@ -199,7 +199,7 @@ final class NoiseEncryptionService { // Save to keychain let saved = KeychainManager.shared.saveIdentityKey(keyData, forKey: "noiseStaticKey") - SecureLogger.logKeyOperation("create", keyType: "noiseStaticKey", success: saved) + SecureLogger.logKeyOperation(.create, keyType: "noiseStaticKey", success: saved) } // Now assign the final value @@ -213,7 +213,7 @@ final class NoiseEncryptionService { if let signingData = KeychainManager.shared.getIdentityKey(forKey: "ed25519SigningKey"), let key = try? Curve25519.Signing.PrivateKey(rawRepresentation: signingData) { loadedSigningKey = key - SecureLogger.logKeyOperation("load", keyType: "ed25519SigningKey", success: true) + SecureLogger.logKeyOperation(.load, keyType: "ed25519SigningKey", success: true) } // If no signing key exists, create new one else { @@ -222,7 +222,7 @@ final class NoiseEncryptionService { // Save to keychain let saved = KeychainManager.shared.saveIdentityKey(keyData, forKey: "ed25519SigningKey") - SecureLogger.logKeyOperation("create", keyType: "ed25519SigningKey", success: saved) + SecureLogger.logKeyOperation(.create, keyType: "ed25519SigningKey", success: saved) } // Now assign the signing keys @@ -269,7 +269,7 @@ final class NoiseEncryptionService { // Clear from keychain let deletedStatic = KeychainManager.shared.deleteIdentityKey(forKey: "noiseStaticKey") let deletedSigning = KeychainManager.shared.deleteIdentityKey(forKey: "ed25519SigningKey") - SecureLogger.logKeyOperation("delete", keyType: "identity keys", success: deletedStatic && deletedSigning) + SecureLogger.logKeyOperation(.delete, keyType: "identity keys", success: deletedStatic && deletedSigning) SecureLogger.warning("Panic mode activated - identity cleared", category: .security) // Stop rekey timer stopRekeyTimer() diff --git a/bitchat/Utils/SecureLogger.swift b/bitchat/Utils/SecureLogger.swift index 6e970f89..95a55725 100644 --- a/bitchat/Utils/SecureLogger.swift +++ b/bitchat/Utils/SecureLogger.swift @@ -263,12 +263,24 @@ final class SecureLogger { extension SecureLogger { + enum KeyOperation: String, CustomStringConvertible { + case load + case create + case generate + case delete + case save + + var description: String { rawValue } + } + /// Log key management operations - static func logKeyOperation(_ operation: String, keyType: String, success: Bool = true, - file: String = #file, line: Int = #line, function: String = #function) { - let level: LogLevel = success ? .debug : .error - log("Key operation '\(operation)' for \(keyType) \(success ? "succeeded" : "failed")", - category: .keychain, level: level, file: file, line: line, function: function) + static func logKeyOperation(_ operation: KeyOperation, keyType: String, success: Bool = true, + file: String = #file, line: Int = #line, function: String = #function) { + if success { + debug("Key operation '\(operation)' for \(keyType) succeeded", category: .keychain, file: file, line: line, function: function) + } else { + error("Key operation '\(operation)' for \(keyType) failed", category: .keychain, file: file, line: line, function: function) + } } }