The supported board list:
- SAM L21 Xplained Pro
- SAM L22 Xplained Pro
This example demonstrates how to use the AES driver to perform:
Upon startup, the program uses the USART driver to display application output message from which ECB DMA encryption modes can be tested.
Quick Start
Prerequisites
There are no prerequisites for this use case.
Code
Add to the main application source file, outside of any functions:
#define AES_EXAMPLE_REFBUF_SIZE 4
0xe2bec16b,
0x969f402e,
0x117e3de9,
0x2a179373
};
0xb47bd73a,
0x60367a0d,
0xf3ca9ea8,
0x97ef6624
};
const uint32_t key128[4] = {
0x16157e2b,
0xa6d2ae28,
0x8815f7ab,
0x3c4fcf09
};
Add to the main application source file, outside of any functions:
volatile bool state = false;
Copy-paste the following setup code to your user application:
{
config_usart.baudrate = 38400;
config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
}
{
printf("\r\n-----------------------------------\r\n");
printf("- 128bit cryptographic key\r\n");
printf("- ECB cipher mode\r\n");
printf("- DMA mode\r\n");
printf("- 4 32bit words with DMA\r\n");
printf("-----------------------------------\r\n");
state = false;
while (false == state) {
}
}
state = false;
while (false == state) {
}
if ((ref_cipher_text_ecb[0] != output_data[0]) ||
(ref_cipher_text_ecb[1] != output_data[1]) ||
(ref_cipher_text_ecb[2] != output_data[2]) ||
(ref_cipher_text_ecb[3] != output_data[3])) {
printf("\r\nKO!!!\r\n");
} else {
printf("\r\nOK!!!\r\n");
}
}
{
state = true;
}
{
tx_config.peripheral_trigger = AES_DMAC_ID_WR;
tx_descriptor_config.dst_increment_enable = false;
tx_descriptor_config.source_address = (uint32_t)ref_plain_text + sizeof(ref_plain_text);
tx_descriptor_config.destination_address =(uint32_t) &(AES->INDATA);
}
{
rx_config.peripheral_trigger = AES_DMAC_ID_RD;
rx_descriptor_config.src_increment_enable = false;
rx_descriptor_config.source_address = (uint32_t)&(AES->INDATA);
rx_descriptor_config.destination_address =
(uint32_t)output_data + sizeof(output_data);
}
Add to user application initialization (typically the start of main()
):
Workflow
- Define sample data from NIST-800-38A appendix F for ECB mode.
#define AES_EXAMPLE_REFBUF_SIZE 4
0xe2bec16b,
0x969f402e,
0x117e3de9,
0x2a179373
};
0xb47bd73a,
0x60367a0d,
0xf3ca9ea8,
0x97ef6624
};
const uint32_t key128[4] = {
0x16157e2b,
0xa6d2ae28,
0x8815f7ab,
0x3c4fcf09
};
- Create related module variable and software instance structure.
volatile bool state = false;
- Create DMA resource struct and descriptor.
DmacDescriptor example_descriptor_tx SECTION_DMAC_DESCRIPTOR;
DmacDescriptor example_descriptor_rx SECTION_DMAC_DESCRIPTOR;
- Configure, initialize, and enable AES module.
- Configuration AES DMA module, which can be used for AES.
- Configuration AES struct, which can be filled out to adjust the configuration of a physical AES peripheral.
- Initialize the AES configuration struct with the module's default values.
- Enable the AES module.
Use Case
Code
Copy-paste the following code to your user application:
Workflow
- Configure ECB mode encryption with DMA and run test.
state = false;
while (false == state) {
}
}
state = false;
while (false == state) {
}
if ((ref_cipher_text_ecb[0] != output_data[0]) ||
(ref_cipher_text_ecb[1] != output_data[1]) ||
(ref_cipher_text_ecb[2] != output_data[2]) ||
(ref_cipher_text_ecb[3] != output_data[3])) {
printf("\r\nKO!!!\r\n");
} else {
printf("\r\nOK!!!\r\n");
}