Software APIs
provisioning_data.h
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #ifndef OPENTITAN_SW_DEVICE_LIB_TESTING_JSON_PROVISIONING_DATA_H_
6 #define OPENTITAN_SW_DEVICE_LIB_TESTING_JSON_PROVISIONING_DATA_H_
7 
8 #include "sw/device/lib/ujson/ujson_derive.h"
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #define MODULE_ID MAKE_MODULE_ID('j', 'p', 'd')
15 
16 /**
17  * Provisioning data imported onto the device in CP.
18  */
19 // clang-format off
20 #define STRUCT_MANUF_CP_PROVISIONING_DATA(field, string) \
21  field(device_id, uint32_t, 8) \
22  field(manuf_state, uint32_t, 8) \
23  field(wafer_auth_secret, uint32_t, 8) \
24  field(test_unlock_token_hash, uint64_t, 2) \
25  field(test_exit_token_hash, uint64_t, 2)
26 UJSON_SERDE_STRUCT(ManufCpProvisioningData, \
27  manuf_cp_provisioning_data_t, \
28  STRUCT_MANUF_CP_PROVISIONING_DATA);
29 // clang-format on
30 
31 /**
32  * Provisioning data imported onto the device in FT during individualization.
33  */
34 // clang-format off
35 #define STRUCT_MANUF_FT_INDIVIDUALIZE_DATA(field, string) \
36  field(device_id, uint32_t, 8)
37 UJSON_SERDE_STRUCT(ManufFtIndividualizeData, \
38  manuf_ft_individualize_data_t, \
39  STRUCT_MANUF_FT_INDIVIDUALIZE_DATA);
40 // clang-format on
41 
42 /**
43  * ECC P256 public key.
44  */
45 // clang-format off
46 #define STRUCT_ECC_P256_PUBLIC_KEY(field, string) \
47  field(x, uint32_t, 8) \
48  field(y, uint32_t, 8)
49 UJSON_SERDE_STRUCT(EccP256PublicKey, \
50  ecc_p256_public_key_t, \
51  STRUCT_ECC_P256_PUBLIC_KEY);
52 // clang-format on
53 
54 /**
55  * A CShake hash used for storing various LC tokens (test lock/unlock, RMA
56  * unlock, etc).
57  */
58 // clang-format off
59 #define STRUCT_LC_TOKEN_HASH(field, string) \
60  field(hash, uint64_t, 2)
61 UJSON_SERDE_STRUCT(LcTokenHash, \
62  lc_token_hash_t, \
63  STRUCT_LC_TOKEN_HASH);
64 // clang-format on
65 
66 /**
67  * Inputs needed to generate certificates during personalization.
68  */
69 // clang-format off
70 #define STRUCT_MANUF_CERTGEN_INPUTS(field, string) \
71  field(rom_ext_measurement, uint32_t, 8) \
72  field(rom_ext_security_version, uint32_t) \
73  field(owner_manifest_measurement, uint32_t, 8) \
74  field(owner_measurement, uint32_t, 8) \
75  field(owner_security_version, uint32_t) \
76  field(dice_auth_key_key_id, uint8_t, 20) \
77  field(ext_auth_key_key_id, uint8_t, 20)
78 UJSON_SERDE_STRUCT(ManufCertgenInputs, \
79  manuf_certgen_inputs_t, \
80  STRUCT_MANUF_CERTGEN_INPUTS);
81 // clang-format on
82 
83 /**
84  * Container of data exported/imported during personalization.
85  *
86  * The data is passed as a set of LTV objects concatenated in the 'body' field.
87  *
88  * See details of LTV objects' structure in
89  * sw/device/silicon_creator/manuf/base/perso_tlv_data.h
90  *
91  * The header of the container includes the number of stored objects and the
92  * index of the next free location in the container body.
93  */
94 // clang-format off
95 #define STRUCT_PERSO_BLOB(field, string) \
96  field(num_objs, size_t) \
97  field(next_free, size_t) \
98  field(body, uint8_t, 4096)
99 UJSON_SERDE_STRUCT(PersoBlob, \
100  perso_blob_t, \
101  STRUCT_PERSO_BLOB);
102 // clang-format on
103 
104 /**
105  * Sha256 hash digest.
106  */
107 // clang-format off
108 #define STRUCT_SHA256_HASH(field, string) \
109  field(data, uint32_t, 8)
110 UJSON_SERDE_STRUCT(SerdesSha256Hash, \
111  serdes_sha256_hash_t, \
112  STRUCT_SHA256_HASH);
113 // clang-format on
114 
115 #undef MODULE_ID
116 // clang-format on
117 
118 #ifdef __cplusplus
119 }
120 
121 #endif
122 #endif // OPENTITAN_SW_DEVICE_LIB_TESTING_JSON_PROVISIONING_DATA_H_