1use super::object::{KeyObject, KeyObjectT};
2use super::KeyId;
3use crate::prelude::*;
4use crate::value::{KeyStatus, KeyUsage};
5use crate::valueset::{KeyInternalData, ValueSetKeyInternal};
6use compact_jwt::compact::{JweAlg, JweCompact, JweEnc};
7use compact_jwt::crypto::{
8    JweA128GCMEncipher, JweA128KWEncipher, JwsRs256Signer, JwsRs256Verifier,
9};
10use compact_jwt::jwe::Jwe;
11use compact_jwt::traits::*;
12use compact_jwt::{
13    JwaAlg, Jwk, JwkKeySet, Jws, JwsCompact, JwsEs256Signer, JwsEs256Verifier, JwsHs256Signer,
14    JwsSigner, JwsSignerToVerifier,
15};
16use crypto_glue::{
17    aes128,
18    hkdf_s256::HkdfSha256,
19    hmac_s256::{self, HmacSha256, HmacSha256Key},
20    traits::{Mac, Zeroizing},
21};
22use smolset::SmolSet;
23use std::cmp::Reverse;
24use std::collections::{BTreeMap, BTreeSet};
25use std::ops::Bound::{Included, Unbounded};
26use std::sync::Arc;
27
28const KID_LEN: usize = 32;
29
30pub struct KeyProviderInternal {
31    uuid: Uuid,
32    name: String,
33}
34
35#[derive(Clone)]
36pub struct KeyObjectInternal {
37    provider: Arc<KeyProviderInternal>,
38    uuid: Uuid,
39    jws_es256: Option<KeyObjectInternalJwtEs256>,
40    jws_hs256: Option<KeyObjectInternalJwtHs256>,
41    jws_rs256: Option<KeyObjectInternalJwtRs256>,
42    jwe_a128gcm: Option<KeyObjectInternalJweA128GCM>,
43    hkdf_s256: Option<KeyObjectInternalHkdfS256>,
44    }
47
48impl KeyProviderInternal {
49    pub(super) fn try_from(
50        value: &Entry<EntrySealed, EntryCommitted>,
51    ) -> Result<Self, OperationError> {
52        let name = value
54            .get_ava_single_iname(Attribute::Name)
55            .ok_or_else(|| {
56                error!("Missing {}", Attribute::Name);
57                OperationError::KP0004KeyProviderMissingAttributeName
58            })?
59            .to_string();
60
61        let uuid = value.get_uuid();
62
63        Ok(KeyProviderInternal { uuid, name })
64    }
65
66    pub(crate) fn uuid(&self) -> Uuid {
67        self.uuid
68    }
69
70    pub(crate) fn name(&self) -> &str {
71        &self.name
72    }
73
74    pub(crate) fn create_new_key_object(
75        &self,
76        uuid: Uuid,
77        provider: Arc<Self>,
78    ) -> Result<KeyObject, OperationError> {
79        Ok(Box::new(KeyObjectInternal {
80            provider,
81            uuid,
82            jws_es256: None,
83            jws_hs256: None,
84            jwe_a128gcm: None,
85            jws_rs256: None,
86            hkdf_s256: None,
87        }))
88    }
89
90    pub(super) fn load_key_object(
91        &self,
92        entry: &EntrySealedCommitted,
93        provider: Arc<Self>,
94    ) -> Result<Arc<KeyObject>, OperationError> {
95        let uuid = entry.get_uuid();
96        debug!(?uuid, "Loading key object ...");
97
98        let mut jws_es256: Option<KeyObjectInternalJwtEs256> = None;
99        let mut jws_hs256: Option<KeyObjectInternalJwtHs256> = None;
100        let mut jws_rs256: Option<KeyObjectInternalJwtRs256> = None;
101        let mut jwe_a128gcm: Option<KeyObjectInternalJweA128GCM> = None;
102        let mut hkdf_s256: Option<KeyObjectInternalHkdfS256> = None;
103
104        if let Some(key_internal_map) = entry
105            .get_ava_set(Attribute::KeyInternalData)
106            .and_then(|vs| vs.as_key_internal_map())
107        {
108            for (
109                key_id,
110                KeyInternalData {
111                    usage,
112                    status,
113                    status_cid,
114                    der,
115                    valid_from,
116                },
117            ) in key_internal_map.iter()
118            {
119                trace!(?uuid, ?usage, ?status, ?key_id);
120                match usage {
121                    KeyUsage::JwsEs256 => {
122                        let jws_es256_ref =
123                            jws_es256.get_or_insert_with(KeyObjectInternalJwtEs256::default);
124
125                        jws_es256_ref.load(
126                            key_id,
127                            *status,
128                            status_cid.clone(),
129                            der,
130                            *valid_from,
131                        )?;
132                    }
133                    KeyUsage::JwsHs256 => {
134                        let jws_hs256_ref =
135                            jws_hs256.get_or_insert_with(KeyObjectInternalJwtHs256::default);
136
137                        jws_hs256_ref.load(
138                            key_id,
139                            *status,
140                            status_cid.clone(),
141                            der,
142                            *valid_from,
143                        )?;
144                    }
145                    KeyUsage::JwsRs256 => {
146                        let jws_rs256_ref =
147                            jws_rs256.get_or_insert_with(KeyObjectInternalJwtRs256::default);
148
149                        jws_rs256_ref.load(
150                            key_id,
151                            *status,
152                            status_cid.clone(),
153                            der,
154                            *valid_from,
155                        )?;
156                    }
157                    KeyUsage::JweA128GCM => {
158                        let jwe_a128gcm_ref =
159                            jwe_a128gcm.get_or_insert_with(KeyObjectInternalJweA128GCM::default);
160
161                        jwe_a128gcm_ref.load(
162                            key_id,
163                            *status,
164                            status_cid.clone(),
165                            der,
166                            *valid_from,
167                        )?;
168                    }
169                    KeyUsage::HkdfS256 => {
170                        let hkdf_s256_ref =
171                            hkdf_s256.get_or_insert_with(KeyObjectInternalHkdfS256::default);
172
173                        hkdf_s256_ref.load(
174                            key_id,
175                            *status,
176                            status_cid.clone(),
177                            der,
178                            *valid_from,
179                        )?;
180                    }
181                }
182            }
183        }
184
185        Ok(Arc::new(Box::new(KeyObjectInternal {
186            provider,
187            uuid,
188            jws_es256,
189            jws_hs256,
190            jwe_a128gcm,
191            jws_rs256,
192            hkdf_s256,
193        })))
194    }
195
196    pub(crate) fn test(&self) -> Result<(), OperationError> {
197        Ok(())
200    }
201}
202
203#[cfg(test)]
204impl KeyProviderInternal {
205    fn create_test_provider() -> Self {
206        KeyProviderInternal {
207            uuid: UUID_KEY_PROVIDER_INTERNAL,
208            name: "key_provider_internal".to_string(),
209        }
210    }
211}
212
213#[derive(Clone)]
214enum InternalJweA128GCMStatus {
215    Valid { cipher: JweA128KWEncipher },
216    Retained { cipher: JweA128KWEncipher },
217    Revoked,
218}
219
220#[derive(Clone)]
221struct InternalJweA128GCM {
222    valid_from: u64,
223    status: InternalJweA128GCMStatus,
224    status_cid: Cid,
225}
226
227#[derive(Default, Clone)]
228struct KeyObjectInternalJweA128GCM {
229    active: BTreeMap<u64, JweA128KWEncipher>,
235
236    all: BTreeMap<KeyId, InternalJweA128GCM>,
239}
240
241impl KeyObjectInternalJweA128GCM {
242    fn get_valid_cipher(&self, time: Duration) -> Option<&JweA128KWEncipher> {
243        let ct_secs = time.as_secs();
244
245        self.active
246            .range((Unbounded, Included(ct_secs)))
247            .next_back()
248            .map(|(_time, cipher)| cipher)
249    }
250
251    fn assert_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
252        if self.get_valid_cipher(valid_from).is_none() {
253            debug!("no active jwe a128gcm found, creating a new one ...");
255            self.new_active(valid_from, cid)
256        } else {
257            Ok(())
258        }
259    }
260
261    #[instrument(level = "debug", name = "keyobject::jwe_a128_gcm::new", skip_all)]
262    fn new_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
263        let valid_from = valid_from.as_secs();
264
265        let key = aes128::new_key();
266
267        let mut cipher = JweA128KWEncipher::from(key);
268        cipher.set_sign_option_embed_kid(true);
269        let kid = cipher.get_kid().to_string();
270
271        self.active.insert(valid_from, cipher.clone());
272
273        self.all.insert(
274            kid,
275            InternalJweA128GCM {
276                valid_from,
277                status: InternalJweA128GCMStatus::Valid { cipher },
278                status_cid: cid.clone(),
279            },
280        );
281
282        Ok(())
283    }
284
285    fn to_key_iter(&self) -> impl Iterator<Item = (KeyId, KeyInternalData)> + '_ {
286        self.all.iter().map(|(key_id, internal_jwe)| {
287            let usage = KeyUsage::JweA128GCM;
288
289            let valid_from = internal_jwe.valid_from;
290            let status_cid = internal_jwe.status_cid.clone();
291
292            let (status, der) = match &internal_jwe.status {
293                InternalJweA128GCMStatus::Valid { cipher } => {
294                    (KeyStatus::Valid, cipher.as_ref().as_slice().to_vec().into())
295                }
296                InternalJweA128GCMStatus::Retained { cipher } => (
297                    KeyStatus::Retained,
298                    cipher.as_ref().as_slice().to_vec().into(),
299                ),
300                InternalJweA128GCMStatus::Revoked => {
301                    (KeyStatus::Revoked, Zeroizing::new(Vec::with_capacity(0)))
302                }
303            };
304
305            (
306                key_id.clone(),
307                KeyInternalData {
308                    usage,
309                    valid_from,
310                    der,
311                    status,
312                    status_cid,
313                },
314            )
315        })
316    }
317
318    fn revoke(&mut self, revoke_key_id: &KeyId, cid: &Cid) -> Result<bool, OperationError> {
319        if let Some(key_to_revoke) = self.all.get_mut(revoke_key_id) {
320            key_to_revoke.status = InternalJweA128GCMStatus::Revoked;
321            key_to_revoke.status_cid = cid.clone();
322
323            let valid_from = key_to_revoke.valid_from;
324
325            self.active.remove(&valid_from);
327
328            Ok(true)
329        } else {
330            Ok(false)
332        }
333    }
334
335    fn load(
336        &mut self,
337        id: &str,
338        status: KeyStatus,
339        status_cid: Cid,
340        der: &[u8],
341        valid_from: u64,
342    ) -> Result<(), OperationError> {
343        let id: KeyId = id.to_string();
344
345        let status = match status {
346            KeyStatus::Valid => {
347                let key = aes128::key_from_slice(der).ok_or_else(|| {
348                    error!(?id, "Unable to load A128GCM retained cipher");
349                    OperationError::KP0037KeyObjectImportJweA128GCMInvalid
350                })?;
351
352                let mut cipher = JweA128KWEncipher::from(key);
353                cipher.set_sign_option_embed_kid(true);
354                cipher.set_kid(id.as_str());
355
356                self.active.insert(valid_from, cipher.clone());
357
358                InternalJweA128GCMStatus::Valid { cipher }
359            }
360            KeyStatus::Retained => {
361                let key = aes128::key_from_slice(der).ok_or_else(|| {
362                    error!(?id, "Unable to load A128GCM retained cipher");
363                    OperationError::KP0038KeyObjectImportJweA128GCMInvalid
364                })?;
365
366                let mut cipher = JweA128KWEncipher::from(key);
367                cipher.set_sign_option_embed_kid(true);
368                cipher.set_kid(id.as_str());
369
370                InternalJweA128GCMStatus::Retained { cipher }
371            }
372            KeyStatus::Revoked => InternalJweA128GCMStatus::Revoked,
373        };
374
375        let internal_jwe = InternalJweA128GCM {
376            valid_from,
377            status,
378            status_cid,
379        };
380
381        self.all.insert(id, internal_jwe);
382
383        Ok(())
384    }
385
386    fn decipher(&self, jwec: &JweCompact) -> Result<Jwe, OperationError> {
387        let internal_jwe = jwec
388            .kid()
389            .and_then(|kid| {
390                debug!(?kid);
391                self.all.get(kid)
392            })
393            .ok_or_else(|| {
394                error!("JWE is encrypted by a key that is not present in this KeyObject");
395                for pres_kid in self.all.keys() {
396                    debug!(?pres_kid);
397                }
398                OperationError::KP0039KeyObjectJweNotAssociated
399            })?;
400
401        match &internal_jwe.status {
402            InternalJweA128GCMStatus::Valid { cipher, .. }
403            | InternalJweA128GCMStatus::Retained { cipher, .. } => {
404                cipher.decipher(jwec).map_err(|jwt_err| {
405                    error!(?jwt_err, "Failed to decrypt jwe");
406                    OperationError::KP0040KeyObjectJweInvalid
407                })
408            }
409            InternalJweA128GCMStatus::Revoked => {
410                error!("The key used to encrypt this JWE has been revoked.");
411                Err(OperationError::KP0041KeyObjectJweRevoked)
412            }
413        }
414    }
415
416    fn encipher(&self, jwe: &Jwe, current_time: Duration) -> Result<JweCompact, OperationError> {
417        let Some(cipher) = self.get_valid_cipher(current_time) else {
418            error!("No encryption keys available. This may indicate that no keys are valid yet!");
419            return Err(OperationError::KP0042KeyObjectNoActiveEncryptionKeys);
420        };
421
422        cipher.encipher::<JweA128GCMEncipher>(jwe).map_err(|err| {
423            error!(?err, "Unable to sign jwe");
424            OperationError::KP0043KeyObjectJweA128GCMEncryption
425        })
426    }
427}
428
429#[derive(Clone)]
430enum InternalJwtEs256Status {
431    Valid {
432        verifier: JwsEs256Verifier,
434        private_der: Zeroizing<Vec<u8>>,
435    },
436    Retained {
437        verifier: JwsEs256Verifier,
438        public_der: Vec<u8>,
439    },
440    Revoked {
441        untrusted_verifier: JwsEs256Verifier,
442        public_der: Vec<u8>,
443    },
444}
445
446#[derive(Clone)]
447struct InternalJwtEs256 {
448    valid_from: u64,
449    status: InternalJwtEs256Status,
450    status_cid: Cid,
451}
452
453#[derive(Default, Clone)]
454struct KeyObjectInternalJwtEs256 {
455    active: BTreeMap<u64, JwsEs256Signer>,
461
462    all: BTreeMap<KeyId, InternalJwtEs256>,
465}
466
467impl KeyObjectInternalJwtEs256 {
468    fn get_valid_signer(&self, time: Duration) -> Option<&JwsEs256Signer> {
469        let ct_secs = time.as_secs();
470
471        self.active
472            .range((Unbounded, Included(ct_secs)))
473            .next_back()
474            .map(|(_time, signer)| signer)
475    }
476
477    fn assert_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
478        if self.get_valid_signer(valid_from).is_none() {
479            debug!("no active jwt es256 found, creating a new one ...");
481            self.new_active(valid_from, cid)
482        } else {
483            Ok(())
484        }
485    }
486
487    fn import(
488        &mut self,
489        import_keys: &SmolSet<[Vec<u8>; 1]>,
490        valid_from: Duration,
491        cid: &Cid,
492    ) -> Result<(), OperationError> {
493        let valid_from = valid_from.as_secs();
494
495        for private_der in import_keys {
496            let mut signer = JwsEs256Signer::from_es256_der(private_der).map_err(|err| {
497                error!(?err, "Unable to load imported es256 DER signer");
498                OperationError::KP0028KeyObjectImportJwsEs256DerInvalid
499            })?;
500
501            let verifier = signer.get_verifier().map_err(|jwt_error| {
502                error!(
503                    ?jwt_error,
504                    "Unable to produce jwt es256 verifier from signer"
505                );
506                OperationError::KP0029KeyObjectSignerToVerifier
507            })?;
508
509            let kid = signer.get_legacy_kid().to_string();
511            debug!(?kid, "imported key");
512
513            signer.set_kid(kid.as_str());
515
516            self.active.insert(valid_from, signer.clone());
517
518            self.all.insert(
519                kid,
520                InternalJwtEs256 {
521                    valid_from,
522                    status: InternalJwtEs256Status::Valid {
523                        verifier,
524                        private_der: private_der.clone().into(),
525                    },
526                    status_cid: cid.clone(),
527                },
528            );
529        }
530
531        Ok(())
532    }
533
534    #[instrument(level = "debug", name = "keyobject::jws_es256::new", skip_all)]
535    fn new_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
536        let valid_from = valid_from.as_secs();
537
538        let signer = JwsEs256Signer::generate_es256().map_err(|jwt_error| {
539            error!(?jwt_error, "Unable to generate new jwt es256 signing key");
540            OperationError::KP0006KeyObjectJwtEs256Generation
541        })?;
542
543        let verifier = signer.get_verifier().map_err(|jwt_error| {
544            error!(
545                ?jwt_error,
546                "Unable to produce jwt es256 verifier from signer"
547            );
548            OperationError::KP0010KeyObjectSignerToVerifier
549        })?;
550
551        let private_der = signer.private_key_to_der().map_err(|jwt_error| {
552            error!(?jwt_error, "Unable to convert signing key to DER");
553            OperationError::KP0009KeyObjectPrivateToDer
554        })?;
555
556        self.active.insert(valid_from, signer.clone());
557
558        let kid = signer.get_kid().to_string();
559
560        self.all.insert(
561            kid,
562            InternalJwtEs256 {
563                valid_from,
564                status: InternalJwtEs256Status::Valid {
565                    verifier,
567                    private_der,
568                },
569                status_cid: cid.clone(),
570            },
571        );
572
573        Ok(())
574    }
575
576    fn revoke(&mut self, revoke_key_id: &KeyId, cid: &Cid) -> Result<bool, OperationError> {
577        if let Some(key_to_revoke) = self.all.get_mut(revoke_key_id) {
578            let untrusted_verifier = match &key_to_revoke.status {
579                InternalJwtEs256Status::Valid { verifier, .. }
580                | InternalJwtEs256Status::Retained { verifier, .. } => verifier,
581                InternalJwtEs256Status::Revoked {
582                    untrusted_verifier, ..
583                } => untrusted_verifier,
584            }
585            .clone();
586
587            let public_der = untrusted_verifier
588                .public_key_to_der()
589                .map_err(|jwt_error| {
590                    error!(?jwt_error, "Unable to convert public key to DER");
591                    OperationError::KP0027KeyObjectPublicToDer
592                })?;
593
594            key_to_revoke.status = InternalJwtEs256Status::Revoked {
595                untrusted_verifier,
596                public_der,
597            };
598            key_to_revoke.status_cid = cid.clone();
599
600            let valid_from = key_to_revoke.valid_from;
601
602            self.active.remove(&valid_from);
604
605            Ok(true)
606        } else {
607            Ok(false)
609        }
610    }
611
612    fn load(
613        &mut self,
614        id: &str,
615        status: KeyStatus,
616        status_cid: Cid,
617        der: &[u8],
618        valid_from: u64,
619    ) -> Result<(), OperationError> {
620        let id: KeyId = id.to_string();
621
622        let status = match status {
623            KeyStatus::Valid => {
624                let mut signer = JwsEs256Signer::from_es256_der(der).map_err(|err| {
625                    error!(?err, ?id, "Unable to load es256 DER signer");
626                    OperationError::KP0013KeyObjectJwsEs256DerInvalid
627                })?;
628
629                signer.set_kid(id.as_str());
631
632                let verifier = signer.get_verifier().map_err(|err| {
633                    error!(?err, "Unable to retrieve verifier from signer");
634                    OperationError::KP0014KeyObjectSignerToVerifier
635                })?;
636
637                self.active.insert(valid_from, signer);
638
639                InternalJwtEs256Status::Valid {
640                    verifier,
642                    private_der: der.to_vec().into(),
643                }
644            }
645            KeyStatus::Retained => {
646                let verifier = JwsEs256Verifier::from_es256_der(der).map_err(|err| {
647                    error!(?err, ?id, "Unable to load es256 DER verifier");
648                    OperationError::KP0015KeyObjectJwsEs256DerInvalid
649                })?;
650
651                InternalJwtEs256Status::Retained {
652                    verifier,
653                    public_der: der.to_vec(),
654                }
655            }
656            KeyStatus::Revoked => {
657                let untrusted_verifier = JwsEs256Verifier::from_es256_der(der).map_err(|err| {
658                    error!(?err, ?id, "Unable to load es256 DER revoked verifier");
659                    OperationError::KP0016KeyObjectJwsEs256DerInvalid
660                })?;
661
662                InternalJwtEs256Status::Revoked {
663                    untrusted_verifier,
664                    public_der: der.to_vec(),
665                }
666            }
667        };
668
669        let internal_jwt = InternalJwtEs256 {
670            valid_from,
671            status,
672            status_cid,
673        };
674
675        self.all.insert(id, internal_jwt);
676
677        Ok(())
678    }
679
680    fn to_key_iter(&self) -> impl Iterator<Item = (KeyId, KeyInternalData)> + '_ {
681        self.all.iter().map(|(key_id, internal_jwt)| {
682            let usage = KeyUsage::JwsEs256;
683
684            let valid_from = internal_jwt.valid_from;
685            let status_cid = internal_jwt.status_cid.clone();
686
687            let (status, der) = match &internal_jwt.status {
688                InternalJwtEs256Status::Valid { private_der, .. } => {
689                    (KeyStatus::Valid, private_der.clone())
690                }
691                InternalJwtEs256Status::Retained { public_der, .. } => {
692                    (KeyStatus::Retained, public_der.clone().into())
693                }
694                InternalJwtEs256Status::Revoked { public_der, .. } => {
695                    (KeyStatus::Revoked, public_der.clone().into())
696                }
697            };
698
699            (
700                key_id.clone(),
701                KeyInternalData {
702                    usage,
703                    valid_from,
704                    der,
705                    status,
706                    status_cid,
707                },
708            )
709        })
710    }
711
712    fn sign<V: JwsSignable>(
713        &self,
714        jws: &V,
715        current_time: Duration,
716    ) -> Result<V::Signed, OperationError> {
717        let Some(signing_key) = self.get_valid_signer(current_time) else {
718            error!("No signing keys available. This may indicate that no keys are valid yet!");
719            return Err(OperationError::KP0020KeyObjectNoActiveSigningKeys);
720        };
721
722        signing_key.sign(jws).map_err(|jwt_err| {
723            error!(?jwt_err, "Unable to sign jws");
724            OperationError::KP0021KeyObjectJwsEs256Signature
725        })
726    }
727
728    fn verify<V: JwsVerifiable>(&self, jwsc: &V) -> Result<V::Verified, OperationError> {
729        let internal_jws = jwsc
730            .kid()
731            .and_then(|kid| {
732                debug!(?kid);
733                self.all.get(kid)
734            })
735            .ok_or_else(|| {
736                error!("JWS is signed by a key that is not present in this KeyObject");
737                for pres_kid in self.all.keys() {
738                    debug!(?pres_kid);
739                }
740                OperationError::KP0022KeyObjectJwsNotAssociated
741            })?;
742
743        match &internal_jws.status {
744            InternalJwtEs256Status::Valid { verifier, .. }
745            | InternalJwtEs256Status::Retained { verifier, .. } => {
746                verifier.verify(jwsc).map_err(|jwt_err| {
747                    error!(?jwt_err, "Failed to verify jws");
748                    OperationError::KP0024KeyObjectJwsInvalid
749                })
750            }
751            InternalJwtEs256Status::Revoked { .. } => {
752                error!("The key used to sign this JWS has been revoked.");
753                Err(OperationError::KP0023KeyObjectJwsKeyRevoked)
754            }
755        }
756    }
757
758    fn public_jwks(&self) -> JwkKeySet {
759        let mut signing_keys: Vec<_> = self.all.iter().collect();
762
763        signing_keys.sort_unstable_by_key(|(_, k)| Reverse(k.valid_from));
765
766        let keys = signing_keys
767            .into_iter()
768            .filter_map(|(_, es256)| match &es256.status {
769                InternalJwtEs256Status::Valid { verifier, .. }
770                | InternalJwtEs256Status::Retained { verifier, .. } => verifier
771                    .public_key_as_jwk()
772                    .map_err(|err| {
773                        error!(?err);
774                    })
775                    .ok(),
776                InternalJwtEs256Status::Revoked { .. } => None,
777            })
778            .collect::<Vec<_>>();
779
780        JwkKeySet { keys }
781    }
782
783    fn public_jwk(&self, key_id: &str) -> Result<Option<Jwk>, OperationError> {
784        if let Some(key_to_check) = self.all.get(key_id) {
785            match &key_to_check.status {
786                InternalJwtEs256Status::Valid { verifier, .. }
787                | InternalJwtEs256Status::Retained { verifier, .. } => {
788                    verifier.public_key_as_jwk().map(Some).map_err(|err| {
789                        error!(?err, "Unable to construct public JWK.");
790                        OperationError::KP0044KeyObjectJwsPublicJwk
791                    })
792                }
793                InternalJwtEs256Status::Revoked { .. } => Ok(None),
794            }
795        } else {
796            Ok(None)
797        }
798    }
799
800    #[cfg(test)]
801    fn kid_status(&self, key_id: &KeyId) -> Result<Option<KeyStatus>, OperationError> {
802        if let Some(key_to_check) = self.all.get(key_id) {
803            let status = match &key_to_check.status {
804                InternalJwtEs256Status::Valid { .. } => KeyStatus::Valid,
805                InternalJwtEs256Status::Retained { .. } => KeyStatus::Retained,
806                InternalJwtEs256Status::Revoked { .. } => KeyStatus::Revoked,
807            };
808            Ok(Some(status))
809        } else {
810            Ok(None)
811        }
812    }
813}
814
815#[derive(Clone)]
816enum InternalJwtRs256Status {
817    Valid {
818        verifier: JwsRs256Verifier,
819        private_der: Zeroizing<Vec<u8>>,
820    },
821    Retained {
822        verifier: JwsRs256Verifier,
823        public_der: Vec<u8>,
824    },
825    Revoked {
826        untrusted_verifier: JwsRs256Verifier,
827        public_der: Vec<u8>,
828    },
829}
830
831#[derive(Clone)]
832struct InternalJwtRs256 {
833    valid_from: u64,
834    status: InternalJwtRs256Status,
835    status_cid: Cid,
836}
837
838#[derive(Default, Clone)]
839struct KeyObjectInternalJwtRs256 {
840    active: BTreeMap<u64, JwsRs256Signer>,
846
847    all: BTreeMap<KeyId, InternalJwtRs256>,
850}
851
852impl KeyObjectInternalJwtRs256 {
853    fn get_valid_signer(&self, time: Duration) -> Option<&JwsRs256Signer> {
854        let ct_secs = time.as_secs();
855
856        self.active
857            .range((Unbounded, Included(ct_secs)))
858            .next_back()
859            .map(|(_time, signer)| signer)
860    }
861
862    fn assert_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
863        if self.get_valid_signer(valid_from).is_none() {
864            debug!("no active jwt rs256 found, creating a new one ...");
866            self.new_active(valid_from, cid)
867        } else {
868            Ok(())
869        }
870    }
871
872    fn import(
873        &mut self,
874        import_keys: &SmolSet<[Vec<u8>; 1]>,
875        valid_from: Duration,
876        cid: &Cid,
877    ) -> Result<(), OperationError> {
878        let valid_from = valid_from.as_secs();
879
880        for private_der in import_keys {
881            let mut signer = JwsRs256Signer::from_rs256_der(private_der).map_err(|err| {
882                error!(?err, "Unable to load imported rs256 DER signer");
883                OperationError::KP0045KeyObjectImportJwsRs256DerInvalid
884            })?;
885
886            let verifier = signer.get_verifier().map_err(|jwt_error| {
887                error!(
888                    ?jwt_error,
889                    "Unable to produce jwt rs256 verifier from signer"
890                );
891                OperationError::KP0046KeyObjectSignerToVerifier
892            })?;
893
894            let kid = signer.get_legacy_kid().to_string();
896            debug!(?kid, "imported key");
897
898            signer.set_kid(kid.as_str());
900
901            self.active.insert(valid_from, signer.clone());
902
903            self.all.insert(
904                kid,
905                InternalJwtRs256 {
906                    valid_from,
907                    status: InternalJwtRs256Status::Valid {
908                        verifier,
909                        private_der: private_der.clone().into(),
910                    },
911                    status_cid: cid.clone(),
912                },
913            );
914        }
915
916        Ok(())
917    }
918
919    #[instrument(level = "debug", name = "keyobject::jws_rs256::new", skip_all)]
920    fn new_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
921        let valid_from = valid_from.as_secs();
922
923        let signer = JwsRs256Signer::generate_rs256().map_err(|jwt_error| {
924            error!(?jwt_error, "Unable to generate new jwt rs256 signing key");
925            OperationError::KP0048KeyObjectJwtRs256Generation
926        })?;
927
928        let verifier = signer.get_verifier().map_err(|jwt_error| {
929            error!(
930                ?jwt_error,
931                "Unable to produce jwt rs256 verifier from signer"
932            );
933            OperationError::KP0049KeyObjectSignerToVerifier
934        })?;
935
936        let private_der = signer.private_key_to_der().map_err(|jwt_error| {
937            error!(?jwt_error, "Unable to convert signing key to DER");
938            OperationError::KP0050KeyObjectPrivateToDer
939        })?;
940
941        self.active.insert(valid_from, signer.clone());
942
943        let kid = signer.get_kid().to_string();
944
945        self.all.insert(
946            kid,
947            InternalJwtRs256 {
948                valid_from,
949                status: InternalJwtRs256Status::Valid {
950                    verifier,
952                    private_der,
953                },
954                status_cid: cid.clone(),
955            },
956        );
957
958        Ok(())
959    }
960
961    fn revoke(&mut self, revoke_key_id: &KeyId, cid: &Cid) -> Result<bool, OperationError> {
962        if let Some(key_to_revoke) = self.all.get_mut(revoke_key_id) {
963            let untrusted_verifier = match &key_to_revoke.status {
964                InternalJwtRs256Status::Valid { verifier, .. }
965                | InternalJwtRs256Status::Retained { verifier, .. } => verifier,
966                InternalJwtRs256Status::Revoked {
967                    untrusted_verifier, ..
968                } => untrusted_verifier,
969            }
970            .clone();
971
972            let public_der = untrusted_verifier
973                .public_key_to_der()
974                .map_err(|jwt_error| {
975                    error!(?jwt_error, "Unable to convert public key to DER");
976                    OperationError::KP0051KeyObjectPublicToDer
977                })?;
978
979            key_to_revoke.status = InternalJwtRs256Status::Revoked {
980                untrusted_verifier,
981                public_der,
982            };
983            key_to_revoke.status_cid = cid.clone();
984
985            let valid_from = key_to_revoke.valid_from;
986
987            self.active.remove(&valid_from);
989
990            Ok(true)
991        } else {
992            Ok(false)
994        }
995    }
996
997    fn load(
998        &mut self,
999        id: &str,
1000        status: KeyStatus,
1001        status_cid: Cid,
1002        der: &[u8],
1003        valid_from: u64,
1004    ) -> Result<(), OperationError> {
1005        let id: KeyId = id.to_string();
1006
1007        let status = match status {
1008            KeyStatus::Valid => {
1009                let mut signer = JwsRs256Signer::from_rs256_der(der).map_err(|err| {
1010                    error!(?err, ?id, "Unable to load rs256 DER signer");
1011                    OperationError::KP0052KeyObjectJwsRs256DerInvalid
1012                })?;
1013
1014                signer.set_kid(id.as_str());
1016
1017                let verifier = signer.get_verifier().map_err(|err| {
1018                    error!(?err, "Unable to retrieve verifier from signer");
1019                    OperationError::KP0053KeyObjectSignerToVerifier
1020                })?;
1021
1022                self.active.insert(valid_from, signer);
1023
1024                InternalJwtRs256Status::Valid {
1025                    verifier,
1027                    private_der: der.to_vec().into(),
1028                }
1029            }
1030            KeyStatus::Retained => {
1031                let verifier = JwsRs256Verifier::from_rs256_der(der).map_err(|err| {
1032                    error!(?err, ?id, "Unable to load rs256 DER verifier");
1033                    OperationError::KP0054KeyObjectJwsRs256DerInvalid
1034                })?;
1035
1036                InternalJwtRs256Status::Retained {
1037                    verifier,
1038                    public_der: der.to_vec(),
1039                }
1040            }
1041            KeyStatus::Revoked => {
1042                let untrusted_verifier = JwsRs256Verifier::from_rs256_der(der).map_err(|err| {
1043                    error!(?err, ?id, "Unable to load rs256 DER revoked verifier");
1044                    OperationError::KP0055KeyObjectJwsRs256DerInvalid
1045                })?;
1046
1047                InternalJwtRs256Status::Revoked {
1048                    untrusted_verifier,
1049                    public_der: der.to_vec(),
1050                }
1051            }
1052        };
1053
1054        let internal_jwt = InternalJwtRs256 {
1055            valid_from,
1056            status,
1057            status_cid,
1058        };
1059
1060        self.all.insert(id, internal_jwt);
1061
1062        Ok(())
1063    }
1064
1065    fn to_key_iter(&self) -> impl Iterator<Item = (KeyId, KeyInternalData)> + '_ {
1066        self.all.iter().map(|(key_id, internal_jwt)| {
1067            let usage = KeyUsage::JwsRs256;
1068
1069            let valid_from = internal_jwt.valid_from;
1070            let status_cid = internal_jwt.status_cid.clone();
1071
1072            let (status, der) = match &internal_jwt.status {
1073                InternalJwtRs256Status::Valid { private_der, .. } => {
1074                    (KeyStatus::Valid, private_der.clone())
1075                }
1076                InternalJwtRs256Status::Retained { public_der, .. } => {
1077                    (KeyStatus::Retained, public_der.clone().into())
1078                }
1079                InternalJwtRs256Status::Revoked { public_der, .. } => {
1080                    (KeyStatus::Revoked, public_der.clone().into())
1081                }
1082            };
1083
1084            (
1085                key_id.clone(),
1086                KeyInternalData {
1087                    usage,
1088                    valid_from,
1089                    der,
1090                    status,
1091                    status_cid,
1092                },
1093            )
1094        })
1095    }
1096
1097    fn sign<V: JwsSignable>(
1098        &self,
1099        jws: &V,
1100        current_time: Duration,
1101    ) -> Result<V::Signed, OperationError> {
1102        let Some(signing_key) = self.get_valid_signer(current_time) else {
1103            error!("No signing keys available. This may indicate that no keys are valid yet!");
1104            return Err(OperationError::KP0061KeyObjectNoActiveSigningKeys);
1105        };
1106
1107        signing_key.sign(jws).map_err(|jwt_err| {
1108            error!(?jwt_err, "Unable to sign jws");
1109            OperationError::KP0056KeyObjectJwsRs256Signature
1110        })
1111    }
1112
1113    fn verify<V: JwsVerifiable>(&self, jwsc: &V) -> Result<V::Verified, OperationError> {
1114        let internal_jws = jwsc
1115            .kid()
1116            .and_then(|kid| {
1117                debug!(?kid);
1118                self.all.get(kid)
1119            })
1120            .ok_or_else(|| {
1121                error!("JWS is signed by a key that is not present in this KeyObject");
1122                for pres_kid in self.all.keys() {
1123                    debug!(?pres_kid);
1124                }
1125                OperationError::KP0057KeyObjectJwsNotAssociated
1126            })?;
1127
1128        match &internal_jws.status {
1129            InternalJwtRs256Status::Valid { verifier, .. }
1130            | InternalJwtRs256Status::Retained { verifier, .. } => {
1131                verifier.verify(jwsc).map_err(|jwt_err| {
1132                    error!(?jwt_err, "Failed to verify jws");
1133                    OperationError::KP0058KeyObjectJwsInvalid
1134                })
1135            }
1136            InternalJwtRs256Status::Revoked { .. } => {
1137                error!("The key used to sign this JWS has been revoked.");
1138                Err(OperationError::KP0059KeyObjectJwsKeyRevoked)
1139            }
1140        }
1141    }
1142
1143    fn public_jwks(&self) -> JwkKeySet {
1144        let mut signing_keys: Vec<_> = self.all.iter().collect();
1147
1148        signing_keys.sort_unstable_by_key(|(_, k)| Reverse(k.valid_from));
1150
1151        let keys = signing_keys
1152            .iter()
1153            .filter_map(|(key_id, rs256)| {
1154                error!(?key_id);
1155                match &rs256.status {
1156                    InternalJwtRs256Status::Valid { verifier, .. }
1157                    | InternalJwtRs256Status::Retained { verifier, .. } => verifier
1158                        .public_key_as_jwk()
1159                        .map_err(|err| {
1160                            error!(?err);
1161                        })
1162                        .ok(),
1163                    InternalJwtRs256Status::Revoked { .. } => None,
1164                }
1165            })
1166            .collect::<Vec<_>>();
1167
1168        JwkKeySet { keys }
1169    }
1170
1171    fn public_jwk(&self, key_id: &str) -> Result<Option<Jwk>, OperationError> {
1172        if let Some(key_to_check) = self.all.get(key_id) {
1173            match &key_to_check.status {
1174                InternalJwtRs256Status::Valid { verifier, .. }
1175                | InternalJwtRs256Status::Retained { verifier, .. } => {
1176                    verifier.public_key_as_jwk().map(Some).map_err(|err| {
1177                        error!(?err, "Unable to construct public JWK.");
1178                        OperationError::KP0060KeyObjectJwsPublicJwk
1179                    })
1180                }
1181                InternalJwtRs256Status::Revoked { .. } => Ok(None),
1182            }
1183        } else {
1184            Ok(None)
1185        }
1186    }
1187
1188    #[cfg(test)]
1189    fn kid_status(&self, key_id: &KeyId) -> Result<Option<KeyStatus>, OperationError> {
1190        if let Some(key_to_check) = self.all.get(key_id) {
1191            let status = match &key_to_check.status {
1192                InternalJwtRs256Status::Valid { .. } => KeyStatus::Valid,
1193                InternalJwtRs256Status::Retained { .. } => KeyStatus::Retained,
1194                InternalJwtRs256Status::Revoked { .. } => KeyStatus::Revoked,
1195            };
1196            Ok(Some(status))
1197        } else {
1198            Ok(None)
1199        }
1200    }
1201}
1202
1203#[cfg(test)]
1204impl KeyObjectInternal {
1205    pub fn new_test() -> Arc<KeyObject> {
1206        let provider = Arc::new(KeyProviderInternal::create_test_provider());
1207
1208        let mut key_object = provider
1209            .create_new_key_object(Uuid::new_v4(), provider.clone())
1210            .expect("Unable to build new key object");
1211
1212        key_object
1213            .jws_es256_assert(Duration::from_secs(0), &Cid::new_zero())
1214            .expect("Unable to add jws_es256 to key object");
1215
1216        Arc::new(key_object)
1217    }
1218}
1219
1220impl KeyObjectT for KeyObjectInternal {
1221    fn uuid(&self) -> Uuid {
1222        self.uuid
1223    }
1224
1225    fn duplicate(&self) -> KeyObject {
1226        Box::new(self.clone())
1227    }
1228
1229    fn rotate_keys(&mut self, rotation_time: Duration, cid: &Cid) -> Result<(), OperationError> {
1230        if let Some(jws_es256_object) = &mut self.jws_es256 {
1231            jws_es256_object.new_active(rotation_time, cid)?;
1232        }
1233
1234        if let Some(jws_rs256_object) = &mut self.jws_rs256 {
1235            jws_rs256_object.new_active(rotation_time, cid)?;
1236        }
1237
1238        if let Some(jwe_a128_gcm) = &mut self.jwe_a128gcm {
1239            jwe_a128_gcm.new_active(rotation_time, cid)?;
1240        }
1241
1242        if let Some(jws_hs256_object) = &mut self.jws_hs256 {
1243            jws_hs256_object.new_active(rotation_time, cid)?;
1244        }
1245
1246        if let Some(hkdf_s256_object) = &mut self.hkdf_s256 {
1247            hkdf_s256_object.new_active(rotation_time, cid)?;
1248        }
1249
1250        Ok(())
1251    }
1252
1253    fn revoke_keys(
1254        &mut self,
1255        revoke_set: &BTreeSet<String>,
1256        cid: &Cid,
1257    ) -> Result<(), OperationError> {
1258        for revoke_key_id in revoke_set.iter() {
1259            let mut has_revoked = false;
1260
1261            if let Some(jws_es256_object) = &mut self.jws_es256 {
1262                if jws_es256_object.revoke(revoke_key_id, cid)? {
1263                    has_revoked = true;
1264                }
1265            };
1266
1267            if let Some(jws_rs256_object) = &mut self.jws_rs256 {
1268                if jws_rs256_object.revoke(revoke_key_id, cid)? {
1269                    has_revoked = true;
1270                }
1271            };
1272
1273            if let Some(jwe_a128_gcm) = &mut self.jwe_a128gcm {
1274                if jwe_a128_gcm.revoke(revoke_key_id, cid)? {
1275                    has_revoked = true;
1276                }
1277            };
1278
1279            if let Some(jws_hs256_object) = &mut self.jws_hs256 {
1280                if jws_hs256_object.revoke(revoke_key_id, cid)? {
1281                    has_revoked = true;
1282                }
1283            };
1284
1285            if let Some(hkdf_s256_object) = &mut self.hkdf_s256 {
1286                if hkdf_s256_object.revoke(revoke_key_id, cid)? {
1287                    has_revoked = true;
1288                }
1289            };
1290
1291            if !has_revoked {
1292                error!(?revoke_key_id, "Unable to revoked key, id not found");
1293                return Err(OperationError::KP0026KeyObjectNoSuchKey);
1294            }
1295        }
1296
1297        Ok(())
1298    }
1299
1300    fn jws_es256_sign(
1301        &self,
1302        jws: &Jws,
1303        current_time: Duration,
1304    ) -> Result<JwsCompact, OperationError> {
1305        if let Some(jws_es256_object) = &self.jws_es256 {
1306            jws_es256_object.sign(jws, current_time)
1307        } else {
1308            error!(provider_uuid = ?self.uuid, "jwt es256 not available on this provider");
1309            Err(OperationError::KP0017KeyProviderNoSuchKey)
1310        }
1311    }
1312
1313    fn jws_verify(&self, jwsc: &JwsCompact) -> Result<Jws, OperationError> {
1314        let alg = jwsc.alg();
1316
1317        match alg {
1318            JwaAlg::ES256 => {
1319                if let Some(jws_es256_object) = &self.jws_es256 {
1320                    jws_es256_object.verify(jwsc)
1321                } else {
1322                    error!(provider_uuid = ?self.uuid, "jwt es256 not available on this provider");
1323                    Err(OperationError::KP0018KeyProviderNoSuchKey)
1324                }
1325            }
1326            JwaAlg::HS256 => {
1327                if let Some(jws_hs256_object) = &self.jws_hs256 {
1328                    jws_hs256_object.verify(jwsc)
1329                } else {
1330                    error!(provider_uuid = ?self.uuid, "jwt hs256 not available on this provider");
1331                    Err(OperationError::KP0018KeyProviderNoSuchKey)
1332                }
1333            }
1334            JwaAlg::RS256 => {
1335                if let Some(jws_rs256_object) = &self.jws_rs256 {
1336                    jws_rs256_object.verify(jwsc)
1337                } else {
1338                    error!(provider_uuid = ?self.uuid, "jwt rs256 not available on this provider");
1339                    Err(OperationError::KP0018KeyProviderNoSuchKey)
1340                }
1341            } }
1350    }
1351
1352    fn jws_es256_jwks(&self) -> Option<JwkKeySet> {
1353        self.jws_es256
1354            .as_ref()
1355            .map(|jws_es256_object| jws_es256_object.public_jwks())
1356    }
1357
1358    fn jws_public_jwk(&self, key_id: &str) -> Result<Option<Jwk>, OperationError> {
1359        if let Some(jws_es256_object) = &self.jws_es256 {
1360            if let Some(status) = jws_es256_object.public_jwk(key_id)? {
1361                return Ok(Some(status));
1362            }
1363        }
1364
1365        if let Some(jws_rs256_object) = &self.jws_rs256 {
1366            if let Some(status) = jws_rs256_object.public_jwk(key_id)? {
1367                return Ok(Some(status));
1368            }
1369        }
1370
1371        Ok(None)
1372    }
1373
1374    #[instrument(level = "debug", name = "keyobject::jws_es256_import", skip_all)]
1375    fn jws_es256_import(
1376        &mut self,
1377        import_keys: &SmolSet<[Vec<u8>; 1]>,
1378        valid_from: Duration,
1379        cid: &Cid,
1380    ) -> Result<(), OperationError> {
1381        let koi = self
1382            .jws_es256
1383            .get_or_insert_with(KeyObjectInternalJwtEs256::default);
1384
1385        koi.import(import_keys, valid_from, cid)
1386    }
1387
1388    fn jws_es256_assert(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1389        let koi = self
1390            .jws_es256
1391            .get_or_insert_with(KeyObjectInternalJwtEs256::default);
1392
1393        koi.assert_active(valid_from, cid)
1394    }
1395
1396    fn jwe_decrypt(&self, jwec: &JweCompact) -> Result<Jwe, OperationError> {
1397        let (alg, enc) = jwec.get_alg_enc();
1398
1399        match (alg, enc) {
1400            (JweAlg::A128KW, JweEnc::A128GCM) => {
1401                if let Some(jwe_a128_gcm) = &self.jwe_a128gcm {
1402                    jwe_a128_gcm.decipher(jwec)
1403                } else {
1404                    error!(provider_uuid = ?self.uuid, "jwe a128gcm not available on this provider");
1405                    Err(OperationError::KP0033KeyProviderNoSuchKey)
1406                }
1407            }
1408            (unsupported_alg, unsupported_enc) => {
1409                error!(provider_uuid = ?self.uuid, ?unsupported_alg, ?unsupported_enc, "algorithm+encryption not available on this provider");
1411                Err(OperationError::KP0019KeyProviderUnsupportedAlgorithm)
1412            }
1413        }
1414    }
1415
1416    fn jwe_a128gcm_assert(
1417        &mut self,
1418        valid_from: Duration,
1419        cid: &Cid,
1420    ) -> Result<(), OperationError> {
1421        let koi = self
1422            .jwe_a128gcm
1423            .get_or_insert_with(KeyObjectInternalJweA128GCM::default);
1424
1425        koi.assert_active(valid_from, cid)
1426    }
1427
1428    fn jwe_a128gcm_encrypt(
1429        &self,
1430        jwe: &Jwe,
1431        current_time: Duration,
1432    ) -> Result<JweCompact, OperationError> {
1433        if let Some(jwe_a128_gcm) = &self.jwe_a128gcm {
1434            jwe_a128_gcm.encipher(jwe, current_time)
1435        } else {
1436            error!(provider_uuid = ?self.uuid, "jwe a128gcm not available on this provider");
1437            Err(OperationError::KP0032KeyProviderNoSuchKey)
1438        }
1439    }
1440
1441    #[cfg(test)]
1442    fn kid_status(&self, key_id: &KeyId) -> Result<Option<KeyStatus>, OperationError> {
1443        if let Some(jws_es256_object) = &self.jws_es256 {
1444            if let Some(status) = jws_es256_object.kid_status(key_id)? {
1445                return Ok(Some(status));
1446            }
1447        }
1448
1449        if let Some(jws_rs256_object) = &self.jws_rs256 {
1450            if let Some(status) = jws_rs256_object.kid_status(key_id)? {
1451                return Ok(Some(status));
1452            }
1453        }
1454
1455        Ok(None)
1456    }
1457
1458    fn as_valuesets(&self) -> Result<Vec<(Attribute, ValueSet)>, OperationError> {
1459        let key_iter = self
1460            .jws_es256
1461            .iter()
1462            .flat_map(|jws_es256| jws_es256.to_key_iter())
1463            .chain(
1464                self.jwe_a128gcm
1465                    .iter()
1466                    .flat_map(|jwe_a128gcm| jwe_a128gcm.to_key_iter()),
1467            )
1468            .chain(
1469                self.jws_hs256
1470                    .iter()
1471                    .flat_map(|jws_hs256| jws_hs256.to_key_iter()),
1472            )
1473            .chain(
1474                self.jws_rs256
1475                    .iter()
1476                    .flat_map(|jws_rs256| jws_rs256.to_key_iter()),
1477            )
1478            .chain(
1479                self.hkdf_s256
1480                    .iter()
1481                    .flat_map(|hkdf_s256| hkdf_s256.to_key_iter()),
1482            );
1483        let key_vs = ValueSetKeyInternal::from_key_iter(key_iter)? as ValueSet;
1484
1485        Ok(vec![
1486            (
1487                Attribute::Class,
1488                ValueSetIutf8::new(EntryClass::KeyObjectInternal.into()) as ValueSet,
1489            ),
1490            (
1491                Attribute::KeyProvider,
1492                ValueSetRefer::new(self.provider.uuid()) as ValueSet,
1493            ),
1494            (Attribute::KeyInternalData, key_vs),
1495        ])
1496    }
1497
1498    #[instrument(level = "debug", name = "keyobject::jws_rs256_import", skip_all)]
1499    fn jws_rs256_import(
1500        &mut self,
1501        import_keys: &SmolSet<[Vec<u8>; 1]>,
1502        valid_from: Duration,
1503        cid: &Cid,
1504    ) -> Result<(), OperationError> {
1505        let koi = self
1506            .jws_rs256
1507            .get_or_insert_with(KeyObjectInternalJwtRs256::default);
1508
1509        koi.import(import_keys, valid_from, cid)
1510    }
1511
1512    fn jws_rs256_assert(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1513        let koi = self
1514            .jws_rs256
1515            .get_or_insert_with(KeyObjectInternalJwtRs256::default);
1516
1517        koi.assert_active(valid_from, cid)
1518    }
1519
1520    fn jws_rs256_sign(
1521        &self,
1522        jws: &Jws,
1523        current_time: Duration,
1524    ) -> Result<JwsCompact, OperationError> {
1525        if let Some(jws_rs256_object) = &self.jws_rs256 {
1526            jws_rs256_object.sign(jws, current_time)
1527        } else {
1528            error!(provider_uuid = ?self.uuid, "jwt rs256 not available on this provider");
1529            Err(OperationError::KP0062KeyProviderNoSuchKey)
1530        }
1531    }
1532
1533    fn jws_rs256_jwks(&self) -> Option<JwkKeySet> {
1534        self.jws_rs256
1535            .as_ref()
1536            .map(|jws_rs256_object| jws_rs256_object.public_jwks())
1537    }
1538
1539    fn hkdf_s256_assert(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1540        let koi = self
1541            .hkdf_s256
1542            .get_or_insert_with(KeyObjectInternalHkdfS256::default);
1543
1544        koi.assert_active(valid_from, cid)
1545    }
1546
1547    fn hkdf_s256_expand(
1550        &self,
1551        info: &[u8],
1552        output_key: &mut [u8],
1553        current_time: Duration,
1554    ) -> Result<(), OperationError> {
1555        if let Some(hkdf_s256_object) = &self.hkdf_s256 {
1556            hkdf_s256_object.hkdf_s256_expand(info, output_key, current_time)
1557        } else {
1558            error!(provider_uuid = ?self.uuid, "hkdf s256 not available on this provider");
1559            Err(OperationError::KP0077KeyProviderNoSuchKey)
1560        }
1561    }
1562}
1563
1564#[derive(Clone)]
1565enum InternalJwtHs256Status {
1566    Valid { verifier: JwsHs256Signer },
1567    Retained { verifier: JwsHs256Signer },
1568    Revoked,
1569}
1570
1571#[derive(Clone)]
1572struct InternalJwtHs256 {
1573    valid_from: u64,
1574    status: InternalJwtHs256Status,
1575    status_cid: Cid,
1576}
1577
1578#[derive(Default, Clone)]
1579struct KeyObjectInternalJwtHs256 {
1580    active: BTreeMap<u64, JwsHs256Signer>,
1586
1587    all: BTreeMap<KeyId, InternalJwtHs256>,
1590}
1591
1592#[allow(dead_code)]
1594impl KeyObjectInternalJwtHs256 {
1595    fn get_valid_signer(&self, time: Duration) -> Option<&JwsHs256Signer> {
1596        let ct_secs = time.as_secs();
1597
1598        self.active
1599            .range((Unbounded, Included(ct_secs)))
1600            .next_back()
1601            .map(|(_time, signer)| signer)
1602    }
1603
1604    fn assert_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1605        if self.get_valid_signer(valid_from).is_none() {
1606            debug!("no active jwt hs256 found, creating a new one ...");
1608            self.new_active(valid_from, cid)
1609        } else {
1610            Ok(())
1611        }
1612    }
1613
1614    fn import(
1615        &mut self,
1616        import_keys: &SmolSet<[Vec<u8>; 1]>,
1617        valid_from: Duration,
1618        cid: &Cid,
1619    ) -> Result<(), OperationError> {
1620        let valid_from = valid_from.as_secs();
1621
1622        for private_bytes in import_keys {
1623            let mut signer = JwsHs256Signer::try_from(private_bytes.as_slice()).map_err(|err| {
1624                error!(?err, "Unable to load imported hs256 DER signer");
1625                OperationError::KP0063KeyObjectJwsHs256DerInvalid
1626            })?;
1627
1628            let verifier = signer.clone();
1629
1630            let kid = signer.get_legacy_kid().to_string();
1632            debug!(?kid, "imported key");
1633
1634            signer.set_kid(kid.as_str());
1636
1637            self.active.insert(valid_from, signer.clone());
1638
1639            self.all.insert(
1640                kid,
1641                InternalJwtHs256 {
1642                    valid_from,
1643                    status: InternalJwtHs256Status::Valid { verifier },
1644                    status_cid: cid.clone(),
1645                },
1646            );
1647        }
1648
1649        Ok(())
1650    }
1651
1652    #[instrument(level = "debug", name = "keyobject::jws_hs256::new", skip_all)]
1653    fn new_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1654        let valid_from = valid_from.as_secs();
1655
1656        let signer = JwsHs256Signer::generate_hs256().map_err(|jwt_error| {
1657            error!(?jwt_error, "Unable to generate new jwt hs256 signing key");
1658            OperationError::KP0065KeyObjectJwtHs256Generation
1659        })?;
1660
1661        let verifier = signer.clone();
1662
1663        self.active.insert(valid_from, signer.clone());
1664
1665        let kid = JwsVerifier::get_kid(&signer).to_string();
1667
1668        self.all.insert(
1669            kid,
1670            InternalJwtHs256 {
1671                valid_from,
1672                status: InternalJwtHs256Status::Valid { verifier },
1673                status_cid: cid.clone(),
1674            },
1675        );
1676
1677        Ok(())
1678    }
1679
1680    fn revoke(&mut self, revoke_key_id: &KeyId, cid: &Cid) -> Result<bool, OperationError> {
1681        if let Some(key_to_revoke) = self.all.get_mut(revoke_key_id) {
1682            if matches!(&key_to_revoke.status, InternalJwtHs256Status::Revoked) {
1683                return Ok(false);
1684            }
1685
1686            key_to_revoke.status_cid = cid.clone();
1687            key_to_revoke.status = InternalJwtHs256Status::Revoked;
1688
1689            let valid_from = key_to_revoke.valid_from;
1690
1691            self.active.remove(&valid_from);
1693
1694            Ok(true)
1695        } else {
1696            Ok(false)
1698        }
1699    }
1700
1701    fn load(
1702        &mut self,
1703        id: &str,
1704        status: KeyStatus,
1705        status_cid: Cid,
1706        der: &[u8],
1707        valid_from: u64,
1708    ) -> Result<(), OperationError> {
1709        let id: KeyId = id.to_string();
1710
1711        let status = match status {
1712            KeyStatus::Valid => {
1713                let mut signer = JwsHs256Signer::try_from(der).map_err(|err| {
1714                    error!(?err, ?id, "Unable to load hs256 DER signer");
1715                    OperationError::KP0066KeyObjectJwsHs256DerInvalid
1716                })?;
1717
1718                signer.set_kid(id.as_str());
1720
1721                let verifier = signer.clone();
1722
1723                self.active.insert(valid_from, signer);
1724
1725                InternalJwtHs256Status::Valid { verifier }
1726            }
1727            KeyStatus::Retained => {
1728                let verifier = JwsHs256Signer::try_from(der).map_err(|err| {
1729                    error!(?err, ?id, "Unable to load hs256 DER verifier");
1730                    OperationError::KP0068KeyObjectJwsHs256DerInvalid
1731                })?;
1732
1733                InternalJwtHs256Status::Retained { verifier }
1734            }
1735            KeyStatus::Revoked => InternalJwtHs256Status::Revoked,
1736        };
1737
1738        let internal_jwt = InternalJwtHs256 {
1739            valid_from,
1740            status,
1741            status_cid,
1742        };
1743
1744        self.all.insert(id, internal_jwt);
1745
1746        Ok(())
1747    }
1748
1749    fn to_key_iter(&self) -> impl Iterator<Item = (KeyId, KeyInternalData)> + '_ {
1750        self.all.iter().map(|(key_id, internal_jwt)| {
1751            let usage = KeyUsage::JwsHs256;
1752
1753            let valid_from = internal_jwt.valid_from;
1754            let status_cid = internal_jwt.status_cid.clone();
1755
1756            let (status, der) = match &internal_jwt.status {
1757                InternalJwtHs256Status::Valid { verifier } => (
1758                    KeyStatus::Valid,
1759                    verifier.as_ref().as_slice().to_vec().into(),
1760                ),
1761                InternalJwtHs256Status::Retained { verifier } => (
1762                    KeyStatus::Retained,
1763                    verifier.as_ref().as_slice().to_vec().into(),
1764                ),
1765                InternalJwtHs256Status::Revoked => {
1766                    (KeyStatus::Revoked, Vec::with_capacity(0).into())
1767                }
1768            };
1769
1770            (
1771                key_id.clone(),
1772                KeyInternalData {
1773                    usage,
1774                    valid_from,
1775                    der,
1776                    status,
1777                    status_cid,
1778                },
1779            )
1780        })
1781    }
1782
1783    fn sign<V: JwsSignable>(
1784        &self,
1785        jws: &V,
1786        current_time: Duration,
1787    ) -> Result<V::Signed, OperationError> {
1788        let Some(signing_key) = self.get_valid_signer(current_time) else {
1789            error!("No signing keys available. This may indicate that no keys are valid yet!");
1790            return Err(OperationError::KP0069KeyObjectNoActiveSigningKeys);
1791        };
1792
1793        signing_key.sign(jws).map_err(|jwt_err| {
1794            error!(?jwt_err, "Unable to sign jws");
1795            OperationError::KP0070KeyObjectJwsHs256Signature
1796        })
1797    }
1798
1799    fn verify<V: JwsVerifiable>(&self, jwsc: &V) -> Result<V::Verified, OperationError> {
1800        let internal_jws = jwsc
1801            .kid()
1802            .and_then(|kid| {
1803                debug!(?kid);
1804                self.all.get(kid)
1805            })
1806            .ok_or_else(|| {
1807                error!("JWS is signed by a key that is not present in this KeyObject");
1808                for pres_kid in self.all.keys() {
1809                    debug!(?pres_kid);
1810                }
1811                OperationError::KP0022KeyObjectJwsNotAssociated
1812            })?;
1813
1814        match &internal_jws.status {
1815            InternalJwtHs256Status::Valid { verifier, .. }
1816            | InternalJwtHs256Status::Retained { verifier, .. } => {
1817                verifier.verify(jwsc).map_err(|jwt_err| {
1818                    error!(?jwt_err, "Failed to verify jws");
1819                    OperationError::KP0024KeyObjectJwsInvalid
1820                })
1821            }
1822            InternalJwtHs256Status::Revoked => {
1823                error!("The key used to sign this JWS has been revoked.");
1824                Err(OperationError::KP0023KeyObjectJwsKeyRevoked)
1825            }
1826        }
1827    }
1828
1829    fn public_jwks(&self) -> JwkKeySet {
1830        JwkKeySet {
1831            keys: Vec::with_capacity(0),
1832        }
1833    }
1834
1835    fn public_jwk(&self, _key_id: &str) -> Result<Option<Jwk>, OperationError> {
1836        Ok(None)
1838    }
1839
1840    #[cfg(test)]
1841    fn kid_status(&self, key_id: &KeyId) -> Result<Option<KeyStatus>, OperationError> {
1842        if let Some(key_to_check) = self.all.get(key_id) {
1843            let status = match &key_to_check.status {
1844                InternalJwtHs256Status::Valid { .. } => KeyStatus::Valid,
1845                InternalJwtHs256Status::Retained { .. } => KeyStatus::Retained,
1846                InternalJwtHs256Status::Revoked => KeyStatus::Revoked,
1847            };
1848            Ok(Some(status))
1849        } else {
1850            Ok(None)
1851        }
1852    }
1853}
1854
1855#[derive(Clone)]
1856enum InternalHkdfS256Status {
1857    Valid { verifier: HmacSha256Key },
1858    Retained { verifier: HmacSha256Key },
1859    Revoked,
1860}
1861
1862#[derive(Clone)]
1863struct InternalHkdfS256 {
1864    valid_from: u64,
1865    status: InternalHkdfS256Status,
1866    status_cid: Cid,
1867}
1868
1869#[derive(Default, Clone)]
1870struct KeyObjectInternalHkdfS256 {
1871    active: BTreeMap<u64, HmacSha256Key>,
1877
1878    all: BTreeMap<KeyId, InternalHkdfS256>,
1881}
1882
1883#[allow(dead_code)]
1885impl KeyObjectInternalHkdfS256 {
1886    fn get_valid_signer(&self, time: Duration) -> Option<&HmacSha256Key> {
1887        let ct_secs = time.as_secs();
1888
1889        self.active
1890            .range((Unbounded, Included(ct_secs)))
1891            .next_back()
1892            .map(|(_time, signer)| signer)
1893    }
1894
1895    fn assert_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1896        if self.get_valid_signer(valid_from).is_none() {
1897            debug!("no active hs256 found, creating a new one ...");
1899            self.new_active(valid_from, cid)
1900        } else {
1901            Ok(())
1902        }
1903    }
1904
1905    #[instrument(level = "debug", name = "keyobject::hs256::new", skip_all)]
1906    fn new_active(&mut self, valid_from: Duration, cid: &Cid) -> Result<(), OperationError> {
1907        let valid_from = valid_from.as_secs();
1908
1909        let signer = hmac_s256::new_key();
1910        let verifier = signer.clone();
1911
1912        self.active.insert(valid_from, signer.clone());
1913
1914        let mut hmac = HmacSha256::new(&signer);
1918        hmac.update(b"key identifier");
1919        let hashout = hmac.finalize();
1920        let mut kid = hex::encode(hashout.into_bytes());
1921        kid.truncate(KID_LEN);
1922
1923        self.all.insert(
1924            kid,
1925            InternalHkdfS256 {
1926                valid_from,
1927                status: InternalHkdfS256Status::Valid { verifier },
1928                status_cid: cid.clone(),
1929            },
1930        );
1931
1932        Ok(())
1933    }
1934
1935    fn revoke(&mut self, revoke_key_id: &KeyId, cid: &Cid) -> Result<bool, OperationError> {
1936        if let Some(key_to_revoke) = self.all.get_mut(revoke_key_id) {
1937            if matches!(&key_to_revoke.status, InternalHkdfS256Status::Revoked) {
1938                return Ok(false);
1939            }
1940
1941            key_to_revoke.status_cid = cid.clone();
1942            key_to_revoke.status = InternalHkdfS256Status::Revoked;
1943
1944            let valid_from = key_to_revoke.valid_from;
1945
1946            self.active.remove(&valid_from);
1948
1949            Ok(true)
1950        } else {
1951            Ok(false)
1953        }
1954    }
1955
1956    fn load(
1957        &mut self,
1958        id: &str,
1959        status: KeyStatus,
1960        status_cid: Cid,
1961        der: &[u8],
1962        valid_from: u64,
1963    ) -> Result<(), OperationError> {
1964        let id: KeyId = id.to_string();
1965
1966        let status = match status {
1967            KeyStatus::Valid => {
1968                let signer = hmac_s256::key_from_slice(der).ok_or_else(|| {
1969                    error!(?id, "Unable to load hs256 verifier");
1970                    OperationError::KP0072KeyObjectHs256Invalid
1971                })?;
1972
1973                let verifier = signer.clone();
1974
1975                self.active.insert(valid_from, signer);
1976
1977                InternalHkdfS256Status::Valid { verifier }
1978            }
1979            KeyStatus::Retained => {
1980                let verifier = hmac_s256::key_from_slice(der).ok_or_else(|| {
1981                    error!(?id, "Unable to load hs256 verifier");
1982                    OperationError::KP0073KeyObjectHs256Invalid
1983                })?;
1984
1985                InternalHkdfS256Status::Retained { verifier }
1986            }
1987            KeyStatus::Revoked => InternalHkdfS256Status::Revoked,
1988        };
1989
1990        let internal = InternalHkdfS256 {
1991            valid_from,
1992            status,
1993            status_cid,
1994        };
1995
1996        self.all.insert(id, internal);
1997
1998        Ok(())
1999    }
2000
2001    fn to_key_iter(&self) -> impl Iterator<Item = (KeyId, KeyInternalData)> + '_ {
2002        self.all.iter().map(|(key_id, internal_jwt)| {
2003            let usage = KeyUsage::HkdfS256;
2004
2005            let valid_from = internal_jwt.valid_from;
2006            let status_cid = internal_jwt.status_cid.clone();
2007
2008            let (status, der) = match &internal_jwt.status {
2009                InternalHkdfS256Status::Valid { verifier } => {
2010                    (KeyStatus::Valid, verifier.as_slice().to_vec().into())
2011                }
2012                InternalHkdfS256Status::Retained { verifier } => {
2013                    (KeyStatus::Retained, verifier.as_slice().to_vec().into())
2014                }
2015                InternalHkdfS256Status::Revoked => {
2016                    (KeyStatus::Revoked, Vec::with_capacity(0).into())
2017                }
2018            };
2019
2020            (
2021                key_id.clone(),
2022                KeyInternalData {
2023                    usage,
2024                    valid_from,
2025                    der,
2026                    status,
2027                    status_cid,
2028                },
2029            )
2030        })
2031    }
2032
2033    fn hkdf_s256_expand(
2034        &self,
2035        info: &[u8],
2036        output_key: &mut [u8],
2037        current_time: Duration,
2038    ) -> Result<(), OperationError> {
2039        let Some(signing_key) = self.get_valid_signer(current_time) else {
2040            error!("No signing keys available. This may indicate that no keys are valid yet!");
2041            return Err(OperationError::KP0074KeyObjectNoActiveSigningKeys);
2042        };
2043
2044        let hkdf = HkdfSha256::from_prk(signing_key.as_slice()).map_err(|err| {
2047            error!(?err, "Invalid PRK length - THIS SHOULD NEVER HAPPEN!!!!");
2048            OperationError::KP0075KeyObjectHmacInvalidLength
2049        })?;
2050
2051        hkdf.expand(info, output_key).map_err(|err| {
2052            error!(
2053                ?err,
2054                "Requested output key size is too large to safely derive."
2055            );
2056            OperationError::KP0076KeyObjectHkdfOutputLengthInvalid
2057        })
2058    }
2059
2060    #[cfg(test)]
2061    fn kid_status(&self, key_id: &KeyId) -> Result<Option<KeyStatus>, OperationError> {
2062        if let Some(key_to_check) = self.all.get(key_id) {
2063            let status = match &key_to_check.status {
2064                InternalHkdfS256Status::Valid { .. } => KeyStatus::Valid,
2065                InternalHkdfS256Status::Retained { .. } => KeyStatus::Retained,
2066                InternalHkdfS256Status::Revoked => KeyStatus::Revoked,
2067            };
2068            Ok(Some(status))
2069        } else {
2070            Ok(None)
2071        }
2072    }
2073}
2074
2075#[cfg(test)]
2076mod tests {
2077    use super::*;
2078    use crate::server::keys::*;
2079    use compact_jwt::jws::JwsBuilder;
2080
2081    #[tokio::test]
2082    async fn test_key_object_internal_basic() {
2083        let ct = duration_from_epoch_now();
2084        let test_provider = Arc::new(KeyProviderInternal::create_test_provider());
2085
2086        test_provider.test().expect("Provider failed testing");
2087
2088        let mut key_object = test_provider
2089            .create_new_key_object(Uuid::new_v4(), test_provider.clone())
2090            .expect("Unable to create new key object");
2091
2092        key_object
2093            .jws_es256_assert(ct, &Cid::new_count(ct.as_secs()))
2094            .expect("Unable to create signing key");
2095
2096        let jws = JwsBuilder::from(vec![0, 1, 2, 3, 4]).build();
2097
2098        let sig = key_object
2099            .jws_es256_sign(&jws, ct)
2100            .expect("Unable to sign jws");
2101
2102        let released = key_object.jws_verify(&sig).expect("Unable to validate jws");
2103
2104        assert_eq!(released.payload(), &[0, 1, 2, 3, 4]);
2105    }
2106
2107    #[qs_test]
2108    async fn test_key_object_internal_es256(server: &QueryServer) {
2109        let ct = duration_from_epoch_now();
2110        let mut write_txn = server.write(ct).await.unwrap();
2111
2112        let default_key_provider = write_txn
2114            .get_key_providers()
2115            .get_default()
2116            .expect("Unable to access default key provider object.");
2117
2118        assert_eq!(default_key_provider.uuid(), UUID_KEY_PROVIDER_INTERNAL);
2119
2120        let key_object_uuid = Uuid::new_v4();
2122
2123        write_txn
2124            .internal_create(vec![entry_init!(
2125                (Attribute::Class, EntryClass::Object.to_value()),
2126                (Attribute::Class, EntryClass::KeyObject.to_value()),
2127                (Attribute::Class, EntryClass::KeyObjectJwtEs256.to_value()),
2129                (Attribute::Uuid, Value::Uuid(key_object_uuid))
2130            )])
2131            .expect("Unable to create new key object");
2132
2133        write_txn.reload().expect("Unable to reload transaction");
2135
2136        let key_object_entry = write_txn
2138            .internal_search_uuid(key_object_uuid)
2139            .expect("Unable to retrieve key object by uuid");
2140
2141        assert!(key_object_entry.attribute_pres(Attribute::KeyInternalData));
2143
2144        let jws = JwsBuilder::from(vec![0, 1, 2, 3, 4]).build();
2147
2148        let jwsc_sig_1 = {
2149            let key_object_loaded = write_txn
2150                .get_key_providers()
2151                .get_key_object(key_object_uuid)
2152                .expect("Unable to retrieve key object by uuid");
2153
2154            let jwsc_sig_1 = key_object_loaded
2156                .jws_es256_sign(&jws, ct)
2157                .expect("Unable to sign jws");
2158
2159            assert!(jwsc_sig_1.get_jwk_pubkey_url().is_none());
2160
2161            let released = key_object_loaded
2162                .jws_verify(&jwsc_sig_1)
2163                .expect("Unable to validate jws");
2164
2165            assert_eq!(released.payload(), &[0, 1, 2, 3, 4]);
2166
2167            jwsc_sig_1
2168        };
2169
2170        let ct_future = ct + Duration::from_secs(300);
2174
2175        write_txn
2176            .internal_modify_uuid(
2177                key_object_uuid,
2178                &ModifyList::new_append(
2179                    Attribute::KeyActionRotate,
2180                    Value::new_datetime_epoch(ct_future),
2181                ),
2182            )
2183            .expect("Unable to rotate key.");
2184
2185        write_txn.reload().expect("Unable to reload transaction");
2188
2189        let (jwsc_sig_2, jwsc_sig_3) = {
2190            let key_object_loaded = write_txn
2191                .get_key_providers()
2192                .get_key_object(key_object_uuid)
2193                .expect("Unable to retrieve key object by uuid");
2194
2195            let jwsc_sig_2 = key_object_loaded
2197                .jws_es256_sign(&jws, ct)
2198                .expect("Unable to sign jws");
2199
2200            let jwsc_sig_3 = key_object_loaded
2202                .jws_es256_sign(&jws, ct_future)
2203                .expect("Unable to sign jws");
2204
2205            (jwsc_sig_2, jwsc_sig_3)
2206        };
2207
2208        assert_eq!(jwsc_sig_1.kid(), jwsc_sig_2.kid());
2209        assert_ne!(jwsc_sig_2.kid(), jwsc_sig_3.kid());
2210
2211        let remain_key = jwsc_sig_3.kid().unwrap().to_string();
2214        let revoke_kid = jwsc_sig_2.kid().unwrap().to_string();
2216
2217        {
2219            let key_object = write_txn
2220                .internal_search_uuid(key_object_uuid)
2221                .expect("unable to access key object");
2222
2223            let key_internal_map = key_object
2224                .get_ava_set(Attribute::KeyInternalData)
2225                .and_then(|vs| vs.as_key_internal_map())
2226                .expect("Unable to access key internal map.");
2227
2228            let revoke_key_status = key_internal_map
2229                .get(&revoke_kid)
2230                .map(|kdata| kdata.status)
2231                .expect("Key ID not found");
2232
2233            assert_eq!(revoke_key_status, KeyStatus::Valid);
2234
2235            let remain_key_status = key_internal_map
2236                .get(&remain_key)
2237                .map(|kdata| kdata.status)
2238                .expect("Key ID not found");
2239
2240            assert_eq!(remain_key_status, KeyStatus::Valid);
2241            }
2243
2244        write_txn
2246            .internal_modify_uuid(
2247                key_object_uuid,
2248                &ModifyList::new_append(
2249                    Attribute::KeyActionRevoke,
2250                    Value::HexString(revoke_kid.clone()),
2251                ),
2252            )
2253            .expect("Unable to revoke key.");
2254
2255        write_txn.reload().expect("Unable to reload transaction");
2258
2259        {
2260            let key_object = write_txn
2261                .internal_search_uuid(key_object_uuid)
2262                .expect("unable to access key object");
2263
2264            let key_internal_map = key_object
2265                .get_ava_set(Attribute::KeyInternalData)
2266                .and_then(|vs| vs.as_key_internal_map())
2267                .expect("Unable to access key internal map.");
2268
2269            let revoke_key_status = key_internal_map
2270                .get(&revoke_kid)
2271                .map(|kdata| kdata.status)
2272                .expect("Key ID not found");
2273
2274            trace!(?revoke_kid);
2275
2276            assert_eq!(revoke_key_status, KeyStatus::Revoked);
2277
2278            let remain_key_status = key_internal_map
2279                .get(&remain_key)
2280                .map(|kdata| kdata.status)
2281                .expect("Key ID not found");
2282
2283            trace!(?remain_key);
2284            trace!(?remain_key_status);
2285
2286            assert_eq!(remain_key_status, KeyStatus::Valid);
2287            }
2289
2290        {
2293            let key_object_loaded = write_txn
2294                .get_key_providers()
2295                .get_key_object(key_object_uuid)
2296                .expect("Unable to retrieve key object by uuid");
2297
2298            let _ = key_object_loaded
2299                .jws_es256_sign(&jws, ct)
2300                .expect("Unable to sign jws");
2301
2302            let _jwsc_sig_4 = key_object_loaded
2304                .jws_es256_sign(&jws, ct_future)
2305                .expect("Unable to sign jws");
2306        }
2307
2308        write_txn.commit().expect("Failed to commit");
2309    }
2310}