blob: 605c8ec8c2db6f4c4f2f470d0585d6c993146985 [file] [log] [blame]
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2020 Texas Instruments Incorporated
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "aes_alt.h"
#include "mbedtls/aes.h"
#if defined(MBEDTLS_AES_ALT)
#include <string.h>
#include "ti_drivers_config.h"
#include <ti/drivers/AESECB.h>
#include <ti/drivers/cryptoutils/cryptokey/CryptoKeyPlaintext.h>
/*
* number of active contexts, used for power on/off of the crypto core
*/
static unsigned int ref_num = 0;
static AESECB_Handle AESECB_handle = NULL;
void mbedtls_aes_init(mbedtls_aes_context * ctx)
{
AESECB_Params AESECBParams;
if (ref_num == 0)
{
AESECB_Params_init(&AESECBParams);
AESECBParams.returnBehavior = AESECB_RETURN_BEHAVIOR_POLLING;
AESECB_handle = AESECB_open(CONFIG_AESECB_1, &AESECBParams);
// handle will be NULL if open failed, subsequent calls will fail with a generic HW error
}
ref_num++;
}
void mbedtls_aes_free(mbedtls_aes_context * ctx)
{
if (ref_num > 0)
{
ref_num--;
if (ref_num == 0)
{
AESECB_close(AESECB_handle);
AESECB_handle = NULL;
}
}
memset((void *) ctx, 0x00, sizeof(ctx));
}
int mbedtls_aes_setkey_enc(mbedtls_aes_context * ctx, const unsigned char * key, unsigned int keybits)
{
int_fast16_t statusCrypto;
size_t keylen = keybits / 8U; // 8 bits in a byte
if (keylen > sizeof(ctx->keyMaterial))
{
return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
}
/* Initialize AES key */
memcpy(ctx->keyMaterial, key, keylen);
statusCrypto = CryptoKeyPlaintext_initKey(&ctx->cryptoKey, (uint8_t *) ctx->keyMaterial, keylen);
if (CryptoKey_STATUS_SUCCESS != statusCrypto)
{
return MBEDTLS_ERR_AES_HW_ACCEL_FAILED;
}
return 0;
}
int mbedtls_aes_setkey_dec(mbedtls_aes_context * ctx, const unsigned char * key, unsigned int keybits)
{
int_fast16_t statusCrypto;
size_t keylen = keybits / 8U; // 8 bits in a byte
if (keylen > sizeof(ctx->keyMaterial))
{
return MBEDTLS_ERR_AES_INVALID_KEY_LENGTH;
}
/* Initialize AES key */
statusCrypto = CryptoKeyPlaintext_initKey(&ctx->cryptoKey, (uint8_t *) key, keylen);
if (CryptoKey_STATUS_SUCCESS != statusCrypto)
{
return MBEDTLS_ERR_AES_HW_ACCEL_FAILED;
}
return 0;
}
int mbedtls_aes_crypt_ecb(mbedtls_aes_context * ctx, int mode, const unsigned char input[16], unsigned char output[16])
{
int statusCrypto;
AESECB_Operation operationOneStepEncrypt;
/* run it through the authentication + encryption, pass the ccmLVal = 2 */
AESECB_Operation_init(&operationOneStepEncrypt);
operationOneStepEncrypt.key = &ctx->cryptoKey;
operationOneStepEncrypt.inputLength = 16;
operationOneStepEncrypt.input = (uint8_t *) input;
operationOneStepEncrypt.output = (uint8_t *) output;
statusCrypto = AESECB_oneStepEncrypt(AESECB_handle, &operationOneStepEncrypt);
if (CryptoKey_STATUS_SUCCESS != statusCrypto)
{
return MBEDTLS_ERR_AES_HW_ACCEL_FAILED;
}
return 0;
}
#endif