3.8.2.1.3 Workflow

  1. Define sample data from NIST-800-38A appendix F for ECB mode.
    #define AES_EXAMPLE_REFBUF_SIZE 4
    
    /* @{ */
    uint32_t ref_plain_text[AES_EXAMPLE_REFBUF_SIZE] = {
        0xe2bec16b,
        0x969f402e,
        0x117e3de9,
        0x2a179373
    };
    
    uint32_t ref_cipher_text_ecb[AES_EXAMPLE_REFBUF_SIZE] = {
        0xb47bd73a,
        0x60367a0d,
        0xf3ca9ea8,
        0x97ef6624
    };
    
    uint32_t ref_cipher_text_cbc[AES_EXAMPLE_REFBUF_SIZE] = {
        0xacab4976,
        0x46b21981,
        0x9b8ee9ce,
        0x7d19e912
    };
    
    uint32_t ref_cipher_text_cfb128[AES_EXAMPLE_REFBUF_SIZE] = {
        0x2ed93f3b,
        0x20ad2db7,
        0xf8493433,
        0x4afb3ce8
    };
    
    uint32_t ref_cipher_text_ofb[AES_EXAMPLE_REFBUF_SIZE] = {
        0x2ed93f3b,
        0x20ad2db7,
        0xf8493433,
        0x4afb3ce8
    };
    
    uint32_t ref_cipher_text_ctr[AES_EXAMPLE_REFBUF_SIZE] = {
        0x91614d87,
        0x26e320b6,
        0x6468ef1b,
        0xceb60d99
    };
    
    const uint32_t key128[4] = {
        0x16157e2b,
        0xa6d2ae28,
        0x8815f7ab,
        0x3c4fcf09
    };
    
    const uint32_t init_vector[4] = {
        0x03020100,
        0x07060504,
        0x0b0a0908,
        0x0f0e0d0c
    };
    
    const uint32_t init_vector_ctr[4] = {
        0xf3f2f1f0,
        0xf7f6f5f4,
        0xfbfaf9f8,
        0xfffefdfc
    };
    
    /* @} */
    
  2. Create related module variable and software instance structure.
    /* Output data array */
    static uint32_t output_data[AES_EXAMPLE_REFBUF_SIZE];
    /* State indicate */
    volatile bool state = false;
    
    struct aes_config g_aes_cfg;
    struct aes_module aes_instance;
    struct usart_module usart_instance;
    
  3. Configure, initialize, and enable AES module.
    1. Configuration AES struct, which can be filled out to adjust the configuration of a physical AES peripheral.
      aes_get_config_defaults(&g_aes_cfg);
      
    2. Initialize the AES configuration struct with the module's default values.
      aes_init(&aes_instance,AES, &g_aes_cfg);
      
    3. Enable the AES module.
      aes_enable(&aes_instance);
      
    4. Register and enable the AES module callback.
      /* Enable AES interrupt. */
      aes_register_callback(aes_callback,AES_CALLBACK_ENCRYPTION_COMPLETE);
      aes_enable_callback(&aes_instance,AES_CALLBACK_ENCRYPTION_COMPLETE);