@@ -7,14 +7,17 @@ use rpki::repository::{crypto::KeyIdentifier, x509::Time};
7
7
use crate :: {
8
8
commons:: {
9
9
api:: {
10
- ChildCaInfo , ChildHandle , ChildState , IssuedCert , ResourceClassName , ResourceSet , SuspendedCert ,
11
- UnsuspendedCert ,
10
+ ChildCaInfo , ChildHandle , ChildState , HexEncodedHash , IssuedCert , ReplacedObject , ResourceClassName ,
11
+ ResourceSet , Revocation , SuspendedCert , UnsuspendedCert ,
12
12
} ,
13
- crypto:: IdCert ,
13
+ crypto:: { CsrInfo , IdCert , KrillSigner , SignSupport } ,
14
14
error:: Error ,
15
15
KrillResult ,
16
16
} ,
17
- daemon:: config:: IssuanceTimingConfig ,
17
+ daemon:: {
18
+ ca:: { CertifiedKey , ChildCertificateUpdates } ,
19
+ config:: IssuanceTimingConfig ,
20
+ } ,
18
21
} ;
19
22
20
23
//------------ UsedKeyState ------------------------------------------------
@@ -184,6 +187,105 @@ impl ChildCertificates {
184
187
self . issued . values ( )
185
188
}
186
189
190
+ /// Re-issue everything when activating a new key
191
+ pub fn activate_key (
192
+ & self ,
193
+ new_key : & CertifiedKey ,
194
+ issuance_timing : & IssuanceTimingConfig ,
195
+ signer : & KrillSigner ,
196
+ ) -> KrillResult < ChildCertificateUpdates > {
197
+ let mut updates = ChildCertificateUpdates :: default ( ) ;
198
+ for issued in self . issued . values ( ) {
199
+ updates. issue ( self . re_issue ( issued, None , new_key, issuance_timing, signer) ?) ;
200
+ }
201
+ // Also re-issue suspended certificates, they may yet become unsuspended at some point
202
+ for suspended in self . suspended . values ( ) {
203
+ updates. suspend ( self . re_issue ( suspended, None , new_key, issuance_timing, signer) ?) ;
204
+ }
205
+ Ok ( updates)
206
+ }
207
+
208
+ /// Shrink any overclaiming certificates.
209
+ ///
210
+ /// NOTE: We need to pro-actively shrink child certificates to avoid invalidating them.
211
+ /// But, if we gain additional resources it is up to child to request a new certificate
212
+ /// with those resources.
213
+ pub fn shrink_overclaiming (
214
+ & self ,
215
+ updated_key : & CertifiedKey ,
216
+ issuance_timing : & IssuanceTimingConfig ,
217
+ signer : & KrillSigner ,
218
+ ) -> KrillResult < ChildCertificateUpdates > {
219
+ let mut updates = ChildCertificateUpdates :: default ( ) ;
220
+
221
+ let updated_resources = updated_key. incoming_cert ( ) . resources ( ) ;
222
+
223
+ for issued in self . issued . values ( ) {
224
+ if let Some ( reduced_set) = issued. reduced_applicable_resources ( updated_resources) {
225
+ if reduced_set. is_empty ( ) {
226
+ // revoke
227
+ updates. remove ( issued. subject_key_identifier ( ) ) ;
228
+ } else {
229
+ // re-issue
230
+ updates. issue ( self . re_issue ( issued, Some ( reduced_set) , updated_key, issuance_timing, signer) ?) ;
231
+ }
232
+ }
233
+ }
234
+
235
+ // Also shrink suspended, in case they would come back
236
+ for suspended in self . suspended . values ( ) {
237
+ if let Some ( reduced_set) = suspended. reduced_applicable_resources ( updated_resources) {
238
+ if reduced_set. is_empty ( ) {
239
+ // revoke
240
+ updates. remove ( suspended. subject_key_identifier ( ) ) ;
241
+ } else {
242
+ // re-issue shrunk suspended
243
+ //
244
+ // Note: this will not be published yet, but remain suspended
245
+ // until the child contacts us again, or is manually
246
+ // un-suspended.
247
+ updates. suspend ( self . re_issue (
248
+ suspended,
249
+ Some ( reduced_set) ,
250
+ updated_key,
251
+ issuance_timing,
252
+ signer,
253
+ ) ?) ;
254
+ }
255
+ }
256
+ }
257
+
258
+ Ok ( updates)
259
+ }
260
+
261
+ /// Re-issue a delegated certificate to replace an earlier
262
+ /// one which is about to be outdated or has changed resources.
263
+ fn re_issue (
264
+ & self ,
265
+ previous : & IssuedCert ,
266
+ updated_resources : Option < ResourceSet > ,
267
+ signing_key : & CertifiedKey ,
268
+ issuance_timing : & IssuanceTimingConfig ,
269
+ signer : & KrillSigner ,
270
+ ) -> KrillResult < IssuedCert > {
271
+ let ( _uri, limit, resource_set, cert) = previous. clone ( ) . unpack ( ) ;
272
+ let csr = CsrInfo :: from ( & cert) ;
273
+ let resource_set = updated_resources. unwrap_or ( resource_set) ;
274
+ let replaced = ReplacedObject :: new ( Revocation :: from ( & cert) , HexEncodedHash :: from ( & cert) ) ;
275
+
276
+ let re_issued = SignSupport :: make_issued_cert (
277
+ csr,
278
+ & resource_set,
279
+ limit,
280
+ Some ( replaced) ,
281
+ signing_key,
282
+ issuance_timing. timing_child_certificate_valid_weeks ,
283
+ signer,
284
+ ) ?;
285
+
286
+ Ok ( re_issued)
287
+ }
288
+
187
289
pub fn expiring ( & self , issuance_timing : & IssuanceTimingConfig ) -> Vec < & IssuedCert > {
188
290
self . issued
189
291
. values ( )
@@ -200,10 +302,6 @@ impl ChildCertificates {
200
302
. filter ( |issued| !resources. contains ( issued. resource_set ( ) ) )
201
303
. collect ( )
202
304
}
203
-
204
- pub fn iter ( & self ) -> impl Iterator < Item = & IssuedCert > {
205
- self . issued . values ( )
206
- }
207
305
}
208
306
209
307
impl Default for ChildCertificates {
0 commit comments