]> git.saurik.com Git - apple/security.git/blobdiff - keychain/TrustedPeersHelperUnitTests/ContainerSync.swift
Security-59306.11.20.tar.gz
[apple/security.git] / keychain / TrustedPeersHelperUnitTests / ContainerSync.swift
diff --git a/keychain/TrustedPeersHelperUnitTests/ContainerSync.swift b/keychain/TrustedPeersHelperUnitTests/ContainerSync.swift
new file mode 100644 (file)
index 0000000..17ab441
--- /dev/null
@@ -0,0 +1,374 @@
+//
+//  SessionSync.swift
+//  Security_ios
+//
+//  Created by Ben Williamson on 6/8/18.
+//
+
+import XCTest
+
+extension Container {
+
+    func dumpSync(test: XCTestCase) -> ([AnyHashable: Any]?, Error?) {
+        let expectation = XCTestExpectation(description: "dump replied")
+        var reta: [AnyHashable: Any]?, reterr: Error?
+        self.dump { a, err in
+            reta = a
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, reterr)
+    }
+
+    func resetSync(test: XCTestCase) -> Error? {
+        let expectation = XCTestExpectation(description: "reset replied")
+        var reterr: Error?
+        self.reset { error in
+            reterr = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func localResetSync(test: XCTestCase) -> Error? {
+        let expectation = XCTestExpectation(description: "reset replied")
+        var reterr: Error?
+        self.localReset { error in
+            reterr = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func prepareSync(test: XCTestCase,
+                     epoch: UInt64,
+                     machineID: String,
+                     bottleSalt: String,
+                     bottleID: String,
+                     modelID: String,
+                     deviceName: String = "test device name",
+                     serialNumber: String = "456",
+                     osVersion: String = "123",
+                     policyVersion: UInt64? = nil,
+                     policySecrets: [String: Data]? = nil,
+                     signingPrivateKeyPersistentRef: Data? = nil,
+                     encryptionPrivateKeyPersistentRef: Data? = nil
+        ) -> (String?, Data?, Data?, Data?, Data?, Error?) {
+        let expectation = XCTestExpectation(description: "prepare replied")
+        var reta: String?, retb: Data?, retc: Data?, retd: Data?, rete: Data?, reterr: Error?
+        self.prepare(epoch: epoch,
+                     machineID: machineID,
+                     bottleSalt: bottleSalt,
+                     bottleID: bottleID,
+                     modelID: modelID,
+                     deviceName: deviceName,
+                     serialNumber: serialNumber,
+                     osVersion: osVersion,
+                     policyVersion: policyVersion,
+                     policySecrets: policySecrets,
+                     signingPrivateKeyPersistentRef: signingPrivateKeyPersistentRef,
+                     encryptionPrivateKeyPersistentRef: encryptionPrivateKeyPersistentRef
+        ) { a, b, c, d, e, err in
+            reta = a
+            retb = b
+            retc = c
+            retd = d
+            rete = e
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retb, retc, retd, rete, reterr)
+    }
+
+    func establishSync(test: XCTestCase,
+                       ckksKeys: [CKKSKeychainBackedKeySet],
+                       tlkShares: [CKKSTLKShare],
+                       preapprovedKeys: [Data]?) -> (String?, [CKRecord], Error?) {
+        let expectation = XCTestExpectation(description: "prepare replied")
+        var reta: String?, retkhr: [CKRecord]?, reterr: Error?
+        self.establish(ckksKeys: ckksKeys,
+                       tlkShares: tlkShares,
+                       preapprovedKeys: preapprovedKeys) { a, khr, err in
+                        reta = a
+                        retkhr = khr
+                        reterr = err
+                        expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retkhr!, reterr)
+    }
+
+    func vouchSync(test: XCTestCase,
+                   peerID: String,
+                   permanentInfo: Data,
+                   permanentInfoSig: Data,
+                   stableInfo: Data,
+                   stableInfoSig: Data,
+                   ckksKeys: [CKKSKeychainBackedKeySet]) -> (Data?, Data?, Error?) {
+        let expectation = XCTestExpectation(description: "vouch replied")
+        var reta: Data?, retb: Data?, reterr: Error?
+        self.vouch(peerID: peerID,
+                   permanentInfo: permanentInfo,
+                   permanentInfoSig: permanentInfoSig,
+                   stableInfo: stableInfo,
+                   stableInfoSig: stableInfoSig,
+                   ckksKeys: ckksKeys) { a, b, err in
+                    reta = a
+                    retb = b
+                    reterr = err
+                    expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retb, reterr)
+    }
+
+    func vouchWithBottleSync(test: XCTestCase, b: String, entropy: Data, bottleSalt: String, tlkShares: [CKKSTLKShare]) -> (Data?, Data?, Error?) {
+        let expectation = XCTestExpectation(description: "vouchWithBottle replied")
+        var reta: Data?, retb: Data?, reterr: Error?
+        self.vouchWithBottle(bottleID: b, entropy: entropy, bottleSalt: bottleSalt, tlkShares: tlkShares) { a, b, err in
+            reta = a
+            retb = b
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retb, reterr)
+    }
+
+    func joinSync(test: XCTestCase,
+                  voucherData: Data,
+                  voucherSig: Data,
+                  ckksKeys: [CKKSKeychainBackedKeySet],
+                  tlkShares: [CKKSTLKShare],
+                  preapprovedKeys: [Data]? = nil) -> (String?, [CKRecord]?, Error?) {
+        let expectation = XCTestExpectation(description: "join replied")
+        var reta: String?, retkhr: [CKRecord]?, reterr: Error?
+        self.join(voucherData: voucherData,
+                  voucherSig: voucherSig,
+                  ckksKeys: ckksKeys,
+                  tlkShares: tlkShares,
+                  preapprovedKeys: preapprovedKeys) { a, khr, err in
+                    reta = a
+                    retkhr = khr
+                    reterr = err
+                    expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retkhr, reterr)
+    }
+
+    func preapprovedJoinSync(test: XCTestCase,
+                             ckksKeys: [CKKSKeychainBackedKeySet],
+                             tlkShares: [CKKSTLKShare],
+                             preapprovedKeys: [Data]? = nil) -> (String?, [CKRecord]?, Error?) {
+        let expectation = XCTestExpectation(description: "preapprovedjoin replied")
+        var reta: String?
+        var retkhr: [CKRecord]?
+        var reterr: Error?
+        self.preapprovedJoin(ckksKeys: ckksKeys,
+                             tlkShares: tlkShares,
+                             preapprovedKeys: preapprovedKeys) { a, khr, err in
+                                reta = a
+                                retkhr = khr
+                                reterr = err
+                                expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, retkhr, reterr)
+    }
+
+    func updateSync(test: XCTestCase,
+                    deviceName: String? = nil,
+                    serialNumner: String? = nil,
+                    osVersion: String? = nil,
+                    policyVersion: UInt64? = nil,
+                    policySecrets: [String: Data]? = nil) -> (TrustedPeersHelperPeerState?, Error?) {
+        let expectation = XCTestExpectation(description: "update replied")
+        var reterr: Error?
+        var retstate: TrustedPeersHelperPeerState?
+        self.update(deviceName: deviceName,
+                    serialNumber: serialNumner,
+                    osVersion: osVersion,
+                    policyVersion: policyVersion,
+                    policySecrets: policySecrets) { state, err in
+                        retstate = state
+                        reterr = err
+                        expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (retstate, reterr)
+    }
+
+    func setAllowedMachineIDsSync(test: XCTestCase, allowedMachineIDs: Set<String>, listDifference: Bool = true) -> (Error?) {
+        let expectation = XCTestExpectation(description: "setAllowedMachineIDs replied")
+        var reterr: Error?
+        self.setAllowedMachineIDs(allowedMachineIDs) { differences, err in
+            XCTAssertEqual(differences, listDifference, "Reported list difference should match expectation")
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func addAllowedMachineIDsSync(test: XCTestCase, machineIDs: [String]) -> Error? {
+        let expectation = XCTestExpectation(description: "addAllow replied")
+        var reterr: Error?
+        self.addAllow(machineIDs) { err in
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func removeAllowedMachineIDsSync(test: XCTestCase, machineIDs: [String]) -> Error? {
+        let expectation = XCTestExpectation(description: "removeAllow replied")
+        var reterr: Error?
+        self.removeAllow(machineIDs) { err in
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func departByDistrustingSelfSync(test: XCTestCase) -> Error? {
+        let expectation = XCTestExpectation(description: "departByDistrustingSelf replied")
+        var reterr: Error?
+        self.departByDistrustingSelf { error in
+            reterr = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func distrustSync(test: XCTestCase, peerIDs: Set<String>) -> Error? {
+        let expectation = XCTestExpectation(description: "distrustSync replied")
+        var reterr: Error?
+        self.distrust(peerIDs: peerIDs) { error in
+            reterr = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return reterr
+    }
+
+    func getStateSync(test: XCTestCase) -> ContainerState {
+        let expectation = XCTestExpectation(description: "getState replied")
+        var retstate: ContainerState?
+        self.getState { state in
+            retstate = state
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return retstate!
+    }
+
+    func loadSecretSync(test: XCTestCase,
+                        label: String) -> (Data?) {
+        var secret: Data?
+        do {
+            secret = try loadSecret(label: label)
+        } catch {
+
+        }
+        return secret
+    }
+
+    func setRecoveryKeySync(test: XCTestCase, recoveryKey: String, recoverySalt: String, ckksKeys: [CKKSKeychainBackedKeySet]) -> (Error?) {
+        let expectation = XCTestExpectation(description: "setRecoveryKey replied")
+        var reterr: Error?
+
+        self.setRecoveryKey(recoveryKey: recoveryKey, salt: recoverySalt, ckksKeys: ckksKeys) { error in
+            reterr = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reterr)
+    }
+
+    func fetchViableBottlesSync(test: XCTestCase) -> ([String]?, [String]?, Error?) {
+        let expectation = XCTestExpectation(description: "fetchViableBottles replied")
+        var retescrowRecordIDs: [String]?
+        var retpartialEscrowRecordIDs: [String]?
+        var reterror: Error?
+        self.fetchViableBottles { escrowRecordIDs, partialEscrowRecordIDs, error in
+            retescrowRecordIDs = escrowRecordIDs
+            retpartialEscrowRecordIDs = partialEscrowRecordIDs
+            reterror = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (retescrowRecordIDs, retpartialEscrowRecordIDs, reterror)
+    }
+
+    func trustStatusSync(test: XCTestCase) -> (TrustedPeersHelperEgoPeerStatus, Error?) {
+        let expectation = XCTestExpectation(description: "trustStatus replied")
+        var retEgoStatus = TrustedPeersHelperEgoPeerStatus(egoPeerID: nil, status: .unknown, peerCountsByModelID: [:], isExcluded: false, isLocked: false)
+        var reterror: Error?
+        self.trustStatus { egoStatus, error in
+            retEgoStatus = egoStatus
+            reterror = error
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (retEgoStatus, reterror)
+    }
+
+    func fetchPolicyDocumentsSync(test: XCTestCase,
+                                  keys: [NSNumber: String]) -> ([NSNumber: [String]]?, Error?) {
+        let expectation = XCTestExpectation(description: "fetchPolicyDocuments replied")
+        var reta: [NSNumber: [String]]?, reterr: Error?
+        self.fetchPolicyDocuments(keys: keys) { a, err in
+            reta = a
+            reterr = err
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (reta, reterr)
+    }
+
+    func fetchEscrowContentsSync(test: XCTestCase) -> (Data?, String?, Data?, Error?) {
+        let expectation = XCTestExpectation(description: "fetchEscrowContents replied")
+        var retentropy: Data?
+        var retbottleID: String?
+        var retspki: Data?
+        var reterror: Error?
+
+        self.fetchEscrowContents { entropy, bottleID, spki, error in
+            retentropy = entropy
+            retbottleID = bottleID
+            retspki = spki
+            reterror = error
+
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (retentropy, retbottleID, retspki, reterror)
+    }
+
+    func requestHealthCheckSync(requiresEscrowCheck: Bool, test: XCTestCase) -> (Bool, Bool, Bool, Error?) {
+        let expectation = XCTestExpectation(description: "requestHealthCheck replied")
+        var retrepairaccount: Bool = false
+        var retrepairescrow: Bool = false
+        var retresetoctagon: Bool = false
+        var reterror: Error?
+
+        self.requestHealthCheck(requiresEscrowCheck: requiresEscrowCheck) { repairAccount, repairEscrow, resetOctagon, error in
+            retrepairaccount = repairAccount
+            retrepairescrow = repairEscrow
+            retresetoctagon = resetOctagon
+            reterror = error
+
+            expectation.fulfill()
+        }
+        test.wait(for: [expectation], timeout: 10.0)
+        return (retrepairaccount, retrepairescrow, retresetoctagon, reterror)
+    }
+}