打印
[Atmel]

SAML21走起15:加密解密CALLBACK模式

[复制链接]
639|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ddllxxrr 于 2015-8-18 21:17 编辑

CALLBACK模式只是在加密或解密结束后自动设一个标志而已,同上次的基本一样。
首先打开快速指导的加密解密CALLBACK模式。
按照指导步骤完成程序。然后编译,以下程序一次通过。可见该程序执行了以下操作:
  • ECB encryption and decryption
  • CBC encryption and decryption
  • CFB128 encryption and decryption
  • OFB encryption and decryption
  • CTR encryption and decryption


每次执行完加密解密都调一下中断,这就是CALLBACK模式

程序如下:
#include <asf.h>
#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
        };


/* 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;


static void configure_usart(void)
{
        struct usart_config config_usart;
        usart_get_config_defaults(&config_usart);
        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;
        stdio_serial_init(&usart_instance, EDBG_CDC_MODULE, &config_usart);
        usart_enable(&usart_instance);
}
static void aes_callback(void)
{
        /* Read the output. */
        aes_read_output_data(&aes_instance, output_data);
        state = true;
}
static void ecb_mode_test(void)
{
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- ECB cipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_ENCRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_AUTO_START;
        g_aes_cfg.opmode = AES_ECB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* The initialization vector is not used by the ECB cipher mode. */
        aes_set_new_message(&aes_instance);
        /* Write the data to be ciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_plain_text);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the encryption process. */
        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");
        }
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- ECB decipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_DECRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_AUTO_START;
        g_aes_cfg.opmode = AES_ECB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* The initialization vector is not used by the ECB cipher mode. */
        aes_set_new_message(&aes_instance);
        /* Write the data to be deciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_cipher_text_ecb);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the decryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_plain_text[0] != output_data[0]) ||
        (ref_plain_text[1] != output_data[1]) ||
        (ref_plain_text[2] != output_data[2]) ||
        (ref_plain_text[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
}
static void cbc_mode_test(void)
{
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CBC cipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_ENCRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_MANUAL_START;
        g_aes_cfg.opmode = AES_CBC_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        /* Write the data to be ciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_plain_text);
        aes_set_new_message(&aes_instance);
        aes_start(&aes_instance);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the encryption process. */
        while (false == state) {
        }
        if ((ref_cipher_text_cbc[0] != output_data[0]) ||
        (ref_cipher_text_cbc[1] != output_data[1]) ||
        (ref_cipher_text_cbc[2] != output_data[2]) ||
        (ref_cipher_text_cbc[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CBC decipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_DECRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_AUTO_START;
        g_aes_cfg.opmode = AES_CBC_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        aes_set_new_message(&aes_instance);
        /* Write the data to be deciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_cipher_text_cbc);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the decryption process. */
        while (false == state) {
        }
        if ((ref_plain_text[0] != output_data[0]) ||
        (ref_plain_text[1] != output_data[1]) ||
        (ref_plain_text[2] != output_data[2]) ||
        (ref_plain_text[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
}
static void cfb128_mode_test(void)
{
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CFB128 cipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_ENCRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_MANUAL_START;
        g_aes_cfg.opmode = AES_CFB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        /* Write the data to be ciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_plain_text);
        aes_set_new_message(&aes_instance);
        aes_start(&aes_instance);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the encryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_cipher_text_cfb128[0] != output_data[0]) ||
        (ref_cipher_text_cfb128[1] != output_data[1]) ||
        (ref_cipher_text_cfb128[2] != output_data[2]) ||
        (ref_cipher_text_cfb128[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CFB128 decipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_DECRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_MANUAL_START;
        g_aes_cfg.opmode = AES_CFB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        /* Write the data to be deciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_cipher_text_cfb128);
        aes_set_new_message(&aes_instance);
        aes_start(&aes_instance);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the decryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_plain_text[0] != output_data[0]) ||
        (ref_plain_text[1] != output_data[1]) ||
        (ref_plain_text[2] != output_data[2]) ||
        (ref_plain_text[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
}
static void ofb_mode_test(void)
{
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- OFB cipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_ENCRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_AUTO_START;
        g_aes_cfg.opmode = AES_OFB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        aes_set_new_message(&aes_instance);
        /* Write the data to be ciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_plain_text);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the encryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_cipher_text_ofb[0] != output_data[0]) ||
        (ref_cipher_text_ofb[1] != output_data[1]) ||
        (ref_cipher_text_ofb[2] != output_data[2]) ||
        (ref_cipher_text_ofb[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- OFB decipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_DECRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_MANUAL_START;
        g_aes_cfg.opmode = AES_OFB_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector);
        /* Write the data to be deciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_cipher_text_ofb);
        aes_set_new_message(&aes_instance);
        aes_start(&aes_instance);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the decryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_plain_text[0] != output_data[0]) ||
        (ref_plain_text[1] != output_data[1]) ||
        (ref_plain_text[2] != output_data[2]) ||
        (ref_plain_text[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
}
static void ctr_mode_test(void)
{
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CTR cipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_ENCRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_AUTO_START;
        g_aes_cfg.opmode = AES_CTR_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector_ctr);
        aes_set_new_message(&aes_instance);
        /* Write the data to be ciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_plain_text);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the encryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_cipher_text_ctr[0] != output_data[0]) ||
        (ref_cipher_text_ctr[1] != output_data[1]) ||
        (ref_cipher_text_ctr[2] != output_data[2]) ||
        (ref_cipher_text_ctr[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
        printf("\r\n-----------------------------------\r\n");
        printf("- 128bit cryptographic key\r\n");
        printf("- CTR decipher mode\r\n");
        printf("- Auto start mode\r\n");
        printf("- 4 32bit words\r\n");
        printf("-----------------------------------\r\n");
        state = false;
        /* Configure the AES. */
        g_aes_cfg.encrypt_mode = AES_DECRYPTION;
        g_aes_cfg.key_size = AES_KEY_SIZE_128;
        g_aes_cfg.start_mode = AES_MANUAL_START;
        g_aes_cfg.opmode = AES_CTR_MODE;
        g_aes_cfg.cfb_size = AES_CFB_SIZE_128;
        g_aes_cfg.lod = false;
        aes_set_config(&aes_instance,AES, &g_aes_cfg);
        /* Set the cryptographic key. */
        aes_write_key(&aes_instance, key128);
        /* Set the initialization vector. */
        aes_write_init_vector(&aes_instance, init_vector_ctr);
        /* Write the data to be deciphered to the input data registers. */
        aes_write_input_data(&aes_instance, ref_cipher_text_ctr);
        aes_set_new_message(&aes_instance);
        aes_start(&aes_instance);
        aes_clear_new_message(&aes_instance);
        /* Wait for the end of the decryption process. */
        while (false == state) {
        }
        /* check the result. */
        if ((ref_plain_text[0] != output_data[0]) ||
        (ref_plain_text[1] != output_data[1]) ||
        (ref_plain_text[2] != output_data[2]) ||
        (ref_plain_text[3] != output_data[3])) {
                printf("\r\nKO!!!\r\n");
                } else {
                printf("\r\nOK!!!\r\n");
        }
}


int main (void)
{
        
           /* Initialize the system and console*/
           system_init();
           configure_usart();
           aes_get_config_defaults(&g_aes_cfg);
           aes_init(&aes_instance,AES, &g_aes_cfg);
           aes_enable(&aes_instance);
           /* Enable AES interrupt. */
           aes_register_callback(aes_callback,AES_CALLBACK_ENCRYPTION_COMPLETE);
           aes_enable_callback(&aes_instance,AES_CALLBACK_ENCRYPTION_COMPLETE);
           
            ecb_mode_test();
            cbc_mode_test();
            cfb128_mode_test();
            ofb_mode_test();
            ctr_mode_test();
        
}
执行的结果如下:


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2399

主题

6966

帖子

68

粉丝