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 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 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: BTreeMap<u64, JweA128KWEncipher>,
200
201 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 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 self.active.remove(&valid_from);
292
293 Ok(true)
294 } else {
295 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 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: BTreeMap<u64, JwsEs256Signer>,
426
427 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 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 let kid = signer.get_legacy_kid().to_string();
476 debug!(?kid, "imported key");
477
478 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 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 self.active.remove(&valid_from);
569
570 Ok(true)
571 } else {
572 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 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 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 let mut signing_keys: Vec<_> = self.all.iter().collect();
727
728 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: BTreeMap<u64, JwsRs256Signer>,
811
812 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 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 let kid = signer.get_legacy_kid().to_string();
861 debug!(?kid, "imported key");
862
863 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 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 self.active.remove(&valid_from);
954
955 Ok(true)
956 } else {
957 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 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 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 let mut signing_keys: Vec<_> = self.all.iter().collect();
1112
1113 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 }
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 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 } }
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 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: BTreeMap<u64, JwsHs256Signer>,
1514
1515 all: BTreeMap<KeyId, InternalJwtHs256>,
1518}
1519
1520#[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 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 let kid = signer.get_legacy_kid().to_string();
1560 debug!(?kid, "imported key");
1561
1562 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 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 self.active.remove(&valid_from);
1621
1622 Ok(true)
1623 } else {
1624 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 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 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 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 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 (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 write_txn.reload().expect("Unable to reload transaction");
1843
1844 let key_object_entry = write_txn
1846 .internal_search_uuid(key_object_uuid)
1847 .expect("Unable to retrieve key object by uuid");
1848
1849 assert!(key_object_entry.attribute_pres(Attribute::KeyInternalData));
1851
1852 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 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 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 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 let jwsc_sig_2 = key_object_loaded
1905 .jws_es256_sign(&jws, ct)
1906 .expect("Unable to sign jws");
1907
1908 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 let remain_key = jwsc_sig_3.kid().unwrap().to_string();
1922 let revoke_kid = jwsc_sig_2.kid().unwrap().to_string();
1924
1925 {
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 }
1951
1952 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 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 }
1997
1998 {
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 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}