@@ -19,7 +19,7 @@ import TSCBasic
19
19
20
20
#if os(macOS)
21
21
import Security
22
- #elseif os(Linux) || os(Windows)
22
+ #elseif os(Linux) || os(Windows) || os(Android)
23
23
@_implementationOnly import CCryptoBoringSSL
24
24
@_implementationOnly import PackageCollectionsSigningLibc
25
25
#endif
@@ -29,7 +29,7 @@ let appleDistributionMacOSMarker = "1.2.840.113635.100.6.1.7"
29
29
let appleIntermediateMarker = " 1.2.840.113635.100.6.2.1 "
30
30
31
31
// For BoringSSL only - the Security framework recognizes these marker extensions
32
- #if os(Linux) || os(Windows)
32
+ #if os(Linux) || os(Windows) || os(Android)
33
33
let supportedCriticalExtensions : Set < String > = [ appleDistributionIOSMarker, appleDistributionMacOSMarker,
34
34
// Support "Apple Development" cert markers--they are valid code signing certs after all and satisfy DefaultCertificatePolicy
35
35
" 1.2.840.113635.100.6.1.2 " , " 1.2.840.113635.100.6.1.12 " ]
@@ -99,7 +99,7 @@ extension CertificatePolicy {
99
99
}
100
100
}
101
101
102
- #elseif os(Linux) || os(Windows)
102
+ #elseif os(Linux) || os(Windows) || os(Android)
103
103
typealias BoringSSLVerifyCallback = @convention ( c) ( CInt , UnsafeMutablePointer < X509_STORE_CTX > ? ) -> CInt
104
104
105
105
/// Verifies a certificate chain.
@@ -232,7 +232,7 @@ extension CertificatePolicy {
232
232
#endif
233
233
}
234
234
235
- #if os(Linux) || os(Windows)
235
+ #if os(Linux) || os(Windows) || os(Android)
236
236
private let ocspClient = BoringSSLOCSPClient ( )
237
237
238
238
private struct BoringSSLOCSPClient {
@@ -447,7 +447,7 @@ extension CertificatePolicy {
447
447
throw CertificatePolicyError . extensionFailure
448
448
}
449
449
return !dict. isEmpty
450
- #elseif os(Linux) || os(Windows)
450
+ #elseif os(Linux) || os(Windows) || os(Android)
451
451
let nid = CCryptoBoringSSL_OBJ_create ( oid, " ObjectShortName " , " ObjectLongName " )
452
452
let index = certificate. withUnsafeMutablePointer { CCryptoBoringSSL_X509_get_ext_by_NID ( $0, nid, - 1 ) }
453
453
return index >= 0
@@ -466,7 +466,7 @@ extension CertificatePolicy {
466
466
return false
467
467
}
468
468
return usages. first ( where: { $0 == usage. data } ) != nil
469
- #elseif os(Linux) || os(Windows)
469
+ #elseif os(Linux) || os(Windows) || os(Android)
470
470
let eku = certificate. withUnsafeMutablePointer { CCryptoBoringSSL_X509_get_extended_key_usage ( $0) }
471
471
return eku & UInt32 ( usage. flag) > 0
472
472
#else
@@ -488,7 +488,7 @@ extension CertificatePolicy {
488
488
return false
489
489
}
490
490
return infoAccessValue. first ( where: { valueDict in valueDict [ kSecPropertyKeyValue] as? String == " 1.3.6.1.5.5.7.48.1 " } ) != nil
491
- #elseif os(Linux) || os(Windows)
491
+ #elseif os(Linux) || os(Windows) || os(Android)
492
492
// Check that there is at least one OCSP responder URL, in which case OCSP check will take place in `verify`.
493
493
let ocspURLs = certificate. withUnsafeMutablePointer { CCryptoBoringSSL_X509_get1_ocsp ( $0) }
494
494
defer { CCryptoBoringSSL_sk_OPENSSL_STRING_free ( ocspURLs) }
@@ -513,7 +513,7 @@ enum CertificateExtendedKeyUsage {
513
513
}
514
514
}
515
515
516
- #elseif os(Linux) || os(Windows)
516
+ #elseif os(Linux) || os(Windows) || os(Android)
517
517
var flag : CInt {
518
518
switch self {
519
519
case . codeSigning:
@@ -581,7 +581,7 @@ struct DefaultCertificatePolicy: CertificatePolicy {
581
581
private let callbackQueue : DispatchQueue
582
582
private let diagnosticsEngine : DiagnosticsEngine
583
583
584
- #if os(Linux) || os(Windows)
584
+ #if os(Linux) || os(Windows) || os(Android)
585
585
private let httpClient : HTTPClient
586
586
#endif
587
587
@@ -598,7 +598,7 @@ struct DefaultCertificatePolicy: CertificatePolicy {
598
598
/// - callbackQueue: The `DispatchQueue` to use for callbacks
599
599
/// - diagnosticsEngine: The `DiagnosticsEngine` for emitting warnings and errors.
600
600
init ( trustedRootCertsDir: URL ? , additionalTrustedRootCerts: [ Certificate ] ? , expectedSubjectUserID: String ? = nil , callbackQueue: DispatchQueue , diagnosticsEngine: DiagnosticsEngine ) {
601
- #if !(os(macOS) || os(Linux) || os(Windows))
601
+ #if !(os(macOS) || os(Linux) || os(Windows) || os(Android) )
602
602
fatalError ( " Unsupported: \( #function) " )
603
603
#else
604
604
var trustedRoots = [ Certificate] ( )
@@ -613,14 +613,14 @@ struct DefaultCertificatePolicy: CertificatePolicy {
613
613
self . callbackQueue = callbackQueue
614
614
self . diagnosticsEngine = diagnosticsEngine
615
615
616
- #if os(Linux) || os(Windows)
616
+ #if os(Linux) || os(Windows) || os(Android)
617
617
self . httpClient = HTTPClient . makeDefault ( callbackQueue: callbackQueue)
618
618
#endif
619
619
#endif
620
620
}
621
621
622
622
func validate( certChain: [ Certificate ] , callback: @escaping ( Result < Void , Error > ) -> Void ) {
623
- #if !(os(macOS) || os(Linux) || os(Windows))
623
+ #if !(os(macOS) || os(Linux) || os(Windows) || os(Android) )
624
624
fatalError ( " Unsupported: \( #function) " )
625
625
#else
626
626
let wrappedCallback : ( Result < Void , Error > ) -> Void = { result in self . callbackQueue. async { callback ( result) } }
@@ -649,7 +649,7 @@ struct DefaultCertificatePolicy: CertificatePolicy {
649
649
// Verify the cert chain - if it is trusted then cert chain is valid
650
650
#if os(macOS)
651
651
self . verify ( certChain: certChain, anchorCerts: self . trustedRoots, diagnosticsEngine: self . diagnosticsEngine, callbackQueue: self . callbackQueue, callback: callback)
652
- #elseif os(Linux) || os(Windows)
652
+ #elseif os(Linux) || os(Windows) || os(Android)
653
653
self . verify ( certChain: certChain, anchorCerts: self . trustedRoots, httpClient: self . httpClient, diagnosticsEngine: self . diagnosticsEngine, callbackQueue: self . callbackQueue, callback: callback)
654
654
#endif
655
655
} catch {
@@ -672,7 +672,7 @@ struct AppleDeveloperCertificatePolicy: CertificatePolicy {
672
672
private let callbackQueue : DispatchQueue
673
673
private let diagnosticsEngine : DiagnosticsEngine
674
674
675
- #if os(Linux) || os(Windows)
675
+ #if os(Linux) || os(Windows) || os(Android)
676
676
private let httpClient : HTTPClient
677
677
#endif
678
678
@@ -689,7 +689,7 @@ struct AppleDeveloperCertificatePolicy: CertificatePolicy {
689
689
/// - callbackQueue: The `DispatchQueue` to use for callbacks
690
690
/// - diagnosticsEngine: The `DiagnosticsEngine` for emitting warnings and errors.
691
691
init ( trustedRootCertsDir: URL ? , additionalTrustedRootCerts: [ Certificate ] ? , expectedSubjectUserID: String ? = nil , callbackQueue: DispatchQueue , diagnosticsEngine: DiagnosticsEngine ) {
692
- #if !(os(macOS) || os(Linux) || os(Windows))
692
+ #if !(os(macOS) || os(Linux) || os(Windows) || os(Android) )
693
693
fatalError ( " Unsupported: \( #function) " )
694
694
#else
695
695
var trustedRoots = [ Certificate] ( )
@@ -704,14 +704,14 @@ struct AppleDeveloperCertificatePolicy: CertificatePolicy {
704
704
self . callbackQueue = callbackQueue
705
705
self . diagnosticsEngine = diagnosticsEngine
706
706
707
- #if os(Linux) || os(Windows)
707
+ #if os(Linux) || os(Windows) || os(Android)
708
708
self . httpClient = HTTPClient . makeDefault ( callbackQueue: callbackQueue)
709
709
#endif
710
710
#endif
711
711
}
712
712
713
713
func validate( certChain: [ Certificate ] , callback: @escaping ( Result < Void , Error > ) -> Void ) {
714
- #if !(os(macOS) || os(Linux) || os(Windows))
714
+ #if !(os(macOS) || os(Linux) || os(Windows) || os(Android) )
715
715
fatalError ( " Unsupported: \( #function) " )
716
716
#else
717
717
let wrappedCallback : ( Result < Void , Error > ) -> Void = { result in self . callbackQueue. async { callback ( result) } }
@@ -752,7 +752,7 @@ struct AppleDeveloperCertificatePolicy: CertificatePolicy {
752
752
// Verify the cert chain - if it is trusted then cert chain is valid
753
753
#if os(macOS)
754
754
self . verify ( certChain: certChain, anchorCerts: self . trustedRoots, diagnosticsEngine: self . diagnosticsEngine, callbackQueue: self . callbackQueue, callback: callback)
755
- #elseif os(Linux) || os(Windows)
755
+ #elseif os(Linux) || os(Windows) || os(Android)
756
756
self . verify ( certChain: certChain, anchorCerts: self . trustedRoots, httpClient: self . httpClient, diagnosticsEngine: self . diagnosticsEngine, callbackQueue: self . callbackQueue, callback: callback)
757
757
#endif
758
758
} catch {
0 commit comments