1+ @file:Suppress(" ARGUMENT_TYPE_MISMATCH" )
2+
13package com.privateinternetaccess.regions.internals
24
35/*
@@ -21,7 +23,6 @@ package com.privateinternetaccess.regions.internals
2123import com.privateinternetaccess.regions.internals.Regions.Companion.REQUEST_TIMEOUT_MS
2224import io.ktor.client.HttpClient
2325import io.ktor.client.engine.darwin.*
24- import io.ktor.client.engine.ios.*
2526import io.ktor.client.plugins.*
2627import kotlinx.cinterop.*
2728import platform.CoreFoundation.*
@@ -44,7 +45,7 @@ internal actual object RegionHttpClient {
4445 if (certificate != null && pinnedEndpoint != null ) {
4546 engine {
4647 handleChallenge(
47- RegionCertificatePinner (
48+ buildCertificatePinnerHandler (
4849 certificate,
4950 pinnedEndpoint.first,
5051 pinnedEndpoint.second
@@ -56,14 +57,13 @@ internal actual object RegionHttpClient {
5657 }
5758}
5859
59- @OptIn(kotlinx.cinterop.ExperimentalForeignApi ::class )
60- private class RegionCertificatePinner (
60+ @OptIn(kotlinx.cinterop.ExperimentalForeignApi ::class , kotlinx.cinterop. BetaInteropApi :: class )
61+ private fun buildCertificatePinnerHandler (
6162 certificate : String ,
62- private val hostname : String ,
63- private val commonName : String
64- ) : ChallengeHandler {
65-
66- private val certificateData = NSData .create(
63+ hostname : String ,
64+ commonName : String
65+ ): ChallengeHandler {
66+ val certificateData = NSData .create(
6767 base64EncodedString =
6868 certificate
6969 .replace(" -----BEGIN CERTIFICATE-----" , " " )
@@ -72,59 +72,53 @@ private class RegionCertificatePinner(
7272 options = NSDataBase64Encoding64CharacterLineLength
7373 )
7474
75- override fun invoke (
76- session : NSURLSession ,
77- task : NSURLSessionTask ,
78- challenge : NSURLAuthenticationChallenge ,
79- completionHandler : (NSURLSessionAuthChallengeDisposition , NSURLCredential ? ) -> Unit
80- ) {
75+ return { _, _, challenge, completionHandler ->
8176 if (challenge.protectionSpace.authenticationMethod != NSURLAuthenticationMethodServerTrust ) {
8277 challenge.sender?.cancelAuthenticationChallenge(challenge)
8378 completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge , null )
84- return
85- }
86-
87- val serverTrust = challenge.protectionSpace.serverTrust
88- val serverCertificateRef = SecTrustGetCertificateAtIndex (serverTrust, 0 )
89- val certificateDataRef = CFBridgingRetain (certificateData) as CFDataRef
90- val certificateRef = SecCertificateCreateWithData (null , certificateDataRef)
91- val policyRef = SecPolicyCreateSSL (true , null )
92-
93- memScoped {
94- var preparationSucceeded = true
95- val serverCommonNameRef = alloc<CFStringRefVar >()
96- SecCertificateCopyCommonName (serverCertificateRef, serverCommonNameRef.ptr)
97- val commonNameEvaluationSucceeded = (commonName == CFBridgingRelease (serverCommonNameRef.value))
98- val hostNameEvaluationSucceeded = (hostname == challenge.protectionSpace.host)
79+ } else {
80+ val serverTrust = challenge.protectionSpace.serverTrust
81+ val serverCertificateRef = SecTrustGetCertificateAtIndex (serverTrust, 0 )
82+ val certificateDataRef = CFBridgingRetain (certificateData) as CFDataRef
83+ val certificateRef = SecCertificateCreateWithData (null , certificateDataRef)
84+ val policyRef = SecPolicyCreateSSL (true , null )
85+
86+ memScoped {
87+ var preparationSucceeded = true
88+ val serverCommonNameRef = alloc<CFStringRefVar >()
89+ SecCertificateCopyCommonName (serverCertificateRef, serverCommonNameRef.ptr)
90+ val commonNameEvaluationSucceeded = (commonName == CFBridgingRelease (serverCommonNameRef.value))
91+ val hostNameEvaluationSucceeded = (hostname == challenge.protectionSpace.host)
92+
93+ val trust = alloc<SecTrustRefVar >()
94+ val trustCreation = SecTrustCreateWithCertificates (serverCertificateRef, policyRef, trust.ptr)
95+ if (trustCreation != errSecSuccess) {
96+ preparationSucceeded = false
97+ }
9998
100- val trust = alloc<SecTrustRefVar >()
101- val trustCreation = SecTrustCreateWithCertificates (serverCertificateRef, policyRef, trust.ptr)
102- if (trustCreation != errSecSuccess) {
103- preparationSucceeded = false
104- }
99+ val mutableArrayRef = CFArrayCreateMutable (kCFAllocatorDefault, 1 , null )
100+ CFArrayAppendValue (mutableArrayRef, certificateRef)
105101
106- val mutableArrayRef = CFArrayCreateMutable (kCFAllocatorDefault, 1 , null )
107- CFArrayAppendValue (mutableArrayRef, certificateRef)
102+ val trustAnchor = SecTrustSetAnchorCertificates (trust.value, mutableArrayRef)
103+ if (trustAnchor != errSecSuccess) {
104+ preparationSucceeded = false
105+ }
108106
109- val trustAnchor = SecTrustSetAnchorCertificates (trust.value, mutableArrayRef)
110- if (trustAnchor != errSecSuccess) {
111- preparationSucceeded = false
112- }
107+ val error = alloc<CFErrorRefVar >()
108+ val certificateEvaluationSucceeded = SecTrustEvaluateWithError (trust.value, error.ptr)
109+ challenge.sender?.useCredential(NSURLCredential .create(serverTrust), challenge)
110+ if (preparationSucceeded && hostNameEvaluationSucceeded && commonNameEvaluationSucceeded && certificateEvaluationSucceeded) {
111+ completionHandler(NSURLSessionAuthChallengeUseCredential , NSURLCredential .create(serverTrust))
112+ } else {
113+ completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge , null )
114+ }
113115
114- val error = alloc<CFErrorRefVar >()
115- val certificateEvaluationSucceeded = SecTrustEvaluateWithError (trust.value, error.ptr)
116- challenge.sender?.useCredential(NSURLCredential .create(serverTrust), challenge)
117- if (preparationSucceeded && hostNameEvaluationSucceeded && commonNameEvaluationSucceeded && certificateEvaluationSucceeded) {
118- completionHandler(NSURLSessionAuthChallengeUseCredential , NSURLCredential .create(serverTrust))
119- } else {
120- completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge , null )
116+ CFRelease (serverCertificateRef)
117+ CFRelease (certificateDataRef)
118+ CFRelease (certificateRef)
119+ CFRelease (policyRef)
120+ CFRelease (mutableArrayRef)
121121 }
122-
123- CFRelease (serverCertificateRef)
124- CFRelease (certificateDataRef)
125- CFRelease (certificateRef)
126- CFRelease (policyRef)
127- CFRelease (mutableArrayRef)
128122 }
129123 }
130- }
124+ }
0 commit comments