From 476d749cf7c2105b5c901350faca96e376d87b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Mon, 12 Jun 2017 10:00:16 +0200 Subject: [PATCH 1/7] Prepared API client to make use of multiple certificates --- .gitignore | 1 + Figo.xcodeproj/project.pbxproj | 24 +++++---- .../UserInterfaceState.xcuserstate | Bin 18730 -> 0 bytes .../xcshareddata/xcschemes/Figo iOS.xcscheme | 2 +- .../xcschemes/Figo macOS.xcscheme | 2 +- Source/FigoClient.swift | 51 +++++++++++------- Tests/BaseTestCaseWithLogin.swift | 2 +- api.figo.me.cer => figo_2016.cer | Bin 8 files changed, 50 insertions(+), 32 deletions(-) delete mode 100644 Figo.xcodeproj/project.xcworkspace/xcuserdata/chris.xcuserdatad/UserInterfaceState.xcuserstate rename api.figo.me.cer => figo_2016.cer (100%) diff --git a/.gitignore b/.gitignore index 9d1223c..4b1ee19 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ Figo.xcworkspace/xcuserdata Carthage Paw build +Figo.xcodeproj/project.xcworkspace/xcuserdata diff --git a/Figo.xcodeproj/project.pbxproj b/Figo.xcodeproj/project.pbxproj index 7876685..4f8f5a7 100644 --- a/Figo.xcodeproj/project.pbxproj +++ b/Figo.xcodeproj/project.pbxproj @@ -16,10 +16,10 @@ 831183761E3DF13D000DA80C /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8311836F1E3DF136000DA80C /* Logging.swift */; }; 831183771E3DF141000DA80C /* URLRequest+curlCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831183701E3DF136000DA80C /* URLRequest+curlCommand.swift */; }; 831183781E3DF141000DA80C /* URLRequest+curlCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 831183701E3DF136000DA80C /* URLRequest+curlCommand.swift */; }; - 831183B81E3E2F66000DA80C /* api.figo.me.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* api.figo.me.cer */; }; - 831183B91E3E2F66000DA80C /* api.figo.me.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* api.figo.me.cer */; }; - 831183BA1E3E2F66000DA80C /* api.figo.me.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* api.figo.me.cer */; }; - 831183BB1E3E2F66000DA80C /* api.figo.me.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* api.figo.me.cer */; }; + 831183B81E3E2F66000DA80C /* figo_2016.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* figo_2016.cer */; }; + 831183B91E3E2F66000DA80C /* figo_2016.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* figo_2016.cer */; }; + 831183BA1E3E2F66000DA80C /* figo_2016.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* figo_2016.cer */; }; + 831183BB1E3E2F66000DA80C /* figo_2016.cer in Resources */ = {isa = PBXBuildFile; fileRef = 831183B71E3E2F66000DA80C /* figo_2016.cer */; }; 832CABAE1E242F8700D48895 /* Unbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832CABAD1E242F8700D48895 /* Unbox.swift */; }; 833C01001E2AA72A00AA5E7C /* Figo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 833C00EF1E2AA6A100AA5E7C /* Figo.framework */; }; 833C01061E2AA7F400AA5E7C /* FigoClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F0E46B1C08A91400FB3709 /* FigoClient.swift */; }; @@ -188,7 +188,7 @@ 831183651E3DEAE1000DA80C /* ServiceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceTests.swift; sourceTree = ""; }; 8311836F1E3DF136000DA80C /* Logging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = ""; }; 831183701E3DF136000DA80C /* URLRequest+curlCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URLRequest+curlCommand.swift"; sourceTree = ""; }; - 831183B71E3E2F66000DA80C /* api.figo.me.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = api.figo.me.cer; sourceTree = ""; }; + 831183B71E3E2F66000DA80C /* figo_2016.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = figo_2016.cer; sourceTree = ""; }; 832CABAD1E242F8700D48895 /* Unbox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Unbox.swift; sourceTree = ""; }; 833285EE1C04D45900A9FE73 /* Balance.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = Balance.json; path = Resources/Balance.json; sourceTree = ""; }; 833285F01C04D48E00A9FE73 /* Resources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Resources.swift; sourceTree = ""; }; @@ -454,7 +454,7 @@ isa = PBXGroup; children = ( 83D3A7201C03471D003EDE45 /* README.md */, - 831183B71E3E2F66000DA80C /* api.figo.me.cer */, + 831183B71E3E2F66000DA80C /* figo_2016.cer */, 83D3A67F1BFF2953003EDE45 /* Source */, 83D3A7081BFFB6A7003EDE45 /* Tests */, 83F3AF231BFF28D900767D77 /* Products */, @@ -571,7 +571,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = CodeStage; TargetAttributes = { 833C00EE1E2AA6A100AA5E7C = { @@ -618,7 +618,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 831183BA1E3E2F66000DA80C /* api.figo.me.cer in Resources */, + 831183BA1E3E2F66000DA80C /* figo_2016.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -626,7 +626,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 831183BB1E3E2F66000DA80C /* api.figo.me.cer in Resources */, + 831183BB1E3E2F66000DA80C /* figo_2016.cer in Resources */, 833C01991E2AADB400AA5E7C /* Account.json in Resources */, 833C019A1E2AADB400AA5E7C /* User.json in Resources */, 833C019B1E2AADB400AA5E7C /* Balance.json in Resources */, @@ -647,7 +647,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 831183B91E3E2F66000DA80C /* api.figo.me.cer in Resources */, + 831183B91E3E2F66000DA80C /* figo_2016.cer in Resources */, 833C01511E2AAC0600AA5E7C /* Account.json in Resources */, 833C01521E2AAC0600AA5E7C /* User.json in Resources */, 833C01531E2AAC0600AA5E7C /* Balance.json in Resources */, @@ -668,7 +668,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 831183B81E3E2F66000DA80C /* api.figo.me.cer in Resources */, + 831183B81E3E2F66000DA80C /* figo_2016.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -982,6 +982,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1032,6 +1033,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; diff --git a/Figo.xcodeproj/project.xcworkspace/xcuserdata/chris.xcuserdatad/UserInterfaceState.xcuserstate b/Figo.xcodeproj/project.xcworkspace/xcuserdata/chris.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index cc912f52b9a882f3d74bfc152c1c1e353d1e4c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18730 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

>v^2b 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 Y;R}UZ3t#U_yHMgMx2|{ErEvTI0y2D(&j0`b diff --git a/Figo.xcodeproj/xcshareddata/xcschemes/Figo iOS.xcscheme b/Figo.xcodeproj/xcshareddata/xcschemes/Figo iOS.xcscheme index 648cabc..152137a 100644 --- a/Figo.xcodeproj/xcshareddata/xcschemes/Figo iOS.xcscheme +++ b/Figo.xcodeproj/xcshareddata/xcschemes/Figo iOS.xcscheme @@ -1,6 +1,6 @@ URLSession.AuthChallengeDisposition { - var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling - if let serverTrust = challenge.protectionSpace.serverTrust { + if !trustIsValid(serverTrust) { + return .cancelAuthenticationChallenge + } + if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { let serverKeys = publicKeysForServerTrust(serverTrust: serverTrust) as NSArray - if !serverKeys.contains(self.publicKey) { - disposition = .cancelAuthenticationChallenge + for clientKey in self.publicKeys { + if serverKeys.contains(clientKey) { + return .performDefaultHandling + } } + return .cancelAuthenticationChallenge } - if !trustIsValid(serverTrust) { - disposition = .cancelAuthenticationChallenge - } + } else { if challenge.previousFailureCount > 0 { - disposition = .cancelAuthenticationChallenge + return .cancelAuthenticationChallenge } } - return disposition + return .performDefaultHandling } } @@ -229,3 +227,20 @@ private func trustIsValid(_ trust: SecTrust) -> Bool { } return isValid } + +private func publicKeysForResources(resources: [String]) -> [SecKey] { + var publicKeys: [SecKey] = [] + + for resource in resources { + let url = Bundle(for: FigoClient.self).url(forResource: resource, withExtension: "cer")! + let data = try? Data(contentsOf: url) + assert(data != nil, "Failed to load contents of certificate file '\(resource).cer'") + let key = publicKeyForCertificateData(data: data!) + assert(key != nil, "Failed to extract public key from certificate file '\(resource).cer'") + if let key = key { + publicKeys.append(key) + } + } + + return publicKeys +} diff --git a/Tests/BaseTestCaseWithLogin.swift b/Tests/BaseTestCaseWithLogin.swift index be7502c..484fb20 100644 --- a/Tests/BaseTestCaseWithLogin.swift +++ b/Tests/BaseTestCaseWithLogin.swift @@ -77,6 +77,6 @@ class BaseTestCaseWithLogin: XCTestCase { } func testThatCertificateIsPresent() { - XCTAssertNotNil(figo.publicKey) + XCTAssertNotNil(figo.publicKeys) } } diff --git a/api.figo.me.cer b/figo_2016.cer similarity index 100% rename from api.figo.me.cer rename to figo_2016.cer From c25b4b1621d71ea0ba519b16966856ff119bbcc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Mon, 12 Jun 2017 10:06:08 +0200 Subject: [PATCH 2/7] Fixed some compiler warnings --- Source/Logging/URLRequest+curlCommand.swift | 2 +- Tests/AccountTests.swift | 2 +- Tests/TransactionTests.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Logging/URLRequest+curlCommand.swift b/Source/Logging/URLRequest+curlCommand.swift index 37ec5e1..21495b0 100644 --- a/Source/Logging/URLRequest+curlCommand.swift +++ b/Source/Logging/URLRequest+curlCommand.swift @@ -31,7 +31,7 @@ extension URLRequest { command.append(" -H \"\(key): \(value)\"") } command.append(" --compressed") - command.append(" \"\(self.url?.absoluteString)\"") + command.append(" \"\(self.url!.absoluteString)\"") command.append(" | python -mjson.tool") return command } diff --git a/Tests/AccountTests.swift b/Tests/AccountTests.swift index 1df5aef..3078a52 100644 --- a/Tests/AccountTests.swift +++ b/Tests/AccountTests.swift @@ -21,7 +21,7 @@ class AccountTests: BaseTestCaseWithLogin { XCTAssertGreaterThan(accounts.count, 0) print("\(accounts.count) accounts:") for account in accounts { - print("\(account.accountID) \(account.bankID) \(account.bankCode) \(account.name) \(account.balanceFormatted ?? "")") + print("\(account.accountID) \(account.bankID ?? "null") \(account.bankCode) \(account.name) \(account.balanceFormatted ?? "")") } break case .failure(let error): diff --git a/Tests/TransactionTests.swift b/Tests/TransactionTests.swift index 0034075..6c441d7 100644 --- a/Tests/TransactionTests.swift +++ b/Tests/TransactionTests.swift @@ -41,7 +41,7 @@ class TransactionsTests: BaseTestCaseWithLogin { if case .success(let envelope) = result { print("Retrieved \(envelope.transactions.count) transactions") for t in envelope.transactions { - print("\(t.name) \(t.amountFormatted)") + print("\(t.name ?? "null")) \(t.amountFormatted)") } figo.retrieveTransaction(envelope.transactions.last!.transactionID) { result in From 9324874be314544fcb146bc53082406b452b9658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Mon, 12 Jun 2017 10:33:50 +0200 Subject: [PATCH 3/7] Pinned Swift version to 3.0 --- Figo.xcodeproj/project.pbxproj | 5 ++++- Source/Core/Response.swift | 2 +- Source/FigoClient.swift | 16 ++++++++-------- Tests/BaseTestCaseWithLogin.swift | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Figo.xcodeproj/project.pbxproj b/Figo.xcodeproj/project.pbxproj index 4f8f5a7..fab2ebd 100644 --- a/Figo.xcodeproj/project.pbxproj +++ b/Figo.xcodeproj/project.pbxproj @@ -584,11 +584,12 @@ }; 833C01391E2AAB4200AA5E7C = { CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0830; ProvisioningStyle = Manual; }; 83F3AF211BFF28D900767D77 = { CreatedOnToolsVersion = 7.1.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 0830; ProvisioningStyle = Manual; }; }; @@ -1068,6 +1069,7 @@ PRODUCT_BUNDLE_IDENTIFIER = io.figo.iOS; PRODUCT_NAME = Figo; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -1083,6 +1085,7 @@ PRODUCT_BUNDLE_IDENTIFIER = io.figo.iOS; PRODUCT_NAME = Figo; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/Source/Core/Response.swift b/Source/Core/Response.swift index 9d91291..186fd35 100644 --- a/Source/Core/Response.swift +++ b/Source/Core/Response.swift @@ -53,5 +53,5 @@ internal func decodeUnboxableResponse(_ data: FigoResult, co internal func base64EncodeBasicAuthCredentials(_ clientID: String, _ clientSecret: String) -> String { let clientCode: String = clientID + ":" + clientSecret let utf8str: Data = clientCode.data(using: String.Encoding.utf8)! - return utf8str.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithCarriageReturn) + return utf8str.base64EncodedString(options: Data.Base64EncodingOptions.endLineWithCarriageReturn) } diff --git a/Source/FigoClient.swift b/Source/FigoClient.swift index 54d29a5..d613b9a 100644 --- a/Source/FigoClient.swift +++ b/Source/FigoClient.swift @@ -33,12 +33,12 @@ internal let CERTIFICATE_FILES = ["figo_2016"] */ public class FigoClient: NSObject { - private lazy var session: URLSession = { + fileprivate lazy var session: URLSession = { return URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil) }() /// Used for Basic HTTP authentication, derived from CliendID and ClientSecret - private var basicAuthCredentials: String? + fileprivate var basicAuthCredentials: String? /// OAuth2 access token var accessToken: String? @@ -48,7 +48,7 @@ public class FigoClient: NSObject { /// Public keys extracted from certificate files in bundle lazy var publicKeys: [SecKey] = { - return publicKeysForResources(resources: CERTIFICATE_FILES) + return publicKeysForResources(CERTIFICATE_FILES) }() @@ -156,7 +156,7 @@ public class FigoClient: NSObject { } if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { - let serverKeys = publicKeysForServerTrust(serverTrust: serverTrust) as NSArray + let serverKeys = publicKeysForServerTrust(serverTrust) as NSArray for clientKey in self.publicKeys { if serverKeys.contains(clientKey) { return .performDefaultHandling @@ -181,7 +181,7 @@ extension FigoClient: URLSessionDelegate { } } -private func publicKeyForCertificateData(data: Data) -> SecKey? { +private func publicKeyForCertificateData(_ data: Data) -> SecKey? { if let certificate = SecCertificateCreateWithData(nil, data as CFData) { var trust: SecTrust? let status = SecTrustCreateWithCertificates(certificate, SecPolicyCreateBasicX509(), &trust) @@ -195,7 +195,7 @@ private func publicKeyForCertificateData(data: Data) -> SecKey? { return nil } -private func publicKeysForServerTrust(serverTrust: SecTrust) -> [SecKey] { +private func publicKeysForServerTrust(_ serverTrust: SecTrust) -> [SecKey] { var keys: [SecKey] = [] for index in 0 ..< SecTrustGetCertificateCount(serverTrust) { @@ -228,14 +228,14 @@ private func trustIsValid(_ trust: SecTrust) -> Bool { return isValid } -private func publicKeysForResources(resources: [String]) -> [SecKey] { +private func publicKeysForResources(_ resources: [String]) -> [SecKey] { var publicKeys: [SecKey] = [] for resource in resources { let url = Bundle(for: FigoClient.self).url(forResource: resource, withExtension: "cer")! let data = try? Data(contentsOf: url) assert(data != nil, "Failed to load contents of certificate file '\(resource).cer'") - let key = publicKeyForCertificateData(data: data!) + let key = publicKeyForCertificateData(data!) assert(key != nil, "Failed to extract public key from certificate file '\(resource).cer'") if let key = key { publicKeys.append(key) diff --git a/Tests/BaseTestCaseWithLogin.swift b/Tests/BaseTestCaseWithLogin.swift index 484fb20..798b1df 100644 --- a/Tests/BaseTestCaseWithLogin.swift +++ b/Tests/BaseTestCaseWithLogin.swift @@ -68,7 +68,7 @@ class BaseTestCaseWithLogin: XCTestCase { } /// Allows you to get rid of the boilerplate code for async callbacks in test cases - func waitForCompletionOfTests(tests: (_ doneWaiting: @escaping () -> ()) -> ()) { + func waitForCompletionOfTests(_ tests: (_ doneWaiting: @escaping () -> ()) -> ()) { let completionExpectation = self.expectation(description: "Completion should be called") tests { completionExpectation.fulfill() From 9bfa6a126826de9061db3ec2bbbf9eeead1c105d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Mon, 12 Jun 2017 10:37:18 +0200 Subject: [PATCH 4/7] Updated version to 2.0.2 --- Figo.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Figo.podspec b/Figo.podspec index 6eac7b9..b3e2cec 100644 --- a/Figo.podspec +++ b/Figo.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = "Figo" - s.version = "2.0.1" + s.version = "2.0.2" s.summary = "Wraps the figo Connect API endpoints in nicely typed Swift functions and types for your conveniece." s.description = <<-DESC The figo Connect API allows you to easily access your bank account including transaction history and submitting payments. From 42404490f6b3d59f9151a18cedfd77b90015b0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Mon, 12 Jun 2017 10:40:36 +0200 Subject: [PATCH 5/7] Prepared Podspec for multiple certificate files --- Figo.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Figo.podspec b/Figo.podspec index b3e2cec..176eab7 100644 --- a/Figo.podspec +++ b/Figo.podspec @@ -25,6 +25,6 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/figo-connect/ios-sdk.git", :tag => "#{s.version}" } s.source_files = "Source/**/*.swift" - s.resource = "api.figo.me.cer" + s.resources = "*.cer" end From 87f8367854bfcf794a15d47f4ffbdd001f632ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Wed, 14 Jun 2017 15:08:10 +0200 Subject: [PATCH 6/7] Added new certificate --- Figo.xcodeproj/project.pbxproj | 10 ++++++++++ Source/FigoClient.swift | 2 +- figo_2017.cer | Bin 0 -> 1634 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 figo_2017.cer diff --git a/Figo.xcodeproj/project.pbxproj b/Figo.xcodeproj/project.pbxproj index fab2ebd..e7c49ec 100644 --- a/Figo.xcodeproj/project.pbxproj +++ b/Figo.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 7B6025731EF169E2005EF5B0 /* figo_2017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 7B6025721EF169E2005EF5B0 /* figo_2017.cer */; }; + 7B6025741EF169E2005EF5B0 /* figo_2017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 7B6025721EF169E2005EF5B0 /* figo_2017.cer */; }; + 7B6025751EF169E7005EF5B0 /* figo_2017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 7B6025721EF169E2005EF5B0 /* figo_2017.cer */; }; + 7B6025761EF169E8005EF5B0 /* figo_2017.cer in Resources */ = {isa = PBXBuildFile; fileRef = 7B6025721EF169E2005EF5B0 /* figo_2017.cer */; }; 830E63D91C05A4050048F7BF /* TANScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830E63D81C05A4050048F7BF /* TANScheme.swift */; }; 830E63DE1C05A7070048F7BF /* SyncStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830E63DD1C05A7070048F7BF /* SyncStatus.swift */; }; 830E63E31C05AB890048F7BF /* PaymentParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830E63E21C05AB890048F7BF /* PaymentParameters.swift */; }; @@ -179,6 +183,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 7B6025721EF169E2005EF5B0 /* figo_2017.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = figo_2017.cer; sourceTree = ""; }; 83017B771C0A2FE80062FC08 /* TaskState.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = TaskState.json; path = Resources/TaskState.json; sourceTree = ""; }; 830E63D81C05A4050048F7BF /* TANScheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TANScheme.swift; path = Types/TANScheme.swift; sourceTree = ""; }; 830E63DB1C05A4960048F7BF /* TanScheme.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = TanScheme.json; path = Resources/TanScheme.json; sourceTree = ""; }; @@ -455,6 +460,7 @@ children = ( 83D3A7201C03471D003EDE45 /* README.md */, 831183B71E3E2F66000DA80C /* figo_2016.cer */, + 7B6025721EF169E2005EF5B0 /* figo_2017.cer */, 83D3A67F1BFF2953003EDE45 /* Source */, 83D3A7081BFFB6A7003EDE45 /* Tests */, 83F3AF231BFF28D900767D77 /* Products */, @@ -620,6 +626,7 @@ buildActionMask = 2147483647; files = ( 831183BA1E3E2F66000DA80C /* figo_2016.cer in Resources */, + 7B6025741EF169E2005EF5B0 /* figo_2017.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -641,6 +648,7 @@ 833C01A31E2AADB400AA5E7C /* Security.json in Resources */, 833C01A41E2AADB400AA5E7C /* StandingOrder.json in Resources */, 833C01A51E2AADB400AA5E7C /* Payment.json in Resources */, + 7B6025761EF169E8005EF5B0 /* figo_2017.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -662,6 +670,7 @@ 833C015B1E2AAC0600AA5E7C /* Security.json in Resources */, 833C015C1E2AAC0600AA5E7C /* StandingOrder.json in Resources */, 833C015D1E2AAC0600AA5E7C /* Payment.json in Resources */, + 7B6025751EF169E7005EF5B0 /* figo_2017.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -670,6 +679,7 @@ buildActionMask = 2147483647; files = ( 831183B81E3E2F66000DA80C /* figo_2016.cer in Resources */, + 7B6025731EF169E2005EF5B0 /* figo_2017.cer in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/FigoClient.swift b/Source/FigoClient.swift index d613b9a..8e9d4df 100644 --- a/Source/FigoClient.swift +++ b/Source/FigoClient.swift @@ -16,7 +16,7 @@ internal let POLLING_INTERVAL_MSECS: Int64 = Int64(400) * Int64(NSEC_PER_MSEC) internal let POLLING_COUNTDOWN_INITIAL_VALUE = 100 // 100 x 400 ms = 40 s /// Name of certificate file for public key pinning -internal let CERTIFICATE_FILES = ["figo_2016"] +internal let CERTIFICATE_FILES = ["figo_2016, figo_2017"] /** diff --git a/figo_2017.cer b/figo_2017.cer new file mode 100644 index 0000000000000000000000000000000000000000..ff7072d0b01d31c4aa720e5ab44768e9dd2a7a0c GIT binary patch literal 1634 zcmbVMX;c$u6rGt&0t6C*6NnW9Ba20H2w!AT5Jg!GiWC)5S;`SGhM*8k0#WLcNiE`0 zLBS$om9?^{)Dv+*EmlPf3TUB0DyT)pibN4OfF2i`$)TwI(I1^(^X|LfeQ)mf-T*Z% z2B@hEizo<;AS~?Opz!({O|-kjJ~ua~O$`_{6X%Sej8O&*n^GYl6qo`N8YLX1VMutG zzzVR*fQ~VQBIycQs$79DN{;6Xa9~5?6pS;02d>1!!j|Cv3vd@)=niZ+48bhmG1CJW zo=AN-8+guipXuh|<>3_xhzrA3tUo}#%WOq(jpn68>uA|vOXT-E8HS?EhW`s&1h8z*X3s6BJAR7lTm zbr?%~9n~dwdeQqQ=2a(I+wH5kO{vQp4VdDhav2U9*%|X~NM^(Ot3P(?{1u~x6+w;> z-*6jGoo5!zFP(k=n5%9d;ZymhznZ8l-)%bVTY)PWi4kR0+YdQk%e_>7;aW9J;gr%M zdUHRBC=Pa|U)IgzXE=%5aj%FMXIJfRKe+mryTQ_`>cOUW`E4CgJtt#{PsMxN;^xNt zuX~PnvK|szgaSiwsT$D$HBzm=Zb~@U0yPH=^=B@UQ^>_o1VDxh<(k9r7>ZI5Y7yX( zDO=P5*a5uArf6!$lmvw$#oN_YoWz%JPKuA?$4isQAYQfs5S1hwM~PxU90f!U&BQQr zuk2tNAa(#>nz25nQjHMU%8itf>vfb$C0{I(D#(F1Xvsu!X{szy#`Sq}xGK$h%qiiE-i8l|w|(h_GqikPJ!Sv%p5IUB^z3+$ zJ+jE-L1A~t$c-CqiS7G!PaK`!jYTFxX;4|M$-bJ&tJym*VkJ%D6uOT`KKjP`;rYkP zW@ZDUi#1+2#86lW0uda~%gY~LDaq1Z9#CB}?Ri{wa$2=;ucWx;EHi9VRyj>yH}B@A zy`mwkuq$M_iGPbqcc*!ZoifSKUp!|vy|Fg9_0zr9|1R}=4MX*PheG@NFUnXvlT*&w zN4I{Zbun7o?Z;H>)OVFX*gtuN=h!^w83%6-(3N;^-1qdnrk_1@z3l0utUWn`!@PjF zM~U#JCZ`_vbf&uI)|PT;M7S85eo7i6Fy210&0GHLj~S1E<@4b|+J`oQgI&p3KX2U( zrzWqaHQ#nTf literal 0 HcmV?d00001 From 99488566839a13c4bbec711c45c2f3d618abb94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ko=CC=88nig?= Date: Wed, 14 Jun 2017 15:19:19 +0200 Subject: [PATCH 7/7] Added new certificate --- Source/FigoClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/FigoClient.swift b/Source/FigoClient.swift index 8e9d4df..04911b9 100644 --- a/Source/FigoClient.swift +++ b/Source/FigoClient.swift @@ -16,7 +16,7 @@ internal let POLLING_INTERVAL_MSECS: Int64 = Int64(400) * Int64(NSEC_PER_MSEC) internal let POLLING_COUNTDOWN_INITIAL_VALUE = 100 // 100 x 400 ms = 40 s /// Name of certificate file for public key pinning -internal let CERTIFICATE_FILES = ["figo_2016, figo_2017"] +internal let CERTIFICATE_FILES = ["figo_2016", "figo_2017"] /**