ServerTrustPolicyTests.swift 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485
  1. //
  2. // MultipartFormDataTests.swift
  3. //
  4. // Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. import Alamofire
  25. import Foundation
  26. import XCTest
  27. private struct TestCertificates {
  28. // Root Certificates
  29. static let RootCA = TestCertificates.certificateWithFileName("alamofire-root-ca")
  30. // Intermediate Certificates
  31. static let IntermediateCA1 = TestCertificates.certificateWithFileName("alamofire-signing-ca1")
  32. static let IntermediateCA2 = TestCertificates.certificateWithFileName("alamofire-signing-ca2")
  33. // Leaf Certificates - Signed by CA1
  34. static let LeafWildcard = TestCertificates.certificateWithFileName("wildcard.alamofire.org")
  35. static let LeafMultipleDNSNames = TestCertificates.certificateWithFileName("multiple-dns-names")
  36. static let LeafSignedByCA1 = TestCertificates.certificateWithFileName("signed-by-ca1")
  37. static let LeafDNSNameAndURI = TestCertificates.certificateWithFileName("test.alamofire.org")
  38. // Leaf Certificates - Signed by CA2
  39. static let LeafExpired = TestCertificates.certificateWithFileName("expired")
  40. static let LeafMissingDNSNameAndURI = TestCertificates.certificateWithFileName("missing-dns-name-and-uri")
  41. static let LeafSignedByCA2 = TestCertificates.certificateWithFileName("signed-by-ca2")
  42. static let LeafValidDNSName = TestCertificates.certificateWithFileName("valid-dns-name")
  43. static let LeafValidURI = TestCertificates.certificateWithFileName("valid-uri")
  44. static func certificateWithFileName(fileName: String) -> SecCertificate {
  45. class Bundle {}
  46. let filePath = NSBundle(forClass: Bundle.self).pathForResource(fileName, ofType: "cer")!
  47. let data = NSData(contentsOfFile: filePath)!
  48. let certificate = SecCertificateCreateWithData(nil, data)!
  49. return certificate
  50. }
  51. }
  52. // MARK: -
  53. private struct TestPublicKeys {
  54. // Root Public Keys
  55. static let RootCA = TestPublicKeys.publicKeyForCertificate(TestCertificates.RootCA)
  56. // Intermediate Public Keys
  57. static let IntermediateCA1 = TestPublicKeys.publicKeyForCertificate(TestCertificates.IntermediateCA1)
  58. static let IntermediateCA2 = TestPublicKeys.publicKeyForCertificate(TestCertificates.IntermediateCA2)
  59. // Leaf Public Keys - Signed by CA1
  60. static let LeafWildcard = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafWildcard)
  61. static let LeafMultipleDNSNames = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafMultipleDNSNames)
  62. static let LeafSignedByCA1 = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafSignedByCA1)
  63. static let LeafDNSNameAndURI = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafDNSNameAndURI)
  64. // Leaf Public Keys - Signed by CA2
  65. static let LeafExpired = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafExpired)
  66. static let LeafMissingDNSNameAndURI = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafMissingDNSNameAndURI)
  67. static let LeafSignedByCA2 = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafSignedByCA2)
  68. static let LeafValidDNSName = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafValidDNSName)
  69. static let LeafValidURI = TestPublicKeys.publicKeyForCertificate(TestCertificates.LeafValidURI)
  70. static func publicKeyForCertificate(certificate: SecCertificate) -> SecKey {
  71. let policy = SecPolicyCreateBasicX509()
  72. var trust: SecTrust?
  73. SecTrustCreateWithCertificates(certificate, policy, &trust)
  74. let publicKey = SecTrustCopyPublicKey(trust!)!
  75. return publicKey
  76. }
  77. }
  78. // MARK: -
  79. private enum TestTrusts {
  80. // Leaf Trusts - Signed by CA1
  81. case LeafWildcard
  82. case LeafMultipleDNSNames
  83. case LeafSignedByCA1
  84. case LeafDNSNameAndURI
  85. // Leaf Trusts - Signed by CA2
  86. case LeafExpired
  87. case LeafMissingDNSNameAndURI
  88. case LeafSignedByCA2
  89. case LeafValidDNSName
  90. case LeafValidURI
  91. // Invalid Trusts
  92. case LeafValidDNSNameMissingIntermediate
  93. case LeafValidDNSNameWithIncorrectIntermediate
  94. var trust: SecTrust {
  95. let trust: SecTrust
  96. switch self {
  97. case .LeafWildcard:
  98. trust = TestTrusts.trustWithCertificates([
  99. TestCertificates.LeafWildcard,
  100. TestCertificates.IntermediateCA1,
  101. TestCertificates.RootCA
  102. ])
  103. case .LeafMultipleDNSNames:
  104. trust = TestTrusts.trustWithCertificates([
  105. TestCertificates.LeafMultipleDNSNames,
  106. TestCertificates.IntermediateCA1,
  107. TestCertificates.RootCA
  108. ])
  109. case .LeafSignedByCA1:
  110. trust = TestTrusts.trustWithCertificates([
  111. TestCertificates.LeafSignedByCA1,
  112. TestCertificates.IntermediateCA1,
  113. TestCertificates.RootCA
  114. ])
  115. case .LeafDNSNameAndURI:
  116. trust = TestTrusts.trustWithCertificates([
  117. TestCertificates.LeafDNSNameAndURI,
  118. TestCertificates.IntermediateCA1,
  119. TestCertificates.RootCA
  120. ])
  121. case .LeafExpired:
  122. trust = TestTrusts.trustWithCertificates([
  123. TestCertificates.LeafExpired,
  124. TestCertificates.IntermediateCA2,
  125. TestCertificates.RootCA
  126. ])
  127. case .LeafMissingDNSNameAndURI:
  128. trust = TestTrusts.trustWithCertificates([
  129. TestCertificates.LeafMissingDNSNameAndURI,
  130. TestCertificates.IntermediateCA2,
  131. TestCertificates.RootCA
  132. ])
  133. case .LeafSignedByCA2:
  134. trust = TestTrusts.trustWithCertificates([
  135. TestCertificates.LeafSignedByCA2,
  136. TestCertificates.IntermediateCA2,
  137. TestCertificates.RootCA
  138. ])
  139. case .LeafValidDNSName:
  140. trust = TestTrusts.trustWithCertificates([
  141. TestCertificates.LeafValidDNSName,
  142. TestCertificates.IntermediateCA2,
  143. TestCertificates.RootCA
  144. ])
  145. case .LeafValidURI:
  146. trust = TestTrusts.trustWithCertificates([
  147. TestCertificates.LeafValidURI,
  148. TestCertificates.IntermediateCA2,
  149. TestCertificates.RootCA
  150. ])
  151. case LeafValidDNSNameMissingIntermediate:
  152. trust = TestTrusts.trustWithCertificates([
  153. TestCertificates.LeafValidDNSName,
  154. TestCertificates.RootCA
  155. ])
  156. case LeafValidDNSNameWithIncorrectIntermediate:
  157. trust = TestTrusts.trustWithCertificates([
  158. TestCertificates.LeafValidDNSName,
  159. TestCertificates.IntermediateCA1,
  160. TestCertificates.RootCA
  161. ])
  162. }
  163. return trust
  164. }
  165. static func trustWithCertificates(certificates: [SecCertificate]) -> SecTrust {
  166. let policy = SecPolicyCreateBasicX509()
  167. var trust: SecTrust?
  168. SecTrustCreateWithCertificates(certificates, policy, &trust)
  169. return trust!
  170. }
  171. }
  172. // MARK: - Basic X509 and SSL Exploration Tests -
  173. class ServerTrustPolicyTestCase: BaseTestCase {
  174. func setRootCertificateAsLoneAnchorCertificateForTrust(trust: SecTrust) {
  175. SecTrustSetAnchorCertificates(trust, [TestCertificates.RootCA])
  176. SecTrustSetAnchorCertificatesOnly(trust, true)
  177. }
  178. func trustIsValid(trust: SecTrust) -> Bool {
  179. var isValid = false
  180. #if swift (>=2.3)
  181. var result = SecTrustResultType(rawValue: SecTrustResultType.Invalid.rawValue)
  182. let status = SecTrustEvaluate(trust, &result!)
  183. #else
  184. var result = SecTrustResultType(kSecTrustResultInvalid)
  185. let status = SecTrustEvaluate(trust, &result)
  186. #endif
  187. if status == errSecSuccess {
  188. #if swift (>=2.3)
  189. let unspecified = SecTrustResultType(rawValue: SecTrustResultType.Unspecified.rawValue)
  190. let proceed = SecTrustResultType(rawValue: SecTrustResultType.Proceed.rawValue)
  191. #else
  192. let unspecified = SecTrustResultType(kSecTrustResultUnspecified)
  193. let proceed = SecTrustResultType(kSecTrustResultProceed)
  194. #endif
  195. isValid = result == unspecified || result == proceed
  196. }
  197. return isValid
  198. }
  199. }
  200. // MARK: -
  201. class ServerTrustPolicyExplorationBasicX509PolicyValidationTestCase: ServerTrustPolicyTestCase {
  202. func testThatAnchoredRootCertificatePassesBasicX509ValidationWithRootInTrust() {
  203. // Given
  204. let trust = TestTrusts.trustWithCertificates([
  205. TestCertificates.LeafDNSNameAndURI,
  206. TestCertificates.IntermediateCA1,
  207. TestCertificates.RootCA
  208. ])
  209. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  210. // When
  211. #if swift (>=2.3)
  212. let policies = [SecPolicyCreateBasicX509()!]
  213. #else
  214. let policies = [SecPolicyCreateBasicX509()]
  215. #endif
  216. SecTrustSetPolicies(trust, policies)
  217. // Then
  218. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  219. }
  220. func testThatAnchoredRootCertificatePassesBasicX509ValidationWithoutRootInTrust() {
  221. // Given
  222. let trust = TestTrusts.LeafDNSNameAndURI.trust
  223. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  224. // When
  225. #if swift (>=2.3)
  226. let policies = [SecPolicyCreateBasicX509()!]
  227. #else
  228. let policies = [SecPolicyCreateBasicX509()]
  229. #endif
  230. SecTrustSetPolicies(trust, policies)
  231. // Then
  232. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  233. }
  234. func testThatCertificateMissingDNSNamePassesBasicX509Validation() {
  235. // Given
  236. let trust = TestTrusts.LeafMissingDNSNameAndURI.trust
  237. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  238. // When
  239. #if swift (>=2.3)
  240. let policies = [SecPolicyCreateBasicX509()!]
  241. #else
  242. let policies = [SecPolicyCreateBasicX509()]
  243. #endif
  244. SecTrustSetPolicies(trust, policies)
  245. // Then
  246. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  247. }
  248. func testThatExpiredCertificateFailsBasicX509Validation() {
  249. // Given
  250. let trust = TestTrusts.LeafExpired.trust
  251. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  252. // When
  253. #if swift (>=2.3)
  254. let policies = [SecPolicyCreateBasicX509()!]
  255. #else
  256. let policies = [SecPolicyCreateBasicX509()]
  257. #endif
  258. SecTrustSetPolicies(trust, policies)
  259. // Then
  260. XCTAssertFalse(trustIsValid(trust), "trust should not be valid")
  261. }
  262. }
  263. // MARK: -
  264. class ServerTrustPolicyExplorationSSLPolicyValidationTestCase: ServerTrustPolicyTestCase {
  265. func testThatAnchoredRootCertificatePassesSSLValidationWithRootInTrust() {
  266. // Given
  267. let trust = TestTrusts.trustWithCertificates([
  268. TestCertificates.LeafDNSNameAndURI,
  269. TestCertificates.IntermediateCA1,
  270. TestCertificates.RootCA
  271. ])
  272. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  273. // When
  274. #if swift(>=2.3)
  275. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  276. #else
  277. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  278. #endif
  279. SecTrustSetPolicies(trust, policies)
  280. // Then
  281. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  282. }
  283. func testThatAnchoredRootCertificatePassesSSLValidationWithoutRootInTrust() {
  284. // Given
  285. let trust = TestTrusts.LeafDNSNameAndURI.trust
  286. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  287. // When
  288. #if swift(>=2.3)
  289. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  290. #else
  291. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  292. #endif
  293. SecTrustSetPolicies(trust, policies)
  294. // Then
  295. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  296. }
  297. func testThatCertificateMissingDNSNameFailsSSLValidation() {
  298. // Given
  299. let trust = TestTrusts.LeafMissingDNSNameAndURI.trust
  300. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  301. // When
  302. #if swift(>=2.3)
  303. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  304. #else
  305. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  306. #endif
  307. SecTrustSetPolicies(trust, policies)
  308. // Then
  309. XCTAssertFalse(trustIsValid(trust), "trust should not be valid")
  310. }
  311. func testThatWildcardCertificatePassesSSLValidation() {
  312. // Given
  313. let trust = TestTrusts.LeafWildcard.trust // *.alamofire.org
  314. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  315. // When
  316. #if swift(>=2.3)
  317. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  318. #else
  319. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  320. #endif
  321. SecTrustSetPolicies(trust, policies)
  322. // Then
  323. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  324. }
  325. func testThatDNSNameCertificatePassesSSLValidation() {
  326. // Given
  327. let trust = TestTrusts.LeafValidDNSName.trust
  328. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  329. // When
  330. #if swift(>=2.3)
  331. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  332. #else
  333. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  334. #endif
  335. SecTrustSetPolicies(trust, policies)
  336. // Then
  337. XCTAssertTrue(trustIsValid(trust), "trust should be valid")
  338. }
  339. func testThatURICertificateFailsSSLValidation() {
  340. // Given
  341. let trust = TestTrusts.LeafValidURI.trust
  342. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  343. // When
  344. #if swift(>=2.3)
  345. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  346. #else
  347. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  348. #endif
  349. SecTrustSetPolicies(trust, policies)
  350. // Then
  351. XCTAssertFalse(trustIsValid(trust), "trust should not be valid")
  352. }
  353. func testThatMultipleDNSNamesCertificatePassesSSLValidationForAllEntries() {
  354. // Given
  355. let trust = TestTrusts.LeafMultipleDNSNames.trust
  356. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  357. // When
  358. #if swift(>=2.3)
  359. let policies = [
  360. SecPolicyCreateSSL(true, "test.alamofire.org")!,
  361. SecPolicyCreateSSL(true, "blog.alamofire.org")!,
  362. SecPolicyCreateSSL(true, "www.alamofire.org")!
  363. ]
  364. #else
  365. let policies = [
  366. SecPolicyCreateSSL(true, "test.alamofire.org"),
  367. SecPolicyCreateSSL(true, "blog.alamofire.org"),
  368. SecPolicyCreateSSL(true, "www.alamofire.org")
  369. ]
  370. #endif
  371. SecTrustSetPolicies(trust, policies)
  372. // Then
  373. XCTAssertTrue(trustIsValid(trust), "trust should not be valid")
  374. }
  375. func testThatPassingNilForHostParameterAllowsCertificateMissingDNSNameToPassSSLValidation() {
  376. // Given
  377. let trust = TestTrusts.LeafMissingDNSNameAndURI.trust
  378. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  379. // When
  380. #if swift(>=2.3)
  381. let policies = [SecPolicyCreateSSL(true, nil)!]
  382. #else
  383. let policies = [SecPolicyCreateSSL(true, nil)]
  384. #endif
  385. SecTrustSetPolicies(trust, policies)
  386. // Then
  387. XCTAssertTrue(trustIsValid(trust), "trust should not be valid")
  388. }
  389. func testThatExpiredCertificateFailsSSLValidation() {
  390. // Given
  391. let trust = TestTrusts.LeafExpired.trust
  392. setRootCertificateAsLoneAnchorCertificateForTrust(trust)
  393. // When
  394. #if swift(>=2.3)
  395. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")!]
  396. #else
  397. let policies = [SecPolicyCreateSSL(true, "test.alamofire.org")]
  398. #endif
  399. SecTrustSetPolicies(trust, policies)
  400. // Then
  401. XCTAssertFalse(trustIsValid(trust), "trust should not be valid")
  402. }
  403. }
  404. // MARK: - Server Trust Policy Tests -
  405. class ServerTrustPolicyPerformDefaultEvaluationTestCase: ServerTrustPolicyTestCase {
  406. // MARK: Do NOT Validate Host
  407. func testThatValidCertificateChainPassesEvaluationWithoutHostValidation() {
  408. // Given
  409. let host = "test.alamofire.org"
  410. let serverTrust = TestTrusts.LeafValidDNSName.trust
  411. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: false)
  412. // When
  413. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  414. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  415. // Then
  416. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  417. }
  418. func testThatNonAnchoredRootCertificateChainFailsEvaluationWithoutHostValidation() {
  419. // Given
  420. let host = "test.alamofire.org"
  421. let serverTrust = TestTrusts.trustWithCertificates([
  422. TestCertificates.LeafValidDNSName,
  423. TestCertificates.IntermediateCA2
  424. ])
  425. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: false)
  426. // When
  427. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  428. // Then
  429. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  430. }
  431. func testThatMissingDNSNameLeafCertificatePassesEvaluationWithoutHostValidation() {
  432. // Given
  433. let host = "test.alamofire.org"
  434. let serverTrust = TestTrusts.LeafMissingDNSNameAndURI.trust
  435. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: false)
  436. // When
  437. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  438. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  439. // Then
  440. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  441. }
  442. func testThatExpiredCertificateChainFailsEvaluationWithoutHostValidation() {
  443. // Given
  444. let host = "test.alamofire.org"
  445. let serverTrust = TestTrusts.LeafExpired.trust
  446. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: false)
  447. // When
  448. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  449. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  450. // Then
  451. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  452. }
  453. func testThatMissingIntermediateCertificateInChainFailsEvaluationWithoutHostValidation() {
  454. // Given
  455. let host = "test.alamofire.org"
  456. let serverTrust = TestTrusts.LeafValidDNSNameMissingIntermediate.trust
  457. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: false)
  458. // When
  459. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  460. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  461. // Then
  462. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  463. }
  464. // MARK: Validate Host
  465. func testThatValidCertificateChainPassesEvaluationWithHostValidation() {
  466. // Given
  467. let host = "test.alamofire.org"
  468. let serverTrust = TestTrusts.LeafValidDNSName.trust
  469. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  470. // When
  471. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  472. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  473. // Then
  474. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  475. }
  476. func testThatNonAnchoredRootCertificateChainFailsEvaluationWithHostValidation() {
  477. // Given
  478. let host = "test.alamofire.org"
  479. let serverTrust = TestTrusts.trustWithCertificates([
  480. TestCertificates.LeafValidDNSName,
  481. TestCertificates.IntermediateCA2
  482. ])
  483. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  484. // When
  485. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  486. // Then
  487. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  488. }
  489. func testThatMissingDNSNameLeafCertificateFailsEvaluationWithHostValidation() {
  490. // Given
  491. let host = "test.alamofire.org"
  492. let serverTrust = TestTrusts.LeafMissingDNSNameAndURI.trust
  493. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  494. // When
  495. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  496. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  497. // Then
  498. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  499. }
  500. func testThatWildcardedLeafCertificateChainPassesEvaluationWithHostValidation() {
  501. // Given
  502. let host = "test.alamofire.org"
  503. let serverTrust = TestTrusts.LeafWildcard.trust
  504. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  505. // When
  506. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  507. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  508. // Then
  509. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  510. }
  511. func testThatExpiredCertificateChainFailsEvaluationWithHostValidation() {
  512. // Given
  513. let host = "test.alamofire.org"
  514. let serverTrust = TestTrusts.LeafExpired.trust
  515. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  516. // When
  517. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  518. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  519. // Then
  520. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  521. }
  522. func testThatMissingIntermediateCertificateInChainFailsEvaluationWithHostValidation() {
  523. // Given
  524. let host = "test.alamofire.org"
  525. let serverTrust = TestTrusts.LeafValidDNSNameMissingIntermediate.trust
  526. let serverTrustPolicy = ServerTrustPolicy.PerformDefaultEvaluation(validateHost: true)
  527. // When
  528. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  529. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  530. // Then
  531. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  532. }
  533. }
  534. // MARK: -
  535. class ServerTrustPolicyPinCertificatesTestCase: ServerTrustPolicyTestCase {
  536. // MARK: Validate Certificate Chain Without Validating Host
  537. func testThatPinnedLeafCertificatePassesEvaluationWithoutHostValidation() {
  538. // Given
  539. let host = "test.alamofire.org"
  540. let serverTrust = TestTrusts.LeafValidDNSName.trust
  541. let certificates = [TestCertificates.LeafValidDNSName]
  542. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  543. certificates: certificates,
  544. validateCertificateChain: true,
  545. validateHost: false
  546. )
  547. // When
  548. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  549. // Then
  550. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  551. }
  552. func testThatPinnedIntermediateCertificatePassesEvaluationWithoutHostValidation() {
  553. // Given
  554. let host = "test.alamofire.org"
  555. let serverTrust = TestTrusts.LeafValidDNSName.trust
  556. let certificates = [TestCertificates.IntermediateCA2]
  557. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  558. certificates: certificates,
  559. validateCertificateChain: true,
  560. validateHost: false
  561. )
  562. // When
  563. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  564. // Then
  565. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  566. }
  567. func testThatPinnedRootCertificatePassesEvaluationWithoutHostValidation() {
  568. // Given
  569. let host = "test.alamofire.org"
  570. let serverTrust = TestTrusts.LeafValidDNSName.trust
  571. let certificates = [TestCertificates.RootCA]
  572. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  573. certificates: certificates,
  574. validateCertificateChain: true,
  575. validateHost: false
  576. )
  577. // When
  578. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  579. // Then
  580. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  581. }
  582. func testThatPinningLeafCertificateNotInCertificateChainFailsEvaluationWithoutHostValidation() {
  583. // Given
  584. let host = "test.alamofire.org"
  585. let serverTrust = TestTrusts.LeafValidDNSName.trust
  586. let certificates = [TestCertificates.LeafSignedByCA2]
  587. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  588. certificates: certificates,
  589. validateCertificateChain: true,
  590. validateHost: false
  591. )
  592. // When
  593. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  594. // Then
  595. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  596. }
  597. func testThatPinningIntermediateCertificateNotInCertificateChainFailsEvaluationWithoutHostValidation() {
  598. // Given
  599. let host = "test.alamofire.org"
  600. let serverTrust = TestTrusts.LeafValidDNSName.trust
  601. let certificates = [TestCertificates.IntermediateCA1]
  602. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  603. certificates: certificates,
  604. validateCertificateChain: true,
  605. validateHost: false
  606. )
  607. // When
  608. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  609. // Then
  610. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  611. }
  612. func testThatPinningExpiredLeafCertificateFailsEvaluationWithoutHostValidation() {
  613. // Given
  614. let host = "test.alamofire.org"
  615. let serverTrust = TestTrusts.LeafExpired.trust
  616. let certificates = [TestCertificates.LeafExpired]
  617. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  618. certificates: certificates,
  619. validateCertificateChain: true,
  620. validateHost: false
  621. )
  622. // When
  623. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  624. // Then
  625. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  626. }
  627. func testThatPinningIntermediateCertificateWithExpiredLeafCertificateFailsEvaluationWithoutHostValidation() {
  628. // Given
  629. let host = "test.alamofire.org"
  630. let serverTrust = TestTrusts.LeafExpired.trust
  631. let certificates = [TestCertificates.IntermediateCA2]
  632. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  633. certificates: certificates,
  634. validateCertificateChain: true,
  635. validateHost: false
  636. )
  637. // When
  638. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  639. // Then
  640. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  641. }
  642. // MARK: Validate Certificate Chain and Host
  643. func testThatPinnedLeafCertificatePassesEvaluationWithHostValidation() {
  644. // Given
  645. let host = "test.alamofire.org"
  646. let serverTrust = TestTrusts.LeafValidDNSName.trust
  647. let certificates = [TestCertificates.LeafValidDNSName]
  648. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  649. certificates: certificates,
  650. validateCertificateChain: true,
  651. validateHost: true
  652. )
  653. // When
  654. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  655. // Then
  656. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  657. }
  658. func testThatPinnedIntermediateCertificatePassesEvaluationWithHostValidation() {
  659. // Given
  660. let host = "test.alamofire.org"
  661. let serverTrust = TestTrusts.LeafValidDNSName.trust
  662. let certificates = [TestCertificates.IntermediateCA2]
  663. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  664. certificates: certificates,
  665. validateCertificateChain: true,
  666. validateHost: true
  667. )
  668. // When
  669. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  670. // Then
  671. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  672. }
  673. func testThatPinnedRootCertificatePassesEvaluationWithHostValidation() {
  674. // Given
  675. let host = "test.alamofire.org"
  676. let serverTrust = TestTrusts.LeafValidDNSName.trust
  677. let certificates = [TestCertificates.RootCA]
  678. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  679. certificates: certificates,
  680. validateCertificateChain: true,
  681. validateHost: true
  682. )
  683. // When
  684. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  685. // Then
  686. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  687. }
  688. func testThatPinningLeafCertificateNotInCertificateChainFailsEvaluationWithHostValidation() {
  689. // Given
  690. let host = "test.alamofire.org"
  691. let serverTrust = TestTrusts.LeafValidDNSName.trust
  692. let certificates = [TestCertificates.LeafSignedByCA2]
  693. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  694. certificates: certificates,
  695. validateCertificateChain: true,
  696. validateHost: true
  697. )
  698. // When
  699. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  700. // Then
  701. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  702. }
  703. func testThatPinningIntermediateCertificateNotInCertificateChainFailsEvaluationWithHostValidation() {
  704. // Given
  705. let host = "test.alamofire.org"
  706. let serverTrust = TestTrusts.LeafValidDNSName.trust
  707. let certificates = [TestCertificates.IntermediateCA1]
  708. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  709. certificates: certificates,
  710. validateCertificateChain: true,
  711. validateHost: true
  712. )
  713. // When
  714. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  715. // Then
  716. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  717. }
  718. func testThatPinningExpiredLeafCertificateFailsEvaluationWithHostValidation() {
  719. // Given
  720. let host = "test.alamofire.org"
  721. let serverTrust = TestTrusts.LeafExpired.trust
  722. let certificates = [TestCertificates.LeafExpired]
  723. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  724. certificates: certificates,
  725. validateCertificateChain: true,
  726. validateHost: true
  727. )
  728. // When
  729. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  730. // Then
  731. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  732. }
  733. func testThatPinningIntermediateCertificateWithExpiredLeafCertificateFailsEvaluationWithHostValidation() {
  734. // Given
  735. let host = "test.alamofire.org"
  736. let serverTrust = TestTrusts.LeafExpired.trust
  737. let certificates = [TestCertificates.IntermediateCA2]
  738. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  739. certificates: certificates,
  740. validateCertificateChain: true,
  741. validateHost: true
  742. )
  743. // When
  744. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  745. // Then
  746. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  747. }
  748. // MARK: Do NOT Validate Certificate Chain or Host
  749. func testThatPinnedLeafCertificateWithoutCertificateChainValidationPassesEvaluation() {
  750. // Given
  751. let host = "test.alamofire.org"
  752. let serverTrust = TestTrusts.LeafValidDNSName.trust
  753. let certificates = [TestCertificates.LeafValidDNSName]
  754. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  755. certificates: certificates,
  756. validateCertificateChain: false,
  757. validateHost: false
  758. )
  759. // When
  760. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  761. // Then
  762. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  763. }
  764. func testThatPinnedIntermediateCertificateWithoutCertificateChainValidationPassesEvaluation() {
  765. // Given
  766. let host = "test.alamofire.org"
  767. let serverTrust = TestTrusts.LeafValidDNSName.trust
  768. let certificates = [TestCertificates.IntermediateCA2]
  769. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  770. certificates: certificates,
  771. validateCertificateChain: false,
  772. validateHost: false
  773. )
  774. // When
  775. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  776. // Then
  777. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  778. }
  779. func testThatPinnedRootCertificateWithoutCertificateChainValidationPassesEvaluation() {
  780. // Given
  781. let host = "test.alamofire.org"
  782. let serverTrust = TestTrusts.LeafValidDNSName.trust
  783. let certificates = [TestCertificates.RootCA]
  784. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  785. certificates: certificates,
  786. validateCertificateChain: false,
  787. validateHost: false
  788. )
  789. // When
  790. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  791. // Then
  792. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  793. }
  794. func testThatPinningLeafCertificateNotInCertificateChainWithoutCertificateChainValidationFailsEvaluation() {
  795. // Given
  796. let host = "test.alamofire.org"
  797. let serverTrust = TestTrusts.LeafValidDNSName.trust
  798. let certificates = [TestCertificates.LeafSignedByCA2]
  799. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  800. certificates: certificates,
  801. validateCertificateChain: false,
  802. validateHost: false
  803. )
  804. // When
  805. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  806. // Then
  807. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  808. }
  809. func testThatPinningIntermediateCertificateNotInCertificateChainWithoutCertificateChainValidationFailsEvaluation() {
  810. // Given
  811. let host = "test.alamofire.org"
  812. let serverTrust = TestTrusts.LeafValidDNSName.trust
  813. let certificates = [TestCertificates.IntermediateCA1]
  814. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  815. certificates: certificates,
  816. validateCertificateChain: false,
  817. validateHost: false
  818. )
  819. // When
  820. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  821. // Then
  822. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  823. }
  824. func testThatPinningExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() {
  825. // Given
  826. let host = "test.alamofire.org"
  827. let serverTrust = TestTrusts.LeafExpired.trust
  828. let certificates = [TestCertificates.LeafExpired]
  829. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  830. certificates: certificates,
  831. validateCertificateChain: false,
  832. validateHost: false
  833. )
  834. // When
  835. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  836. // Then
  837. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  838. }
  839. func testThatPinningIntermediateCertificateWithExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() {
  840. // Given
  841. let host = "test.alamofire.org"
  842. let serverTrust = TestTrusts.LeafExpired.trust
  843. let certificates = [TestCertificates.IntermediateCA2]
  844. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  845. certificates: certificates,
  846. validateCertificateChain: false,
  847. validateHost: false
  848. )
  849. // When
  850. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  851. // Then
  852. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  853. }
  854. func testThatPinningRootCertificateWithExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() {
  855. // Given
  856. let host = "test.alamofire.org"
  857. let serverTrust = TestTrusts.LeafExpired.trust
  858. let certificates = [TestCertificates.RootCA]
  859. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  860. certificates: certificates,
  861. validateCertificateChain: false,
  862. validateHost: false
  863. )
  864. // When
  865. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  866. // Then
  867. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  868. }
  869. func testThatPinningMultipleCertificatesWithoutCertificateChainValidationPassesEvaluation() {
  870. // Given
  871. let host = "test.alamofire.org"
  872. let serverTrust = TestTrusts.LeafExpired.trust
  873. let certificates = [
  874. TestCertificates.LeafMultipleDNSNames, // not in certificate chain
  875. TestCertificates.LeafSignedByCA1, // not in certificate chain
  876. TestCertificates.LeafExpired, // in certificate chain 👍🏼👍🏼
  877. TestCertificates.LeafWildcard, // not in certificate chain
  878. TestCertificates.LeafDNSNameAndURI, // not in certificate chain
  879. ]
  880. let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
  881. certificates: certificates,
  882. validateCertificateChain: false,
  883. validateHost: false
  884. )
  885. // When
  886. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  887. // Then
  888. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  889. }
  890. }
  891. // MARK: -
  892. class ServerTrustPolicyPinPublicKeysTestCase: ServerTrustPolicyTestCase {
  893. // MARK: Validate Certificate Chain Without Validating Host
  894. func testThatPinningLeafKeyPassesEvaluationWithoutHostValidation() {
  895. // Given
  896. let host = "test.alamofire.org"
  897. let serverTrust = TestTrusts.LeafValidDNSName.trust
  898. let publicKeys = [TestPublicKeys.LeafValidDNSName]
  899. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  900. publicKeys: publicKeys,
  901. validateCertificateChain: true,
  902. validateHost: false
  903. )
  904. // When
  905. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  906. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  907. // Then
  908. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  909. }
  910. func testThatPinningIntermediateKeyPassesEvaluationWithoutHostValidation() {
  911. // Given
  912. let host = "test.alamofire.org"
  913. let serverTrust = TestTrusts.LeafValidDNSName.trust
  914. let publicKeys = [TestPublicKeys.IntermediateCA2]
  915. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  916. publicKeys: publicKeys,
  917. validateCertificateChain: true,
  918. validateHost: false
  919. )
  920. // When
  921. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  922. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  923. // Then
  924. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  925. }
  926. func testThatPinningRootKeyPassesEvaluationWithoutHostValidation() {
  927. // Given
  928. let host = "test.alamofire.org"
  929. let serverTrust = TestTrusts.LeafValidDNSName.trust
  930. let publicKeys = [TestPublicKeys.RootCA]
  931. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  932. publicKeys: publicKeys,
  933. validateCertificateChain: true,
  934. validateHost: false
  935. )
  936. // When
  937. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  938. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  939. // Then
  940. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  941. }
  942. func testThatPinningKeyNotInCertificateChainFailsEvaluationWithoutHostValidation() {
  943. // Given
  944. let host = "test.alamofire.org"
  945. let serverTrust = TestTrusts.LeafValidDNSName.trust
  946. let publicKeys = [TestPublicKeys.LeafSignedByCA2]
  947. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  948. publicKeys: publicKeys,
  949. validateCertificateChain: true,
  950. validateHost: false
  951. )
  952. // When
  953. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  954. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  955. // Then
  956. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  957. }
  958. func testThatPinningBackupKeyPassesEvaluationWithoutHostValidation() {
  959. // Given
  960. let host = "test.alamofire.org"
  961. let serverTrust = TestTrusts.LeafValidDNSName.trust
  962. let publicKeys = [TestPublicKeys.LeafSignedByCA1, TestPublicKeys.IntermediateCA1, TestPublicKeys.LeafValidDNSName]
  963. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  964. publicKeys: publicKeys,
  965. validateCertificateChain: true,
  966. validateHost: false
  967. )
  968. // When
  969. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  970. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  971. // Then
  972. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  973. }
  974. // MARK: Validate Certificate Chain and Host
  975. func testThatPinningLeafKeyPassesEvaluationWithHostValidation() {
  976. // Given
  977. let host = "test.alamofire.org"
  978. let serverTrust = TestTrusts.LeafValidDNSName.trust
  979. let publicKeys = [TestPublicKeys.LeafValidDNSName]
  980. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  981. publicKeys: publicKeys,
  982. validateCertificateChain: true,
  983. validateHost: true
  984. )
  985. // When
  986. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  987. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  988. // Then
  989. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  990. }
  991. func testThatPinningIntermediateKeyPassesEvaluationWithHostValidation() {
  992. // Given
  993. let host = "test.alamofire.org"
  994. let serverTrust = TestTrusts.LeafValidDNSName.trust
  995. let publicKeys = [TestPublicKeys.IntermediateCA2]
  996. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  997. publicKeys: publicKeys,
  998. validateCertificateChain: true,
  999. validateHost: true
  1000. )
  1001. // When
  1002. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1003. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1004. // Then
  1005. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1006. }
  1007. func testThatPinningRootKeyPassesEvaluationWithHostValidation() {
  1008. // Given
  1009. let host = "test.alamofire.org"
  1010. let serverTrust = TestTrusts.LeafValidDNSName.trust
  1011. let publicKeys = [TestPublicKeys.RootCA]
  1012. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1013. publicKeys: publicKeys,
  1014. validateCertificateChain: true,
  1015. validateHost: true
  1016. )
  1017. // When
  1018. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1019. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1020. // Then
  1021. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1022. }
  1023. func testThatPinningKeyNotInCertificateChainFailsEvaluationWithHostValidation() {
  1024. // Given
  1025. let host = "test.alamofire.org"
  1026. let serverTrust = TestTrusts.LeafValidDNSName.trust
  1027. let publicKeys = [TestPublicKeys.LeafSignedByCA2]
  1028. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1029. publicKeys: publicKeys,
  1030. validateCertificateChain: true,
  1031. validateHost: true
  1032. )
  1033. // When
  1034. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1035. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1036. // Then
  1037. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  1038. }
  1039. func testThatPinningBackupKeyPassesEvaluationWithHostValidation() {
  1040. // Given
  1041. let host = "test.alamofire.org"
  1042. let serverTrust = TestTrusts.LeafValidDNSName.trust
  1043. let publicKeys = [TestPublicKeys.LeafSignedByCA1, TestPublicKeys.IntermediateCA1, TestPublicKeys.LeafValidDNSName]
  1044. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1045. publicKeys: publicKeys,
  1046. validateCertificateChain: true,
  1047. validateHost: true
  1048. )
  1049. // When
  1050. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1051. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1052. // Then
  1053. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1054. }
  1055. // MARK: Do NOT Validate Certificate Chain or Host
  1056. func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithMissingIntermediateCertificate() {
  1057. // Given
  1058. let host = "test.alamofire.org"
  1059. let serverTrust = TestTrusts.LeafValidDNSNameMissingIntermediate.trust
  1060. let publicKeys = [TestPublicKeys.LeafValidDNSName]
  1061. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1062. publicKeys: publicKeys,
  1063. validateCertificateChain: false,
  1064. validateHost: false
  1065. )
  1066. // When
  1067. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1068. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1069. // Then
  1070. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1071. }
  1072. func testThatPinningRootKeyWithoutCertificateChainValidationFailsEvaluationWithMissingIntermediateCertificate() {
  1073. // Given
  1074. let host = "test.alamofire.org"
  1075. let serverTrust = TestTrusts.LeafValidDNSNameMissingIntermediate.trust
  1076. let publicKeys = [TestPublicKeys.RootCA]
  1077. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1078. publicKeys: publicKeys,
  1079. validateCertificateChain: false,
  1080. validateHost: false
  1081. )
  1082. // When
  1083. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1084. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1085. // Then
  1086. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  1087. }
  1088. func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithIncorrectIntermediateCertificate() {
  1089. // Given
  1090. let host = "test.alamofire.org"
  1091. let serverTrust = TestTrusts.LeafValidDNSNameWithIncorrectIntermediate.trust
  1092. let publicKeys = [TestPublicKeys.LeafValidDNSName]
  1093. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1094. publicKeys: publicKeys,
  1095. validateCertificateChain: false,
  1096. validateHost: false
  1097. )
  1098. // When
  1099. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1100. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1101. // Then
  1102. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1103. }
  1104. func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() {
  1105. // Given
  1106. let host = "test.alamofire.org"
  1107. let serverTrust = TestTrusts.LeafExpired.trust
  1108. let publicKeys = [TestPublicKeys.LeafExpired]
  1109. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1110. publicKeys: publicKeys,
  1111. validateCertificateChain: false,
  1112. validateHost: false
  1113. )
  1114. // When
  1115. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1116. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1117. // Then
  1118. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1119. }
  1120. func testThatPinningIntermediateKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() {
  1121. // Given
  1122. let host = "test.alamofire.org"
  1123. let serverTrust = TestTrusts.LeafExpired.trust
  1124. let publicKeys = [TestPublicKeys.IntermediateCA2]
  1125. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1126. publicKeys: publicKeys,
  1127. validateCertificateChain: false,
  1128. validateHost: false
  1129. )
  1130. // When
  1131. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1132. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1133. // Then
  1134. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1135. }
  1136. func testThatPinningRootKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() {
  1137. // Given
  1138. let host = "test.alamofire.org"
  1139. let serverTrust = TestTrusts.LeafExpired.trust
  1140. let publicKeys = [TestPublicKeys.RootCA]
  1141. let serverTrustPolicy = ServerTrustPolicy.PinPublicKeys(
  1142. publicKeys: publicKeys,
  1143. validateCertificateChain: false,
  1144. validateHost: false
  1145. )
  1146. // When
  1147. setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust)
  1148. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1149. // Then
  1150. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1151. }
  1152. }
  1153. // MARK: -
  1154. class ServerTrustPolicyDisableEvaluationTestCase: ServerTrustPolicyTestCase {
  1155. func testThatCertificateChainMissingIntermediateCertificatePassesEvaluation() {
  1156. // Given
  1157. let host = "test.alamofire.org"
  1158. let serverTrust = TestTrusts.LeafValidDNSNameMissingIntermediate.trust
  1159. let serverTrustPolicy = ServerTrustPolicy.DisableEvaluation
  1160. // When
  1161. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1162. // Then
  1163. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1164. }
  1165. func testThatExpiredLeafCertificatePassesEvaluation() {
  1166. // Given
  1167. let host = "test.alamofire.org"
  1168. let serverTrust = TestTrusts.LeafExpired.trust
  1169. let serverTrustPolicy = ServerTrustPolicy.DisableEvaluation
  1170. // When
  1171. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1172. // Then
  1173. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1174. }
  1175. }
  1176. // MARK: -
  1177. class ServerTrustPolicyCustomEvaluationTestCase: ServerTrustPolicyTestCase {
  1178. func testThatReturningTrueFromClosurePassesEvaluation() {
  1179. // Given
  1180. let host = "test.alamofire.org"
  1181. let serverTrust = TestTrusts.LeafValidDNSName.trust
  1182. let serverTrustPolicy = ServerTrustPolicy.CustomEvaluation { _, _ in
  1183. return true
  1184. }
  1185. // When
  1186. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1187. // Then
  1188. XCTAssertTrue(serverTrustIsValid, "server trust should pass evaluation")
  1189. }
  1190. func testThatReturningFalseFromClosurePassesEvaluation() {
  1191. // Given
  1192. let host = "test.alamofire.org"
  1193. let serverTrust = TestTrusts.LeafValidDNSName.trust
  1194. let serverTrustPolicy = ServerTrustPolicy.CustomEvaluation { _, _ in
  1195. return false
  1196. }
  1197. // When
  1198. let serverTrustIsValid = serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host)
  1199. // Then
  1200. XCTAssertFalse(serverTrustIsValid, "server trust should not pass evaluation")
  1201. }
  1202. }
  1203. // MARK: -
  1204. class ServerTrustPolicyCertificatesInBundleTestCase: ServerTrustPolicyTestCase {
  1205. func testOnlyValidCertificatesAreDetected() {
  1206. // Given
  1207. // Files present in bundle in the form of type+encoding+extension [key|cert][DER|PEM].[cer|crt|der|key|pem]
  1208. // certDER.cer: DER-encoded well-formed certificate
  1209. // certDER.crt: DER-encoded well-formed certificate
  1210. // certDER.der: DER-encoded well-formed certificate
  1211. // certPEM.*: PEM-encoded well-formed certificates, expected to fail: Apple API only handles DER encoding
  1212. // devURandomGibberish.crt: Random data, should fail
  1213. // keyDER.der: DER-encoded key, not a certificate, should fail
  1214. // When
  1215. let certificates = ServerTrustPolicy.certificatesInBundle(
  1216. NSBundle(forClass: ServerTrustPolicyCertificatesInBundleTestCase.self)
  1217. )
  1218. // Then
  1219. // Expectation: 19 well-formed certificates in the test bundle plus 4 invalid certificates.
  1220. #if os(OSX)
  1221. // For some reason, OSX is allowing all certificates to be considered valid. Need to file a
  1222. // rdar demonstrating this behavior.
  1223. XCTAssertEqual(certificates.count, 23, "Expected 23 well-formed certificates")
  1224. #else
  1225. XCTAssertEqual(certificates.count, 19, "Expected 19 well-formed certificates")
  1226. #endif
  1227. }
  1228. }