diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 34d41f8..8158df6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,17 +63,21 @@ jobs: KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} run: | echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12 - security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain - security default-keychain -s build.keychain - security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain - security set-keychain-settings -t 3600 -u build.keychain + # security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain + # security default-keychain -s build.keychain + # security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain + # security set-keychain-settings -t 3600 -u build.keychain - curl https://droposs.org/drop.crt --output drop.pem - sudo security authorizationdb write com.apple.trust-settings.user allow - security add-trusted-cert -r trustRoot -k build.keychain -p codeSign -u -1 drop.pem - sudo security authorizationdb remove com.apple.trust-settings.user + curl https://droposs.org/drop.der --output drop.der + swiftc libs/appletrust/add-certificate.swift + ./add-certificate drop.der + rm add-certificate - security import certificate.p12 -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign + # sudo security authorizationdb write com.apple.trust-settings.user allow + # security add-trusted-cert -r trustRoot -k build.keychain -p codeSign -u -1 drop.pem + # sudo security authorizationdb remove com.apple.trust-settings.user + + security import certificate.p12 -k /Library/Keychains/System.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" build.keychain security find-identity -v -p codesigning build.keychain diff --git a/.gitlab-ci-local/.gitignore b/.gitlab-ci-local/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/.gitlab-ci-local/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/libs/appletrust/add-certificate.swift b/libs/appletrust/add-certificate.swift new file mode 100644 index 0000000..ecb1285 --- /dev/null +++ b/libs/appletrust/add-certificate.swift @@ -0,0 +1,72 @@ +import Foundation +import Security + +enum SecurityError: Error { + case generalError +} + +func deleteCertificateFromKeyChain(_ certificateLabel: String) -> Bool { + let delQuery: [NSString: Any] = [ + kSecClass: kSecClassCertificate, + kSecAttrLabel: certificateLabel, + ] + let delStatus: OSStatus = SecItemDelete(delQuery as CFDictionary) + + return delStatus == errSecSuccess +} + +func saveCertificateToKeyChain(_ certificate: SecCertificate, certificateLabel: String) throws { + SecKeychainSetPreferenceDomain(SecPreferencesDomain.system) + deleteCertificateFromKeyChain(certificateLabel) + + let setQuery: [NSString: AnyObject] = [ + kSecClass: kSecClassCertificate, + kSecValueRef: certificate, + kSecAttrLabel: certificateLabel as AnyObject, + kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked, + ] + let addStatus: OSStatus = SecItemAdd(setQuery as CFDictionary, nil) + + guard addStatus == errSecSuccess else { + throw SecurityError.generalError + } + + var status = SecTrustSettingsSetTrustSettings(certificate, SecTrustSettingsDomain.admin, nil) +} + +func getCertificateFromString(stringData: String) throws -> SecCertificate { + if let data = NSData(base64Encoded: stringData, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) { + if let certificate = SecCertificateCreateWithData(kCFAllocatorDefault, data) { + return certificate + } + } + throw SecurityError.generalError +} + +if CommandLine.arguments.count != 2 { + print("Usage: \(CommandLine.arguments[0]) [cert.file]") + print("Usage: \(CommandLine.arguments[0]) --version") + exit(1) +} + +if (CommandLine.arguments[1] == "--version") { + let version = "dev" + print(version) + exit(0) +} else { + let fileURL = URL(fileURLWithPath: CommandLine.arguments[1]) + do { + let certData = try Data(contentsOf: fileURL) + let certificate = SecCertificateCreateWithData(nil, certData as CFData) + if certificate != nil { + print("Saving certificate") + try? saveCertificateToKeyChain(certificate!, certificateLabel: "DropOSS") + exit(0) + } else { + print("ERROR: Unknown error while reading the \(CommandLine.arguments[1]) file.") + } + } catch { + print("ERROR: Unexpected error while reading the \(CommandLine.arguments[1]) file. \(error)") + } +} +exit(1) \ No newline at end of file