components/appid/
checker_signature.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2024.
4
5//! Components for signature credential checkers.
6
7use 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}