diff --git a/SecretAgent/Notifier.swift b/SecretAgent/Notifier.swift index 19d93ea..b759f8a 100644 --- a/SecretAgent/Notifier.swift +++ b/SecretAgent/Notifier.swift @@ -1,5 +1,6 @@ import Foundation import SecretKit +import SecretAgentKit import UserNotifications class Notifier { @@ -10,7 +11,7 @@ class Notifier { } } - func notify(accessTo secret: SecretType) { + func notify(accessTo secret: AnySecret) { let notificationCenter = UNUserNotificationCenter.current() let notificationContent = UNMutableNotificationContent() notificationContent.title = "Signed Request" @@ -20,3 +21,11 @@ class Notifier { } } + +extension Notifier: SigningWitness { + + func witness(accessTo secret: AnySecret) throws { + notify(accessTo: secret) + } + +} diff --git a/SecretAgentKit/Agent.swift b/SecretAgentKit/Agent.swift index 8e90c8e..73d6240 100644 --- a/SecretAgentKit/Agent.swift +++ b/SecretAgentKit/Agent.swift @@ -6,20 +6,20 @@ import SecretKit public class Agent { fileprivate let storeList: SecretStoreList -// fileprivate let notifier: Notifier + fileprivate let witness: SigningWitness? fileprivate let writer = OpenSSHKeyWriter() - public init(storeList: SecretStoreList/*, notifier: Notifier*/) { + public init(storeList: SecretStoreList, witness: SigningWitness? = nil) { os_log(.debug, "Agent is running") self.storeList = storeList -// self.notifier = notifier + self.witness = witness } } extension Agent { - public tfunc handle(fileHandle: FileHandle) { + public func handle(fileHandle: FileHandle) { os_log(.debug, "Agent handling new data") let data = fileHandle.availableData guard !data.isEmpty else { return } @@ -78,12 +78,17 @@ extension Agent { let reader = OpenSSHReader(data: data) let hash = try reader.readNextChunk() guard let (store, secret) = secret(matching: hash) else { + os_log(.debug, "Agent did not have a key matching %@", hash as NSData) throw AgentError.noMatchingKey } + + if let witness = witness { + try witness.witness(accessTo: secret) + } + let dataToSign = try reader.readNextChunk() let derSignature = try store.sign(data: dataToSign, with: secret) - // TODO: Move this -// notifier.notify(accessTo: secret) + let curveData = writer.curveType(for: secret.algorithm, length: secret.keySize).data(using: .utf8)! // Convert from DER formatted rep to raw (r||s) diff --git a/SecretAgentKit/SigningWitness.swift b/SecretAgentKit/SigningWitness.swift new file mode 100644 index 0000000..67577c3 --- /dev/null +++ b/SecretAgentKit/SigningWitness.swift @@ -0,0 +1,8 @@ +import Foundation +import SecretKit + +public protocol SigningWitness { + + func witness(accessTo secret: AnySecret) throws + +} diff --git a/Secretive.xcodeproj/project.pbxproj b/Secretive.xcodeproj/project.pbxproj index 447a66b..d6261ef 100644 --- a/Secretive.xcodeproj/project.pbxproj +++ b/Secretive.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 50731669241E00C20023809E /* NoticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50731668241E00C20023809E /* NoticeView.swift */; }; 507CE4ED2420A3C70029F750 /* Agent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A3B79F24026B9900D209EA /* Agent.swift */; }; 507CE4EE2420A3CA0029F750 /* SocketController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A3B79D24026B9900D209EA /* SocketController.swift */; }; + 507CE4F02420A4C50029F750 /* SigningWitness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4EF2420A4C50029F750 /* SigningWitness.swift */; }; 508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */; }; 508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */; }; 508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B4241ED48F0069DC07 /* PreviewAgentStatusChecker.swift */; }; @@ -98,6 +99,13 @@ remoteGlobalIDString = 50617DA723FCE4AB0099B055; remoteInfo = SecretKit; }; + 507CE4F12420A6B50029F750 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 50617D7723FCE48D0099B055 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 50617DA723FCE4AB0099B055; + remoteInfo = SecretKit; + }; 5099A076240242BA0062B6F2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 50617D7723FCE48D0099B055 /* Project object */; @@ -194,6 +202,7 @@ 506838A22415EA5D00F55094 /* AnySecretStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnySecretStore.swift; sourceTree = ""; }; 50731665241DF8660023809E /* Updater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Updater.swift; sourceTree = ""; }; 50731668241E00C20023809E /* NoticeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeView.swift; sourceTree = ""; }; + 507CE4EF2420A4C50029F750 /* SigningWitness.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningWitness.swift; sourceTree = ""; }; 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewUpdater.swift; sourceTree = ""; }; 508A58AB241E121B0069DC07 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentStatusChecker.swift; sourceTree = ""; }; @@ -458,6 +467,7 @@ 5099A06E240242BA0062B6F2 /* SecretAgentKit.h */, 5099A089240242C20062B6F2 /* SSHAgentProtocol.swift */, 50A3B79D24026B9900D209EA /* SocketController.swift */, + 507CE4EF2420A4C50029F750 /* SigningWitness.swift */, 50A3B79F24026B9900D209EA /* Agent.swift */, 5099A06F240242BA0062B6F2 /* Info.plist */, ); @@ -611,6 +621,7 @@ buildRules = ( ); dependencies = ( + 507CE4F22420A6B50029F750 /* PBXTargetDependency */, ); name = SecretAgentKit; productName = SecretAgentKit; @@ -838,6 +849,7 @@ 507CE4EE2420A3CA0029F750 /* SocketController.swift in Sources */, 5099A08A240242C20062B6F2 /* SSHAgentProtocol.swift in Sources */, 507CE4ED2420A3C70029F750 /* Agent.swift in Sources */, + 507CE4F02420A4C50029F750 /* SigningWitness.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -886,6 +898,11 @@ target = 50617DA723FCE4AB0099B055 /* SecretKit */; targetProxy = 50617DBB23FCE4AB0099B055 /* PBXContainerItemProxy */; }; + 507CE4F22420A6B50029F750 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 50617DA723FCE4AB0099B055 /* SecretKit */; + targetProxy = 507CE4F12420A6B50029F750 /* PBXContainerItemProxy */; + }; 5099A077240242BA0062B6F2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 5099A06B240242BA0062B6F2 /* SecretAgentKit */;