1*900bf7c6SYuichi Sugiyama // SPDX-License-Identifier: BSD-2-Clause
2*900bf7c6SYuichi Sugiyama /*
3*900bf7c6SYuichi Sugiyama * Copyright (C) 2024, Institute of Information Security (IISEC)
4*900bf7c6SYuichi Sugiyama */
5*900bf7c6SYuichi Sugiyama
6*900bf7c6SYuichi Sugiyama #include <compiler.h>
7*900bf7c6SYuichi Sugiyama #include <kernel/pseudo_ta.h>
8*900bf7c6SYuichi Sugiyama #include <mempool.h>
9*900bf7c6SYuichi Sugiyama
10*900bf7c6SYuichi Sugiyama #include "cbor.h"
11*900bf7c6SYuichi Sugiyama #include "sign.h"
12*900bf7c6SYuichi Sugiyama
13*900bf7c6SYuichi Sugiyama struct cbor_evidence_args {
14*900bf7c6SYuichi Sugiyama UsefulBufC ubc_eat_profile;
15*900bf7c6SYuichi Sugiyama int psa_client_id;
16*900bf7c6SYuichi Sugiyama int psa_security_lifecycle;
17*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_implementation_id;
18*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_type;
19*900bf7c6SYuichi Sugiyama UsefulBufC ubc_signer_id;
20*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_instance_id;
21*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_nonce;
22*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_value;
23*900bf7c6SYuichi Sugiyama };
24*900bf7c6SYuichi Sugiyama
25*900bf7c6SYuichi Sugiyama struct cose_evidence_args {
26*900bf7c6SYuichi Sugiyama UsefulBufC ubc_cbor_evidence;
27*900bf7c6SYuichi Sugiyama };
28*900bf7c6SYuichi Sugiyama
29*900bf7c6SYuichi Sugiyama struct tbs_structure_args {
30*900bf7c6SYuichi Sugiyama UsefulBufC protected_header;
31*900bf7c6SYuichi Sugiyama UsefulBufC aad;
32*900bf7c6SYuichi Sugiyama UsefulBufC payload;
33*900bf7c6SYuichi Sugiyama };
34*900bf7c6SYuichi Sugiyama
35*900bf7c6SYuichi Sugiyama static void
encode_cbor_evidence(QCBOREncodeContext * context,UsefulBufC ubc_eat_profile,const int psa_client_id,const int psa_security_lifecycle,UsefulBufC ubc_psa_implementation_id,UsefulBufC ubc_measurement_type,UsefulBufC ubc_signer_id,UsefulBufC ubc_psa_instance_id,UsefulBufC ubc_psa_nonce,UsefulBufC ubc_measurement_value)36*900bf7c6SYuichi Sugiyama encode_cbor_evidence(QCBOREncodeContext *context, UsefulBufC ubc_eat_profile,
37*900bf7c6SYuichi Sugiyama const int psa_client_id, const int psa_security_lifecycle,
38*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_implementation_id,
39*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_type, UsefulBufC ubc_signer_id,
40*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_instance_id, UsefulBufC ubc_psa_nonce,
41*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_value)
42*900bf7c6SYuichi Sugiyama {
43*900bf7c6SYuichi Sugiyama QCBOREncode_OpenMap(context);
44*900bf7c6SYuichi Sugiyama
45*900bf7c6SYuichi Sugiyama /* Profile Definition */
46*900bf7c6SYuichi Sugiyama QCBOREncode_AddTextToMapN(context, PSA_PROFILE_DEFINITION,
47*900bf7c6SYuichi Sugiyama ubc_eat_profile);
48*900bf7c6SYuichi Sugiyama
49*900bf7c6SYuichi Sugiyama /* Client ID */
50*900bf7c6SYuichi Sugiyama QCBOREncode_AddInt64ToMapN(context, PSA_CLIENT_ID, psa_client_id);
51*900bf7c6SYuichi Sugiyama
52*900bf7c6SYuichi Sugiyama /* Security Lifecycle */
53*900bf7c6SYuichi Sugiyama QCBOREncode_AddInt64ToMapN(context, PSA_SECURITY_LIFECYCLE,
54*900bf7c6SYuichi Sugiyama psa_security_lifecycle);
55*900bf7c6SYuichi Sugiyama
56*900bf7c6SYuichi Sugiyama /* Implementation ID */
57*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytesToMapN(context, PSA_IMPLEMENTATION_ID,
58*900bf7c6SYuichi Sugiyama ubc_psa_implementation_id);
59*900bf7c6SYuichi Sugiyama
60*900bf7c6SYuichi Sugiyama /* Software Components */
61*900bf7c6SYuichi Sugiyama QCBOREncode_OpenArrayInMapN(context, PSA_SW_COMPONENTS); /* [ */
62*900bf7c6SYuichi Sugiyama QCBOREncode_OpenMap(context); /* { */
63*900bf7c6SYuichi Sugiyama QCBOREncode_AddTextToMapN(context, PSA_SW_COMPONENT_MEASUREMENT_TYPE,
64*900bf7c6SYuichi Sugiyama ubc_measurement_type);
65*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytesToMapN(context, PSA_SW_COMPONENT_MEASUREMENT_VALUE,
66*900bf7c6SYuichi Sugiyama ubc_measurement_value);
67*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytesToMapN(context, PSA_SW_COMPONENT_SIGNER_ID,
68*900bf7c6SYuichi Sugiyama ubc_signer_id);
69*900bf7c6SYuichi Sugiyama QCBOREncode_CloseMap(context); /* } */
70*900bf7c6SYuichi Sugiyama QCBOREncode_CloseArray(context); /* ] */
71*900bf7c6SYuichi Sugiyama
72*900bf7c6SYuichi Sugiyama /* Nonce */
73*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytesToMapN(context, PSA_NONCE, ubc_psa_nonce);
74*900bf7c6SYuichi Sugiyama
75*900bf7c6SYuichi Sugiyama /* Instance ID */
76*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytesToMapN(context, PSA_INSTANCE_ID,
77*900bf7c6SYuichi Sugiyama ubc_psa_instance_id);
78*900bf7c6SYuichi Sugiyama
79*900bf7c6SYuichi Sugiyama QCBOREncode_CloseMap(context);
80*900bf7c6SYuichi Sugiyama }
81*900bf7c6SYuichi Sugiyama
82*900bf7c6SYuichi Sugiyama /* Generic function for encoding and buffer allocation */
build_encoded_buffer(void (* encode_func)(QCBOREncodeContext *,void *),void * encode_args)83*900bf7c6SYuichi Sugiyama static UsefulBufC build_encoded_buffer(void (*encode_func)(QCBOREncodeContext *,
84*900bf7c6SYuichi Sugiyama void *),
85*900bf7c6SYuichi Sugiyama void *encode_args)
86*900bf7c6SYuichi Sugiyama {
87*900bf7c6SYuichi Sugiyama QCBOREncodeContext context = { };
88*900bf7c6SYuichi Sugiyama uint8_t *buffer = NULL;
89*900bf7c6SYuichi Sugiyama size_t required_size = 0;
90*900bf7c6SYuichi Sugiyama UsefulBufC encoded_data = { NULL, 0 };
91*900bf7c6SYuichi Sugiyama
92*900bf7c6SYuichi Sugiyama /* First encode: calculate the required length */
93*900bf7c6SYuichi Sugiyama QCBOREncode_Init(&context, (UsefulBuf){ NULL, INT32_MAX });
94*900bf7c6SYuichi Sugiyama encode_func(&context, encode_args);
95*900bf7c6SYuichi Sugiyama if (QCBOREncode_FinishGetSize(&context, &required_size) !=
96*900bf7c6SYuichi Sugiyama QCBOR_SUCCESS) {
97*900bf7c6SYuichi Sugiyama return NULLUsefulBufC;
98*900bf7c6SYuichi Sugiyama }
99*900bf7c6SYuichi Sugiyama
100*900bf7c6SYuichi Sugiyama /* Allocate buffer for encoded data */
101*900bf7c6SYuichi Sugiyama buffer = mempool_alloc(mempool_default, required_size);
102*900bf7c6SYuichi Sugiyama if (!buffer) {
103*900bf7c6SYuichi Sugiyama DMSG("Failed to allocate buffer");
104*900bf7c6SYuichi Sugiyama return NULLUsefulBufC;
105*900bf7c6SYuichi Sugiyama }
106*900bf7c6SYuichi Sugiyama
107*900bf7c6SYuichi Sugiyama /* Second encode: encode data */
108*900bf7c6SYuichi Sugiyama QCBOREncode_Init(&context, (UsefulBuf){ buffer, required_size });
109*900bf7c6SYuichi Sugiyama encode_func(&context, encode_args);
110*900bf7c6SYuichi Sugiyama if (QCBOREncode_Finish(&context, &encoded_data) != QCBOR_SUCCESS) {
111*900bf7c6SYuichi Sugiyama mempool_free(mempool_default, buffer);
112*900bf7c6SYuichi Sugiyama return NULLUsefulBufC;
113*900bf7c6SYuichi Sugiyama }
114*900bf7c6SYuichi Sugiyama
115*900bf7c6SYuichi Sugiyama /* Verify the length of the encoded data */
116*900bf7c6SYuichi Sugiyama if (encoded_data.len != required_size) {
117*900bf7c6SYuichi Sugiyama DMSG("Unexpected length of encoded data");
118*900bf7c6SYuichi Sugiyama mempool_free(mempool_default, buffer);
119*900bf7c6SYuichi Sugiyama return NULLUsefulBufC;
120*900bf7c6SYuichi Sugiyama }
121*900bf7c6SYuichi Sugiyama
122*900bf7c6SYuichi Sugiyama return encoded_data;
123*900bf7c6SYuichi Sugiyama }
124*900bf7c6SYuichi Sugiyama
encode_protected_header(QCBOREncodeContext * context)125*900bf7c6SYuichi Sugiyama static void encode_protected_header(QCBOREncodeContext *context)
126*900bf7c6SYuichi Sugiyama {
127*900bf7c6SYuichi Sugiyama QCBOREncode_OpenMap(context);
128*900bf7c6SYuichi Sugiyama QCBOREncode_AddInt64ToMapN(context, COSE_HEADER_PARAM_ALG,
129*900bf7c6SYuichi Sugiyama COSE_ALGORITHM_ES256);
130*900bf7c6SYuichi Sugiyama QCBOREncode_CloseMap(context);
131*900bf7c6SYuichi Sugiyama }
132*900bf7c6SYuichi Sugiyama
encode_protected_header_wrapper(QCBOREncodeContext * context,void * args __unused)133*900bf7c6SYuichi Sugiyama static void encode_protected_header_wrapper(QCBOREncodeContext *context,
134*900bf7c6SYuichi Sugiyama void *args __unused)
135*900bf7c6SYuichi Sugiyama {
136*900bf7c6SYuichi Sugiyama encode_protected_header(context);
137*900bf7c6SYuichi Sugiyama }
138*900bf7c6SYuichi Sugiyama
139*900bf7c6SYuichi Sugiyama /*
140*900bf7c6SYuichi Sugiyama * Format of to-be-signed bytes. This is defined in COSE (RFC 8152)
141*900bf7c6SYuichi Sugiyama * section 4.4. It is the input to the hash.
142*900bf7c6SYuichi Sugiyama *
143*900bf7c6SYuichi Sugiyama * Sig_structure = [
144*900bf7c6SYuichi Sugiyama * context : "Signature1",
145*900bf7c6SYuichi Sugiyama * body_protected : empty_or_serialized_map,
146*900bf7c6SYuichi Sugiyama * external_aad : bstr,
147*900bf7c6SYuichi Sugiyama * payload : bstr
148*900bf7c6SYuichi Sugiyama * ]
149*900bf7c6SYuichi Sugiyama *
150*900bf7c6SYuichi Sugiyama * body_protected refers to the protected parameters from the main
151*900bf7c6SYuichi Sugiyama * COSE_Sign1 structure.
152*900bf7c6SYuichi Sugiyama */
encode_tbs_structure(QCBOREncodeContext * context,UsefulBufC protected_header,UsefulBufC aad,UsefulBufC payload)153*900bf7c6SYuichi Sugiyama static void encode_tbs_structure(QCBOREncodeContext *context,
154*900bf7c6SYuichi Sugiyama UsefulBufC protected_header, UsefulBufC aad,
155*900bf7c6SYuichi Sugiyama UsefulBufC payload)
156*900bf7c6SYuichi Sugiyama {
157*900bf7c6SYuichi Sugiyama QCBOREncode_OpenArray(context);
158*900bf7c6SYuichi Sugiyama QCBOREncode_AddSZString(context, COSE_SIG_CONTEXT_STRING_SIGNATURE1);
159*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, protected_header);
160*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, aad);
161*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, payload);
162*900bf7c6SYuichi Sugiyama QCBOREncode_CloseArray(context);
163*900bf7c6SYuichi Sugiyama }
164*900bf7c6SYuichi Sugiyama
encode_tbs_structure_wrapper(QCBOREncodeContext * context,void * args)165*900bf7c6SYuichi Sugiyama static void encode_tbs_structure_wrapper(QCBOREncodeContext *context,
166*900bf7c6SYuichi Sugiyama void *args)
167*900bf7c6SYuichi Sugiyama {
168*900bf7c6SYuichi Sugiyama struct tbs_structure_args *tbs_args =
169*900bf7c6SYuichi Sugiyama (struct tbs_structure_args *)args;
170*900bf7c6SYuichi Sugiyama
171*900bf7c6SYuichi Sugiyama encode_tbs_structure(context, tbs_args->protected_header, tbs_args->aad,
172*900bf7c6SYuichi Sugiyama tbs_args->payload);
173*900bf7c6SYuichi Sugiyama }
174*900bf7c6SYuichi Sugiyama
build_protected_header(void)175*900bf7c6SYuichi Sugiyama static UsefulBufC build_protected_header(void)
176*900bf7c6SYuichi Sugiyama {
177*900bf7c6SYuichi Sugiyama return build_encoded_buffer(encode_protected_header_wrapper, NULL);
178*900bf7c6SYuichi Sugiyama }
179*900bf7c6SYuichi Sugiyama
build_tbs_structure(UsefulBufC protected_header,UsefulBufC aad,UsefulBufC payload)180*900bf7c6SYuichi Sugiyama static UsefulBufC build_tbs_structure(UsefulBufC protected_header,
181*900bf7c6SYuichi Sugiyama UsefulBufC aad, UsefulBufC payload)
182*900bf7c6SYuichi Sugiyama {
183*900bf7c6SYuichi Sugiyama struct tbs_structure_args args = {
184*900bf7c6SYuichi Sugiyama .protected_header = protected_header,
185*900bf7c6SYuichi Sugiyama .aad = aad,
186*900bf7c6SYuichi Sugiyama .payload = payload,
187*900bf7c6SYuichi Sugiyama };
188*900bf7c6SYuichi Sugiyama
189*900bf7c6SYuichi Sugiyama return build_encoded_buffer(encode_tbs_structure_wrapper, &args);
190*900bf7c6SYuichi Sugiyama }
191*900bf7c6SYuichi Sugiyama
encode_cose_evidence(QCBOREncodeContext * context,UsefulBufC ubc_cbor_evidence)192*900bf7c6SYuichi Sugiyama static void encode_cose_evidence(QCBOREncodeContext *context,
193*900bf7c6SYuichi Sugiyama UsefulBufC ubc_cbor_evidence)
194*900bf7c6SYuichi Sugiyama {
195*900bf7c6SYuichi Sugiyama UsefulBufC protected_header = { NULL, 0 };
196*900bf7c6SYuichi Sugiyama UsefulBufC tbs_payload = { NULL, 0 };
197*900bf7c6SYuichi Sugiyama uint8_t signature[64] = { };
198*900bf7c6SYuichi Sugiyama size_t signature_len = 64;
199*900bf7c6SYuichi Sugiyama UsefulBufC signature_payload = { signature, signature_len };
200*900bf7c6SYuichi Sugiyama
201*900bf7c6SYuichi Sugiyama /* Add top level array for COSE_Sign1 */
202*900bf7c6SYuichi Sugiyama QCBOREncode_AddTag(context, CBOR_TAG_COSE_SIGN1);
203*900bf7c6SYuichi Sugiyama QCBOREncode_OpenArray(context);
204*900bf7c6SYuichi Sugiyama
205*900bf7c6SYuichi Sugiyama /* Encode protected header */
206*900bf7c6SYuichi Sugiyama protected_header = build_protected_header();
207*900bf7c6SYuichi Sugiyama if (UsefulBuf_IsNULLC(protected_header)) {
208*900bf7c6SYuichi Sugiyama DMSG("Failed to encode protected header payload");
209*900bf7c6SYuichi Sugiyama return;
210*900bf7c6SYuichi Sugiyama }
211*900bf7c6SYuichi Sugiyama
212*900bf7c6SYuichi Sugiyama /* Add protected header */
213*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, protected_header);
214*900bf7c6SYuichi Sugiyama
215*900bf7c6SYuichi Sugiyama /* Add unprotected header (empty map) */
216*900bf7c6SYuichi Sugiyama QCBOREncode_OpenMap(context);
217*900bf7c6SYuichi Sugiyama QCBOREncode_CloseMap(context);
218*900bf7c6SYuichi Sugiyama
219*900bf7c6SYuichi Sugiyama /* Add the payload (evidence CBOR) */
220*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, ubc_cbor_evidence);
221*900bf7c6SYuichi Sugiyama
222*900bf7c6SYuichi Sugiyama /* Encode "To Be Signed" payload */
223*900bf7c6SYuichi Sugiyama tbs_payload = build_tbs_structure(protected_header, NULLUsefulBufC,
224*900bf7c6SYuichi Sugiyama ubc_cbor_evidence);
225*900bf7c6SYuichi Sugiyama if (UsefulBuf_IsNULLC(tbs_payload)) {
226*900bf7c6SYuichi Sugiyama DMSG("Failed to encode to-be-signed payload");
227*900bf7c6SYuichi Sugiyama mempool_free(mempool_default, (void *)protected_header.ptr);
228*900bf7c6SYuichi Sugiyama return;
229*900bf7c6SYuichi Sugiyama }
230*900bf7c6SYuichi Sugiyama
231*900bf7c6SYuichi Sugiyama /* Calculate a signature and add the signature to payload */
232*900bf7c6SYuichi Sugiyama if (sign_ecdsa_sha256(tbs_payload.ptr, tbs_payload.len, signature,
233*900bf7c6SYuichi Sugiyama &signature_len) != TEE_SUCCESS) {
234*900bf7c6SYuichi Sugiyama DMSG("Failed to sign payload");
235*900bf7c6SYuichi Sugiyama mempool_free(mempool_default, (void *)protected_header.ptr);
236*900bf7c6SYuichi Sugiyama mempool_free(mempool_default, (void *)tbs_payload.ptr);
237*900bf7c6SYuichi Sugiyama return;
238*900bf7c6SYuichi Sugiyama }
239*900bf7c6SYuichi Sugiyama
240*900bf7c6SYuichi Sugiyama /* Add the signature */
241*900bf7c6SYuichi Sugiyama QCBOREncode_AddBytes(context, signature_payload);
242*900bf7c6SYuichi Sugiyama
243*900bf7c6SYuichi Sugiyama /* Close top level array for COSE_Sign1 */
244*900bf7c6SYuichi Sugiyama QCBOREncode_CloseArray(context);
245*900bf7c6SYuichi Sugiyama }
246*900bf7c6SYuichi Sugiyama
encode_cbor_evidence_wrapper(QCBOREncodeContext * context,void * args)247*900bf7c6SYuichi Sugiyama static void encode_cbor_evidence_wrapper(QCBOREncodeContext *context,
248*900bf7c6SYuichi Sugiyama void *args)
249*900bf7c6SYuichi Sugiyama {
250*900bf7c6SYuichi Sugiyama struct cbor_evidence_args *evidence_args =
251*900bf7c6SYuichi Sugiyama (struct cbor_evidence_args *)args;
252*900bf7c6SYuichi Sugiyama
253*900bf7c6SYuichi Sugiyama encode_cbor_evidence(context, evidence_args->ubc_eat_profile,
254*900bf7c6SYuichi Sugiyama evidence_args->psa_client_id,
255*900bf7c6SYuichi Sugiyama evidence_args->psa_security_lifecycle,
256*900bf7c6SYuichi Sugiyama evidence_args->ubc_psa_implementation_id,
257*900bf7c6SYuichi Sugiyama evidence_args->ubc_measurement_type,
258*900bf7c6SYuichi Sugiyama evidence_args->ubc_signer_id,
259*900bf7c6SYuichi Sugiyama evidence_args->ubc_psa_instance_id,
260*900bf7c6SYuichi Sugiyama evidence_args->ubc_psa_nonce,
261*900bf7c6SYuichi Sugiyama evidence_args->ubc_measurement_value);
262*900bf7c6SYuichi Sugiyama }
263*900bf7c6SYuichi Sugiyama
encode_cose_evidence_wrapper(QCBOREncodeContext * context,void * args)264*900bf7c6SYuichi Sugiyama static void encode_cose_evidence_wrapper(QCBOREncodeContext *context,
265*900bf7c6SYuichi Sugiyama void *args)
266*900bf7c6SYuichi Sugiyama {
267*900bf7c6SYuichi Sugiyama struct cose_evidence_args *cose_args =
268*900bf7c6SYuichi Sugiyama (struct cose_evidence_args *)args;
269*900bf7c6SYuichi Sugiyama
270*900bf7c6SYuichi Sugiyama encode_cose_evidence(context, cose_args->ubc_cbor_evidence);
271*900bf7c6SYuichi Sugiyama }
272*900bf7c6SYuichi Sugiyama
273*900bf7c6SYuichi Sugiyama static UsefulBufC
build_cbor_evidence(UsefulBufC ubc_eat_profile,int psa_client_id,int psa_security_lifecycle,UsefulBufC ubc_psa_implementation_id,UsefulBufC ubc_measurement_type,UsefulBufC ubc_signer_id,UsefulBufC ubc_psa_instance_id,UsefulBufC ubc_psa_nonce,UsefulBufC ubc_measurement_value)274*900bf7c6SYuichi Sugiyama build_cbor_evidence(UsefulBufC ubc_eat_profile, int psa_client_id,
275*900bf7c6SYuichi Sugiyama int psa_security_lifecycle,
276*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_implementation_id,
277*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_type, UsefulBufC ubc_signer_id,
278*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_instance_id, UsefulBufC ubc_psa_nonce,
279*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_value)
280*900bf7c6SYuichi Sugiyama {
281*900bf7c6SYuichi Sugiyama struct cbor_evidence_args args = {
282*900bf7c6SYuichi Sugiyama .ubc_eat_profile = ubc_eat_profile,
283*900bf7c6SYuichi Sugiyama .psa_client_id = psa_client_id,
284*900bf7c6SYuichi Sugiyama .psa_security_lifecycle = psa_security_lifecycle,
285*900bf7c6SYuichi Sugiyama .ubc_psa_implementation_id = ubc_psa_implementation_id,
286*900bf7c6SYuichi Sugiyama .ubc_measurement_type = ubc_measurement_type,
287*900bf7c6SYuichi Sugiyama .ubc_signer_id = ubc_signer_id,
288*900bf7c6SYuichi Sugiyama .ubc_psa_instance_id = ubc_psa_instance_id,
289*900bf7c6SYuichi Sugiyama .ubc_psa_nonce = ubc_psa_nonce,
290*900bf7c6SYuichi Sugiyama .ubc_measurement_value = ubc_measurement_value,
291*900bf7c6SYuichi Sugiyama };
292*900bf7c6SYuichi Sugiyama
293*900bf7c6SYuichi Sugiyama return build_encoded_buffer(encode_cbor_evidence_wrapper, &args);
294*900bf7c6SYuichi Sugiyama }
295*900bf7c6SYuichi Sugiyama
build_cose_evidence(UsefulBufC ubc_cbor_evidence)296*900bf7c6SYuichi Sugiyama static UsefulBufC build_cose_evidence(UsefulBufC ubc_cbor_evidence)
297*900bf7c6SYuichi Sugiyama {
298*900bf7c6SYuichi Sugiyama struct cose_evidence_args args = {
299*900bf7c6SYuichi Sugiyama .ubc_cbor_evidence = ubc_cbor_evidence,
300*900bf7c6SYuichi Sugiyama };
301*900bf7c6SYuichi Sugiyama
302*900bf7c6SYuichi Sugiyama return build_encoded_buffer(encode_cose_evidence_wrapper, &args);
303*900bf7c6SYuichi Sugiyama }
304*900bf7c6SYuichi Sugiyama
generate_cbor_evidence(const char * eat_profile,int psa_client_id,int psa_security_lifecycle,const uint8_t * psa_implementation_id,size_t psa_implementation_id_len,const char * measurement_type,const uint8_t * signer_id,size_t signer_id_len,const uint8_t * psa_instance_id,size_t psa_instance_id_len,const uint8_t * psa_nonce,size_t psa_nonce_len,const uint8_t * measurement_value,size_t measurement_value_len)305*900bf7c6SYuichi Sugiyama UsefulBufC generate_cbor_evidence(const char *eat_profile,
306*900bf7c6SYuichi Sugiyama int psa_client_id,
307*900bf7c6SYuichi Sugiyama int psa_security_lifecycle,
308*900bf7c6SYuichi Sugiyama const uint8_t *psa_implementation_id,
309*900bf7c6SYuichi Sugiyama size_t psa_implementation_id_len,
310*900bf7c6SYuichi Sugiyama const char *measurement_type,
311*900bf7c6SYuichi Sugiyama const uint8_t *signer_id,
312*900bf7c6SYuichi Sugiyama size_t signer_id_len,
313*900bf7c6SYuichi Sugiyama const uint8_t *psa_instance_id,
314*900bf7c6SYuichi Sugiyama size_t psa_instance_id_len,
315*900bf7c6SYuichi Sugiyama const uint8_t *psa_nonce,
316*900bf7c6SYuichi Sugiyama size_t psa_nonce_len,
317*900bf7c6SYuichi Sugiyama const uint8_t *measurement_value,
318*900bf7c6SYuichi Sugiyama size_t measurement_value_len)
319*900bf7c6SYuichi Sugiyama {
320*900bf7c6SYuichi Sugiyama /* prepare usefulbufs because qcbor only accepts them */
321*900bf7c6SYuichi Sugiyama UsefulBufC ubc_eat_profile = UsefulBuf_FromSZ(eat_profile);
322*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_implementation_id = { psa_implementation_id,
323*900bf7c6SYuichi Sugiyama psa_implementation_id_len };
324*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_type = UsefulBuf_FromSZ(measurement_type);
325*900bf7c6SYuichi Sugiyama UsefulBufC ubc_signer_id = { signer_id, signer_id_len };
326*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_instance_id = { psa_instance_id,
327*900bf7c6SYuichi Sugiyama psa_instance_id_len };
328*900bf7c6SYuichi Sugiyama UsefulBufC ubc_psa_nonce = { psa_nonce, psa_nonce_len };
329*900bf7c6SYuichi Sugiyama UsefulBufC ubc_measurement_value = { measurement_value,
330*900bf7c6SYuichi Sugiyama measurement_value_len };
331*900bf7c6SYuichi Sugiyama
332*900bf7c6SYuichi Sugiyama return build_cbor_evidence(ubc_eat_profile,
333*900bf7c6SYuichi Sugiyama psa_client_id,
334*900bf7c6SYuichi Sugiyama psa_security_lifecycle,
335*900bf7c6SYuichi Sugiyama ubc_psa_implementation_id,
336*900bf7c6SYuichi Sugiyama ubc_measurement_type,
337*900bf7c6SYuichi Sugiyama ubc_signer_id,
338*900bf7c6SYuichi Sugiyama ubc_psa_instance_id,
339*900bf7c6SYuichi Sugiyama ubc_psa_nonce,
340*900bf7c6SYuichi Sugiyama ubc_measurement_value);
341*900bf7c6SYuichi Sugiyama }
342*900bf7c6SYuichi Sugiyama
generate_cose_evidence(UsefulBufC ubc_cbor_evidence)343*900bf7c6SYuichi Sugiyama UsefulBufC generate_cose_evidence(UsefulBufC ubc_cbor_evidence)
344*900bf7c6SYuichi Sugiyama {
345*900bf7c6SYuichi Sugiyama return build_cose_evidence(ubc_cbor_evidence);
346*900bf7c6SYuichi Sugiyama }
347