├── CHANGELOG.md ├── Certificate SDK Sample App.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── Certificate SDK Sample iOS.xcscheme │ └── Certificate SDK Sample visionOS.xcscheme ├── Certificate SDK Sample Shared ├── CertRequestConfiguration.swift ├── CertificateRequestManager.swift ├── KeychainHandler.swift ├── LocalNotificationService.swift └── test_certificate.p12 ├── Certificate SDK Sample iOS ├── ActionLogViewController.swift ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon-jamf-certificate-SDK-20x20@1x.png │ │ ├── icon-jamf-certificate-SDK-20x20@2x-1.png │ │ ├── icon-jamf-certificate-SDK-20x20@2x.png │ │ ├── icon-jamf-certificate-SDK-20x20@3x.png │ │ ├── icon-jamf-certificate-SDK-29x29@1x.png │ │ ├── icon-jamf-certificate-SDK-29x29@2x-1.png │ │ ├── icon-jamf-certificate-SDK-29x29@2x.png │ │ ├── icon-jamf-certificate-SDK-29x29@3x.png │ │ ├── icon-jamf-certificate-SDK-40x40@1x.png │ │ ├── icon-jamf-certificate-SDK-40x40@2x-1.png │ │ ├── icon-jamf-certificate-SDK-40x40@2x.png │ │ ├── icon-jamf-certificate-SDK-40x40@3x.png │ │ ├── icon-jamf-certificate-SDK-512x512@2x.png │ │ ├── icon-jamf-certificate-SDK-60x60@2x.png │ │ ├── icon-jamf-certificate-SDK-60x60@3x.png │ │ ├── icon-jamf-certificate-SDK-76x76@1x.png │ │ ├── icon-jamf-certificate-SDK-76x76@2x.png │ │ └── icon-jamf-certificate-SDK-83.5x83.5@2x.png │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── Jamf-one-color-knockout.png └── SetupTestViewController.swift ├── Certificate SDK Sample visionOS ├── Assets.xcassets │ ├── AppIcon.solidimagestack │ │ ├── Back.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Front.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ └── Middle.solidimagestacklayer │ │ │ ├── Content.imageset │ │ │ └── Contents.json │ │ │ └── Contents.json │ └── Contents.json ├── CertificateSDKSampleVisionOSApp.swift ├── ContentView.swift ├── Info.plist ├── RequestTypeModel.swift └── RequestTypeView.swift ├── CertificateSDK.xcframework ├── Info.plist ├── _CodeSignature │ ├── CodeDirectory │ ├── CodeRequirements │ ├── CodeRequirements-1 │ ├── CodeResources │ └── CodeSignature ├── ios-arm64 │ └── CertificateSDK.framework │ │ ├── CertificateSDK │ │ ├── Headers │ │ ├── CertificateRequestBase.h │ │ ├── CertificateRequestDelegate.h │ │ ├── CertificateRequestEmbeddedP12.h │ │ ├── CertificateRequestErrorDomain.h │ │ ├── CertificateRequestProtocol.h │ │ ├── CertificateRequestWorkflow.h │ │ └── CertificateSDK.h │ │ ├── Info.plist │ │ └── Modules │ │ └── module.modulemap ├── ios-arm64_x86_64-simulator │ └── CertificateSDK.framework │ │ ├── CertificateSDK │ │ ├── Headers │ │ ├── CertificateRequestBase.h │ │ ├── CertificateRequestDelegate.h │ │ ├── CertificateRequestEmbeddedP12.h │ │ ├── CertificateRequestErrorDomain.h │ │ ├── CertificateRequestProtocol.h │ │ ├── CertificateRequestWorkflow.h │ │ └── CertificateSDK.h │ │ ├── Info.plist │ │ ├── Modules │ │ └── module.modulemap │ │ └── _CodeSignature │ │ └── CodeResources ├── xros-arm64 │ └── CertificateSDK.framework │ │ ├── CertificateSDK │ │ ├── Headers │ │ ├── CertificateRequestBase.h │ │ ├── CertificateRequestDelegate.h │ │ ├── CertificateRequestEmbeddedP12.h │ │ ├── CertificateRequestErrorDomain.h │ │ ├── CertificateRequestProtocol.h │ │ ├── CertificateRequestWorkflow.h │ │ └── CertificateSDK.h │ │ ├── Info.plist │ │ └── Modules │ │ └── module.modulemap └── xros-arm64_x86_64-simulator │ └── CertificateSDK.framework │ ├── CertificateSDK │ ├── Headers │ ├── CertificateRequestBase.h │ ├── CertificateRequestDelegate.h │ ├── CertificateRequestEmbeddedP12.h │ ├── CertificateRequestErrorDomain.h │ ├── CertificateRequestProtocol.h │ ├── CertificateRequestWorkflow.h │ └── CertificateSDK.h │ ├── Info.plist │ ├── Modules │ └── module.modulemap │ └── _CodeSignature │ └── CodeResources ├── LICENSE ├── Package.swift ├── README.md └── sample-app-specfile.xml /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [2.1.0] - 2025-05-01 8 | ### Added 9 | - `keySize` support in the Managed App Config. 10 | - Support for arrays of SAN type/value pairs in the Managed App Config. 11 | 12 | ## [2.0.0] - 2024-06-14 13 | ### Added 14 | - visionOS support! The compiled framework now includes support for visionOS v1.1 and 15 | visionOS Simulator. There is also a native visionOS sample app that works just like 16 | the iOS sample app. 17 | - The CertificateSDK.xcframework is now signed by Jamf for added security. 18 | ### Changed 19 | - Moved the Package.swift tool version from Swift 5.3 to Swift v5.9 in order to support visionOS. 20 | - Moved the iOS minimum deployment target from v10 to v12. 21 | - Described how to use `$MANAGEMENTID` to support BYOD devices with Jamf Pro v11.5.1 and newer. 22 | ### Removed 23 | - Removed PDF file titled "Integrating the Jamf Certificate SDK into your iOS App". This information 24 | is now available online. See the bottom of the README file for a link. 25 | 26 | ## [1.1.1] - 2022-03-11 27 | ### Changed 28 | - Modified the name of the target in the `Package.swift` file so that Xcode 13.3 can find the artifact. 29 | 30 | ## [1.1.0] - 2021-01-08 31 | ### Added 32 | - The compiled framework now includes simulator code for simulators running on Macs with Apple Silicon. 33 | - Added a `Package.swift` file for integration with Swift Package Manager. 34 | 35 | ### Changed 36 | - The compiled framework is now an XCFramework to allow easy integration with Xcode 12 projects. 37 | 38 | ### Fixed 39 | - Fixed an issue that caused two `certificate(request:error:)` calls to be made to the delegate if the SDK could not reach Jamf Pro to request a new AppConfig. 40 | 41 | ## [1.0.1] - 2020-02-11 42 | ### Added 43 | - This CHANGELOG.md file. 44 | 45 | ### Changed 46 | - The Jamf Certificate SDK now adds an interval to the time specified in the pollingTimeout setting. This enables the SDK to retrieve the Managed App Configuration prior to starting the specified pollingTimeout seconds. 47 | - The Jamf Certificate SDK has been re-licensed under the MIT License. 48 | 49 | ### Fixed 50 | - The Jamf Certificate SDK now properly handles network errors and status updates when making requests for a new Managed App Configuration. 51 | - Fixed an issue that prevented the progress of steps from starting at zero and incrementing by one up to the maxNumberOfSteps. 52 | - Fixed an issue that prevented the NSError object from being correctly sent into the `certificateRequest:errorOccurred:` delegate method. 53 | 54 | ## [1.0.0] - 2018-07-24 55 | ### Added 56 | - Initial release. 57 | -------------------------------------------------------------------------------- /Certificate SDK Sample App.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Certificate SDK Sample App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Certificate SDK Sample App.xcodeproj/xcshareddata/xcschemes/Certificate SDK Sample iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 10 | 16 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Certificate SDK Sample App.xcodeproj/xcshareddata/xcschemes/Certificate SDK Sample visionOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 10 | 16 | 22 | 23 | 24 | 25 | 26 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Certificate SDK Sample Shared/CertRequestConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | 8 | /// Contains the selected options for the test run 9 | struct CertRequestConfiguration { 10 | var isActual: Bool 11 | var slowSpeed: Bool 12 | var simulateError: Bool 13 | 14 | var description: String { 15 | if isActual { 16 | return "Actual" 17 | } 18 | 19 | return "Simulated" + (slowSpeed ? " slow" : "") + (simulateError ? " with error" : "") 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Certificate SDK Sample Shared/CertificateRequestManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import CertificateSDK 8 | 9 | class CertificateRequestManager: NSObject { 10 | let keychainHelper = KeychainHandler() 11 | 12 | var textOutputHandler: ((String) -> Void)? 13 | var progressHandler: ((Float) -> Void)? 14 | 15 | private var certificateRequest: CertificateRequestProtocol? 16 | 17 | /// Starts a new request with the given configuration; does nothing if a request is currently pending. 18 | /// 19 | /// - Parameter configuration: The type of certificate request to start 20 | func startRequest(with configuration: CertRequestConfiguration) { 21 | guard certificateRequest == nil else { 22 | // do nothing. Let the user try to run the test or re-run the test once the request is nil. 23 | return 24 | } 25 | 26 | if configuration.isActual { 27 | certificateRequest = CertificateRequestWorkflow(delegate: self) 28 | } else { 29 | var localRequest: CertificateRequestEmbeddedP12? 30 | if !configuration.simulateError, let p12 = Bundle.main.url(forResource: "test_certificate", 31 | withExtension: "p12") { 32 | localRequest = CertificateRequestEmbeddedP12(delegate: self, p12File: p12, p12Password: "abc123") 33 | } else { 34 | localRequest = CertificateRequestEmbeddedP12(delegate: self, 35 | p12File: URL(fileURLWithPath: ""), 36 | p12Password: "a") 37 | } 38 | 39 | if configuration.slowSpeed { 40 | localRequest?.secondsBetweenSteps = 2 41 | } 42 | certificateRequest = localRequest 43 | } 44 | 45 | certificateRequest?.startNewCertificateRequest() 46 | } 47 | 48 | /// Stop any pending certificate request. 49 | func cancelPendingRequest() { 50 | certificateRequest?.cancelRequest() 51 | certificateRequest = nil 52 | } 53 | } 54 | 55 | typealias CertificateRequestHandler = CertificateRequestManager 56 | 57 | extension CertificateRequestHandler: CertificateRequestDelegate { 58 | 59 | func certificate(request: CertificateRequestProtocol, error: Error) { 60 | self.textOutputHandler?("Error: \(error.localizedDescription)") 61 | } 62 | 63 | func certificate(request: CertificateRequestProtocol, completedWith identity: SecIdentity?) { 64 | certificateRequest = nil 65 | 66 | if let actualIdentity = identity { 67 | self.textOutputHandler?("Request completed with identity \(actualIdentity)") 68 | self.textOutputHandler?(self.keychainHelper.addKeychain(identity: actualIdentity)) 69 | } else { 70 | self.textOutputHandler?("Request completed with identity nil") 71 | } 72 | 73 | self.textOutputHandler?(self.keychainHelper.showCertificateInfo()) 74 | } 75 | 76 | func certificateRequest(_ request: CertificateRequestProtocol, progress current: UInt) { 77 | self.textOutputHandler?("Progress: \(current) of \(request.maxNumberOfSteps)") 78 | 79 | self.progressHandler?(Float(current) / Float(request.maxNumberOfSteps)) 80 | } 81 | 82 | func certificateRequest(_ request: CertificateRequestProtocol, isUsingNetwork: Bool) { 83 | self.textOutputHandler?("Using network: \(isUsingNetwork)") 84 | } 85 | 86 | func certificateRequest(_ request: CertificateRequestProtocol, isWaitingForMAC waitingForMAC: Bool) { 87 | self.textOutputHandler?("Waiting for AppConfig: \(waitingForMAC)") 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Certificate SDK Sample Shared/KeychainHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import Foundation 8 | 9 | struct KeychainHandler { 10 | let kMyIdentityLabel = "Jamf Sample App Identity Label" 11 | 12 | func addKeychain(identity: SecIdentity) -> String { 13 | // This specifies the identity is added only if the device has a passcode and it will not sync to other devices. 14 | // If this should be used in other apps signed by your Developer ID, add a kSecAttrAccessGroup key and value. 15 | let query = [kSecValueRef: identity, 16 | kSecAttrLabel: kMyIdentityLabel, 17 | kSecAttrAccessible: kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly] as CFDictionary 18 | let status = SecItemAdd(query, nil) 19 | switch status { 20 | case errSecDuplicateItem: 21 | return "Keychain item already exists" 22 | case errSecSuccess: 23 | return "Keychain item added" 24 | case errSecNotAvailable: 25 | var result = "Keychain item could not be added. Your device probably does not have a passcode." 26 | result += "Set a passcode and try again." 27 | return result 28 | default: 29 | return "Keychain add resulted in status: \(status)" 30 | } 31 | } 32 | 33 | func clearKeychain() -> String { 34 | var resultString = "" 35 | let query = [kSecMatchLimit: kSecMatchLimitAll, 36 | kSecReturnAttributes: true, 37 | kSecReturnRef: true, 38 | kSecClass: kSecClassIdentity] as CFDictionary 39 | var result: CFTypeRef? 40 | let resultCode = SecItemCopyMatching(query, &result) 41 | 42 | if resultCode == errSecSuccess { 43 | let actualResult = result! 44 | if CFArrayGetTypeID() == CFGetTypeID(actualResult) { 45 | let array = (actualResult as? NSArray) as? [NSDictionary] 46 | array?.forEach { (item) in 47 | resultString += self.deleteIdentity(item) 48 | } 49 | } else { 50 | resultString += self.deleteIdentity((result as? NSDictionary)!) 51 | } 52 | } 53 | 54 | return resultString 55 | } 56 | 57 | func deleteIdentity(_ identity: NSDictionary) -> String { 58 | if let label = identity[kSecAttrLabel] as? String, label == kMyIdentityLabel { 59 | let query = [kSecValueRef: identity[kSecValueRef]] as CFDictionary 60 | let status = SecItemDelete(query) 61 | if status != errSecSuccess { 62 | return "Item delete result: \(status)\n" 63 | } 64 | } 65 | return "" 66 | } 67 | 68 | func showCertificateInfo() -> String { 69 | var resultString = "--- Certificates in Keychain ---\n" 70 | var outputACert = false 71 | let query = [kSecMatchLimit: kSecMatchLimitAll, 72 | kSecReturnRef: true, 73 | kSecClass: kSecClassCertificate] as CFDictionary 74 | var result: CFTypeRef? 75 | let resultCode = SecItemCopyMatching(query, &result) 76 | 77 | if resultCode == errSecSuccess { 78 | if CFArrayGetTypeID() == CFGetTypeID(result) { 79 | let array = (result as? NSArray) as? [SecCertificate] 80 | array?.forEach { (item) in 81 | resultString += self.displayCertificate(item) 82 | outputACert = true 83 | } 84 | } else { 85 | // swiftlint:disable force_cast 86 | resultString += self.displayCertificate(result as! SecCertificate) 87 | // swiftlint:enable force_cast 88 | outputACert = true 89 | } 90 | } 91 | 92 | if !outputACert { 93 | resultString += "None\n" 94 | } 95 | resultString += "-------------------------------" 96 | return resultString 97 | } 98 | 99 | func displayCertificate(_ certificate: SecCertificate) -> String { 100 | let subject = SecCertificateCopySubjectSummary(certificate) as String? 101 | return "Cert Subject: \(subject ?? "nil")\n" 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Certificate SDK Sample Shared/LocalNotificationService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import UserNotifications 8 | 9 | class LocalNotificationService: NSObject, UNUserNotificationCenterDelegate { 10 | static let shared = LocalNotificationService() 11 | 12 | weak var requestManager: CertificateRequestManager? 13 | 14 | static private let kRenewalCategory = "com.jamf.certificate-sdk.sample.renewal.category" 15 | static private let kRenewalIdentifier = "com.jamf.certificate-sdk.sample.renewal" 16 | static private let kDelayInSeconds = 5.0 17 | 18 | /// These are custom actions that we put onto the notification for the user to choose how to proceed 19 | /// without launching the entire app. 20 | /// 21 | /// - renew: This is the renew button; we will try to renew the certificate in the background. 22 | /// - decline: The is the decline button; we schedule another notification to remind the user to renew later. 23 | private enum CertificateNotificationAction: String { 24 | case renew = "com.jamf.certificate-sdk.sample.renew" 25 | case decline = "com.jamf.certificate-sdk.sample.decline" 26 | } 27 | 28 | /// Register for notifications and set up the notification delegate 29 | func registerForNotifications() { 30 | let center = UNUserNotificationCenter.current() 31 | 32 | // First, set ourselves as the delegate to handle incoming notifications. 33 | center.delegate = self 34 | 35 | // Second, request authorization from the user for alerts 36 | center.requestAuthorization(options: [.alert]) { (_, error) in 37 | // enable or disable features based on authorization. 38 | // We check for authorization later anyway so...nothing to do in this callback. 39 | if error != nil { 40 | self.requestManager?.textOutputHandler?("Error requesting notification authorization: \(error!)") 41 | } 42 | } 43 | 44 | // Third, set up our two custom actions on our category. 45 | let renewText = NSLocalizedString("Renew", comment: "Action button to renew from a notification") 46 | let declineText = NSLocalizedString("Decline", comment: "Action button to decline renewal from a notification") 47 | let renewAction = UNNotificationAction(identifier: CertificateNotificationAction.renew.rawValue, 48 | title: renewText, 49 | options: .init(rawValue: 0)) 50 | let declineAction = UNNotificationAction(identifier: CertificateNotificationAction.decline.rawValue, 51 | title: declineText, 52 | options: .init(rawValue: 0)) 53 | let renewalCategory = UNNotificationCategory(identifier: Self.kRenewalCategory, 54 | actions: [renewAction, declineAction], 55 | intentIdentifiers: [], 56 | options: .customDismissAction) 57 | 58 | center.setNotificationCategories([renewalCategory]) 59 | } 60 | 61 | func scheduleLocalNotificationForRenewal(_ expirationDate: Date) { 62 | let center = UNUserNotificationCenter.current() 63 | 64 | // First, remove any pending renewal local notifications. 65 | center.removePendingNotificationRequests(withIdentifiers: 66 | [Self.kRenewalIdentifier]) 67 | 68 | center.getNotificationSettings { (settings) in 69 | // Do not schedule notifications if not authorized. 70 | guard settings.authorizationStatus == .authorized else { return } 71 | 72 | let dateFormatter = DateFormatter() 73 | dateFormatter.dateStyle = .short 74 | dateFormatter.timeStyle = .none 75 | let dateAsString = dateFormatter.string(from: expirationDate) 76 | 77 | // Schedule the new local notification. 78 | let content = UNMutableNotificationContent() 79 | content.categoryIdentifier = Self.kRenewalCategory 80 | content.title = NSLocalizedString("Renew SSO Cert", 81 | comment: "Short title of the notification to renew the user certificate") 82 | content.subtitle = String(format: NSLocalizedString("Expires: %@", 83 | comment: """ 84 | Subtitle of notification to renew the user certificate; 85 | the expiration date will be substituted for %@ 86 | """), 87 | dateAsString) 88 | // swiftlint:disable line_length 89 | if expirationDate < Date(timeIntervalSinceNow: 0) { 90 | content.body = NSLocalizedString("Your Single Sign On certificate has expired. Renew your certificate to restore SSO functionality.", 91 | comment: "Notification text to renew the user certificate if it has expired.") 92 | } else { 93 | content.body = NSLocalizedString("Your Single Sign On certificate will expire soon. Renew your certificate to continue enjoying SSO functionality.", 94 | comment: "Notification text to renew the user certificate if it will expire in the future.") 95 | } 96 | // swiftlint:enable line_length 97 | 98 | content.userInfo = ["CustomData": "Anything else you want to keep track of can go here"] 99 | 100 | // This is going to schedule a notification for 5 seconds from now (for testing) 101 | // In a real app, you probably want to examine the certificate expiration date, pick a day a 102 | // couple weeks in advance of that and use a UNCalendarNotificationTrigger instead. 103 | 104 | let trigger = UNTimeIntervalNotificationTrigger(timeInterval: Self.kDelayInSeconds, 105 | repeats: false) 106 | 107 | let request = UNNotificationRequest(identifier: Self.kRenewalIdentifier, 108 | content: content, 109 | trigger: trigger) 110 | 111 | center.add(request) { error in 112 | guard let actualError = error else { return } 113 | // Could do better error handling to let user know the notification to renew failed to be scheduled. 114 | self.requestManager?.textOutputHandler?("Scheduling error: \(actualError)") 115 | } 116 | } 117 | } 118 | 119 | // MARK: - 120 | 121 | /// If the application is in the foreground when the notification fires, this method is called first. 122 | /// This gives us the opportunity to do things automatically and not show an alert to the user. 123 | /// NOTE: This method is called on a background thread. 124 | /// 125 | /// - Parameters: 126 | /// - center: The notification center. 127 | /// - notification: The notification itself. 128 | /// - completionHandler: A completion handler that must be called once during this method to let the system 129 | /// know how to display the notification (or to NOT display the notification at all). 130 | func userNotificationCenter(_ center: UNUserNotificationCenter, 131 | willPresent notification: UNNotification, 132 | withCompletionHandler 133 | completionHandler: @escaping (UNNotificationPresentationOptions) 134 | -> Void) { 135 | if notification.request.identifier == Self.kRenewalIdentifier { 136 | // Since we're in the foreground already, we can automatically do this renewal and not show the alert. 137 | self.requestManager?.textOutputHandler?("Auto renew in foreground") 138 | self.requestManager?.startRequest(with: 139 | CertRequestConfiguration(isActual: false, slowSpeed: false, simulateError: false)) 140 | 141 | completionHandler(.init(rawValue: 0)) 142 | } else { 143 | // Some other kind of notification; we should show it. 144 | if #available(iOS 14.0, *) { 145 | completionHandler(.banner) 146 | } else { 147 | completionHandler(.alert) 148 | } 149 | } 150 | } 151 | 152 | /// Called when a notification comes in. The user may have tapped the notification itself, 153 | /// or one of our two custom actions (Renew and Decline). 154 | /// 155 | /// - Parameters: 156 | /// - center: The notification center. 157 | /// - response: The response the user choose 158 | /// - completionHandler: A completion handler that must be called after finished processing the notification. 159 | func userNotificationCenter(_ center: UNUserNotificationCenter, 160 | didReceive response: UNNotificationResponse, 161 | withCompletionHandler completionHandler: @escaping () -> Void) { 162 | 163 | let action = CertificateNotificationAction(rawValue: response.actionIdentifier) ?? .renew 164 | 165 | switch action { 166 | case .renew: 167 | if CertificateNotificationAction(rawValue: response.actionIdentifier) == nil { 168 | self.requestManager?.textOutputHandler?("User did not choose an action") 169 | } else { 170 | self.requestManager?.textOutputHandler?("User tapped renew") 171 | } 172 | self.requestManager?.startRequest(with: 173 | CertRequestConfiguration(isActual: false, slowSpeed: false, simulateError: false)) 174 | 175 | case .decline: 176 | // Could schedule another local notification here to nag the user again. 177 | self.requestManager?.textOutputHandler?("User tapped decline; scheduling again") 178 | // Again, the real app should pick some useful date here. 179 | self.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60)) 180 | } 181 | 182 | completionHandler() 183 | } 184 | } 185 | -------------------------------------------------------------------------------- /Certificate SDK Sample Shared/test_certificate.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample Shared/test_certificate.p12 -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/ActionLogViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import CertificateSDK 8 | import UIKit 9 | 10 | class ActionLogViewController: UIViewController { 11 | 12 | @IBOutlet weak var progressView: UIProgressView! 13 | @IBOutlet weak var actionLogTextView: UITextView! 14 | 15 | let keychainHelper = KeychainHandler() 16 | let requestManager = (UIApplication.shared.delegate as? AppDelegate)?.requestManager 17 | 18 | var testConfiguration: CertRequestConfiguration? 19 | 20 | override func viewDidAppear(_ animated: Bool) { 21 | super.viewDidAppear(animated) 22 | 23 | requestManager?.textOutputHandler = { [weak self] (newText) in 24 | self?.append(newText) 25 | } 26 | 27 | requestManager?.progressHandler = { [weak self] (progressPercent) in 28 | self?.updateProgress(progressPercent) 29 | } 30 | 31 | resetBaseTextView() 32 | runTest() 33 | } 34 | 35 | // MARK: - 36 | 37 | /// Runs the same test that has already been defined. 38 | /// 39 | /// - Parameter sender: unused 40 | @IBAction func rerunTest(_ sender: Any) { 41 | runTest() 42 | } 43 | 44 | /// Stop any current request; clear the keychain; clear the action log 45 | /// 46 | /// - Parameter sender: unused 47 | @IBAction func reset(_ sender: Any) { 48 | requestManager?.cancelPendingRequest() 49 | _ = keychainHelper.clearKeychain() 50 | self.resetBaseTextView() 51 | self.progressView.progress = 0 52 | } 53 | 54 | // MARK: - 55 | 56 | /// Start a new certificate request. 57 | func runTest() { 58 | if let configuration = testConfiguration { 59 | requestManager?.cancelPendingRequest() 60 | requestManager?.startRequest(with: configuration) 61 | } 62 | } 63 | 64 | /// Update the user interface for the detail item. 65 | func resetBaseTextView() { 66 | if let configuration = testConfiguration, let textView = actionLogTextView { 67 | textView.text = "Setup: \(configuration.description)" 68 | 69 | self.append( keychainHelper.showCertificateInfo() ) 70 | } 71 | } 72 | 73 | func append(_ logText: String) { 74 | DispatchQueue.main.async { 75 | if let textView = self.actionLogTextView { 76 | let existingText = textView.text ?? "" 77 | let newText = "\(existingText)\n\(logText)" 78 | textView.text = newText 79 | 80 | // Autoscroll as text is added to the bottom. 81 | let lastChar = NSRange(location: (newText as NSString).length - 1, length: 1) 82 | textView.scrollRangeToVisible(lastChar) 83 | } 84 | } 85 | } 86 | 87 | func updateProgress(_ progress: Float) { 88 | DispatchQueue.main.async { 89 | self.progressView.progress = progress 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import UIKit 8 | import UserNotifications 9 | 10 | @UIApplicationMain 11 | class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | let requestManager = CertificateRequestManager() 16 | 17 | func application(_ application: UIApplication, 18 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 19 | // Override point for customization after application launch. 20 | if let splitViewController = window!.rootViewController as? UISplitViewController { 21 | let navController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] 22 | as? UINavigationController 23 | navController?.topViewController!.navigationItem.leftBarButtonItem 24 | = splitViewController.displayModeButtonItem 25 | 26 | if UIDevice.current.userInterfaceIdiom == .pad { 27 | splitViewController.preferredDisplayMode = .allVisible 28 | } 29 | splitViewController.delegate = self 30 | } 31 | 32 | // Register for notifications in this app delegate method to ensure all notifications are properly sent to us. 33 | let notificationService = LocalNotificationService.shared 34 | notificationService.requestManager = self.requestManager 35 | notificationService.registerForNotifications() 36 | 37 | return true 38 | } 39 | 40 | // MARK: - Split view 41 | 42 | func splitViewController(_ splitViewController: UISplitViewController, 43 | collapseSecondary secondaryViewController: UIViewController, 44 | onto primaryViewController: UIViewController) -> Bool { 45 | guard let navController = secondaryViewController as? UINavigationController else { 46 | return false 47 | } 48 | guard let actionLogController = navController.topViewController as? ActionLogViewController else { 49 | return false 50 | } 51 | 52 | if actionLogController.testConfiguration == nil { 53 | // Return true to indicate that we have handled the collapse by doing nothing. 54 | // The secondary controller will be discarded. 55 | return true 56 | } 57 | return false 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "icon-jamf-certificate-SDK-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "icon-jamf-certificate-SDK-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "icon-jamf-certificate-SDK-29x29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "icon-jamf-certificate-SDK-29x29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "icon-jamf-certificate-SDK-40x40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "icon-jamf-certificate-SDK-40x40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "icon-jamf-certificate-SDK-60x60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "icon-jamf-certificate-SDK-60x60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "20x20", 53 | "idiom" : "ipad", 54 | "filename" : "icon-jamf-certificate-SDK-20x20@1x.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "icon-jamf-certificate-SDK-20x20@2x-1.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "icon-jamf-certificate-SDK-29x29@1x.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "icon-jamf-certificate-SDK-29x29@2x-1.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "icon-jamf-certificate-SDK-40x40@1x.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "icon-jamf-certificate-SDK-40x40@2x-1.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "icon-jamf-certificate-SDK-76x76@1x.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "icon-jamf-certificate-SDK-76x76@2x.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "icon-jamf-certificate-SDK-83.5x83.5@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "1024x1024", 107 | "idiom" : "ios-marketing", 108 | "filename" : "icon-jamf-certificate-SDK-512x512@2x.png", 109 | "scale" : "1x" 110 | } 111 | ], 112 | "info" : { 113 | "version" : 1, 114 | "author" : "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@1x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x-1.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-20x20@3x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@1x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x-1.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-29x29@3x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@1x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x-1.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-40x40@3x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-512x512@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-60x60@3x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@1x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-76x76@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Assets.xcassets/AppIcon.appiconset/icon-jamf-certificate-SDK-83.5x83.5@2x.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 32 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 46 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Jamf Cert SDK 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.1 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UIStatusBarTintParameters 34 | 35 | UINavigationBar 36 | 37 | Style 38 | UIBarStyleDefault 39 | Translucent 40 | 41 | 42 | 43 | UISupportedInterfaceOrientations 44 | 45 | UIInterfaceOrientationPortrait 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | UIInterfaceOrientationPortraitUpsideDown 49 | 50 | UISupportedInterfaceOrientations~ipad 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationPortraitUpsideDown 54 | UIInterfaceOrientationLandscapeLeft 55 | UIInterfaceOrientationLandscapeRight 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/Jamf-one-color-knockout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/Certificate SDK Sample iOS/Jamf-one-color-knockout.png -------------------------------------------------------------------------------- /Certificate SDK Sample iOS/SetupTestViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import UIKit 8 | 9 | class SegmentedCellView: UITableViewCell { 10 | @IBOutlet weak var segmentedControl: UISegmentedControl! 11 | } 12 | 13 | class ButtonCellView: UITableViewCell { 14 | @IBOutlet weak var button: UIButton! 15 | } 16 | 17 | class OptionCellView: UITableViewCell { 18 | @IBOutlet weak var detailLabel: UILabel! 19 | @IBOutlet weak var label: UILabel! 20 | @IBOutlet weak var optionSwitch: UISwitch! 21 | 22 | override var detailTextLabel: UILabel? { 23 | return detailLabel 24 | } 25 | 26 | override var textLabel: UILabel? { 27 | return label 28 | } 29 | } 30 | 31 | class SetupTestViewController: UITableViewController { 32 | 33 | var detailViewController: ActionLogViewController? 34 | 35 | var testConfiguration = CertRequestConfiguration(isActual: false, 36 | slowSpeed: true, 37 | simulateError: false) 38 | 39 | override func viewDidLoad() { 40 | super.viewDidLoad() 41 | 42 | // Do any additional setup after loading the view, typically from a nib. 43 | if let split = splitViewController { 44 | let controllers = split.viewControllers 45 | let navController = controllers[controllers.count-1] as? UINavigationController 46 | detailViewController = navController?.topViewController as? ActionLogViewController 47 | } 48 | } 49 | 50 | override func viewWillAppear(_ animated: Bool) { 51 | clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed 52 | super.viewWillAppear(animated) 53 | } 54 | 55 | // MARK: - Segues 56 | 57 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 58 | if segue.identifier == "showDetail", 59 | let navController = segue.destination as? UINavigationController, 60 | let controller = navController.topViewController as? ActionLogViewController { 61 | 62 | controller.testConfiguration = testConfiguration 63 | controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem 64 | controller.navigationItem.leftItemsSupplementBackButton = true 65 | } 66 | } 67 | 68 | // MARK: - Actions 69 | 70 | /// The user has switched which type of test they want to perform. 71 | /// 72 | /// - Parameter sender: The control that the user has switchde 73 | @IBAction func selectType(_ sender: UISegmentedControl) { 74 | let newActual = (sender.selectedSegmentIndex == 1) 75 | 76 | if newActual != testConfiguration.isActual { 77 | testConfiguration.isActual = newActual 78 | // reload the table with a nice animation. 79 | if let table = self.tableView { 80 | let rowsToAddOrDelete = [IndexPath(row: SetupRowIndices.optionSpeed.rawValue, section: 0), 81 | IndexPath(row: SetupRowIndices.optionError.rawValue, section: 0)] 82 | table.beginUpdates() 83 | table.reloadRows(at: [IndexPath(row: SetupRowIndices.descriptionOfTestType.rawValue, section: 0)], 84 | with: .fade) 85 | if testConfiguration.isActual { 86 | table.deleteRows(at: rowsToAddOrDelete, with: .left) 87 | } else { 88 | table.insertRows(at: rowsToAddOrDelete, with: .left) 89 | } 90 | table.endUpdates() 91 | } 92 | } 93 | } 94 | 95 | /// The user has turned on/off an option within the testConfiguration. 96 | /// 97 | /// - Parameter sender: The switch the user has toggled 98 | @IBAction func toggleOption(_ sender: UISwitch) { 99 | guard let index = SetupRowIndices(rawValue: sender.tag) else { 100 | // Some unknown option? 101 | return 102 | } 103 | 104 | switch index { 105 | case .optionSpeed: 106 | testConfiguration.slowSpeed = sender.isOn 107 | 108 | case .optionError: 109 | testConfiguration.simulateError = sender.isOn 110 | 111 | default: // do nothing 112 | break 113 | } 114 | } 115 | 116 | /// User wants to schedule a notification for renewal. 117 | /// 118 | /// - Parameter _: Unused 119 | @IBAction func scheduleNotification(_ sender: UIButton) { 120 | let notificationService = LocalNotificationService.shared 121 | // A real app should schedule the notification to renew on some date in the future. 122 | notificationService.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60)) 123 | 124 | // Let the user know it's scheduled. 125 | sender.setTitle("Scheduled", for: .normal) 126 | 127 | // Reset the title back to "Schedule Notification" after 4.5 seconds. 128 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4.5, qos: .background) { 129 | sender.setTitle("Schedule Notification", for: .normal) 130 | } 131 | } 132 | 133 | // MARK: - Table View 134 | 135 | private enum SetupRowIndices: Int { 136 | case typeOfTest 137 | case descriptionOfTestType 138 | case optionSpeed 139 | case optionError 140 | case runTestButton 141 | case descriptionOfNotification 142 | case scheduleNotification 143 | } 144 | private enum SetupNumberOfRows: Int { 145 | case simulatedTest = 7 146 | case actualTest = 5 147 | } 148 | 149 | override func numberOfSections(in tableView: UITableView) -> Int { 150 | return 1 151 | } 152 | 153 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 154 | return (testConfiguration.isActual ? SetupNumberOfRows.actualTest : SetupNumberOfRows.simulatedTest).rawValue 155 | } 156 | 157 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 158 | guard let index = SetupRowIndices(rawValue: indexPath.row) else { 159 | // Some unknown row? 160 | return UITableViewCell() 161 | } 162 | 163 | return self.cell(for: index, at: indexPath) 164 | } 165 | 166 | private func cell(for index: SetupRowIndices, at indexPath: IndexPath) -> UITableViewCell { 167 | switch index { 168 | case .typeOfTest: 169 | let cell = tableView.dequeueReusableCell(withIdentifier: "TypeSelection", 170 | for: indexPath) as? SegmentedCellView 171 | 172 | cell?.segmentedControl.selectedSegmentIndex = (testConfiguration.isActual ? 1 : 0) 173 | return cell! 174 | case .descriptionOfTestType: 175 | let cell = tableView.dequeueReusableCell(withIdentifier: "Description", for: indexPath) 176 | 177 | if testConfiguration.isActual { 178 | cell.textLabel!.text = "Makes the network calls to the Jamf Pro server to request a certificate" 179 | } else { 180 | cell.textLabel!.text = "Uses the embedded example .p12 for local testing" 181 | } 182 | return cell 183 | case .optionSpeed: 184 | let cell = tableView.dequeueReusableCell(withIdentifier: "Option", for: indexPath) as? OptionCellView 185 | 186 | // This lets our action know which option is being switched on/off 187 | cell?.optionSwitch.tag = index.rawValue 188 | 189 | cell?.textLabel!.text = "Slow speed" 190 | cell?.detailTextLabel!.text = "Simulates a slow server" 191 | cell?.optionSwitch.isOn = testConfiguration.slowSpeed 192 | return cell! 193 | case .optionError: 194 | let cell = tableView.dequeueReusableCell(withIdentifier: "Option", for: indexPath) as? OptionCellView 195 | 196 | // This lets our action know which option is being switched on/off 197 | cell?.optionSwitch.tag = index.rawValue 198 | 199 | cell?.textLabel!.text = "Error simulation" 200 | cell?.detailTextLabel!.text = "Results in an error" 201 | cell?.optionSwitch.isOn = testConfiguration.simulateError 202 | return cell! 203 | case .runTestButton: 204 | let cell = tableView.dequeueReusableCell(withIdentifier: "RunTest", for: indexPath) 205 | return cell 206 | case .descriptionOfNotification: 207 | let cell = tableView.dequeueReusableCell(withIdentifier: "Description", for: indexPath) 208 | 209 | cell.textLabel?.text = "Schedule a local notification to renew the certificate in five seconds" 210 | return cell 211 | case .scheduleNotification: 212 | let cell = tableView.dequeueReusableCell(withIdentifier: "RunTest", for: indexPath) as? ButtonCellView 213 | cell?.button.setTitle("Schedule Notification", for: .normal) 214 | cell?.button.removeTarget(nil, action: nil, for: .allEvents) 215 | cell?.button.addTarget(self, action: #selector(scheduleNotification(_:)), for: .primaryActionTriggered) 216 | return cell! 217 | } 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "vision", 5 | "scale" : "2x" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Back.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.solidimagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.solidimagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.solidimagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "vision", 5 | "scale" : "2x" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Front.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "vision", 5 | "scale" : "2x" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/AppIcon.solidimagestack/Middle.solidimagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/CertificateSDKSampleVisionOSApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import SwiftUI 8 | 9 | @main 10 | struct CertificateSDKSampleVisionOSApp: App { 11 | var body: some Scene { 12 | WindowGroup { 13 | ContentView() 14 | .frame(minWidth: 700, minHeight: 600) 15 | } 16 | .windowResizability(.contentMinSize) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import SwiftUI 8 | 9 | struct ContentView: View { 10 | @ObservedObject var model = RequestTypeModel() 11 | var body: some View { 12 | NavigationSplitView { 13 | RequestTypeView(model: model) 14 | .navigationTitle("Select Test Type") 15 | } detail: { 16 | RightArea(model: model) 17 | .navigationTitle("Action Log") 18 | } 19 | .onAppear { 20 | LocalNotificationService.shared.registerForNotifications() 21 | } 22 | } 23 | } 24 | 25 | struct RightArea: View { 26 | @ObservedObject var model: RequestTypeModel 27 | 28 | var body: some View { 29 | ProgressView(value: model.progress, total: 1.0) 30 | ScrollView { 31 | Text(model.completeOutput) 32 | .lineLimit(nil) 33 | .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) 34 | } 35 | .padding(.leading) 36 | .defaultScrollAnchor(.bottom) 37 | HStack { 38 | Button("Reset") { 39 | model.reset() 40 | } 41 | Button("Rerun Test") { 42 | model.runTest(resetOutput: false) 43 | } 44 | } 45 | } 46 | } 47 | 48 | #Preview(windowStyle: .automatic) { 49 | ContentView() 50 | } 51 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationPreferredDefaultSceneSessionRole 8 | UIWindowSceneSessionRoleApplication 9 | UIApplicationSupportsMultipleScenes 10 | 11 | UISceneConfigurations 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/RequestTypeModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import Foundation 8 | 9 | /// Contains the selected options for the test run for use with visionOS 10 | class RequestTypeModel: ObservableObject { 11 | /// Whether to make actual network requests for the certificate or to use the built-in p12 file 12 | @Published var isActual: Bool 13 | /// If true, simulates a slower network speed. 14 | @Published var slowSpeed: Bool 15 | /// If true, ends the certificate request in an error. 16 | @Published var simulateError: Bool 17 | /// The complete output text shown in the Action Log 18 | @Published var completeOutput = "" 19 | /// The progress (from 0.0 to 1.0) of the network request 20 | @Published var progress = 0.0 21 | /// True when the local notification has been scheduled 22 | @Published var notificationScheduled = false 23 | 24 | /// The certificate request manager; the ``RequestTypeModel`` owns the 25 | /// instance of the ``CertificateRequestManager``. 26 | let requestManager: CertificateRequestManager 27 | 28 | init(isActual: Bool = false, slowSpeed: Bool = true, simulateError: Bool = false) { 29 | self.isActual = isActual 30 | self.slowSpeed = slowSpeed 31 | self.simulateError = simulateError 32 | self.completeOutput = "" 33 | self.progress = 0.0 34 | self.requestManager = CertificateRequestManager() 35 | LocalNotificationService.shared.requestManager = self.requestManager 36 | } 37 | 38 | var description: String { 39 | if isActual { 40 | return "Actual" 41 | } 42 | 43 | return "Simulated" + (slowSpeed ? " slow" : "") + (simulateError ? " with error" : "") 44 | } 45 | 46 | func runTest(resetOutput: Bool) { 47 | requestManager.textOutputHandler = { (text: String) in 48 | self.append(text: text) 49 | } 50 | 51 | requestManager.progressHandler = { (progress: Float) in 52 | DispatchQueue.main.async { 53 | self.progress = Double(progress) 54 | } 55 | } 56 | 57 | if resetOutput { 58 | completeOutput = "Setup: \(description)" 59 | progress = 0.0 60 | } 61 | 62 | let testConfiguration = CertRequestConfiguration(isActual: isActual, 63 | slowSpeed: slowSpeed, 64 | simulateError: simulateError) 65 | requestManager.cancelPendingRequest() 66 | requestManager.startRequest(with: testConfiguration) 67 | } 68 | 69 | func reset() { 70 | requestManager.cancelPendingRequest() 71 | _ = requestManager.keychainHelper.clearKeychain() 72 | 73 | progress = 0.0 74 | 75 | completeOutput = "Setup: \(description)" 76 | append(text: requestManager.keychainHelper.showCertificateInfo()) 77 | } 78 | 79 | func scheduleNotification() { 80 | notificationScheduled = true 81 | 82 | let notificationService = LocalNotificationService.shared 83 | 84 | // A real app should schedule the notification to renew on some date in the future. 85 | notificationService.scheduleLocalNotificationForRenewal(Date(timeIntervalSinceNow: 60)) 86 | 87 | // Reset back to schedule notification after 4 seconds. 88 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4.0, qos: .background) { 89 | self.notificationScheduled = false 90 | } 91 | } 92 | 93 | private func append(text: String) { 94 | DispatchQueue.main.async { 95 | self.completeOutput += "\n\(text)" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Certificate SDK Sample visionOS/RequestTypeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | import SwiftUI 8 | 9 | struct RequestTypeView: View { 10 | @ObservedObject var model: RequestTypeModel 11 | 12 | var body: some View { 13 | List { 14 | Picker("Simulated/Actual", selection: $model.isActual) { 15 | Text("Simulated") 16 | .tag(false) 17 | Text("Actual") 18 | .tag(true) 19 | } 20 | .pickerStyle(.segmented) 21 | if model.isActual { 22 | Text("Makes network calls to the Jamf Pro server to request a certificate") 23 | .font(.footnote) 24 | } else { 25 | Text("Uses the embedded example .p12 for local testing") 26 | .font(.footnote) 27 | SidebarSwitch(title: "Slow speed", 28 | descriptiveText: "Simulates a slow server", 29 | switchIsOn: $model.slowSpeed) 30 | SidebarSwitch(title: "Error simulation", 31 | descriptiveText: "Results in an error", 32 | switchIsOn: $model.simulateError) 33 | } 34 | Button("Run Text", systemImage: "play") { 35 | model.runTest(resetOutput: true) 36 | } 37 | Text("Schedule a local notification to renew the certificate in five seconds") 38 | .font(.footnote) 39 | Button(model.notificationScheduled ? "Scheduled" : "Schedule Notification", 40 | systemImage: "play") { 41 | model.scheduleNotification() 42 | } 43 | .disabled(model.notificationScheduled) 44 | } 45 | .listStyle(.sidebar) 46 | } 47 | } 48 | 49 | /// This view has a Toggle with a title and descriptive text. 50 | struct SidebarSwitch: View { 51 | let title: String 52 | let descriptiveText: String 53 | @Binding var switchIsOn: Bool 54 | 55 | var body: some View { 56 | Toggle(isOn: $switchIsOn) { 57 | VStack(alignment: .leading) { 58 | Text(title) 59 | .font(.title) 60 | Text(descriptiveText) 61 | .font(.footnote) 62 | } 63 | } 64 | } 65 | } 66 | 67 | #Preview(windowStyle: .automatic) { 68 | let model = RequestTypeModel() 69 | NavigationSplitView { 70 | RequestTypeView(model: model) 71 | } detail: { 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AvailableLibraries 6 | 7 | 8 | BinaryPath 9 | CertificateSDK.framework/CertificateSDK 10 | LibraryIdentifier 11 | ios-arm64 12 | LibraryPath 13 | CertificateSDK.framework 14 | SupportedArchitectures 15 | 16 | arm64 17 | 18 | SupportedPlatform 19 | ios 20 | 21 | 22 | BinaryPath 23 | CertificateSDK.framework/CertificateSDK 24 | LibraryIdentifier 25 | xros-arm64 26 | LibraryPath 27 | CertificateSDK.framework 28 | SupportedArchitectures 29 | 30 | arm64 31 | 32 | SupportedPlatform 33 | xros 34 | 35 | 36 | BinaryPath 37 | CertificateSDK.framework/CertificateSDK 38 | LibraryIdentifier 39 | ios-arm64_x86_64-simulator 40 | LibraryPath 41 | CertificateSDK.framework 42 | SupportedArchitectures 43 | 44 | arm64 45 | x86_64 46 | 47 | SupportedPlatform 48 | ios 49 | SupportedPlatformVariant 50 | simulator 51 | 52 | 53 | BinaryPath 54 | CertificateSDK.framework/CertificateSDK 55 | LibraryIdentifier 56 | xros-arm64_x86_64-simulator 57 | LibraryPath 58 | CertificateSDK.framework 59 | SupportedArchitectures 60 | 61 | arm64 62 | x86_64 63 | 64 | SupportedPlatform 65 | xros 66 | SupportedPlatformVariant 67 | simulator 68 | 69 | 70 | CFBundlePackageType 71 | XFWK 72 | XCFrameworkFormatVersion 73 | 1.0 74 | 75 | 76 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/_CodeSignature/CodeDirectory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeDirectory -------------------------------------------------------------------------------- /CertificateSDK.xcframework/_CodeSignature/CodeRequirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeRequirements -------------------------------------------------------------------------------- /CertificateSDK.xcframework/_CodeSignature/CodeRequirements-1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeRequirements-1 -------------------------------------------------------------------------------- /CertificateSDK.xcframework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | ios-arm64/CertificateSDK.framework/CertificateSDK 8 | 9 | EYFWs7hQ8RuuzcFOK5O+e1HKTXY= 10 | 11 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h 12 | 13 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 14 | 15 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 16 | 17 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 18 | 19 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 20 | 21 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 22 | 23 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 24 | 25 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 26 | 27 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 28 | 29 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 30 | 31 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 32 | 33 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 34 | 35 | ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h 36 | 37 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 38 | 39 | ios-arm64/CertificateSDK.framework/Info.plist 40 | 41 | oKKx3xO67HXJqIuryrZX9Zm31gI= 42 | 43 | ios-arm64/CertificateSDK.framework/Modules/module.modulemap 44 | 45 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 46 | 47 | ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK 48 | 49 | tPPEICETVk3NBYa4xWgFocnVra4= 50 | 51 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h 52 | 53 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 54 | 55 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 56 | 57 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 58 | 59 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 60 | 61 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 62 | 63 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 64 | 65 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 66 | 67 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 68 | 69 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 70 | 71 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 72 | 73 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 74 | 75 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h 76 | 77 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 78 | 79 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist 80 | 81 | yR5ER88z8vsXQdXlQliEpMowX/Q= 82 | 83 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap 84 | 85 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 86 | 87 | ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources 88 | 89 | MHDKTDprm8Sz4kxOPKiTYEuYdzg= 90 | 91 | xros-arm64/CertificateSDK.framework/CertificateSDK 92 | 93 | F436YTswVmacc/k+0DJ8lNObFL8= 94 | 95 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h 96 | 97 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 98 | 99 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 100 | 101 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 102 | 103 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 104 | 105 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 106 | 107 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 108 | 109 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 110 | 111 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 112 | 113 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 114 | 115 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 116 | 117 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 118 | 119 | xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h 120 | 121 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 122 | 123 | xros-arm64/CertificateSDK.framework/Info.plist 124 | 125 | RRagTUFEOIYwMm4MHoZkgN8HNf4= 126 | 127 | xros-arm64/CertificateSDK.framework/Modules/module.modulemap 128 | 129 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 130 | 131 | xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK 132 | 133 | gexrUlFOV20GK34xaGc8OACmtLw= 134 | 135 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h 136 | 137 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 138 | 139 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 140 | 141 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 142 | 143 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 144 | 145 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 146 | 147 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 148 | 149 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 150 | 151 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 152 | 153 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 154 | 155 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 156 | 157 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 158 | 159 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h 160 | 161 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 162 | 163 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist 164 | 165 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI= 166 | 167 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap 168 | 169 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 170 | 171 | xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources 172 | 173 | VKq4ypCBYivwqChIgiQlO9dqmBE= 174 | 175 | 176 | files2 177 | 178 | ios-arm64/CertificateSDK.framework/CertificateSDK 179 | 180 | hash 181 | 182 | EYFWs7hQ8RuuzcFOK5O+e1HKTXY= 183 | 184 | hash2 185 | 186 | yDmiZgUCFlXJ949fzR2ANO5BTJMcdNp0xssqsLip4xo= 187 | 188 | 189 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h 190 | 191 | hash 192 | 193 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 194 | 195 | hash2 196 | 197 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 198 | 199 | 200 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 201 | 202 | hash 203 | 204 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 205 | 206 | hash2 207 | 208 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 209 | 210 | 211 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 212 | 213 | hash 214 | 215 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 216 | 217 | hash2 218 | 219 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 220 | 221 | 222 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 223 | 224 | hash 225 | 226 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 227 | 228 | hash2 229 | 230 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 231 | 232 | 233 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 234 | 235 | hash 236 | 237 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 238 | 239 | hash2 240 | 241 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 242 | 243 | 244 | ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 245 | 246 | hash 247 | 248 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 249 | 250 | hash2 251 | 252 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 253 | 254 | 255 | ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h 256 | 257 | hash 258 | 259 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 260 | 261 | hash2 262 | 263 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 264 | 265 | 266 | ios-arm64/CertificateSDK.framework/Info.plist 267 | 268 | hash 269 | 270 | oKKx3xO67HXJqIuryrZX9Zm31gI= 271 | 272 | hash2 273 | 274 | StaKZfvqIn6QngholYv+Yz7GOfg4KmEDMAz9awahsxk= 275 | 276 | 277 | ios-arm64/CertificateSDK.framework/Modules/module.modulemap 278 | 279 | hash 280 | 281 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 282 | 283 | hash2 284 | 285 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 286 | 287 | 288 | ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK 289 | 290 | hash 291 | 292 | tPPEICETVk3NBYa4xWgFocnVra4= 293 | 294 | hash2 295 | 296 | 3TmEMGxKiZt38+LaaziudGPg6xSILsRDGCCDO2/Ydnk= 297 | 298 | 299 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h 300 | 301 | hash 302 | 303 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 304 | 305 | hash2 306 | 307 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 308 | 309 | 310 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 311 | 312 | hash 313 | 314 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 315 | 316 | hash2 317 | 318 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 319 | 320 | 321 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 322 | 323 | hash 324 | 325 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 326 | 327 | hash2 328 | 329 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 330 | 331 | 332 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 333 | 334 | hash 335 | 336 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 337 | 338 | hash2 339 | 340 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 341 | 342 | 343 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 344 | 345 | hash 346 | 347 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 348 | 349 | hash2 350 | 351 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 352 | 353 | 354 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 355 | 356 | hash 357 | 358 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 359 | 360 | hash2 361 | 362 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 363 | 364 | 365 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h 366 | 367 | hash 368 | 369 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 370 | 371 | hash2 372 | 373 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 374 | 375 | 376 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist 377 | 378 | hash 379 | 380 | yR5ER88z8vsXQdXlQliEpMowX/Q= 381 | 382 | hash2 383 | 384 | /5oI8EYke/uHcDkI/us8JtJFAWwzfCCRmmTWoEHg3PE= 385 | 386 | 387 | ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap 388 | 389 | hash 390 | 391 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 392 | 393 | hash2 394 | 395 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 396 | 397 | 398 | ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources 399 | 400 | hash 401 | 402 | MHDKTDprm8Sz4kxOPKiTYEuYdzg= 403 | 404 | hash2 405 | 406 | 73G1bP4ycLZMWMbWxagOxunhG7Rn6E3C2A9bZool2gQ= 407 | 408 | 409 | xros-arm64/CertificateSDK.framework/CertificateSDK 410 | 411 | hash 412 | 413 | F436YTswVmacc/k+0DJ8lNObFL8= 414 | 415 | hash2 416 | 417 | 6mNWltv/Nt9/QeKJrDuQS0Z0wZjSo1VpRGPSlyTBgwY= 418 | 419 | 420 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h 421 | 422 | hash 423 | 424 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 425 | 426 | hash2 427 | 428 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 429 | 430 | 431 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 432 | 433 | hash 434 | 435 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 436 | 437 | hash2 438 | 439 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 440 | 441 | 442 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 443 | 444 | hash 445 | 446 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 447 | 448 | hash2 449 | 450 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 451 | 452 | 453 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 454 | 455 | hash 456 | 457 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 458 | 459 | hash2 460 | 461 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 462 | 463 | 464 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 465 | 466 | hash 467 | 468 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 469 | 470 | hash2 471 | 472 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 473 | 474 | 475 | xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 476 | 477 | hash 478 | 479 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 480 | 481 | hash2 482 | 483 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 484 | 485 | 486 | xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h 487 | 488 | hash 489 | 490 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 491 | 492 | hash2 493 | 494 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 495 | 496 | 497 | xros-arm64/CertificateSDK.framework/Info.plist 498 | 499 | hash 500 | 501 | RRagTUFEOIYwMm4MHoZkgN8HNf4= 502 | 503 | hash2 504 | 505 | pkp60rhJVwX7ho3UTHMQj/9a9YD+x6tgBTYWC4oTapg= 506 | 507 | 508 | xros-arm64/CertificateSDK.framework/Modules/module.modulemap 509 | 510 | hash 511 | 512 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 513 | 514 | hash2 515 | 516 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 517 | 518 | 519 | xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK 520 | 521 | hash 522 | 523 | gexrUlFOV20GK34xaGc8OACmtLw= 524 | 525 | hash2 526 | 527 | NZKOlQSq+s3q9LrYDHXfSspwERANMsbm3JypeLvo6yg= 528 | 529 | 530 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h 531 | 532 | hash 533 | 534 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 535 | 536 | hash2 537 | 538 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 539 | 540 | 541 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h 542 | 543 | hash 544 | 545 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 546 | 547 | hash2 548 | 549 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 550 | 551 | 552 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h 553 | 554 | hash 555 | 556 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 557 | 558 | hash2 559 | 560 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 561 | 562 | 563 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h 564 | 565 | hash 566 | 567 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 568 | 569 | hash2 570 | 571 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 572 | 573 | 574 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h 575 | 576 | hash 577 | 578 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 579 | 580 | hash2 581 | 582 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 583 | 584 | 585 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h 586 | 587 | hash 588 | 589 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 590 | 591 | hash2 592 | 593 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 594 | 595 | 596 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h 597 | 598 | hash 599 | 600 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 601 | 602 | hash2 603 | 604 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 605 | 606 | 607 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist 608 | 609 | hash 610 | 611 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI= 612 | 613 | hash2 614 | 615 | 35qRMKMr+NctBfZDK7xwnQ51nHrmstRjO8eyaXvzftY= 616 | 617 | 618 | xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap 619 | 620 | hash 621 | 622 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 623 | 624 | hash2 625 | 626 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 627 | 628 | 629 | xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources 630 | 631 | hash 632 | 633 | VKq4ypCBYivwqChIgiQlO9dqmBE= 634 | 635 | hash2 636 | 637 | 3EXJVzHA+inZivDKoH/PTvl+yN4cRuroH5l7XMZGRWY= 638 | 639 | 640 | 641 | rules 642 | 643 | ^.* 644 | 645 | ^.*\.lproj/ 646 | 647 | optional 648 | 649 | weight 650 | 1000 651 | 652 | ^.*\.lproj/locversion.plist$ 653 | 654 | omit 655 | 656 | weight 657 | 1100 658 | 659 | ^Base\.lproj/ 660 | 661 | weight 662 | 1010 663 | 664 | ^version.plist$ 665 | 666 | 667 | rules2 668 | 669 | .*\.dSYM($|/) 670 | 671 | weight 672 | 11 673 | 674 | ^(.*/)?\.DS_Store$ 675 | 676 | omit 677 | 678 | weight 679 | 2000 680 | 681 | ^.* 682 | 683 | ^.*\.lproj/ 684 | 685 | optional 686 | 687 | weight 688 | 1000 689 | 690 | ^.*\.lproj/locversion.plist$ 691 | 692 | omit 693 | 694 | weight 695 | 1100 696 | 697 | ^Base\.lproj/ 698 | 699 | weight 700 | 1010 701 | 702 | ^Info\.plist$ 703 | 704 | omit 705 | 706 | weight 707 | 20 708 | 709 | ^PkgInfo$ 710 | 711 | omit 712 | 713 | weight 714 | 20 715 | 716 | ^embedded\.provisionprofile$ 717 | 718 | weight 719 | 20 720 | 721 | ^version\.plist$ 722 | 723 | weight 724 | 20 725 | 726 | 727 | 728 | 729 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/_CodeSignature/CodeSignature: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/_CodeSignature/CodeSignature -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/CertificateSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/CertificateSDK -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestBase_h 8 | #define CertificateRequestBase_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the base class for all CertificateRequestProtocol objects. 18 | Subclasses will have a concrete implementation of requesting certificates. 19 | */ 20 | NS_CLASS_AVAILABLE_IOS(10_0) 21 | @interface CertificateRequestBase : NSObject 22 | 23 | /** 24 | The object that will be called back with progress, errors, and completion. 25 | */ 26 | @property (weak, readonly) id delegate; 27 | 28 | /** 29 | This is the maximum number of steps in the progress of a certificate request. 30 | May be approximate until the actual call of -startNewCertificateRequest 31 | */ 32 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 33 | 34 | /** 35 | Create an object. 36 | 37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 38 | @return An initialized object; may be nil if memory is full 39 | */ 40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER; 41 | 42 | @end 43 | 44 | NS_ASSUME_NONNULL_END 45 | 46 | #endif /* CertificateRequestBase_h */ 47 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestDelegate_h 8 | #define CertificateRequestDelegate_h 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @protocol CertificateRequestProtocol; 13 | 14 | /** 15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion. 16 | */ 17 | @protocol CertificateRequestDelegate 18 | 19 | @required 20 | /** 21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called. 22 | 23 | @param request The object that initiated the request 24 | @param error An error object 25 | */ 26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:)); 27 | 28 | @required 29 | /** 30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil. 31 | 32 | @param request The object that started the request. 33 | @param identity An identity that encapsulates the info from the server. 34 | */ 35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity 36 | NS_SWIFT_NAME(certificate(request:completedWith:)); 37 | 38 | @optional 39 | /** 40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked 41 | against the request.maxNumberOfSteps to show progress percentage. 42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources. 43 | 44 | @param request The object that started the request. 45 | @param current The current progress 46 | */ 47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current; 48 | 49 | @optional 50 | /** 51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method 52 | is called if implemented. 53 | 54 | @param request The object that started the request. 55 | @param isUsingNetwork Whether or not the request is currently using the network. 56 | */ 57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork; 58 | 59 | 60 | @optional 61 | /** 62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the 63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered 64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly. 65 | 66 | @param request The object that started the request. 67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config. 68 | */ 69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC; 70 | 71 | @end 72 | 73 | NS_ASSUME_NONNULL_END 74 | 75 | #endif /* CertificateRequestDelegate_h */ 76 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestEmbeddedP12_h 8 | #define CertificateRequestEmbeddedP12_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class reads the certificate from an embedded p12 file, and can force errors for testing. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @param p12URL A URL to a file with a .p12 certificate that will be returned 27 | @param pwd The password for the .p12 file 28 | @return An initialized object; may be nil if memory is full 29 | */ 30 | - (nullable instancetype)initWithDelegate:(id)delegate 31 | p12File:(NSURL *)p12URL 32 | p12Password:(NSString *)pwd; 33 | 34 | /** 35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds. 36 | This allows you to test things that are hard to test otherwise, such as progress. 37 | Defaults to zero (full speed). 38 | */ 39 | @property (assign) NSUInteger secondsBetweenSteps; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | 45 | #endif /* CertificateRequestEmbeddedP12_h */ 46 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateErrorDomain_h 8 | #define CertificateErrorDomain_h 9 | 10 | /** 11 | The error domain specific to the Jamf Certificate SDK. 12 | */ 13 | extern NSString * const kCertificateRequestErrorDomain; 14 | 15 | /** 16 | Errors specific to the Jamf Certificate SDK 17 | 18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters. 19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit. 20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen. 21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro. 22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand. 23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load. 24 | */ 25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) { 26 | kErrorBadInitializationParams = 1, 27 | kErrorCertificateMalformed = 2, 28 | kErrorCertificateWrongAutomaticPassword = 3, 29 | kErrorIncorrectManagedAppConfigData = 4, 30 | kErrorInvalidResponseFromJamfProServer = 5, 31 | kErrorTestingP12LoadFailed = 6 32 | }; 33 | 34 | #endif /* CertificateErrorDomain_h */ 35 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestProtocol_h 8 | #define CertificateRequestProtocol_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | /** 15 | This is the protocol used for requesting and renewing certificates from Jamf Pro. 16 | */ 17 | @protocol CertificateRequestProtocol 18 | 19 | /** 20 | This is the maximum number of steps in the progress of a certificate request. 21 | May be approximate until the actual call of -startNewCertificateRequest 22 | */ 23 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 24 | 25 | /** 26 | This will start a request to the Jamf Pro server for a new certificate. 27 | The delegate will be called with progress, errors, and the new identity. 28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object. 29 | */ 30 | - (void)startNewCertificateRequest; 31 | 32 | /** 33 | Cancels the current request, if any. The completion handler WILL be called on the delegate. 34 | */ 35 | - (void)cancelRequest; 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | 41 | #endif /* CertificateRequestProtocol_h */ 42 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestWorkflow_h 8 | #define CertificateRequestWorkflow_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the main class that should be instantiated to make a certificate request. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestWorkflow : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @return An initialized object; may be nil if memory is full 27 | */ 28 | - (nullable instancetype)initWithDelegate:(id)delegate; 29 | 30 | /** 31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method. 32 | 33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 34 | @param testSettings The settings that would otherwise be provided by Managed App Config. 35 | @return An initialized object; may be nil if memory is full 36 | */ 37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings; 38 | 39 | /** 40 | Use this option to specify a custom timeout in seconds for individual network requests. 41 | Defaults to 30 seconds. 42 | */ 43 | @property (assign) NSUInteger networkingTimeout; 44 | 45 | /** 46 | Use this option to specify a custom interval in seconds to poll for certificate creation. 47 | The first retrieval will happen after this interval, which means this also specifies the minimum 48 | amount of time required for the certificate request. Minimum value is one second. 49 | Defaults to 5 seconds. 50 | */ 51 | @property (assign) NSUInteger pollingInterval; 52 | 53 | /** 54 | Use this option to specify an overall timeout in seconds to poll for certificate creation. 55 | After this much time, if the server has still not returned a certificate then the certificate request 56 | will fail with a timeout error. 57 | Defaults to 180 seconds. 58 | */ 59 | @property (assign) NSUInteger pollingTimeout; 60 | 61 | @end 62 | 63 | NS_ASSUME_NONNULL_END 64 | 65 | #endif /* CertificateRequestWorkflow_h */ 66 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Headers/CertificateSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #import 8 | 9 | //! Project version number for CertificateSDK. 10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber; 11 | 12 | //! Project version string for CertificateSDK. 13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[]; 14 | 15 | 16 | #import 17 | #import 18 | #import 19 | 20 | #import 21 | #import 22 | #import 23 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Info.plist -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64/CertificateSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module CertificateSDK { 2 | umbrella header "CertificateSDK.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestBase_h 8 | #define CertificateRequestBase_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the base class for all CertificateRequestProtocol objects. 18 | Subclasses will have a concrete implementation of requesting certificates. 19 | */ 20 | NS_CLASS_AVAILABLE_IOS(10_0) 21 | @interface CertificateRequestBase : NSObject 22 | 23 | /** 24 | The object that will be called back with progress, errors, and completion. 25 | */ 26 | @property (weak, readonly) id delegate; 27 | 28 | /** 29 | This is the maximum number of steps in the progress of a certificate request. 30 | May be approximate until the actual call of -startNewCertificateRequest 31 | */ 32 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 33 | 34 | /** 35 | Create an object. 36 | 37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 38 | @return An initialized object; may be nil if memory is full 39 | */ 40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER; 41 | 42 | @end 43 | 44 | NS_ASSUME_NONNULL_END 45 | 46 | #endif /* CertificateRequestBase_h */ 47 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestDelegate_h 8 | #define CertificateRequestDelegate_h 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @protocol CertificateRequestProtocol; 13 | 14 | /** 15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion. 16 | */ 17 | @protocol CertificateRequestDelegate 18 | 19 | @required 20 | /** 21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called. 22 | 23 | @param request The object that initiated the request 24 | @param error An error object 25 | */ 26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:)); 27 | 28 | @required 29 | /** 30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil. 31 | 32 | @param request The object that started the request. 33 | @param identity An identity that encapsulates the info from the server. 34 | */ 35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity 36 | NS_SWIFT_NAME(certificate(request:completedWith:)); 37 | 38 | @optional 39 | /** 40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked 41 | against the request.maxNumberOfSteps to show progress percentage. 42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources. 43 | 44 | @param request The object that started the request. 45 | @param current The current progress 46 | */ 47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current; 48 | 49 | @optional 50 | /** 51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method 52 | is called if implemented. 53 | 54 | @param request The object that started the request. 55 | @param isUsingNetwork Whether or not the request is currently using the network. 56 | */ 57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork; 58 | 59 | 60 | @optional 61 | /** 62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the 63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered 64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly. 65 | 66 | @param request The object that started the request. 67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config. 68 | */ 69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC; 70 | 71 | @end 72 | 73 | NS_ASSUME_NONNULL_END 74 | 75 | #endif /* CertificateRequestDelegate_h */ 76 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestEmbeddedP12_h 8 | #define CertificateRequestEmbeddedP12_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class reads the certificate from an embedded p12 file, and can force errors for testing. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @param p12URL A URL to a file with a .p12 certificate that will be returned 27 | @param pwd The password for the .p12 file 28 | @return An initialized object; may be nil if memory is full 29 | */ 30 | - (nullable instancetype)initWithDelegate:(id)delegate 31 | p12File:(NSURL *)p12URL 32 | p12Password:(NSString *)pwd; 33 | 34 | /** 35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds. 36 | This allows you to test things that are hard to test otherwise, such as progress. 37 | Defaults to zero (full speed). 38 | */ 39 | @property (assign) NSUInteger secondsBetweenSteps; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | 45 | #endif /* CertificateRequestEmbeddedP12_h */ 46 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateErrorDomain_h 8 | #define CertificateErrorDomain_h 9 | 10 | /** 11 | The error domain specific to the Jamf Certificate SDK. 12 | */ 13 | extern NSString * const kCertificateRequestErrorDomain; 14 | 15 | /** 16 | Errors specific to the Jamf Certificate SDK 17 | 18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters. 19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit. 20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen. 21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro. 22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand. 23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load. 24 | */ 25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) { 26 | kErrorBadInitializationParams = 1, 27 | kErrorCertificateMalformed = 2, 28 | kErrorCertificateWrongAutomaticPassword = 3, 29 | kErrorIncorrectManagedAppConfigData = 4, 30 | kErrorInvalidResponseFromJamfProServer = 5, 31 | kErrorTestingP12LoadFailed = 6 32 | }; 33 | 34 | #endif /* CertificateErrorDomain_h */ 35 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestProtocol_h 8 | #define CertificateRequestProtocol_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | /** 15 | This is the protocol used for requesting and renewing certificates from Jamf Pro. 16 | */ 17 | @protocol CertificateRequestProtocol 18 | 19 | /** 20 | This is the maximum number of steps in the progress of a certificate request. 21 | May be approximate until the actual call of -startNewCertificateRequest 22 | */ 23 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 24 | 25 | /** 26 | This will start a request to the Jamf Pro server for a new certificate. 27 | The delegate will be called with progress, errors, and the new identity. 28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object. 29 | */ 30 | - (void)startNewCertificateRequest; 31 | 32 | /** 33 | Cancels the current request, if any. The completion handler WILL be called on the delegate. 34 | */ 35 | - (void)cancelRequest; 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | 41 | #endif /* CertificateRequestProtocol_h */ 42 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestWorkflow_h 8 | #define CertificateRequestWorkflow_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the main class that should be instantiated to make a certificate request. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestWorkflow : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @return An initialized object; may be nil if memory is full 27 | */ 28 | - (nullable instancetype)initWithDelegate:(id)delegate; 29 | 30 | /** 31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method. 32 | 33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 34 | @param testSettings The settings that would otherwise be provided by Managed App Config. 35 | @return An initialized object; may be nil if memory is full 36 | */ 37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings; 38 | 39 | /** 40 | Use this option to specify a custom timeout in seconds for individual network requests. 41 | Defaults to 30 seconds. 42 | */ 43 | @property (assign) NSUInteger networkingTimeout; 44 | 45 | /** 46 | Use this option to specify a custom interval in seconds to poll for certificate creation. 47 | The first retrieval will happen after this interval, which means this also specifies the minimum 48 | amount of time required for the certificate request. Minimum value is one second. 49 | Defaults to 5 seconds. 50 | */ 51 | @property (assign) NSUInteger pollingInterval; 52 | 53 | /** 54 | Use this option to specify an overall timeout in seconds to poll for certificate creation. 55 | After this much time, if the server has still not returned a certificate then the certificate request 56 | will fail with a timeout error. 57 | Defaults to 180 seconds. 58 | */ 59 | @property (assign) NSUInteger pollingTimeout; 60 | 61 | @end 62 | 63 | NS_ASSUME_NONNULL_END 64 | 65 | #endif /* CertificateRequestWorkflow_h */ 66 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #import 8 | 9 | //! Project version number for CertificateSDK. 10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber; 11 | 12 | //! Project version string for CertificateSDK. 13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[]; 14 | 15 | 16 | #import 17 | #import 18 | #import 19 | 20 | #import 21 | #import 22 | #import 23 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module CertificateSDK { 2 | umbrella header "CertificateSDK.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/ios-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Headers/CertificateRequestBase.h 8 | 9 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 10 | 11 | Headers/CertificateRequestDelegate.h 12 | 13 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 14 | 15 | Headers/CertificateRequestEmbeddedP12.h 16 | 17 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 18 | 19 | Headers/CertificateRequestErrorDomain.h 20 | 21 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 22 | 23 | Headers/CertificateRequestProtocol.h 24 | 25 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 26 | 27 | Headers/CertificateRequestWorkflow.h 28 | 29 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 30 | 31 | Headers/CertificateSDK.h 32 | 33 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 34 | 35 | Info.plist 36 | 37 | yR5ER88z8vsXQdXlQliEpMowX/Q= 38 | 39 | Modules/module.modulemap 40 | 41 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 42 | 43 | 44 | files2 45 | 46 | Headers/CertificateRequestBase.h 47 | 48 | hash2 49 | 50 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 51 | 52 | 53 | Headers/CertificateRequestDelegate.h 54 | 55 | hash2 56 | 57 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 58 | 59 | 60 | Headers/CertificateRequestEmbeddedP12.h 61 | 62 | hash2 63 | 64 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 65 | 66 | 67 | Headers/CertificateRequestErrorDomain.h 68 | 69 | hash2 70 | 71 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 72 | 73 | 74 | Headers/CertificateRequestProtocol.h 75 | 76 | hash2 77 | 78 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 79 | 80 | 81 | Headers/CertificateRequestWorkflow.h 82 | 83 | hash2 84 | 85 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 86 | 87 | 88 | Headers/CertificateSDK.h 89 | 90 | hash2 91 | 92 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 93 | 94 | 95 | Modules/module.modulemap 96 | 97 | hash2 98 | 99 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 100 | 101 | 102 | 103 | rules 104 | 105 | ^.* 106 | 107 | ^.*\.lproj/ 108 | 109 | optional 110 | 111 | weight 112 | 1000 113 | 114 | ^.*\.lproj/locversion.plist$ 115 | 116 | omit 117 | 118 | weight 119 | 1100 120 | 121 | ^Base\.lproj/ 122 | 123 | weight 124 | 1010 125 | 126 | ^version.plist$ 127 | 128 | 129 | rules2 130 | 131 | .*\.dSYM($|/) 132 | 133 | weight 134 | 11 135 | 136 | ^(.*/)?\.DS_Store$ 137 | 138 | omit 139 | 140 | weight 141 | 2000 142 | 143 | ^.* 144 | 145 | ^.*\.lproj/ 146 | 147 | optional 148 | 149 | weight 150 | 1000 151 | 152 | ^.*\.lproj/locversion.plist$ 153 | 154 | omit 155 | 156 | weight 157 | 1100 158 | 159 | ^Base\.lproj/ 160 | 161 | weight 162 | 1010 163 | 164 | ^Info\.plist$ 165 | 166 | omit 167 | 168 | weight 169 | 20 170 | 171 | ^PkgInfo$ 172 | 173 | omit 174 | 175 | weight 176 | 20 177 | 178 | ^embedded\.provisionprofile$ 179 | 180 | weight 181 | 20 182 | 183 | ^version\.plist$ 184 | 185 | weight 186 | 20 187 | 188 | 189 | 190 | 191 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/CertificateSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/CertificateSDK -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestBase_h 8 | #define CertificateRequestBase_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the base class for all CertificateRequestProtocol objects. 18 | Subclasses will have a concrete implementation of requesting certificates. 19 | */ 20 | NS_CLASS_AVAILABLE_IOS(10_0) 21 | @interface CertificateRequestBase : NSObject 22 | 23 | /** 24 | The object that will be called back with progress, errors, and completion. 25 | */ 26 | @property (weak, readonly) id delegate; 27 | 28 | /** 29 | This is the maximum number of steps in the progress of a certificate request. 30 | May be approximate until the actual call of -startNewCertificateRequest 31 | */ 32 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 33 | 34 | /** 35 | Create an object. 36 | 37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 38 | @return An initialized object; may be nil if memory is full 39 | */ 40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER; 41 | 42 | @end 43 | 44 | NS_ASSUME_NONNULL_END 45 | 46 | #endif /* CertificateRequestBase_h */ 47 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestDelegate_h 8 | #define CertificateRequestDelegate_h 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @protocol CertificateRequestProtocol; 13 | 14 | /** 15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion. 16 | */ 17 | @protocol CertificateRequestDelegate 18 | 19 | @required 20 | /** 21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called. 22 | 23 | @param request The object that initiated the request 24 | @param error An error object 25 | */ 26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:)); 27 | 28 | @required 29 | /** 30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil. 31 | 32 | @param request The object that started the request. 33 | @param identity An identity that encapsulates the info from the server. 34 | */ 35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity 36 | NS_SWIFT_NAME(certificate(request:completedWith:)); 37 | 38 | @optional 39 | /** 40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked 41 | against the request.maxNumberOfSteps to show progress percentage. 42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources. 43 | 44 | @param request The object that started the request. 45 | @param current The current progress 46 | */ 47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current; 48 | 49 | @optional 50 | /** 51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method 52 | is called if implemented. 53 | 54 | @param request The object that started the request. 55 | @param isUsingNetwork Whether or not the request is currently using the network. 56 | */ 57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork; 58 | 59 | 60 | @optional 61 | /** 62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the 63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered 64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly. 65 | 66 | @param request The object that started the request. 67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config. 68 | */ 69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC; 70 | 71 | @end 72 | 73 | NS_ASSUME_NONNULL_END 74 | 75 | #endif /* CertificateRequestDelegate_h */ 76 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestEmbeddedP12_h 8 | #define CertificateRequestEmbeddedP12_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class reads the certificate from an embedded p12 file, and can force errors for testing. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @param p12URL A URL to a file with a .p12 certificate that will be returned 27 | @param pwd The password for the .p12 file 28 | @return An initialized object; may be nil if memory is full 29 | */ 30 | - (nullable instancetype)initWithDelegate:(id)delegate 31 | p12File:(NSURL *)p12URL 32 | p12Password:(NSString *)pwd; 33 | 34 | /** 35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds. 36 | This allows you to test things that are hard to test otherwise, such as progress. 37 | Defaults to zero (full speed). 38 | */ 39 | @property (assign) NSUInteger secondsBetweenSteps; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | 45 | #endif /* CertificateRequestEmbeddedP12_h */ 46 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateErrorDomain_h 8 | #define CertificateErrorDomain_h 9 | 10 | /** 11 | The error domain specific to the Jamf Certificate SDK. 12 | */ 13 | extern NSString * const kCertificateRequestErrorDomain; 14 | 15 | /** 16 | Errors specific to the Jamf Certificate SDK 17 | 18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters. 19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit. 20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen. 21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro. 22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand. 23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load. 24 | */ 25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) { 26 | kErrorBadInitializationParams = 1, 27 | kErrorCertificateMalformed = 2, 28 | kErrorCertificateWrongAutomaticPassword = 3, 29 | kErrorIncorrectManagedAppConfigData = 4, 30 | kErrorInvalidResponseFromJamfProServer = 5, 31 | kErrorTestingP12LoadFailed = 6 32 | }; 33 | 34 | #endif /* CertificateErrorDomain_h */ 35 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestProtocol_h 8 | #define CertificateRequestProtocol_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | /** 15 | This is the protocol used for requesting and renewing certificates from Jamf Pro. 16 | */ 17 | @protocol CertificateRequestProtocol 18 | 19 | /** 20 | This is the maximum number of steps in the progress of a certificate request. 21 | May be approximate until the actual call of -startNewCertificateRequest 22 | */ 23 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 24 | 25 | /** 26 | This will start a request to the Jamf Pro server for a new certificate. 27 | The delegate will be called with progress, errors, and the new identity. 28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object. 29 | */ 30 | - (void)startNewCertificateRequest; 31 | 32 | /** 33 | Cancels the current request, if any. The completion handler WILL be called on the delegate. 34 | */ 35 | - (void)cancelRequest; 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | 41 | #endif /* CertificateRequestProtocol_h */ 42 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestWorkflow_h 8 | #define CertificateRequestWorkflow_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the main class that should be instantiated to make a certificate request. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestWorkflow : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @return An initialized object; may be nil if memory is full 27 | */ 28 | - (nullable instancetype)initWithDelegate:(id)delegate; 29 | 30 | /** 31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method. 32 | 33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 34 | @param testSettings The settings that would otherwise be provided by Managed App Config. 35 | @return An initialized object; may be nil if memory is full 36 | */ 37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings; 38 | 39 | /** 40 | Use this option to specify a custom timeout in seconds for individual network requests. 41 | Defaults to 30 seconds. 42 | */ 43 | @property (assign) NSUInteger networkingTimeout; 44 | 45 | /** 46 | Use this option to specify a custom interval in seconds to poll for certificate creation. 47 | The first retrieval will happen after this interval, which means this also specifies the minimum 48 | amount of time required for the certificate request. Minimum value is one second. 49 | Defaults to 5 seconds. 50 | */ 51 | @property (assign) NSUInteger pollingInterval; 52 | 53 | /** 54 | Use this option to specify an overall timeout in seconds to poll for certificate creation. 55 | After this much time, if the server has still not returned a certificate then the certificate request 56 | will fail with a timeout error. 57 | Defaults to 180 seconds. 58 | */ 59 | @property (assign) NSUInteger pollingTimeout; 60 | 61 | @end 62 | 63 | NS_ASSUME_NONNULL_END 64 | 65 | #endif /* CertificateRequestWorkflow_h */ 66 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Headers/CertificateSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #import 8 | 9 | //! Project version number for CertificateSDK. 10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber; 11 | 12 | //! Project version string for CertificateSDK. 13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[]; 14 | 15 | 16 | #import 17 | #import 18 | #import 19 | 20 | #import 21 | #import 22 | #import 23 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Info.plist -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64/CertificateSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module CertificateSDK { 2 | umbrella header "CertificateSDK.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/CertificateSDK -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestBase_h 8 | #define CertificateRequestBase_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the base class for all CertificateRequestProtocol objects. 18 | Subclasses will have a concrete implementation of requesting certificates. 19 | */ 20 | NS_CLASS_AVAILABLE_IOS(10_0) 21 | @interface CertificateRequestBase : NSObject 22 | 23 | /** 24 | The object that will be called back with progress, errors, and completion. 25 | */ 26 | @property (weak, readonly) id delegate; 27 | 28 | /** 29 | This is the maximum number of steps in the progress of a certificate request. 30 | May be approximate until the actual call of -startNewCertificateRequest 31 | */ 32 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 33 | 34 | /** 35 | Create an object. 36 | 37 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 38 | @return An initialized object; may be nil if memory is full 39 | */ 40 | - (nullable instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER; 41 | 42 | @end 43 | 44 | NS_ASSUME_NONNULL_END 45 | 46 | #endif /* CertificateRequestBase_h */ 47 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestDelegate_h 8 | #define CertificateRequestDelegate_h 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @protocol CertificateRequestProtocol; 13 | 14 | /** 15 | Third party apps should have a class that implements these methods for notification on progress, errors, and completion. 16 | */ 17 | @protocol CertificateRequestDelegate 18 | 19 | @required 20 | /** 21 | When any kind of error occurs in the process for requesting certificates, this delegate method will be called. 22 | 23 | @param request The object that initiated the request 24 | @param error An error object 25 | */ 26 | - (void)certificateRequest:(id)request errorOccurred:(NSError *)error NS_SWIFT_NAME(certificate(request:error:)); 27 | 28 | @required 29 | /** 30 | When the request to Jamf Pro is completed, this method will be called. If there were errors, the identity will be nil. 31 | 32 | @param request The object that started the request. 33 | @param identity An identity that encapsulates the info from the server. 34 | */ 35 | - (void)certificateRequest:(id)request completedWithIdentity:(nullable SecIdentityRef)identity 36 | NS_SWIFT_NAME(certificate(request:completedWith:)); 37 | 38 | @optional 39 | /** 40 | As the steps are completed during the request to Jamf Pro, this method can be called. The current progress can be checked 41 | against the request.maxNumberOfSteps to show progress percentage. 42 | NOTE: Each step may take a different (unknown) amount of time as the actual request will be using network resources. 43 | 44 | @param request The object that started the request. 45 | @param current The current progress 46 | */ 47 | - (void)certificateRequest:(id)request progress:(NSUInteger)current; 48 | 49 | @optional 50 | /** 51 | When the CertificateRequest SDK begins accessing the network and when it ends accessing the network, this method 52 | is called if implemented. 53 | 54 | @param request The object that started the request. 55 | @param isUsingNetwork Whether or not the request is currently using the network. 56 | */ 57 | - (void)certificateRequest:(id)request isUsingNetwork:(BOOL)isUsingNetwork; 58 | 59 | 60 | @optional 61 | /** 62 | When the CertificateRequest SDK detects no settings in the Managed App Config key, or if the invitation in the 63 | Managed App Config has expired this will be called to let you know that it is waiting for a new MAC to be delivered 64 | from the Jamf Pro server. Will be called again when the MAC comes in; the timing on this can vary greatly. 65 | 66 | @param request The object that started the request. 67 | @param waitingForMAC Whether or not the request is currently waiting for settings in the Managed App Config. 68 | */ 69 | - (void)certificateRequest:(id)request isWaitingForMAC:(BOOL)waitingForMAC; 70 | 71 | @end 72 | 73 | NS_ASSUME_NONNULL_END 74 | 75 | #endif /* CertificateRequestDelegate_h */ 76 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestEmbeddedP12.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestEmbeddedP12_h 8 | #define CertificateRequestEmbeddedP12_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class reads the certificate from an embedded p12 file, and can force errors for testing. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestEmbeddedP12 : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @param p12URL A URL to a file with a .p12 certificate that will be returned 27 | @param pwd The password for the .p12 file 28 | @return An initialized object; may be nil if memory is full 29 | */ 30 | - (nullable instancetype)initWithDelegate:(id)delegate 31 | p12File:(NSURL *)p12URL 32 | p12Password:(NSString *)pwd; 33 | 34 | /** 35 | Use this option to artificially delay the completion of each step. Each step up to maxNumberOfSteps will take this many seconds. 36 | This allows you to test things that are hard to test otherwise, such as progress. 37 | Defaults to zero (full speed). 38 | */ 39 | @property (assign) NSUInteger secondsBetweenSteps; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | 45 | #endif /* CertificateRequestEmbeddedP12_h */ 46 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestErrorDomain.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateErrorDomain_h 8 | #define CertificateErrorDomain_h 9 | 10 | /** 11 | The error domain specific to the Jamf Certificate SDK. 12 | */ 13 | extern NSString * const kCertificateRequestErrorDomain; 14 | 15 | /** 16 | Errors specific to the Jamf Certificate SDK 17 | 18 | - kErrorBadInitializationParams: A CertificateRequestEmbeddedP12 object was initialized with bad parameters. 19 | - kErrorCertificateMalformed: Unlikely to happen. The certificate coming from Jamf Pro has been mangled in transit. 20 | - kErrorCertificateWrongAutomaticPassword: Unlikely to happen. Occurs when the .p12 from the server was encrypted with a different password than the SDK has chosen. 21 | - kErrorIncorrectManagedAppConfigData: The Managed App Config info does not contain enough information to contact Jamf Pro. 22 | - kErrorInvalidResponseFromJamfProServer: Unlikely to happen. The Jamf Pro server responded with info that the SDK does not understand. 23 | - kErrorTestingP12LoadFailed: Unlikely to happen. When using the testing class CertificateRequestEmbeddedP12 this is a generic error that the p12 failed to load. 24 | */ 25 | NS_ERROR_ENUM(kCertificateRequestErrorDomain) { 26 | kErrorBadInitializationParams = 1, 27 | kErrorCertificateMalformed = 2, 28 | kErrorCertificateWrongAutomaticPassword = 3, 29 | kErrorIncorrectManagedAppConfigData = 4, 30 | kErrorInvalidResponseFromJamfProServer = 5, 31 | kErrorTestingP12LoadFailed = 6 32 | }; 33 | 34 | #endif /* CertificateErrorDomain_h */ 35 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestProtocol_h 8 | #define CertificateRequestProtocol_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | /** 15 | This is the protocol used for requesting and renewing certificates from Jamf Pro. 16 | */ 17 | @protocol CertificateRequestProtocol 18 | 19 | /** 20 | This is the maximum number of steps in the progress of a certificate request. 21 | May be approximate until the actual call of -startNewCertificateRequest 22 | */ 23 | @property (assign, readonly) NSUInteger maxNumberOfSteps; 24 | 25 | /** 26 | This will start a request to the Jamf Pro server for a new certificate. 27 | The delegate will be called with progress, errors, and the new identity. 28 | NOTE: Only one such request should be in progress at a given time for a single CertificateRequest object. 29 | */ 30 | - (void)startNewCertificateRequest; 31 | 32 | /** 33 | Cancels the current request, if any. The completion handler WILL be called on the delegate. 34 | */ 35 | - (void)cancelRequest; 36 | 37 | @end 38 | 39 | NS_ASSUME_NONNULL_END 40 | 41 | #endif /* CertificateRequestProtocol_h */ 42 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateRequestWorkflow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #ifndef CertificateRequestWorkflow_h 8 | #define CertificateRequestWorkflow_h 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /** 17 | This class is the main class that should be instantiated to make a certificate request. 18 | */ 19 | NS_CLASS_AVAILABLE_IOS(10_0) 20 | @interface CertificateRequestWorkflow : CertificateRequestBase 21 | 22 | /** 23 | Create an object. 24 | 25 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 26 | @return An initialized object; may be nil if memory is full 27 | */ 28 | - (nullable instancetype)initWithDelegate:(id)delegate; 29 | 30 | /** 31 | Create an object with given settings instead of relying on Managed App Config. This is a testing method. 32 | 33 | @param delegate Your delegate that will be called as the certificate request workflow proceeds 34 | @param testSettings The settings that would otherwise be provided by Managed App Config. 35 | @return An initialized object; may be nil if memory is full 36 | */ 37 | - (nullable instancetype)initWithDelegate:(id)delegate testSettings:(NSDictionary *)testSettings; 38 | 39 | /** 40 | Use this option to specify a custom timeout in seconds for individual network requests. 41 | Defaults to 30 seconds. 42 | */ 43 | @property (assign) NSUInteger networkingTimeout; 44 | 45 | /** 46 | Use this option to specify a custom interval in seconds to poll for certificate creation. 47 | The first retrieval will happen after this interval, which means this also specifies the minimum 48 | amount of time required for the certificate request. Minimum value is one second. 49 | Defaults to 5 seconds. 50 | */ 51 | @property (assign) NSUInteger pollingInterval; 52 | 53 | /** 54 | Use this option to specify an overall timeout in seconds to poll for certificate creation. 55 | After this much time, if the server has still not returned a certificate then the certificate request 56 | will fail with a timeout error. 57 | Defaults to 180 seconds. 58 | */ 59 | @property (assign) NSUInteger pollingTimeout; 60 | 61 | @end 62 | 63 | NS_ASSUME_NONNULL_END 64 | 65 | #endif /* CertificateRequestWorkflow_h */ 66 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Headers/CertificateSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPDX-License-Identifier: MIT 3 | // https://github.com/jamf/CertificateSDK 4 | // 5 | // Copyright 2024, Jamf 6 | // 7 | #import 8 | 9 | //! Project version number for CertificateSDK. 10 | FOUNDATION_EXPORT double CertificateSDKVersionNumber; 11 | 12 | //! Project version string for CertificateSDK. 13 | FOUNDATION_EXPORT const unsigned char CertificateSDKVersionString[]; 14 | 15 | 16 | #import 17 | #import 18 | #import 19 | 20 | #import 21 | #import 22 | #import 23 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamf/CertificateSDK/bbfa7ea281a23d881e0055c759a343041a207f2c/CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Info.plist -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module CertificateSDK { 2 | umbrella header "CertificateSDK.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /CertificateSDK.xcframework/xros-arm64_x86_64-simulator/CertificateSDK.framework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Headers/CertificateRequestBase.h 8 | 9 | hLjW9WyUJS+8jyVUmK1qoWpduqk= 10 | 11 | Headers/CertificateRequestDelegate.h 12 | 13 | PTnCyZx+ZVpYX9ezPirk0yCgMGQ= 14 | 15 | Headers/CertificateRequestEmbeddedP12.h 16 | 17 | Cxit1w7Rs2j/lOoaxM5/ZMF4ZFo= 18 | 19 | Headers/CertificateRequestErrorDomain.h 20 | 21 | 0tufHVLiYUxzA4jOkXxCA6DSSi4= 22 | 23 | Headers/CertificateRequestProtocol.h 24 | 25 | j4gMIOdnBKmA7QBIbZpPbbDo/88= 26 | 27 | Headers/CertificateRequestWorkflow.h 28 | 29 | qVckvekXlnjMDZ4JZkYtrKr1nO0= 30 | 31 | Headers/CertificateSDK.h 32 | 33 | mawIEG5HK+qAG8KcrxXRcf0DMJo= 34 | 35 | Info.plist 36 | 37 | n+VlnCTVs9HVPBlZ8bY2aBzcCUI= 38 | 39 | Modules/module.modulemap 40 | 41 | tClFj0ge1TQaXuYCRNTIZQgBu0s= 42 | 43 | 44 | files2 45 | 46 | Headers/CertificateRequestBase.h 47 | 48 | hash2 49 | 50 | wWe6CUg0N7yw17b+1oZ67WShom4s6cGio8ARlP092kc= 51 | 52 | 53 | Headers/CertificateRequestDelegate.h 54 | 55 | hash2 56 | 57 | 6BiT30OcqvhG5O8xPcpo89ExV6G891XxueC7xvJdb8k= 58 | 59 | 60 | Headers/CertificateRequestEmbeddedP12.h 61 | 62 | hash2 63 | 64 | Ey9h/I+0/TdWScu0y5k1YfKmLx1k19EIK4tPo9Fw7LA= 65 | 66 | 67 | Headers/CertificateRequestErrorDomain.h 68 | 69 | hash2 70 | 71 | qCZ8nkXt16gpFrdGDk8r2voWrInPz4Hor6gZF0MKM48= 72 | 73 | 74 | Headers/CertificateRequestProtocol.h 75 | 76 | hash2 77 | 78 | vOWSTNnIP0yyaCAt0KDj0sqoyjD2iULx8fHkjtodZQI= 79 | 80 | 81 | Headers/CertificateRequestWorkflow.h 82 | 83 | hash2 84 | 85 | 3IscKjIVIEqC6diwnqoA3s81mpnxisYcjGtZszckgzE= 86 | 87 | 88 | Headers/CertificateSDK.h 89 | 90 | hash2 91 | 92 | 7EsaVvw/RMWKN9VKOjlPQeqYmA92YPANzRtScsxjKcA= 93 | 94 | 95 | Modules/module.modulemap 96 | 97 | hash2 98 | 99 | AIqQ0e5V5b6Cgro6ipCHJOTtDg3nX/JyMVH8HgxHpck= 100 | 101 | 102 | 103 | rules 104 | 105 | ^.* 106 | 107 | ^.*\.lproj/ 108 | 109 | optional 110 | 111 | weight 112 | 1000 113 | 114 | ^.*\.lproj/locversion.plist$ 115 | 116 | omit 117 | 118 | weight 119 | 1100 120 | 121 | ^Base\.lproj/ 122 | 123 | weight 124 | 1010 125 | 126 | ^version.plist$ 127 | 128 | 129 | rules2 130 | 131 | .*\.dSYM($|/) 132 | 133 | weight 134 | 11 135 | 136 | ^(.*/)?\.DS_Store$ 137 | 138 | omit 139 | 140 | weight 141 | 2000 142 | 143 | ^.* 144 | 145 | ^.*\.lproj/ 146 | 147 | optional 148 | 149 | weight 150 | 1000 151 | 152 | ^.*\.lproj/locversion.plist$ 153 | 154 | omit 155 | 156 | weight 157 | 1100 158 | 159 | ^Base\.lproj/ 160 | 161 | weight 162 | 1010 163 | 164 | ^Info\.plist$ 165 | 166 | omit 167 | 168 | weight 169 | 20 170 | 171 | ^PkgInfo$ 172 | 173 | omit 174 | 175 | weight 176 | 20 177 | 178 | ^embedded\.provisionprofile$ 179 | 180 | weight 181 | 20 182 | 183 | ^version\.plist$ 184 | 185 | weight 186 | 20 187 | 188 | 189 | 190 | 191 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jamf 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.9 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "CertificateSDK", 6 | platforms: [ 7 | .iOS(.v12), 8 | .visionOS(.v1) 9 | ], 10 | products: [ 11 | .library( 12 | name: "CertificateSDK", targets: ["CertificateSDK"] 13 | ) 14 | ], 15 | targets: [ 16 | .binaryTarget( 17 | name: "CertificateSDK", path: "CertificateSDK.xcframework" 18 | ) 19 | ] 20 | ) 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Jamf Certificate SDK 2 | 3 | When the Jamf Certificate SDK is integrated with your iOS or visionOS app, it provides a secure process 4 | that allows the app to request a certificate from a certificate authority (CA) via Jamf Pro. Certificates 5 | can be used to establish identities that support certificate-based authentication to perform Single Sign-On 6 | (SSO) or other actions specific to your environment. 7 | 8 | See [Distributing an In-House App Developed with the Jamf Certificate SDK](https://learn.jamf.com/en-US/bundle/technical-paper-integrating-ad-cs-current/page/Distributing_an_In-House_App_Developed_with_the_Jamf_Certificate_SDK.html) for more details. 9 | 10 | -------- 11 | 12 | ### Installation 13 | 14 | Jamf Certificate SDK is available through the [Swift Package Manager](https://swift.org/package-manager/). 15 | 16 | To install via the Swift Package Manager add the following line to your `Package.swift` file's `dependencies`: 17 | 18 | ```swift 19 | .package(url: "https://github.com/jamf/CertificateSDK.git", from: "2.0.0") 20 | ``` 21 | 22 | -------- 23 | 24 | #### Framework Architectures 25 | 26 | The included XCFramework ships with support for the iOS and visionOS simulators on Apple Silicon and 27 | Intel-based Mac computers, and iOS and visionOS devices using the arm64 architecture. This allows app 28 | developers to use the framework on actual iOS and visionOS devices and in the simulators while 29 | developing and testing their apps. 30 | 31 | -------- 32 | 33 | ### Managed App Configuration Required Settings 34 | 35 | To ensure proper use of the SDK, the app is required to be distributed by Jamf Pro. During distribution, 36 | a managed app configuration can be specified that will let the SDK communicate with Jamf Pro and request 37 | the proper certificate. Here is a sample managed app configuration that can be used as a basis for your own app. 38 | 39 | *Note that you can add your own key/value pairs to the managed app configuration to configure other parts of your app.* Jamf's keys are all prefixed 40 | with `com.jamf.config.` so they will not clash with your own naming conventions for keys. 41 | 42 | 43 | com.jamf.config.jamfpro.invitation 44 | $MOBILEDEVICEAPPINVITE 45 | com.jamf.config.device.udid 46 | $MANAGEMENTID 47 | com.jamf.config.jamfpro.url 48 | https://the_jamf_pro_server_url_goes_here/ 49 | com.jamf.config.certificate-request.pkiId 50 | 1 51 | com.jamf.config.certificate-request.template 52 | User2 53 | com.jamf.config.certificate-request.keySize 54 | 4096 55 | com.jamf.config.certificate-request.subject 56 | cn=something 57 | com.jamf.config.certificate-request.subjectAlternativeNames 58 | 59 | 60 | com.jamf.config.certificate-request.sanType 61 | rfc822Name 62 | com.jamf.config.certificate-request.sanValue 63 | somebody@example.com 64 | 65 | 66 | com.jamf.config.certificate-request.sanType 67 | userPrincipalName 68 | com.jamf.config.certificate-request.sanValue 69 | somebody@example.com 70 | 71 | 72 | com.jamf.config.certificate-request.signature 73 | $JAMF_SIGNATURE_com.jamf.config.certificate-request 74 | 75 | 76 | ###### MAC key discussion 77 | 78 | `com.jamf.config.device.udid`: The device identifier of the device the app is installed on. Starting with 79 | Jamf Pro 11.5.1, the value must be `$MANAGEMENTID` to support both company-owned and BYOD devices. In Jamf 80 | Pro 11.5.0 and earlier, the value must instead be `$UDID` and only company-owned devices are supported. 81 | 82 | `com.jamf.config.jamfpro.url`: The value should be filled in with your Jamf Pro Server's URL. 83 | 84 | The keys prefixed with `com.jamf.config.certificate-request` are used during certificate generation. They 85 | will be specific to your organization. You should confer with those responsible for Jamf Pro and your 86 | Certificate Authority to ensure the proper settings are configured for your app. 87 | 88 | * `pkiId`: (an integer but typed as string in the MAC) Jamf Pro ID of the PKI Integration/Certificate Authority to be used; find this in the Jamf Pro 89 | web UI at Settings > PKI Certificates > Your ADCS CA settings and then look in the URL bar for the number after "id=". You should have a URL something like "adcsSettings.html?id=3" and enter the number `3` in the AppConfig 90 | * `template`: (string) Certificate template name as defined in your CA. 91 | * `subject`: (string) Subject to include in the certificate signing request. 92 | * `keySize`: (integer) The number of bits used in cryptographic algorithm of the certificate. Must be one of `2048`, `4096` or `8192`; defaults to `2048` if not specified. 93 | * `subjectAlternativeNames`: (array) Available starting in Jamf Pro 11.17.0. An array of subject alternative name dictionaries. 94 | * `sanType`: (string) One of 'rfc822Name', 'dNSName', 'uniformResourceIdentifier', or 'userPrincipalName.' 95 | * `sanValue`: (string) Subject Alternative Name to include in the certificate signing request. 96 | 97 | With the `subject` and `sanValue` fields, variable substitution is available as discussed under [Payload Variables for Configuration Profiles](https://learn.jamf.com/en-US/bundle/jamf-pro-documentation-current/page/Mobile_Device_Configuration_Profiles.html#ariaid-title3). 98 | 99 | Jamf Pro 11.17.0 added the `keySize` and `subjectAlternativeNames` top level keys. Jamf Pro 11.16 and earlier do not support `keySize`, and the `sanType` and `sanValue` keys should be specified at the top level instead of within the `subjectAlternativeNames` array. See earlier versions of the CertificateSDK for details. 100 | 101 | -- 102 | 103 | Additional reference documentation is available in 104 | [Integrating the Jamf Certificate SDK with Mobile Device Apps Deployed by Jamf Pro](https://learn.jamf.com/bundle/jamf-certificate-sdk/page/Overview.html). 105 | -------------------------------------------------------------------------------- /sample-app-specfile.xml: -------------------------------------------------------------------------------- 1 | 2 | 1.0.0 3 | com.jamf.certificate-sdk.sample 4 | 5 | 6 | 7 | https://example.com/ 8 | 9 | 10 | 11 | 12 | $MOBILEDEVICEAPPINVITE 13 | 14 | 15 | 16 | 17 | $MANAGEMENTID 18 | 19 | 20 | 21 | 22 | 3 23 | 24 | 25 | 26 | 27 | cn=something 28 | 29 | 30 | 31 | 32 | 33 | rfc822Name 34 | 35 | 36 | 37 | 38 | 39 | somebody@example.com 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | Jamf Certificate SDK 51 | 52 | 53 | 56 | 57 | URL of your Jamf Pro server 58 | 59 | 60 | 61 | 64 | 65 | A one time use code to connect to Jamf Pro's API. 66 | 67 | 68 | 69 | 72 | 73 | The device's UDID 74 | 75 | 76 | 77 | 80 | 81 | The id value of the PKI record to use in Jamf Pro 82 | 83 | 84 | 85 | 88 | 89 | The subject value for defining your cert. Likely will contain user/device variables. 90 | 91 | 92 | 93 | 96 | 97 | The type of the Subject Alternative Name 98 | 99 | 100 | 101 | 104 | 105 | The SAN in a format specified by the type. Likely will contain user/device variables. 106 | 107 | 108 | 109 | 112 | 113 | The name of the ADCS CA template to use (leave blank if no template is needed). 114 | 115 | 116 | 117 | 118 | --------------------------------------------------------------------------------