From fd95771feddb43280efc62c335af5ca9a1e9ee20 Mon Sep 17 00:00:00 2001 From: Max Goedjen Date: Fri, 26 Sep 2025 00:19:32 -0700 Subject: [PATCH] Dump --- Sources/Packages/Sources/Brief/Updater.swift | 10 +- .../CertificateKit/CertificateMigrator.swift | 91 ++++++ .../SSHProtocolKit/OpenSSHCertificate.swift | 18 +- Sources/SecretAgent/AppDelegate.swift | 3 + Sources/Secretive.xcodeproj/project.pbxproj | 261 ------------------ .../xcshareddata/xcschemes/Secretive.xcscheme | 2 +- Sources/Secretive/App.swift | 4 +- 7 files changed, 103 insertions(+), 286 deletions(-) create mode 100644 Sources/Packages/Sources/CertificateKit/CertificateMigrator.swift diff --git a/Sources/Packages/Sources/Brief/Updater.swift b/Sources/Packages/Sources/Brief/Updater.swift index 12be1ee..7e71fe8 100644 --- a/Sources/Packages/Sources/Brief/Updater.swift +++ b/Sources/Packages/Sources/Brief/Updater.swift @@ -75,14 +75,14 @@ extension Updater { .reversed() .filter({ !$0.prerelease }) .first(where: { $0.minimumOSVersion <= osVersion }) else { return } - guard !userIgnored(release: release) else { return } - guard !release.prerelease else { return } - let latestVersion = SemVer(release.name) - if latestVersion > currentVersion { +// guard !userIgnored(release: release) else { return } +// guard !release.prerelease else { return } +// let latestVersion = SemVer(release.name) +// if latestVersion > currentVersion { await MainActor.run { state.update = release } - } +// } } /// Checks whether the user has ignored a release. diff --git a/Sources/Packages/Sources/CertificateKit/CertificateMigrator.swift b/Sources/Packages/Sources/CertificateKit/CertificateMigrator.swift new file mode 100644 index 0000000..ecde163 --- /dev/null +++ b/Sources/Packages/Sources/CertificateKit/CertificateMigrator.swift @@ -0,0 +1,91 @@ +import Foundation +import Security +import CryptoTokenKit +import CryptoKit +import os +import SSHProtocolKit + +public struct CertificateKitMigrator { + + private let logger = Logger(subsystem: "com.maxgoedjen.secretive.migration", category: "CertificateKitMigrator") + let directory: URL + + /// Initializes a PublicKeyFileStoreController. + public init(homeDirectory: URL) { + directory = homeDirectory.appending(component: "PublicKeys") + } + + @MainActor public func migrate() throws { + let fileCerts = try FileManager.default + .contentsOfDirectory(atPath: directory.path()) + .filter { $0.hasSuffix("-cert.pub") } + Task { + for path in fileCerts { + let url = directory.appending(component: path) + let data = try! Data(contentsOf: url) +// let parser = try! await XPCCertificateParser() + let parser = OpenSSHCertificateParser() + let cert = try! await parser.parse(data: data) + print(cert) +// let secret = storeList.allSecrets.first { secret in +// secret.name == cert.name +// } +// guard let secret = secret ?? storeList.allSecrets.first else { return } +// print(cert.data.formatted(.hex())) +// certificateStore.saveCertificate(cert.data, for: secret) + print(cert) + } + + } + +// let privateAttributes = KeychainDictionary([ +// kSecClass: kSecClassKey, +// kSecAttrKeyType: Constants.oldKeyType, +// kSecAttrApplicationTag: SecureEnclave.Store.Constants.keyTag, +// kSecAttrKeyClass: kSecAttrKeyClassPrivate, +// kSecReturnRef: true, +// kSecMatchLimit: kSecMatchLimitAll, +// kSecReturnAttributes: true +// ]) +// var privateUntyped: CFTypeRef? +// unsafe SecItemCopyMatching(privateAttributes, &privateUntyped) +// guard let privateTyped = privateUntyped as? [[CFString: Any]] else { return } +// let migratedPublicKeys = Set(store.secrets.map(\.publicKey)) +// var migratedAny = false +// for key in privateTyped { +// let name = key[kSecAttrLabel] as? String ?? String(localized: .unnamedSecret) +// let id = key[kSecAttrApplicationLabel] as! Data +// guard !id.contains(Constants.migrationMagicNumber) else { +// logger.log("Skipping \(name), already migrated.") +// continue +// } +// let ref = key[kSecValueRef] as! SecKey +// let attributes = SecKeyCopyAttributes(ref) as! [CFString: Any] +// let tokenObjectID = unsafe attributes[Constants.tokenObjectID] as! Data +// let accessControl = attributes[kSecAttrAccessControl] as! SecAccessControl +// // Best guess. +// let auth: AuthenticationRequirement = String(describing: accessControl) +// .contains("DeviceOwnerAuthentication") ? .presenceRequired : .unknown +// do { +// let parsed = try CryptoKit.SecureEnclave.P256.Signing.PrivateKey(dataRepresentation: tokenObjectID) +// let secret = Secret(id: UUID().uuidString, name: name, publicKey: parsed.publicKey.x963Representation, attributes: Attributes(keyType: .init(algorithm: .ecdsa, size: 256), authentication: auth)) +// guard !migratedPublicKeys.contains(parsed.publicKey.x963Representation) else { +// logger.log("Skipping \(name), public key already present. Marking as migrated.") +// markMigrated(secret: secret, oldID: id) +// continue +// } +// logger.log("Migrating \(name).") +// try store.saveKey(tokenObjectID, name: name, attributes: secret.attributes) +// logger.log("Migrated \(name).") +// markMigrated(secret: secret, oldID: id) +// migratedAny = true +// } catch { +// logger.error("Failed to migrate \(name): \(error.localizedDescription).") +// } +// } +// if migratedAny { +// store.reloadSecrets() +// } + } + +} diff --git a/Sources/Packages/Sources/SSHProtocolKit/OpenSSHCertificate.swift b/Sources/Packages/Sources/SSHProtocolKit/OpenSSHCertificate.swift index 0f3a7c1..cb4c222 100644 --- a/Sources/Packages/Sources/SSHProtocolKit/OpenSSHCertificate.swift +++ b/Sources/Packages/Sources/SSHProtocolKit/OpenSSHCertificate.swift @@ -77,16 +77,7 @@ public struct OpenSSHCertificateParser: OpenSSHCertificateParserProtocol, Sendab } let validAfter = try dataParser.readNextBytes(as: UInt64.self, convertEndianness: true) let validBefore = try dataParser.readNextBytes(as: UInt64.self, convertEndianness: true) - let validityRange = Date(timeIntervalSince1970: TimeInterval(validAfter)).. String { - let base64 = Data(SHA256.hash(data: data)).base64EncodedString() - let paddingRange = base64.index(base64.endIndex, offsetBy: -2).. diff --git a/Sources/Secretive/App.swift b/Sources/Secretive/App.swift index 5143a78..57cda44 100644 --- a/Sources/Secretive/App.swift +++ b/Sources/Secretive/App.swift @@ -116,8 +116,8 @@ extension EnvironmentValues { @MainActor fileprivate static let _secretStoreList: SecretStoreList = { let list = SecretStoreList() let cryptoKit = SecureEnclave.Store() - let migrator = SecureEnclave.CryptoKitMigrator() - try? migrator.migrate(to: cryptoKit) + let cryptoKitMigrator = SecureEnclave.CryptoKitMigrator() + try? cryptoKitMigrator.migrate(to: cryptoKit) list.add(store: cryptoKit) list.add(store: SmartCard.Store()) return list