@@ -17,7 +17,7 @@ import struct Foundation.URL
17
17
18
18
import Basics
19
19
@_implementationOnly import SwiftASN1
20
- @_implementationOnly import X509
20
+ @_implementationOnly @ _spi ( DisableValidityCheck ) import X509
21
21
22
22
extension SignatureProviderProtocol {
23
23
func buildPolicySet( configuration: VerifierConfiguration , httpClient: HTTPClient ) -> PolicySet {
@@ -26,25 +26,47 @@ extension SignatureProviderProtocol {
26
26
_ADPCertificatePolicy ( ) ,
27
27
]
28
28
29
- switch configuration. certificateExpiration {
30
- case . enabled( let validationTime) :
31
- policies. append ( _RFC5280Policy ( validationTime: validationTime, enableExpiryCheck: true ) )
32
- case . disabled:
33
- policies. append ( _RFC5280Policy ( validationTime: . none, enableExpiryCheck: false ) )
34
- }
35
-
36
- switch configuration. certificateRevocation {
37
- case . strict( let validationTime) :
38
- policies. append ( _OCSPVerifierPolicy ( httpClient: httpClient, mode: . strict, validationTime: validationTime) )
39
- case . allowSoftFail( let validationTime) :
29
+ let now = Date ( )
30
+ switch ( configuration. certificateExpiration, configuration. certificateRevocation) {
31
+ case ( . enabled( let expiryValidationTime) , . strict( let revocationValidationTime) ) :
32
+ policies. append ( RFC5280Policy ( validationTime: expiryValidationTime ?? now) )
33
+ policies
34
+ . append ( _OCSPVerifierPolicy (
35
+ httpClient: httpClient,
36
+ mode: . strict,
37
+ validationTime: revocationValidationTime ?? now
38
+ ) )
39
+ case ( . enabled( let expiryValidationTime) , . allowSoftFail( let revocationValidationTime) ) :
40
+ policies. append ( RFC5280Policy ( validationTime: expiryValidationTime ?? now) )
40
41
policies
41
42
. append ( _OCSPVerifierPolicy (
42
43
httpClient: httpClient,
43
44
mode: . allowSoftFail,
44
- validationTime: validationTime
45
+ validationTime: revocationValidationTime ?? now
45
46
) )
46
- case . disabled:
47
- ( )
47
+ case ( . enabled( let expiryValidationTime) , . disabled) :
48
+ policies. append ( RFC5280Policy ( validationTime: expiryValidationTime ?? now) )
49
+ case ( . disabled, . strict( let revocationValidationTime) ) :
50
+ // Always do expiry check (and before) if revocation check is enabled
51
+ policies. append ( RFC5280Policy ( validationTime: revocationValidationTime ?? now) )
52
+ policies
53
+ . append ( _OCSPVerifierPolicy (
54
+ httpClient: httpClient,
55
+ mode: . strict,
56
+ validationTime: revocationValidationTime ?? now
57
+ ) )
58
+ case ( . disabled, . allowSoftFail( let revocationValidationTime) ) :
59
+ // Always do expiry check (and before) if revocation check is enabled
60
+ policies. append ( RFC5280Policy ( validationTime: revocationValidationTime ?? now) )
61
+ policies
62
+ . append ( _OCSPVerifierPolicy (
63
+ httpClient: httpClient,
64
+ mode: . allowSoftFail,
65
+ validationTime: revocationValidationTime ?? now
66
+ ) )
67
+ case ( . disabled, . disabled) :
68
+ // We should still do basic certificate validations even if expiry check is disabled
69
+ policies. append ( RFC5280Policy . withValidityCheckDisabled ( ) )
48
70
}
49
71
50
72
return PolicySet ( policies: policies)
@@ -97,32 +119,6 @@ struct _ADPCertificatePolicy: VerifierPolicy {
97
119
}
98
120
}
99
121
100
- struct _RFC5280Policy : VerifierPolicy {
101
- /// See RFC5280Policy
102
- public let verifyingCriticalExtensions : [ ASN1ObjectIdentifier ] = [
103
- . X509ExtensionID. basicConstraints,
104
- . X509ExtensionID. nameConstraints,
105
- . X509ExtensionID. keyUsage,
106
- ]
107
-
108
- let validationTime : Date ?
109
- let enableExpiryCheck : Bool
110
-
111
- func chainMeetsPolicyRequirements( chain: UnverifiedCertificateChain ) async -> PolicyEvaluationResult {
112
- let policy : RFC5280Policy
113
- if self . enableExpiryCheck {
114
- policy = RFC5280Policy ( validationTime: self . validationTime ?? Date ( ) )
115
- } else {
116
- // Use leaf.notValidBefore as validationTime to ensure the leaf
117
- // will pass expiry check. This should work for the chain if the
118
- // chain follows validity nesting, but if a parent expires before
119
- // a child does then the expiry check will fail.
120
- policy = RFC5280Policy ( validationTime: chain. leaf. notValidBefore)
121
- }
122
- return policy. chainMeetsPolicyRequirements ( chain: chain)
123
- }
124
- }
125
-
126
122
struct _OCSPVerifierPolicy : VerifierPolicy {
127
123
private static let cacheTTL : DispatchTimeInterval = . seconds( 5 * 60 )
128
124
private let cache = ThreadSafeKeyValueStore <
@@ -135,10 +131,10 @@ struct _OCSPVerifierPolicy: VerifierPolicy {
135
131
136
132
let verifyingCriticalExtensions : [ ASN1ObjectIdentifier ] = [ ]
137
133
138
- init ( httpClient: HTTPClient , mode: Mode , validationTime: Date ? ) {
134
+ init ( httpClient: HTTPClient , mode: Mode , validationTime: Date ) {
139
135
self . underlying = OCSPVerifierPolicy (
140
136
requester: _OCSPRequester ( httpClient: httpClient) ,
141
- validationTime: validationTime ?? Date ( )
137
+ validationTime: validationTime
142
138
)
143
139
self . mode = mode
144
140
}
0 commit comments