// // Keychain.swift // AltStore // // Created by Riley Testut on 6/4/19. // Copyright © 2019 Riley Testut. All rights reserved. // import Foundation import KeychainAccess import AltSign @propertyWrapper public struct KeychainItem { public let key: String public var wrappedValue: Value? { get { switch Value.self { case is Data.Type: return try? Keychain.shared.keychain.getData(self.key) as? Value case is String.Type: return try? Keychain.shared.keychain.getString(self.key) as? Value default: return nil } } set { switch Value.self { case is Data.Type: Keychain.shared.keychain[data: self.key] = newValue as? Data case is String.Type: Keychain.shared.keychain[self.key] = newValue as? String default: break } } } public init(key: String) { self.key = key } } public class Keychain { public static let shared = Keychain() fileprivate let keychain = KeychainAccess.Keychain(service: Bundle.Info.appbundleIdentifier).accessibility(.afterFirstUnlock).synchronizable(true) @KeychainItem(key: "appleIDEmailAddress") public var appleIDEmailAddress: String? @KeychainItem(key: "appleIDPassword") public var appleIDPassword: String? @KeychainItem(key: "signingCertificatePrivateKey") public var signingCertificatePrivateKey: Data? @KeychainItem(key: "signingCertificateSerialNumber") public var signingCertificateSerialNumber: String? @KeychainItem(key: "signingCertificate") public var signingCertificate: Data? @KeychainItem(key: "signingCertificatePassword") public var signingCertificatePassword: String? @KeychainItem(key: "patreonAccessToken") public var patreonAccessToken: String? @KeychainItem(key: "patreonRefreshToken") public var patreonRefreshToken: String? @KeychainItem(key: "patreonCreatorAccessToken") public var patreonCreatorAccessToken: String? @KeychainItem(key: "patreonAccountID") public var patreonAccountID: String? @KeychainItem(key: "identifier") public var identifier: String? @KeychainItem(key: "adiPb") public var adiPb: String? private init() { } public func reset() { self.appleIDEmailAddress = nil self.appleIDPassword = nil self.signingCertificatePrivateKey = nil self.signingCertificateSerialNumber = nil } }