blob: ef593733a0d09f65967d94bc6ab7210f53a0fba2 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright Laurence Lundblade.
4 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
5 */
6
7/*
8 * This file is derived from:
9 * trusted-firmware-m/secure_fw/partitions/initial_attestation/attest_token.h
10 */
11
12#ifndef ATTESTATION_TOKEN_H
13#define ATTESTATION_TOKEN_H
14
15#include <measurement.h>
Mate Toth-Palc08e0112023-06-27 13:08:31 +020016#ifndef CBMC
Soby Mathewb4c6df42022-11-09 11:13:29 +000017#include <qcbor/qcbor.h>
Mate Toth-Palc08e0112023-06-27 13:08:31 +020018#endif /* CBMC */
19#include <stddef.h>
20#include <stdint.h>
21#ifndef CBMC
Soby Mathewb4c6df42022-11-09 11:13:29 +000022#include <t_cose/q_useful_buf.h>
Mate Toth-Palfda673a2023-06-13 12:25:43 +020023#include <t_cose/t_cose_sign_sign.h>
24#include <t_cose/t_cose_signature_sign_restart.h>
Mate Toth-Palc69951d2023-03-17 17:30:50 +010025#include <t_cose_psa_crypto.h>
Mate Toth-Palc08e0112023-06-27 13:08:31 +020026#endif /* CBMC */
27
28/* The state of the realm token generation */
29enum attest_token_gen_state_t {
30 ATTEST_SIGN_NOT_STARTED,
31 ATTEST_SIGN_IN_PROGRESS,
32 ATTEST_SIGN_TOKEN_WRITE_IN_PROGRESS
33};
34
35#ifndef CBMC
Soby Mathewb4c6df42022-11-09 11:13:29 +000036
37#define ATTEST_TOKEN_BUFFER_SIZE GRANULE_SIZE
38
39enum attest_token_err_t {
40 /* Success */
41 ATTEST_TOKEN_ERR_SUCCESS = 0,
42 /* The buffer passed in to receive the output is too small. */
43 ATTEST_TOKEN_ERR_TOO_SMALL,
44 /*
45 * Something went wrong formatting the CBOR, most likely the
46 * payload has maps or arrays that are not closed.
47 */
48 ATTEST_TOKEN_ERR_CBOR_FORMATTING,
49 /* Signing key is not found or of wrong type. */
50 ATTEST_TOKEN_ERR_SIGNING_KEY,
51 ATTEST_TOKEN_ERR_COSE_ERROR,
Mate Toth-Palc08e0112023-06-27 13:08:31 +020052 /*
53 * Signing is in progress, function should be called with the same
Soby Mathewb4c6df42022-11-09 11:13:29 +000054 * parameters again.
55 */
56 ATTEST_TOKEN_ERR_COSE_SIGN_IN_PROGRESS
57};
58
Soby Mathewb4c6df42022-11-09 11:13:29 +000059/*
60 * The context for creating an attestation token. The caller of
61 * attest_token_encode must create one of these and pass it to the functions
62 * here. It is small enough that it can go on the stack. It is most of
63 * the memory needed to create a token except the output buffer and
64 * any memory requirements for the cryptographic operations.
65 *
66 * The structure is opaque for the caller.
67 *
68 * This is roughly 148 + 8 + 32 = 188 bytes
69 */
70
71struct attest_token_encode_ctx {
72 /* Private data structure */
Mate Toth-Palc69951d2023-03-17 17:30:50 +010073 QCBOREncodeContext cbor_enc_ctx;
74 uint32_t opt_flags;
75 int32_t key_select;
Mate Toth-Palfda673a2023-06-13 12:25:43 +020076 struct q_useful_buf_c signed_payload;
77 struct t_cose_sign_sign_ctx sign_ctx;
78 struct t_cose_signature_sign_restart restartable_signer_ctx;
Mate Toth-Palc69951d2023-03-17 17:30:50 +010079 struct t_cose_psa_crypto_context crypto_ctx;
Soby Mathewb4c6df42022-11-09 11:13:29 +000080};
81
82#define ATTEST_CHALLENGE_SIZE (64)
83
84/*
85 * The context for signing an attestation token. Each REC contains one context
86 * that is passed to the attestation library during attestation token creation
87 * to keep track of the signing state.
88 */
AlexeiFedorov56e1a8e2023-09-01 17:06:13 +010089struct token_sign_cntxt {
Soby Mathewb4c6df42022-11-09 11:13:29 +000090 /*
91 * 'state' is used to implement a state machine
92 * to track the current state of signing.
93 */
94 enum attest_token_gen_state_t state;
95 struct attest_token_encode_ctx ctx;
AlexeiFedorovea68b552023-10-03 11:11:47 +010096
97 /* Number of CCA token bytes left to copy to the Realm */
98 size_t cca_token_len;
99
100 /* Number of CCA token bytes copied to the Realm */
101 size_t copied_len;
102
Soby Mathewb4c6df42022-11-09 11:13:29 +0000103 unsigned char challenge[ATTEST_CHALLENGE_SIZE];
104};
105
Mate Toth-Palc08e0112023-06-27 13:08:31 +0200106#else /* CBMC */
107
108#define ATTEST_TOKEN_BUFFER_SIZE GRANULE_SIZE
109
110enum attest_token_err_t {
111 /* Success */
112 ATTEST_TOKEN_ERR_SUCCESS = 0,
113 /*
114 * Signing is in progress, function should be called with the same
115 * parameters again.
116 */
117 ATTEST_TOKEN_ERR_COSE_SIGN_IN_PROGRESS
118};
119
120struct attest_token_encode_ctx {
121 uint32_t unused;
122};
123
124struct token_sign_cntxt {
125 enum attest_token_gen_state_t state;
126};
127
128#define ATTEST_CHALLENGE_SIZE (1)
129
130#endif /* CBMC */
131
Soby Mathewb4c6df42022-11-09 11:13:29 +0000132/*
133 * Sign the realm token and complete the CBOR encoding.
134 * This function returns ATTEST_TOKEN_ERR_COSE_SIGN_IN_PROGRESS
135 * if signing is not complete and this function needs to be
136 * invoked again. ATTEST_TOKEN_ERR_SUCCESS is returned if
137 * signing is complete and `completed_token` is valid.
138 * Else returns one of the attest_token_err_t errors on
139 * any other error.
140 *
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200141 * me Token Creation Context.
142 * completed_token_len Length of the completed token.
Soby Mathewb4c6df42022-11-09 11:13:29 +0000143 *
144 * This completes the token after the payload has been added. When
145 * this is called the signing algorithm is run and the final
146 * formatting of the token is completed.
147 */
148enum attest_token_err_t
149attest_realm_token_sign(struct attest_token_encode_ctx *me,
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200150 size_t *completed_token_len);
Soby Mathewb4c6df42022-11-09 11:13:29 +0000151
152/*
153 * Combine realm token and platform token to top-level cca token
154 *
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200155 * attest_token_buf Pointer to the buffer where the token will be
AlexeiFedorov47165422023-09-13 11:47:57 +0100156 * written.
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200157 * attest_token_buf_size Size of the buffer where the token will be
AlexeiFedorov47165422023-09-13 11:47:57 +0100158 * written.
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200159 * realm_token_buf Pointer to the realm token.
160 * realm_token_len Length of the realm token.
Soby Mathewb4c6df42022-11-09 11:13:29 +0000161 *
162 * Return 0 in case of error, the length of the cca token otherwise.
163 */
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200164size_t attest_cca_token_create(void *attest_token_buf,
165 size_t attest_token_buf_size,
166 const void *realm_token_buf,
167 size_t realm_token_len);
Soby Mathewb4c6df42022-11-09 11:13:29 +0000168
169/*
170 * Assemble the Realm token in the buffer provided in realm_token_buf,
171 * except the signature.
172 *
173 * Arguments:
174 * Algorithm - Algorithm used during measurement.
175 * Measurement - Array of buffers containing all the measurements.
176 * num_measurements - Number of measurements to add to the token.
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200177 * rpv_buf - Pointer to the Realm Personalization value
178 * rpv_len - Length of the Realm Personalization value
Soby Mathewb4c6df42022-11-09 11:13:29 +0000179 * ctx - Token sign context, used for signing.
180 * realm_token_buf - Buffer where to assemble the attestation token.
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200181 * realm_token_buf_size - size of the buffer where to assemble the attestation
182 * token.
Soby Mathewb4c6df42022-11-09 11:13:29 +0000183 *
184 * Returns ATTEST_TOKEN_ERR_SUCCESS (0) on success or a negative error code
185 * otherwise.
186 */
187int attest_realm_token_create(enum hash_algo algorithm,
188 unsigned char measurements[][MAX_MEASUREMENT_SIZE],
189 unsigned int num_measurements,
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200190 const void *rpv_buf,
191 size_t rpv_len,
AlexeiFedorov56e1a8e2023-09-01 17:06:13 +0100192 struct token_sign_cntxt *ctx,
Mate Toth-Pal071aa562023-07-04 09:09:26 +0200193 void *realm_token_buf,
194 size_t realm_token_buf_size);
Soby Mathewb4c6df42022-11-09 11:13:29 +0000195
196#endif /* ATTESTATION_TOKEN_H */