/* * Amazon FreeRTOS V1.0.3 * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * http://aws.amazon.com/freertos * http://www.FreeRTOS.org */ #include "fsl_common.h" #if defined(FSL_FEATURE_SOC_LTC_COUNT) && (FSL_FEATURE_SOC_LTC_COUNT > 0) #include "fsl_ltc.h" #endif #if defined(FSL_FEATURE_SOC_CAAM_COUNT) && (FSL_FEATURE_SOC_CAAM_COUNT > 0) #include "fsl_caam.h" #endif #if defined(FSL_FEATURE_SOC_CAU3_COUNT) && (FSL_FEATURE_SOC_CAU3_COUNT > 0) #include "fsl_cau3.h" #endif #if defined(FSL_FEATURE_SOC_DCP_COUNT) && (FSL_FEATURE_SOC_DCP_COUNT > 0) #include "fsl_dcp.h" #endif #if defined(FSL_FEATURE_SOC_TRNG_COUNT) && (FSL_FEATURE_SOC_TRNG_COUNT > 0) #include "fsl_trng.h" #elif defined(FSL_FEATURE_SOC_RNG_COUNT) && (FSL_FEATURE_SOC_RNG_COUNT > 0) #include "fsl_rnga.h" #elif defined(FSL_FEATURE_SOC_LPC_RNG_COUNT) && (FSL_FEATURE_SOC_LPC_RNG_COUNT > 0) #include "fsl_rng.h" #endif int mbedtls_hardware_poll(void *data, unsigned char *output, size_t len, size_t *olen) { status_t result = kStatus_Success; #if defined(FSL_FEATURE_SOC_TRNG_COUNT) && (FSL_FEATURE_SOC_TRNG_COUNT > 0) #ifndef TRNG0 #define TRNG0 TRNG #endif result = TRNG_GetRandomData(TRNG0, output, len); #elif defined(FSL_FEATURE_SOC_RNG_COUNT) && (FSL_FEATURE_SOC_RNG_COUNT > 0) result = RNGA_GetRandomData(RNG, (void *)output, len); #elif defined(FSL_FEATURE_SOC_CAAM_COUNT) && (FSL_FEATURE_SOC_CAAM_COUNT > 0) && defined(CRYPTO_USE_DRIVER_CAAM) result = CAAM_RNG_GetRandomData(CAAM_INSTANCE, &s_caamHandle, kCAAM_RngStateHandle0, output, len, kCAAM_RngDataAny, NULL); #elif defined(FSL_FEATURE_SOC_LPC_RNG_COUNT) && (FSL_FEATURE_SOC_LPC_RNG_COUNT > 0) uint32_t rn; size_t length; int i; length = len; while (length > 0) { rn = RNG_GetRandomData(); if (length >= sizeof(uint32_t)) { memcpy(output, &rn, sizeof(uint32_t)); length -= sizeof(uint32_t); output += sizeof(uint32_t); } else { memcpy(output, &rn, length); output += length; len = 0U; } /* Discard next 32 random words for better entropy */ for (i = 0; i < 32; i++) { RNG_GetRandomData(); } } result = kStatus_Success; #endif if (result == kStatus_Success) { *olen = len; return 0; } else { return result; } } void CRYPTO_InitHardware(void) { #if defined(FSL_FEATURE_SOC_LTC_COUNT) && (FSL_FEATURE_SOC_LTC_COUNT > 0) /* Initialize LTC driver. * This enables clocking and resets the module to a known state. */ LTC_Init(LTC0); #endif #if defined(FSL_FEATURE_SOC_CAAM_COUNT) && (FSL_FEATURE_SOC_CAAM_COUNT > 0) && defined(CRYPTO_USE_DRIVER_CAAM) /* Initialize CAAM driver. */ caam_config_t caamConfig; CAAM_GetDefaultConfig(&caamConfig); caamConfig.jobRingInterface[0] = &s_jrif0; caamConfig.jobRingInterface[1] = &s_jrif1; CAAM_Init(CAAM, &caamConfig); #endif #if defined(FSL_FEATURE_SOC_CAU3_COUNT) && (FSL_FEATURE_SOC_CAU3_COUNT > 0) /* Initialize CAU3 */ CAU3_Init(CAU3); #endif #if defined(FSL_FEATURE_SOC_DCP_COUNT) && (FSL_FEATURE_SOC_DCP_COUNT > 0) /* Initialize DCP */ dcp_config_t dcpConfig; DCP_GetDefaultConfig(&dcpConfig); DCP_Init(DCP, &dcpConfig); #endif { /* Init RNG module.*/ #if defined(FSL_FEATURE_SOC_TRNG_COUNT) && (FSL_FEATURE_SOC_TRNG_COUNT > 0) #if defined(TRNG) #define TRNG0 TRNG #endif trng_config_t trngConfig; TRNG_GetDefaultConfig(&trngConfig); /* Set sample mode of the TRNG ring oscillator to Von Neumann, for better random data.*/ trngConfig.sampleMode = kTRNG_SampleModeVonNeumann; /* Initialize TRNG */ TRNG_Init(TRNG0, &trngConfig); #elif defined(FSL_FEATURE_SOC_RNG_COUNT) && (FSL_FEATURE_SOC_RNG_COUNT > 0) RNGA_Init(RNG); RNGA_Seed(RNG, SIM->UIDL); #endif } }