From f33bf89be29e5ef2a19211bdcc74f2ab8d168b23 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 21 Jul 2023 00:11:43 +0800 Subject: [PATCH] CocoaExtension // Add Bundle.getCodeSignedDate(). --- .../CocoaExtension/CocoaExtension_Misc.swift | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_Misc.swift b/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_Misc.swift index 7d913465..d67beb1d 100644 --- a/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_Misc.swift +++ b/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_Misc.swift @@ -9,6 +9,35 @@ import AppKit import SwiftExtension +// MARK: - Get Bundle Signature Timestamp + +public extension Bundle { + func getCodeSignedDate() -> Date? { + var code: SecStaticCode? + var information: CFDictionary? + let status4Code = SecStaticCodeCreateWithPath(bundleURL as CFURL, SecCSFlags(rawValue: 0), &code) + guard status4Code == 0, let code = code else { + NSLog("Error from getCodeSignedDate(): Failed from retrieving status4Code.") + return nil + } + let status = SecCodeCopySigningInformation(code, SecCSFlags(rawValue: kSecCSSigningInformation), &information) + guard status == noErr else { + NSLog("Error from getCodeSignedDate(): Failed from retrieving code signing intelligence.") + return nil + } + guard let dictionary = information as? [String: NSObject] else { return nil } + guard dictionary[kSecCodeInfoIdentifier as String] != nil else { + NSLog("Error from getCodeSignedDate(): Target not signed.") + return nil + } + guard let infoDate = dictionary[kSecCodeInfoTimestamp as String] as? Date else { + NSLog("Error from getCodeSignedDate(): Target signing timestamp is missing.") + return nil + } + return infoDate as Date + } +} + // MARK: - NSSize extension public extension NSSize {