123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188 |
- /*
- * The Clear BSD License
- * Copyright (c) 2015, Freescale Semiconductor, Inc.
- * Copyright 2016-2018 NXP
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted (subject to the limitations in the disclaimer below) provided
- * that the following conditions are met:
- *
- * o Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * o Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- *
- * o Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "fsl_ltc_edma.h"
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /* Component ID definition, used by tools. */
- #ifndef FSL_COMPONENT_ID
- #define FSL_COMPONENT_ID "platform.drivers.ltc_edma"
- #endif
- /*<! Structure definition for ltc_edma_private_handle_t. The structure is private. */
- typedef struct _ltc_edma_private_handle
- {
- LTC_Type *base;
- ltc_edma_handle_t *handle;
- } ltc_edma_private_handle_t;
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- /*<! Private handle only used for internally. */
- static ltc_edma_private_handle_t s_edmaPrivateHandle[FSL_FEATURE_SOC_LTC_COUNT];
- /* Array of LTC peripheral base address. */
- static LTC_Type *const s_ltcBase[] = LTC_BASE_PTRS;
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- /* State machine state.*/
- #define LTC_SM_STATE_START 0x0000u
- #define LTC_SM_STATE_FINISH 0xFFFFu
- #define LTC_FIFO_SZ_MAX_DOWN_ALGN (0xff0u)
- enum _ltc_md_dk_bit_shift
- {
- kLTC_ModeRegBitShiftDK = 12U,
- };
- /*******************************************************************************
- * Prototypes
- ******************************************************************************/
- static uint32_t LTC_GetInstance(LTC_Type *base);
- static void ltc_symmetric_process_EDMA(LTC_Type *base, uint32_t inSize, const uint8_t **inData, uint8_t **outData);
- static status_t ltc_process_message_in_sessions_EDMA(LTC_Type *base, ltc_edma_handle_t *handle);
- /*******************************************************************************
- * Code
- ******************************************************************************/
- /*******************************************************************************
- * LTC Common code static
- ******************************************************************************/
- /*!
- * @brief Splits the LTC job into sessions. Used for CBC, CTR, CFB, OFB cipher block modes.
- *
- * @param base LTC peripheral base address
- * @param inData Input data to process.
- * @param inSize Input size of the input buffer.
- * @param outData Output data buffer.
- */
- static status_t ltc_process_message_in_sessions_EDMA(LTC_Type *base, ltc_edma_handle_t *handle)
- {
- status_t retval;
- bool exit_sm = false;
- handle->modeReg = base->MD;
- retval = kStatus_Success;
- if ((!handle->inData) || (!handle->outData))
- {
- handle->state = LTC_SM_STATE_FINISH; /* END */
- retval = kStatus_InvalidArgument;
- }
- while (exit_sm == false)
- {
- switch (handle->state)
- {
- case LTC_SM_STATE_START:
- if (handle->size)
- {
- uint32_t sz;
- if (handle->size <= LTC_FIFO_SZ_MAX_DOWN_ALGN)
- {
- sz = handle->size;
- }
- else
- {
- sz = LTC_FIFO_SZ_MAX_DOWN_ALGN;
- }
- /* retval = ltc_symmetric_process_data_EDMA(base, handle->inData, sz, handle->outData); */
- {
- uint32_t lastSize;
- uint32_t inSize = sz;
- /* Write the data size. */
- base->DS = inSize;
- /* Split the inSize into full 16-byte chunks and last incomplete block due to LTC AES OFIFO
- * errata */
- if (inSize <= 16u)
- {
- lastSize = inSize;
- inSize = 0;
- }
- else
- {
- /* Process all 16-byte data chunks. */
- lastSize = inSize % 16u;
- if (lastSize == 0)
- {
- lastSize = 16;
- inSize -= 16;
- }
- else
- {
- inSize -=
- lastSize; /* inSize will be rounded down to 16 byte boundary. remaining bytes in
- lastSize */
- }
- }
- if (inSize)
- {
- handle->size -= inSize;
- ltc_symmetric_process_EDMA(base, inSize, &handle->inData, &handle->outData);
- exit_sm = true;
- }
- else if (lastSize)
- {
- ltc_symmetric_process(base, lastSize, &handle->inData, &handle->outData);
- retval = ltc_wait(base);
- handle->size -= lastSize;
- }
- else
- {
- }
- }
- }
- else
- {
- handle->state = LTC_SM_STATE_FINISH;
- }
- break;
- case LTC_SM_STATE_FINISH:
- default:
- base->MD = handle->modeReg;
- ltc_clear_all(base, false);
- if (handle->callback)
- {
- handle->callback(base, handle, retval, handle->userData);
- }
- exit_sm = true;
- break;
- }
- }
- return retval;
- }
- /*!
- * @brief Splits the LTC job into sessions. Used for CBC, CTR, CFB, OFB cipher block modes.
- *
- * @param base LTC peripheral base address
- * @param inData Input data to process.
- * @param inSize Input size of the input buffer.
- * @param outData Output data buffer.
- */
- static status_t ltc_process_message_in_sessions_ctr_EDMA(LTC_Type *base, ltc_edma_handle_t *handle)
- {
- status_t retval;
- bool exit_sm = false;
- handle->modeReg = base->MD;
- retval = kStatus_Success;
- if ((!handle->inData) || (!handle->outData))
- {
- handle->state = LTC_SM_STATE_FINISH;
- retval = kStatus_InvalidArgument;
- }
- while (exit_sm == false)
- {
- switch (handle->state)
- {
- case LTC_SM_STATE_START:
- if (handle->size)
- {
- uint32_t sz;
- if (handle->size <= LTC_FIFO_SZ_MAX_DOWN_ALGN)
- {
- sz = handle->size;
- }
- else
- {
- sz = LTC_FIFO_SZ_MAX_DOWN_ALGN;
- }
- /* retval = ltc_symmetric_process_data_EDMA(base, handle->inData, sz, handle->outData); */
- {
- uint32_t lastSize;
- uint32_t inSize = sz;
- /* Write the data size. */
- base->DS = inSize;
- /* Split the inSize into full 16-byte chunks and last incomplete block due to LTC AES OFIFO
- * errata */
- if (inSize <= 16u)
- {
- lastSize = inSize;
- inSize = 0;
- }
- else
- {
- /* Process all 16-byte data chunks. */
- lastSize = inSize % 16u;
- if (lastSize == 0)
- {
- lastSize = 16;
- inSize -= 16;
- }
- else
- {
- inSize -=
- lastSize; /* inSize will be rounded down to 16 byte boundary. remaining bytes in
- lastSize */
- }
- }
- if (inSize)
- {
- handle->size -= inSize;
- ltc_symmetric_process_EDMA(base, inSize, &handle->inData, &handle->outData);
- exit_sm = true;
- }
- else if (lastSize)
- {
- ltc_symmetric_process(base, lastSize, &handle->inData, &handle->outData);
- retval = ltc_wait(base);
- handle->size -= lastSize;
- }
- else
- {
- }
- }
- }
- else
- {
- handle->state = LTC_SM_STATE_FINISH;
- }
- break;
- case LTC_SM_STATE_FINISH:
- default:
- base->MD = handle->modeReg;
- /* CTR final phase.*/
- if (kStatus_Success == retval)
- {
- const uint8_t *input = handle->inData;
- uint8_t *output = handle->outData;
- if ((handle->counterlast != NULL) && (handle->lastSize))
- {
- uint8_t zeroes[16] = {0};
- ltc_mode_t modeReg;
- modeReg = (uint32_t)kLTC_AlgorithmAES | (uint32_t)kLTC_ModeCTR | (uint32_t)kLTC_ModeEncrypt;
- /* Write the mode register to the hardware. */
- base->MD = modeReg | (uint32_t)kLTC_ModeFinalize;
- /* context is re-used (CTRi) */
- /* Process data and return status. */
- retval = ltc_symmetric_process_data(base, input, handle->lastSize, output);
- if (kStatus_Success == retval)
- {
- if (handle->szLeft)
- {
- *handle->szLeft = 16U - handle->lastSize;
- }
- /* Initialize algorithm state. */
- base->MD = modeReg | (uint32_t)kLTC_ModeUpdate;
- /* context is re-used (CTRi) */
- /* Process data and return status. */
- retval = ltc_symmetric_process_data(base, zeroes, 16U, handle->counterlast);
- }
- }
- if (kStatus_Success == retval)
- {
- ltc_get_context(base, &handle->counter[0], 16U, 4U);
- ltc_clear_all(base, false);
- }
- }
- if (handle->callback)
- {
- handle->callback(base, handle, retval, handle->userData);
- }
- exit_sm = true;
- break;
- }
- }
- return retval;
- }
- /*******************************************************************************
- * AES Code public
- ******************************************************************************/
- status_t LTC_AES_EncryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t *key,
- uint32_t keySize)
- {
- status_t retval;
- if ((ltc_check_key_size(keySize) == 0) || (size < 16u) ||
- (size % 16u)) /* ECB mode, size must be 16-byte multiple */
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, key, keySize, kLTC_AlgorithmAES, kLTC_ModeECB, kLTC_ModeEncrypt);
- /* Process data and return status. */
- handle->inData = &plaintext[0];
- handle->outData = &ciphertext[0];
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- status_t LTC_AES_DecryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t *key,
- uint32_t keySize,
- ltc_aes_key_t keyType)
- {
- status_t status;
- if ((ltc_check_key_size(keySize) == 0) || (size < 16u) ||
- (size % 16u)) /* ECB mode, size must be 16-byte multiple */
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, key, keySize, kLTC_AlgorithmAES, kLTC_ModeECB, kLTC_ModeDecrypt);
- /* set DK bit in the LTC Mode Register AAI field for directly loaded decrypt keys */
- if (keyType == kLTC_DecryptKey)
- {
- base->MD |= (1U << kLTC_ModeRegBitShiftDK);
- }
- /* Process data and return status. */
- handle->inData = &ciphertext[0];
- handle->outData = &plaintext[0];
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- status = handle->state_machine(base, handle);
- return status;
- }
- status_t LTC_AES_EncryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_AES_IV_SIZE],
- const uint8_t *key,
- uint32_t keySize)
- {
- status_t retval;
- if ((ltc_check_key_size(keySize) == 0) || (size < 16u) ||
- (size % 16u)) /* CBC mode, size must be 16-byte multiple */
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, key, keySize, kLTC_AlgorithmAES, kLTC_ModeCBC, kLTC_ModeEncrypt);
- /* Write IV data to the context register. */
- ltc_set_context(base, &iv[0], LTC_AES_IV_SIZE, 0);
- /* Process data and return status. */
- handle->inData = &plaintext[0];
- handle->outData = &ciphertext[0];
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- status_t LTC_AES_DecryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_AES_IV_SIZE],
- const uint8_t *key,
- uint32_t keySize,
- ltc_aes_key_t keyType)
- {
- status_t retval;
- if ((ltc_check_key_size(keySize) == 0) || (size < 16u) ||
- (size % 16u)) /* CBC mode, size must be 16-byte multiple */
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- /* set DK bit in the LTC Mode Register AAI field for directly loaded decrypt keys */
- if (keyType == kLTC_DecryptKey)
- {
- base->MD |= (1U << kLTC_ModeRegBitShiftDK);
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, key, keySize, kLTC_AlgorithmAES, kLTC_ModeCBC, kLTC_ModeDecrypt);
- /* Write IV data to the context register. */
- ltc_set_context(base, &iv[0], LTC_AES_IV_SIZE, 0);
- /* Process data and return status. */
- handle->inData = &ciphertext[0];
- handle->outData = &plaintext[0];
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- status_t LTC_AES_CryptCtrEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *input,
- uint8_t *output,
- uint32_t size,
- uint8_t counter[LTC_AES_BLOCK_SIZE],
- const uint8_t *key,
- uint32_t keySize,
- uint8_t counterlast[LTC_AES_BLOCK_SIZE],
- uint32_t *szLeft)
- {
- status_t retval;
- uint32_t lastSize;
- if (!ltc_check_key_size(keySize))
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- lastSize = 0U;
- if (counterlast != NULL)
- {
- /* Split the size into full 16-byte chunks and last incomplete block due to LTC AES OFIFO errata */
- if (size <= 16U)
- {
- lastSize = size;
- size = 0U;
- }
- else
- {
- /* Process all 16-byte data chunks. */
- lastSize = size % 16U;
- if (lastSize == 0U)
- {
- lastSize = 16U;
- size -= 16U;
- }
- else
- {
- size -= lastSize; /* size will be rounded down to 16 byte boundary. remaining bytes in lastSize */
- }
- }
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, key, keySize, kLTC_AlgorithmAES, kLTC_ModeCTR, kLTC_ModeEncrypt);
- /* Write initial counter data to the context register.
- * NOTE the counter values start at 4-bytes offset into the context. */
- ltc_set_context(base, &counter[0], 16U, 4U);
- /* Process data and return status. */
- handle->inData = &input[0];
- handle->outData = &output[0];
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_ctr_EDMA;
- handle->counter = counter;
- handle->key = key;
- handle->keySize = keySize;
- handle->counterlast = counterlast;
- handle->szLeft = szLeft;
- handle->lastSize = lastSize;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- #if defined(FSL_FEATURE_LTC_HAS_DES) && FSL_FEATURE_LTC_HAS_DES
- /*******************************************************************************
- * DES / 3DES Code static
- ******************************************************************************/
- static status_t ltc_des_process_EDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *input,
- uint8_t *output,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE],
- ltc_mode_symmetric_alg_t modeAs,
- ltc_mode_encrypt_t modeEnc)
- {
- status_t retval;
- /* all but OFB, size must be 8-byte multiple */
- if ((modeAs != kLTC_ModeOFB) && ((size < 8u) || (size % 8u)))
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return kStatus_InvalidArgument;
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, &key[0], LTC_DES_KEY_SIZE, kLTC_AlgorithmDES, modeAs, modeEnc);
- if ((modeAs != kLTC_ModeECB))
- {
- ltc_set_context(base, iv, LTC_DES_IV_SIZE, 0);
- }
- /* Process data and return status. */
- handle->inData = input;
- handle->outData = output;
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- static status_t ltc_3des_process_EDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *input,
- uint8_t *output,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE],
- ltc_mode_symmetric_alg_t modeAs,
- ltc_mode_encrypt_t modeEnc)
- {
- status_t retval;
- uint8_t key[LTC_DES_KEY_SIZE * 3];
- uint8_t keySize = LTC_DES_KEY_SIZE * 2;
- retval = ltc_3des_check_input_args(modeAs, size, key1, key2);
- if (kStatus_Success != retval)
- {
- if (handle->callback)
- {
- handle->callback(base, handle, kStatus_InvalidArgument, handle->userData);
- }
- return retval;
- }
- ltc_memcpy(&key[0], &key1[0], LTC_DES_KEY_SIZE);
- ltc_memcpy(&key[LTC_DES_KEY_SIZE], &key2[0], LTC_DES_KEY_SIZE);
- if (key3)
- {
- ltc_memcpy(&key[LTC_DES_KEY_SIZE * 2], &key3[0], LTC_DES_KEY_SIZE);
- keySize = sizeof(key);
- }
- /* Initialize algorithm state. */
- ltc_symmetric_update(base, &key[0], keySize, kLTC_Algorithm3DES, modeAs, modeEnc);
- if ((modeAs != kLTC_ModeECB))
- {
- ltc_set_context(base, iv, LTC_DES_IV_SIZE, 0);
- }
- /* Process data and return status. */
- handle->inData = input;
- handle->outData = output;
- handle->size = size;
- handle->state = LTC_SM_STATE_START;
- handle->state_machine = ltc_process_message_in_sessions_EDMA;
- retval = handle->state_machine(base, handle);
- return retval;
- }
- /*******************************************************************************
- * DES / 3DES Code public
- ******************************************************************************/
- status_t LTC_DES_EncryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, plaintext, ciphertext, size, NULL, key, kLTC_ModeECB, kLTC_ModeEncrypt);
- }
- status_t LTC_DES_DecryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, ciphertext, plaintext, size, NULL, key, kLTC_ModeECB, kLTC_ModeDecrypt);
- }
- status_t LTC_DES_EncryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key, kLTC_ModeCBC, kLTC_ModeEncrypt);
- }
- status_t LTC_DES_DecryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key, kLTC_ModeCBC, kLTC_ModeDecrypt);
- }
- status_t LTC_DES_EncryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key, kLTC_ModeCFB, kLTC_ModeEncrypt);
- }
- status_t LTC_DES_DecryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key, kLTC_ModeCFB, kLTC_ModeDecrypt);
- }
- status_t LTC_DES_EncryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key, kLTC_ModeOFB, kLTC_ModeEncrypt);
- }
- status_t LTC_DES_DecryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key[LTC_DES_KEY_SIZE])
- {
- return ltc_des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key, kLTC_ModeOFB, kLTC_ModeDecrypt);
- }
- status_t LTC_DES2_EncryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, NULL, key1, key2, NULL, kLTC_ModeECB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES3_EncryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, NULL, key1, key2, key3, kLTC_ModeECB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES2_DecryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, NULL, key1, key2, NULL, kLTC_ModeECB,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES3_DecryptEcbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, NULL, key1, key2, key3, kLTC_ModeECB,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES2_EncryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, NULL, kLTC_ModeCBC,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES3_EncryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, key3, kLTC_ModeCBC,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES2_DecryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, NULL, kLTC_ModeCBC,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES3_DecryptCbcEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, key3, kLTC_ModeCBC,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES2_EncryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, NULL, kLTC_ModeCFB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES3_EncryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, key3, kLTC_ModeCFB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES2_DecryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, NULL, kLTC_ModeCFB,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES3_DecryptCfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, key3, kLTC_ModeCFB,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES2_EncryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, NULL, kLTC_ModeOFB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES3_EncryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *plaintext,
- uint8_t *ciphertext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, plaintext, ciphertext, size, iv, key1, key2, key3, kLTC_ModeOFB,
- kLTC_ModeEncrypt);
- }
- status_t LTC_DES2_DecryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, NULL, kLTC_ModeOFB,
- kLTC_ModeDecrypt);
- }
- status_t LTC_DES3_DecryptOfbEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- const uint8_t *ciphertext,
- uint8_t *plaintext,
- uint32_t size,
- const uint8_t iv[LTC_DES_IV_SIZE],
- const uint8_t key1[LTC_DES_KEY_SIZE],
- const uint8_t key2[LTC_DES_KEY_SIZE],
- const uint8_t key3[LTC_DES_KEY_SIZE])
- {
- return ltc_3des_process_EDMA(base, handle, ciphertext, plaintext, size, iv, key1, key2, key3, kLTC_ModeOFB,
- kLTC_ModeDecrypt);
- }
- #endif /* FSL_FEATURE_LTC_HAS_DES */
- /*********************** LTC EDMA tools ***************************************/
- static uint32_t LTC_GetInstance(LTC_Type *base)
- {
- uint32_t instance = 0;
- uint32_t i;
- for (i = 0; i < FSL_FEATURE_SOC_LTC_COUNT; i++)
- {
- if (s_ltcBase[instance] == base)
- {
- instance = i;
- break;
- }
- }
- return instance;
- }
- /*!
- * @brief Enable or disable LTC Input FIFO DMA request.
- *
- * This function enables or disables DMA request and done signals for Input FIFO.
- *
- * @param base LTC peripheral base address.
- * @param enable True to enable, false to disable.
- */
- static inline void LTC_EnableInputFifoDMA(LTC_Type *base, bool enable)
- {
- if (enable)
- {
- base->CTL |= LTC_CTL_IFE_MASK;
- }
- else
- {
- base->CTL &= ~LTC_CTL_IFE_MASK;
- }
- }
- /*!
- * @brief Enable or disable LTC Output FIFO DMA request.
- *
- * This function enables or disables DMA request and done signals for Output FIFO.
- *
- * @param base LTC peripheral base address.
- * @param enable True to enable, false to disable.
- */
- static inline void LTC_EnableOutputFifoDMA(LTC_Type *base, bool enable)
- {
- if (enable)
- {
- base->CTL |= LTC_CTL_OFE_MASK;
- }
- else
- {
- base->CTL &= ~LTC_CTL_OFE_MASK;
- }
- }
- static void LTC_InputFifoEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
- {
- ltc_edma_private_handle_t *ltcPrivateHandle = (ltc_edma_private_handle_t *)param;
- /* Avoid the warning for unused variables. */
- handle = handle;
- tcds = tcds;
- if (transferDone)
- {
- /* Stop DMA channel. */
- EDMA_StopTransfer(ltcPrivateHandle->handle->inputFifoEdmaHandle);
- /* Disable Input Fifo DMA */
- LTC_EnableInputFifoDMA(ltcPrivateHandle->base, false);
- }
- }
- static void LTC_OutputFifoEDMACallback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
- {
- ltc_edma_private_handle_t *ltcPrivateHandle = (ltc_edma_private_handle_t *)param;
- /* Avoid the warning for unused variables. */
- handle = handle;
- tcds = tcds;
- if (transferDone)
- {
- /* Stop DMA channel. */
- EDMA_StopTransfer(ltcPrivateHandle->handle->outputFifoEdmaHandle);
- /* Disable Output Fifo DMA */
- LTC_EnableOutputFifoDMA(ltcPrivateHandle->base, false);
- if (ltcPrivateHandle->handle->state_machine)
- {
- ltcPrivateHandle->handle->state_machine(ltcPrivateHandle->base, ltcPrivateHandle->handle);
- }
- }
- }
- /* @brief Copy data to Input FIFO and reading from Ouput FIFO using eDMA. */
- static void ltc_symmetric_process_EDMA(LTC_Type *base, uint32_t inSize, const uint8_t **inData, uint8_t **outData)
- {
- const uint8_t *in = *inData;
- uint8_t *out = *outData;
- uint32_t instance = LTC_GetInstance(base);
- uint32_t entry_number = inSize / sizeof(uint32_t);
- const uint8_t *inputBuffer = *inData;
- uint8_t *outputBuffer = *outData;
- edma_transfer_config_t config;
- if (entry_number)
- {
- /* =========== Init Input FIFO DMA ======================*/
- memset(&config, 0, sizeof(config));
- /* Prepare transfer. */
- EDMA_PrepareTransfer(&config, (void *)(uintptr_t)inputBuffer, 1, (void *)(uintptr_t)(&base->IFIFO), 4U, 4U, entry_number * 4,
- kEDMA_MemoryToPeripheral);
- /* Submit transfer. */
- EDMA_SubmitTransfer(s_edmaPrivateHandle[instance].handle->inputFifoEdmaHandle, &config);
- /* Set request size.*/
- base->CTL &= ~LTC_CTL_IFR_MASK; /* 1 entry */
- /* Enable Input Fifo DMA */
- LTC_EnableInputFifoDMA(base, true);
- /* Start the DMA channel */
- EDMA_StartTransfer(s_edmaPrivateHandle[instance].handle->inputFifoEdmaHandle);
- /* =========== Init Output FIFO DMA ======================*/
- memset(&config, 0, sizeof(config));
- /* Prepare transfer. */
- EDMA_PrepareTransfer(&config, (void *)(uintptr_t)(&base->OFIFO), 4U, (void *)outputBuffer, 1U, 4U,
- entry_number * 4, kEDMA_PeripheralToMemory);
- /* Submit transfer. */
- EDMA_SubmitTransfer(s_edmaPrivateHandle[instance].handle->outputFifoEdmaHandle, &config);
- /* Set request size.*/
- base->CTL &= ~LTC_CTL_OFR_MASK; /* 1 entry */
- /* Enable Output Fifo DMA */
- LTC_EnableOutputFifoDMA(base, true);
- /* Start the DMA channel */
- EDMA_StartTransfer(s_edmaPrivateHandle[instance].handle->outputFifoEdmaHandle);
- { /* Dummy read of LTC register. Do not delete.*/
- volatile uint32_t status_reg;
- status_reg = (base)->STA;
- (void)status_reg;
- }
- out += entry_number * sizeof(uint32_t);
- in += entry_number * sizeof(uint32_t);
- *inData = in;
- *outData = out;
- }
- }
- void LTC_CreateHandleEDMA(LTC_Type *base,
- ltc_edma_handle_t *handle,
- ltc_edma_callback_t callback,
- void *userData,
- edma_handle_t *inputFifoEdmaHandle,
- edma_handle_t *outputFifoEdmaHandle)
- {
- assert(handle);
- assert(inputFifoEdmaHandle);
- assert(outputFifoEdmaHandle);
- uint32_t instance = LTC_GetInstance(base);
- s_edmaPrivateHandle[instance].base = base;
- s_edmaPrivateHandle[instance].handle = handle;
- memset(handle, 0, sizeof(*handle));
- handle->inputFifoEdmaHandle = inputFifoEdmaHandle;
- handle->outputFifoEdmaHandle = outputFifoEdmaHandle;
- handle->callback = callback;
- handle->userData = userData;
- /* Register DMA callback functions */
- EDMA_SetCallback(handle->inputFifoEdmaHandle, LTC_InputFifoEDMACallback, &s_edmaPrivateHandle[instance]);
- EDMA_SetCallback(handle->outputFifoEdmaHandle, LTC_OutputFifoEDMACallback, &s_edmaPrivateHandle[instance]);
- /* Set request size. DMA request size is 1 entry.*/
- base->CTL &= ~LTC_CTL_IFR_MASK;
- base->CTL &= ~LTC_CTL_OFR_MASK;
- }
|