// // 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, 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) -> 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) } }