components/
signature_verify_in_memory_keys.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 2025.
4
5//! Component for SignatureVerifyInMemoryKeys.
6
7use core::mem::MaybeUninit;
8use kernel::component::Component;
9use kernel::deferred_call::DeferredCallClient;
10
11#[macro_export]
12macro_rules! signature_verify_in_memory_keys_component_static {
13    ($S:ty, $NUM_KEYS:expr, $KL:expr, $HL:expr, $SL:expr $(,)?) => {{
14        let verifier = kernel::static_buf!(
15            capsules_extra::signature_verify_in_memory_keys::SignatureVerifyInMemoryKeys<
16                'static,
17                $S,
18                $NUM_KEYS,
19                $KL,
20                $HL,
21                $SL,
22            >
23        );
24
25        verifier
26    };};
27}
28
29pub type SignatureVerifyInMemoryKeysComponentType<
30    S,
31    const NUM_KEYS: usize,
32    const KL: usize,
33    const HL: usize,
34    const SL: usize,
35> = capsules_extra::signature_verify_in_memory_keys::SignatureVerifyInMemoryKeys<
36    'static,
37    S,
38    NUM_KEYS,
39    KL,
40    HL,
41    SL,
42>;
43
44pub struct SignatureVerifyInMemoryKeysComponent<
45    S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL>
46        + kernel::hil::public_key_crypto::keys::SetKeyBySlice<'static, KL>
47        + 'static,
48    const NUM_KEYS: usize,
49    const KL: usize,
50    const HL: usize,
51    const SL: usize,
52> {
53    verifier: &'static S,
54    keys: &'static mut [&'static mut [u8; KL]],
55}
56
57impl<
58        S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL>
59            + kernel::hil::public_key_crypto::keys::SetKeyBySlice<'static, KL>
60            + 'static,
61        const NUM_KEYS: usize,
62        const KL: usize,
63        const HL: usize,
64        const SL: usize,
65    > SignatureVerifyInMemoryKeysComponent<S, NUM_KEYS, KL, HL, SL>
66{
67    pub fn new(verifier: &'static S, keys: &'static mut [&'static mut [u8; KL]]) -> Self {
68        Self { verifier, keys }
69    }
70}
71
72impl<
73        S: kernel::hil::public_key_crypto::signature::SignatureVerify<'static, HL, SL>
74            + kernel::hil::public_key_crypto::keys::SetKeyBySlice<'static, KL>
75            + 'static,
76        const NUM_KEYS: usize,
77        const KL: usize,
78        const HL: usize,
79        const SL: usize,
80    > Component for SignatureVerifyInMemoryKeysComponent<S, NUM_KEYS, KL, HL, SL>
81{
82    type StaticInput = &'static mut MaybeUninit<
83        capsules_extra::signature_verify_in_memory_keys::SignatureVerifyInMemoryKeys<
84            'static,
85            S,
86            NUM_KEYS,
87            KL,
88            HL,
89            SL,
90        >,
91    >;
92
93    type Output =
94        &'static capsules_extra::signature_verify_in_memory_keys::SignatureVerifyInMemoryKeys<
95            'static,
96            S,
97            NUM_KEYS,
98            KL,
99            HL,
100            SL,
101        >;
102
103    fn finalize(self, s: Self::StaticInput) -> Self::Output {
104        let verifier_multiple_keys = s.write(
105            capsules_extra::signature_verify_in_memory_keys::SignatureVerifyInMemoryKeys::new(
106                self.verifier,
107            ),
108        );
109        self.verifier.set_client(verifier_multiple_keys);
110
111        for (i, k) in self.keys.iter_mut().enumerate() {
112            let _ = verifier_multiple_keys.init_key(i, k);
113        }
114        verifier_multiple_keys.register();
115        verifier_multiple_keys
116    }
117}