imix/test/virtual_aes_ccm_test.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 2022.
4
5//! notice that there will be 18 tests, 6 for each,
6//! and the test output will make the debug buffer full,
7//! please go to boards/components/src/debug_writer.rs and change
8//! let buf = static_init!([u8; 1024], [0; 1024]);
9//! to
10//! let buf = static_init!([u8; 4096], [0; 4096]);
11//! Thanks!
12//! To run this test, include the code
13//! ```rust
14//! test::virtual_aes_ccm_test::run();
15//! ```
16//! In the boot sequence. If it runs correctly, you should see the following
17//! output:
18//!
19//! AES CCM* encryption/decryption tests
20//! AES CCM* encryption/decryption tests
21//! AES CCM* encryption/decryption tests
22//! Initialization complete. Entering main loop
23//! aes_ccm_test passed: (current_test=0, encrypting=true, tag_is_valid=true)
24//! aes_ccm_test passed: (current_test=0, encrypting=true, tag_is_valid=true)
25//! aes_ccm_test passed: (current_test=0, encrypting=false, tag_is_valid=true)
26//! aes_ccm_test passed: (current_test=0, encrypting=false, tag_is_valid=true)
27//! aes_ccm_test passed: (current_test=1, encrypting=true, tag_is_valid=true)
28//! aes_ccm_test passed: (current_test=1, encrypting=true, tag_is_valid=true)
29//! aes_ccm_test passed: (current_test=1, encrypting=false, tag_is_valid=true)
30//! aes_ccm_test passed: (current_test=1, encrypting=false, tag_is_valid=true)
31//! aes_ccm_test passed: (current_test=2, encrypting=true, tag_is_valid=true)
32//! aes_ccm_test passed: (current_test=2, encrypting=true, tag_is_valid=true)
33//! aes_ccm_test passed: (current_test=2, encrypting=false, tag_is_valid=true)
34//! aes_ccm_test passed: (current_test=2, encrypting=false, tag_is_valid=true)
35//! aes_ccm_test passed: (current_test=0, encrypting=true, tag_is_valid=true)
36//! aes_ccm_test passed: (current_test=0, encrypting=false, tag_is_valid=true)
37//! aes_ccm_test passed: (current_test=1, encrypting=true, tag_is_valid=true)
38//! aes_ccm_test passed: (current_test=1, encrypting=false, tag_is_valid=true)
39//! aes_ccm_test passed: (current_test=2, encrypting=true, tag_is_valid=true)
40//! aes_ccm_test passed: (current_test=2, encrypting=false, tag_is_valid=true)
41use capsules_core::virtualizers::virtual_aes_ccm;
42use capsules_extra::test::aes_ccm::Test;
43use kernel::hil::symmetric_encryption::{AES128, AES128CCM, AES128_BLOCK_SIZE};
44use kernel::static_init;
45use sam4l::aes::Aes;
46
47type AESCCMMUX = virtual_aes_ccm::MuxAES128CCM<'static, Aes<'static>>;
48type AESCCMCLIENT = virtual_aes_ccm::VirtualAES128CCM<'static, Aes<'static>>;
49
50pub unsafe fn run(aes: &'static sam4l::aes::Aes) {
51 // mux
52 let ccm_mux = static_init!(AESCCMMUX, virtual_aes_ccm::MuxAES128CCM::new(aes));
53 kernel::deferred_call::DeferredCallClient::register(ccm_mux);
54 aes.set_client(ccm_mux);
55 // ---------------- ONE CLIENT ---------------------
56 // client 1
57 const CRYPT_SIZE: usize = 7 * AES128_BLOCK_SIZE;
58 let crypt_buf1 = static_init!([u8; CRYPT_SIZE], [0x00; CRYPT_SIZE]);
59 let ccm_client1 = static_init!(
60 AESCCMCLIENT,
61 virtual_aes_ccm::VirtualAES128CCM::new(ccm_mux, crypt_buf1)
62 );
63 ccm_client1.setup();
64 // test 1
65 let data1 = static_init!([u8; 4 * AES128_BLOCK_SIZE], [0x00; 4 * AES128_BLOCK_SIZE]);
66 let t1 = static_init!(Test<'static, AESCCMCLIENT>, Test::new(ccm_client1, data1));
67 AES128CCM::set_client(ccm_client1, t1);
68
69 // ---------------- ANOTHER CLIENT ---------------------
70 // client 2
71 let crypt_buf2 = static_init!([u8; CRYPT_SIZE], [0x00; CRYPT_SIZE]);
72 let ccm_client2 = static_init!(
73 AESCCMCLIENT,
74 virtual_aes_ccm::VirtualAES128CCM::new(ccm_mux, crypt_buf2)
75 );
76 ccm_client2.setup();
77 // test 2
78 let data2 = static_init!([u8; 4 * AES128_BLOCK_SIZE], [0x00; 4 * AES128_BLOCK_SIZE]);
79 let t2 = static_init!(Test<'static, AESCCMCLIENT>, Test::new(ccm_client2, data2));
80 AES128CCM::set_client(ccm_client2, t2);
81
82 // client 3
83 let crypt_buf3 = static_init!([u8; CRYPT_SIZE], [0x00; CRYPT_SIZE]);
84 let ccm_client3 = static_init!(
85 AESCCMCLIENT,
86 virtual_aes_ccm::VirtualAES128CCM::new(ccm_mux, crypt_buf3)
87 );
88 ccm_client3.setup();
89 // test 3
90 let data3 = static_init!([u8; 4 * AES128_BLOCK_SIZE], [0x00; 4 * AES128_BLOCK_SIZE]);
91 let t3 = static_init!(Test<'static, AESCCMCLIENT>, Test::new(ccm_client3, data3));
92 AES128CCM::set_client(ccm_client3, t3);
93 // ----------------- RUN TESTS NOW ----------------------
94 // run
95 t1.run();
96 t2.run();
97 t3.run();
98}