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}