components/appid/
checker_sha.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 SHA-based credential checkers.
6
7use core::mem::MaybeUninit;
8use kernel::component::Component;
9use kernel::hil::digest;
10
11#[macro_export]
12macro_rules! app_checker_sha256_component_static {
13    () => {{
14        let buffer = kernel::static_buf!([u8; 32]);
15        let checker =
16            kernel::static_buf!(capsules_system::process_checker::basic::AppCheckerSha256);
17
18        (checker, buffer)
19    };};
20}
21
22pub type AppCheckerSha256ComponentType = capsules_system::process_checker::basic::AppCheckerSha256;
23
24pub struct AppCheckerSha256Component<S: 'static + digest::Digest<'static, 32>> {
25    sha: &'static S,
26}
27
28impl<S: 'static + digest::Digest<'static, 32>> AppCheckerSha256Component<S> {
29    pub fn new(sha: &'static S) -> Self {
30        Self { sha }
31    }
32}
33
34impl<
35        S: kernel::hil::digest::Sha256
36            + 'static
37            + digest::Digest<'static, 32>
38            + kernel::hil::digest::DigestDataVerify<'static, 32>,
39    > Component for AppCheckerSha256Component<S>
40{
41    type StaticInput = (
42        &'static mut MaybeUninit<capsules_system::process_checker::basic::AppCheckerSha256>,
43        &'static mut MaybeUninit<[u8; 32]>,
44    );
45
46    type Output = &'static capsules_system::process_checker::basic::AppCheckerSha256;
47
48    fn finalize(self, s: Self::StaticInput) -> Self::Output {
49        let buffer = s.1.write([0; 32]);
50
51        let checker = s.0.write(
52            capsules_system::process_checker::basic::AppCheckerSha256::new(self.sha, buffer),
53        );
54
55        digest::Digest::set_client(self.sha, checker);
56
57        checker
58    }
59}