add aes API by DMA

This commit is contained in:
jiangxiangbing 2018-10-18 10:16:41 +08:00
parent 41dd0c6999
commit 06f2995fad
3 changed files with 626 additions and 3 deletions

View File

@ -13,6 +13,7 @@
* limitations under the License.
*/
#include <stdlib.h>
#include <string.h>
#include "sysctl.h"
#include "aes.h"
#include "utils.h"
@ -419,3 +420,464 @@ void aes_gcm256_hard_encrypt(gcm_context_t *context, uint8_t *input_data, size_t
gcm_get_tag(gcm_tag);
}
void aes_ecb128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_ecb128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(input_key, AES_128, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_ecb192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_ecb192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(input_key, AES_192, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_ecb256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_ecb256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(input_key, AES_256, NULL, 0L, NULL, AES_ECB, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(context->input_key, AES_128, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(context->input_key, AES_192, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
size_t padding_len = ((input_len + 15) / 16) * 16;
aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_DECRYPTION, 0L, input_len);
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_cbc256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data)
{
aes_init(context->input_key, AES_256, context->iv, IV_LEN_128, NULL, AES_CBC, AES_HARD_ENCRYPTION, 0L, input_len);
size_t padding_len = ((input_len + 15) / 16) * 16;
uint8_t* padding_buffer = NULL;
padding_buffer = (uint8_t*)malloc(padding_len * sizeof(uint8_t));
memset(padding_buffer, 0, padding_len);
memcpy(padding_buffer, input_data, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_set_single_mode(dma_send_channel_num, padding_buffer, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, padding_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
free(padding_buffer);
}
void aes_gcm128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}
void aes_gcm128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_128, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}
void aes_gcm192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}
void aes_gcm192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_192, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}
void aes_gcm256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_DECRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}
void aes_gcm256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag)
{
configASSERT(input_len % 4 == 0);
aes_init(context->input_key, AES_256, context->iv, IV_LEN_96, context->gcm_aad,
AES_GCM, AES_HARD_ENCRYPTION, context->gcm_aad_len, input_len);
sysctl_dma_select(dma_receive_channel_num, SYSCTL_DMA_SELECT_AES_REQ);
aes->dma_sel = 1;
dmac_set_single_mode(dma_receive_channel_num, (void *)(&aes->aes_out_data), output_data, DMAC_ADDR_NOCHANGE, DMAC_ADDR_INCREMENT,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_set_single_mode(dma_send_channel_num, input_data, (void *)(&aes->aes_text_data), DMAC_ADDR_INCREMENT, DMAC_ADDR_NOCHANGE,
DMAC_MSIZE_256, DMAC_TRANS_WIDTH_32, input_len >> 2);
dmac_wait_done(dma_send_channel_num);
dmac_wait_done(dma_receive_channel_num);
gcm_get_tag(gcm_tag);
}

View File

@ -16,6 +16,8 @@
#define _DRIVER_AES_H
#include <stdlib.h>
#include <stdint.h>
#include "platform.h"
#include "dmac.h"
#ifdef __cplusplus
extern "C" {
@ -369,6 +371,150 @@ void aes_gcm256_hard_decrypt(gcm_context_t *context, uint8_t *input_data, size_t
*/
void aes_gcm256_hard_encrypt(gcm_context_t *context, uint8_t *input_data, size_t input_len, uint8_t *output_data, uint8_t *gcm_tag);
/**
* @brief AES-ECB-128 decryption by dma
*
* @param[in] dma_send_channel_num Dmac send channel number.
* @param[in] dma_receive_channel_num Dmac receive channel number.
* @param[in] input_key The decryption key. must be 16bytes.
* @param[in] input_data The buffer holding the input data.
* @param[in] input_len The length of a data unit in bytes.
* This can be any length between 16 bytes and 2^31 bytes inclusive
* (between 1 and 2^27 block cipher blocks).
* @param[out] output_data The buffer holding the output data.
*/
void aes_ecb128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_ecb128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_ecb192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_ecb192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_ecb256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_ecb256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint8_t *input_key,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_cbc256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
cbc_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data);
void aes_gcm128_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
void aes_gcm128_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
void aes_gcm192_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
void aes_gcm192_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
void aes_gcm256_hard_decrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
void aes_gcm256_hard_encrypt_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
gcm_context_t *context,
uint8_t *input_data,
size_t input_len,
uint8_t *output_data,
uint8_t *gcm_tag);
/**
* @brief This function initializes the AES hard module.
*

View File

@ -220,9 +220,24 @@ typedef struct _fft
fft_output_fifo_t fft_output_fifo;
} __attribute__((packed, aligned(8))) fft_t;
void fft_complex_uint16_dma(dmac_channel_number_t dma_send_channel_num, dmac_channel_number_t dma_receive_channel_num,
uint16_t shift, fft_direction_t direction, const uint64_t *input, size_t point_num, uint64_t *output);
/**
* @brief Do 16bit quantized complex FFT by DMA
*
* @param[in] dma_send_channel_num Dmac send channel number.
* @param[in] dma_receive_channel_num Dmac receive channel number.
* @param[in] shift The shifts selection in 9 stage
* @param[in] direction The direction
* @param[in] input The input data
* @param[in] point The FFT points count
* @param[out] output The output data
*/
void fft_complex_uint16_dma(dmac_channel_number_t dma_send_channel_num,
dmac_channel_number_t dma_receive_channel_num,
uint16_t shift,
fft_direction_t direction,
const uint64_t *input,
size_t point_num,
uint64_t *output);
#ifdef __cplusplus
}