1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #include <assert.h> 8*54fd6939SJiyong Park #include <stddef.h> 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park /* mbed TLS headers */ 11*54fd6939SJiyong Park #include <mbedtls/memory_buffer_alloc.h> 12*54fd6939SJiyong Park #include <mbedtls/platform.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park #include <common/debug.h> 15*54fd6939SJiyong Park #include <drivers/auth/mbedtls/mbedtls_common.h> 16*54fd6939SJiyong Park #include <drivers/auth/mbedtls/mbedtls_config.h> 17*54fd6939SJiyong Park #include <plat/common/platform.h> 18*54fd6939SJiyong Park cleanup(void)19*54fd6939SJiyong Parkstatic void cleanup(void) 20*54fd6939SJiyong Park { 21*54fd6939SJiyong Park ERROR("EXIT from BL2\n"); 22*54fd6939SJiyong Park panic(); 23*54fd6939SJiyong Park } 24*54fd6939SJiyong Park 25*54fd6939SJiyong Park /* 26*54fd6939SJiyong Park * mbed TLS initialization function 27*54fd6939SJiyong Park */ mbedtls_init(void)28*54fd6939SJiyong Parkvoid mbedtls_init(void) 29*54fd6939SJiyong Park { 30*54fd6939SJiyong Park static int ready; 31*54fd6939SJiyong Park void *heap_addr; 32*54fd6939SJiyong Park size_t heap_size = 0; 33*54fd6939SJiyong Park int err; 34*54fd6939SJiyong Park 35*54fd6939SJiyong Park if (!ready) { 36*54fd6939SJiyong Park if (atexit(cleanup)) 37*54fd6939SJiyong Park panic(); 38*54fd6939SJiyong Park 39*54fd6939SJiyong Park err = plat_get_mbedtls_heap(&heap_addr, &heap_size); 40*54fd6939SJiyong Park 41*54fd6939SJiyong Park /* Ensure heap setup is proper */ 42*54fd6939SJiyong Park if (err < 0) { 43*54fd6939SJiyong Park ERROR("Mbed TLS failed to get a heap\n"); 44*54fd6939SJiyong Park panic(); 45*54fd6939SJiyong Park } 46*54fd6939SJiyong Park assert(heap_size >= TF_MBEDTLS_HEAP_SIZE); 47*54fd6939SJiyong Park 48*54fd6939SJiyong Park /* Initialize the mbed TLS heap */ 49*54fd6939SJiyong Park mbedtls_memory_buffer_alloc_init(heap_addr, heap_size); 50*54fd6939SJiyong Park 51*54fd6939SJiyong Park #ifdef MBEDTLS_PLATFORM_SNPRINTF_ALT 52*54fd6939SJiyong Park mbedtls_platform_set_snprintf(snprintf); 53*54fd6939SJiyong Park #endif 54*54fd6939SJiyong Park ready = 1; 55*54fd6939SJiyong Park } 56*54fd6939SJiyong Park } 57*54fd6939SJiyong Park 58*54fd6939SJiyong Park /* 59*54fd6939SJiyong Park * The following helper function simply returns the default allocated heap. 60*54fd6939SJiyong Park * It can be used by platforms for their plat_get_mbedtls_heap() implementation. 61*54fd6939SJiyong Park */ get_mbedtls_heap_helper(void ** heap_addr,size_t * heap_size)62*54fd6939SJiyong Parkint get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size) 63*54fd6939SJiyong Park { 64*54fd6939SJiyong Park static unsigned char heap[TF_MBEDTLS_HEAP_SIZE]; 65*54fd6939SJiyong Park 66*54fd6939SJiyong Park assert(heap_addr != NULL); 67*54fd6939SJiyong Park assert(heap_size != NULL); 68*54fd6939SJiyong Park 69*54fd6939SJiyong Park *heap_addr = heap; 70*54fd6939SJiyong Park *heap_size = sizeof(heap); 71*54fd6939SJiyong Park return 0; 72*54fd6939SJiyong Park } 73