blob: 72a8d56a6bd97ff548f01b22333aa32cc07c3092 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#include <assert.h>
7#include <attestation.h>
8#include <attestation_priv.h>
9#include <debug.h>
10#include <errno.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000011#include <mbedtls/memory_buffer_alloc.h>
12#include <memory_alloc.h>
Mate Toth-Palc69951d2023-03-17 17:30:50 +010013#include <psa/crypto.h>
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +000014#include <simd.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000015#include <sizes.h>
16
17/*
18 * Memory buffer for the allocator during key initialization.
19 *
Rustam Ismayilov54296b82024-10-08 18:39:26 +020020 * Used to compute the public key and set up a PRNG object per CPU. PRNGs are
Soby Mathewb4c6df42022-11-09 11:13:29 +000021 * needed for key blinding during EC signing.
22 *
23 * Memory requirements:
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010024 * +------------------------+-------+-------------------------+
Soby Mathewb4c6df42022-11-09 11:13:29 +000025 * | | MAX | Persisting allocation |
26 * +------------------------+-------+-------------------------+
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010027 * | Public key computation | 2.9K | 0.1K |
Soby Mathewb4c6df42022-11-09 11:13:29 +000028 * +------------------------+-------+-------------------------+
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010029 * | one SHA256 HMAC_DRBG | | |
30 * | buffer | 364B | 364B |
31 * | | | |
32 * | PRNG setup for 32 CPUs | 12K | 11.6K |
Soby Mathewb4c6df42022-11-09 11:13:29 +000033 * +------------------------+-------+-------------------------+
34 *
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010035 * Measured with eg:
Soby Mathewb4c6df42022-11-09 11:13:29 +000036 * src/lib/memory_buffer_alloc.c: mbedtls_memory_buffer_alloc_status()
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010037 *
38 * Reserve enough space for the temporary PRNG and per-CPU ones (see
Mathieu Poirierd8e1f302024-06-03 10:50:13 -060039 * attest_rnd_prng_init()), plus more space for other allocations.
Soby Mathewb4c6df42022-11-09 11:13:29 +000040 */
Chuyue Luobcfe4c32023-10-24 13:48:19 +010041#define PRNG_INIT_HEAP_SIZE ((MAX_CPUS + 1UL) * 364UL)
Mathieu Poirierd8e1f302024-06-03 10:50:13 -060042#define MISC_PER_CPU (SZ_4K / 16U)
43#define INIT_HEAP_SIZE (PRNG_INIT_HEAP_SIZE + (MISC_PER_CPU * MAX_CPUS))
Soby Mathewb4c6df42022-11-09 11:13:29 +000044
Jean-Philippe Bruckerba223852023-07-31 15:26:35 +010045static unsigned char mem_buf[INIT_HEAP_SIZE]
Soby Mathewb4c6df42022-11-09 11:13:29 +000046 __aligned(sizeof(unsigned long));
47
48static bool attest_initialized;
49
AlexeiFedorov4bbb0e02023-08-22 14:15:21 +010050static struct buffer_alloc_ctx init_ctx;
Soby Mathewb4c6df42022-11-09 11:13:29 +000051
52int attestation_init(void)
53{
54 int ret;
Mate Toth-Palc69951d2023-03-17 17:30:50 +010055 psa_status_t psa_status;
Soby Mathewb4c6df42022-11-09 11:13:29 +000056
Rustam Ismayilov54296b82024-10-08 18:39:26 +020057 /* Enable Data Independent Timing feature */
58 write_dit(DIT_BIT);
59
Soby Mathewb4c6df42022-11-09 11:13:29 +000060 /*
61 * Associate the allocated heap for mbedtls with the current CPU.
62 */
AlexeiFedorov44a76a32023-08-29 16:53:26 +010063 ret = buffer_alloc_ctx_assign(&init_ctx);
64 if (ret != 0) {
65 return ret;
66 }
Soby Mathewb4c6df42022-11-09 11:13:29 +000067
Arunachalam Ganapathy51119932023-03-23 12:32:49 +000068 SIMD_FPU_ALLOW(mbedtls_memory_buffer_alloc_init(mem_buf,
69 sizeof(mem_buf)));
Soby Mathewb4c6df42022-11-09 11:13:29 +000070
Arunachalam Ganapathy51119932023-03-23 12:32:49 +000071 SIMD_FPU_ALLOW(ret = attest_rnd_prng_init());
Soby Mathewb4c6df42022-11-09 11:13:29 +000072 if (ret != 0) {
Soby Mathew376ffa42024-10-04 14:01:59 +010073 goto attest_init_fail;
Soby Mathewb4c6df42022-11-09 11:13:29 +000074 }
75
Mate Toth-Palc69951d2023-03-17 17:30:50 +010076 SIMD_FPU_ALLOW(psa_status = psa_crypto_init());
77 if (psa_status != PSA_SUCCESS) {
Soby Mathew376ffa42024-10-04 14:01:59 +010078 ret = -EINVAL;
79 goto attest_init_fail;
Mate Toth-Palc69951d2023-03-17 17:30:50 +010080 }
81
82 /*
83 * Set the number of max operations per ECC signing iteration to the
84 * configured value.
85 *
86 * This adjusts the length of a single signing loop.
87 */
88 SIMD_FPU_ALLOW(psa_interruptible_set_max_ops(MBEDTLS_ECP_MAX_OPS));
89
Soby Mathewb4c6df42022-11-09 11:13:29 +000090 /* Retrieve the platform key from root world */
Arunachalam Ganapathy51119932023-03-23 12:32:49 +000091 SIMD_FPU_ALLOW(ret = attest_init_realm_attestation_key());
Soby Mathewb4c6df42022-11-09 11:13:29 +000092 if (ret != 0) {
Soby Mathew376ffa42024-10-04 14:01:59 +010093 goto attest_init_fail;
Soby Mathewb4c6df42022-11-09 11:13:29 +000094 }
95
Soby Mathewb4c6df42022-11-09 11:13:29 +000096 /* Retrieve the platform token from root world */
97 ret = attest_setup_platform_token();
98 if (ret != 0) {
Soby Mathew376ffa42024-10-04 14:01:59 +010099 goto attest_init_fail;
Soby Mathewb4c6df42022-11-09 11:13:29 +0000100 }
101
Soby Mathew9ca57552024-10-03 12:21:36 +0100102#if ATTEST_EL3_TOKEN_SIGN
103 /* Initialize the EL3 queue */
104 if (el3_token_sign_queue_init() != 0) {
105 WARN("EL3 queue init failed.\n");
106 ret = -ENOTSUP;
107 goto attest_init_fail;
108 }
109#endif
Soby Mathewb4c6df42022-11-09 11:13:29 +0000110 attest_initialized = true;
111
Rustam Ismayilov54296b82024-10-08 18:39:26 +0200112 /* Disable Data Independent Timing feature */
113 write_dit(0x0);
114
Soby Mathew376ffa42024-10-04 14:01:59 +0100115attest_init_fail :
116 buffer_alloc_ctx_unassign();
117 return ret;
Soby Mathewb4c6df42022-11-09 11:13:29 +0000118}
119
120int attestation_heap_ctx_init(unsigned char *buf, size_t buf_size)
121{
122 assert(buf != NULL);
123
124 if (attest_initialized == false) {
Soby Mathew376ffa42024-10-04 14:01:59 +0100125 ERROR("Attestation init failed.\n");
Soby Mathewb4c6df42022-11-09 11:13:29 +0000126 return -EINVAL;
127 }
128
129 /* Initialise the mbedTLS heap */
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000130 mbedtls_memory_buffer_alloc_init(buf, buf_size);
Soby Mathewb4c6df42022-11-09 11:13:29 +0000131
132 return 0;
133}
134
Soby Mathew376ffa42024-10-04 14:01:59 +0100135void attestation_heap_ctx_assign_pe(struct buffer_alloc_ctx *ctx)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000136{
Soby Mathew376ffa42024-10-04 14:01:59 +0100137 int ret __unused;
Soby Mathewb4c6df42022-11-09 11:13:29 +0000138 assert(ctx != NULL);
139
Soby Mathew376ffa42024-10-04 14:01:59 +0100140 /* Associate the buffer_alloc_ctx to this CPU */
141 ret = buffer_alloc_ctx_assign(ctx);
142 assert(ret == 0);
Soby Mathewb4c6df42022-11-09 11:13:29 +0000143}
144
Soby Mathew376ffa42024-10-04 14:01:59 +0100145void attestation_heap_ctx_unassign_pe(void)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000146{
Soby Mathewb4c6df42022-11-09 11:13:29 +0000147 buffer_alloc_ctx_unassign();
Soby Mathewb4c6df42022-11-09 11:13:29 +0000148}