components/appid/
checker_signature.rs1use core::mem::MaybeUninit;
8use kernel::component::Component;
9use kernel::hil::{digest, public_key_crypto};
10
11#[macro_export]
12macro_rules! app_checker_signature_component_static {
13 ($S:ty, $H:ty, $HL:expr, $SL:expr $(,)?) => {{
14 let hash_buffer = kernel::static_buf!([u8; $HL]);
15 let signature_buffer = kernel::static_buf!([u8; $SL]);
16 let checker = kernel::static_buf!(
17 capsules_system::process_checker::signature::AppCheckerSignature<
18 'static,
19 $S,
20 $H,
21 $HL,
22 $SL,
23 >
24 );
25
26 (checker, hash_buffer, signature_buffer)
27 };};
28}
29
30pub type AppCheckerSignatureComponentType<S, H, const HL: usize, const SL: usize> =
31 capsules_system::process_checker::signature::AppCheckerSignature<'static, S, H, HL, SL>;
32
33pub struct AppCheckerSignatureComponent<
34 S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL> + 'static,
35 H: kernel::hil::digest::DigestDataHash<'static, HL> + 'static,
36 const HL: usize,
37 const SL: usize,
38> {
39 hasher: &'static H,
40 verifier: &'static S,
41 credential_type: tock_tbf::types::TbfFooterV2CredentialsType,
42}
43
44impl<
45 S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL>,
46 H: kernel::hil::digest::DigestDataHash<'static, HL>,
47 const HL: usize,
48 const SL: usize,
49 > AppCheckerSignatureComponent<S, H, HL, SL>
50{
51 pub fn new(
52 hasher: &'static H,
53 verifier: &'static S,
54 credential_type: tock_tbf::types::TbfFooterV2CredentialsType,
55 ) -> Self {
56 Self {
57 hasher,
58 verifier,
59 credential_type,
60 }
61 }
62}
63
64impl<
65 S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL>,
66 H: kernel::hil::digest::DigestDataHash<'static, HL> + kernel::hil::digest::Digest<'static, HL>,
67 const HL: usize,
68 const SL: usize,
69 > Component for AppCheckerSignatureComponent<S, H, HL, SL>
70{
71 type StaticInput = (
72 &'static mut MaybeUninit<
73 capsules_system::process_checker::signature::AppCheckerSignature<'static, S, H, HL, SL>,
74 >,
75 &'static mut MaybeUninit<[u8; HL]>,
76 &'static mut MaybeUninit<[u8; SL]>,
77 );
78
79 type Output = &'static capsules_system::process_checker::signature::AppCheckerSignature<
80 'static,
81 S,
82 H,
83 HL,
84 SL,
85 >;
86
87 fn finalize(self, s: Self::StaticInput) -> Self::Output {
88 let hash_buffer = s.1.write([0; HL]);
89 let signature_buffer = s.2.write([0; SL]);
90
91 let checker = s.0.write(
92 capsules_system::process_checker::signature::AppCheckerSignature::new(
93 self.hasher,
94 self.verifier,
95 hash_buffer,
96 signature_buffer,
97 self.credential_type,
98 ),
99 );
100
101 digest::Digest::set_client(self.hasher, checker);
102 public_key_crypto::signature::SignatureVerify::set_verify_client(self.verifier, checker);
103
104 checker
105 }
106}