--- /dev/null
+//
+// 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)
+ }
+}