kanidmd_lib/server/keys/
internal.rs

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