17d37aa17SJuan Castillo /* 2*17e1335cSJohn Tsichritzis * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 37d37aa17SJuan Castillo * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 57d37aa17SJuan Castillo */ 67d37aa17SJuan Castillo 76d01a463SJohn Tsichritzis #include <assert.h> 809d40e0eSAntonio Nino Diaz #include <stddef.h> 909d40e0eSAntonio Nino Diaz 107d37aa17SJuan Castillo /* mbed TLS headers */ 11649dbf6fSJuan Castillo #include <mbedtls/memory_buffer_alloc.h> 12ab1794f5SAntonio Nino Diaz #include <mbedtls/platform.h> 1309d40e0eSAntonio Nino Diaz 1409d40e0eSAntonio Nino Diaz #include <common/debug.h> 1509d40e0eSAntonio Nino Diaz #include <drivers/auth/mbedtls/mbedtls_common.h> 1609d40e0eSAntonio Nino Diaz #include <drivers/auth/mbedtls/mbedtls_config.h> 1709d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 187d37aa17SJuan Castillo 19*17e1335cSJohn Tsichritzis #pragma weak plat_get_mbedtls_heap 20*17e1335cSJohn Tsichritzis 216c373345SRoberto Vargas static void cleanup(void) 226c373345SRoberto Vargas { 236c373345SRoberto Vargas ERROR("EXIT from BL2\n"); 246c373345SRoberto Vargas panic(); 256c373345SRoberto Vargas } 266c373345SRoberto Vargas 277d37aa17SJuan Castillo /* 287d37aa17SJuan Castillo * mbed TLS initialization function 297d37aa17SJuan Castillo */ 307d37aa17SJuan Castillo void mbedtls_init(void) 317d37aa17SJuan Castillo { 327d37aa17SJuan Castillo static int ready; 336d01a463SJohn Tsichritzis void *heap_addr; 346d01a463SJohn Tsichritzis size_t heap_size = 0; 356d01a463SJohn Tsichritzis int err; 367d37aa17SJuan Castillo 377d37aa17SJuan Castillo if (!ready) { 386c373345SRoberto Vargas if (atexit(cleanup)) 396c373345SRoberto Vargas panic(); 406c373345SRoberto Vargas 416d01a463SJohn Tsichritzis err = plat_get_mbedtls_heap(&heap_addr, &heap_size); 426d01a463SJohn Tsichritzis 436d01a463SJohn Tsichritzis /* Ensure heap setup is proper */ 446d01a463SJohn Tsichritzis if (err < 0) { 456d01a463SJohn Tsichritzis ERROR("Mbed TLS failed to get a heap\n"); 466d01a463SJohn Tsichritzis panic(); 476d01a463SJohn Tsichritzis } 486d01a463SJohn Tsichritzis assert(heap_size >= TF_MBEDTLS_HEAP_SIZE); 496d01a463SJohn Tsichritzis 507d37aa17SJuan Castillo /* Initialize the mbed TLS heap */ 516d01a463SJohn Tsichritzis mbedtls_memory_buffer_alloc_init(heap_addr, heap_size); 52ab1794f5SAntonio Nino Diaz 53c46c18c5SAntonio Nino Diaz #ifdef MBEDTLS_PLATFORM_SNPRINTF_ALT 5439b6cc66SAntonio Nino Diaz mbedtls_platform_set_snprintf(snprintf); 55c46c18c5SAntonio Nino Diaz #endif 567d37aa17SJuan Castillo ready = 1; 577d37aa17SJuan Castillo } 587d37aa17SJuan Castillo } 59*17e1335cSJohn Tsichritzis 60*17e1335cSJohn Tsichritzis /* 61*17e1335cSJohn Tsichritzis * The following default implementation of the function simply returns the 62*17e1335cSJohn Tsichritzis * by default allocated heap. 63*17e1335cSJohn Tsichritzis */ 64*17e1335cSJohn Tsichritzis int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 65*17e1335cSJohn Tsichritzis { 66*17e1335cSJohn Tsichritzis static unsigned char heap[TF_MBEDTLS_HEAP_SIZE]; 67*17e1335cSJohn Tsichritzis 68*17e1335cSJohn Tsichritzis assert(heap_addr != NULL); 69*17e1335cSJohn Tsichritzis assert(heap_size != NULL); 70*17e1335cSJohn Tsichritzis 71*17e1335cSJohn Tsichritzis *heap_addr = heap; 72*17e1335cSJohn Tsichritzis *heap_size = sizeof(heap); 73*17e1335cSJohn Tsichritzis return 0; 74*17e1335cSJohn Tsichritzis } 75