5 #include "sw/device/silicon_creator/lib/otbn_boot_services.h"
8 #include "sw/device/silicon_creator/lib/attestation.h"
10 #include "sw/device/silicon_creator/lib/base/util.h"
11 #include "sw/device/silicon_creator/lib/dbg_print.h"
12 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
13 #include "sw/device/silicon_creator/lib/drivers/hmac.h"
14 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
15 #include "sw/device/silicon_creator/lib/drivers/otbn.h"
17 #include "otbn_regs.h"
19 static_assert(kAttestationSeedWords <= 16,
20 "Additional attestation seed needs must be <= 516 bits.");
32 boot, attestation_additional_seed);
43 static const sc_otbn_addr_t kOtbnVarBootAttestationAdditionalSeed =
50 kOtbnBootModeWords = 1,
56 kOtbnBootModeSigverify = 0x7d3,
62 kOtbnBootModeAttestationKeygen = 0x2bf,
68 kOtbnBootModeAttestationEndorse = 0x5e8,
74 kOtbnBootModeAttestationKeySave = 0x64d,
77 kOtbnAttestationSeedBufferWords =
78 ((kAttestationSeedWords + kScOtbnWideWordNumWords - 1) /
79 kScOtbnWideWordNumWords) *
80 kScOtbnWideWordNumWords,
84 static rom_error_t load_attestation_keygen_seed(uint32_t additional_seed_idx,
87 uint32_t seed_flash_offset =
88 0 + (additional_seed_idx * kAttestationSeedBytes);
90 flash_ctrl_info_read(&kFlashCtrlInfoPageAttestationKeySeeds,
91 seed_flash_offset, kAttestationSeedWords, seed);
93 if (err != kErrorOk) {
95 flash_ctrl_error_code_get(&flash_ctrl_err_code);
96 if (flash_ctrl_err_code.
rd_err) {
101 "Warning: Attestation key seed flash info page not provisioned.\r\n");
102 memset(seed, 0, kAttestationSeedBytes);
111 rom_error_t otbn_boot_app_load(
void) {
return sc_otbn_load_app(kOtbnAppBoot); }
113 rom_error_t otbn_boot_attestation_keygen(
114 uint32_t additional_seed_idx, sc_keymgr_key_type_t key_type,
118 HARDENED_RETURN_IF_ERROR(
119 sc_keymgr_generate_key_otbn(key_type, diversification));
122 uint32_t mode = kOtbnBootModeAttestationKeygen;
123 HARDENED_RETURN_IF_ERROR(
124 sc_otbn_dmem_write(kOtbnBootModeWords, &mode, kOtbnVarBootMode));
127 uint32_t seed[kAttestationSeedWords];
128 HARDENED_RETURN_IF_ERROR(
129 load_attestation_keygen_seed(additional_seed_idx, seed));
132 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(
133 kAttestationSeedWords, seed, kOtbnVarBootAttestationAdditionalSeed));
136 uint32_t zero_buf[kOtbnAttestationSeedBufferWords - kAttestationSeedWords] = {
138 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(
140 kOtbnVarBootAttestationAdditionalSeed + kAttestationSeedBytes));
143 HARDENED_RETURN_IF_ERROR(sc_otbn_execute());
149 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(kEcdsaP256PublicKeyCoordWords,
150 kOtbnVarBootX, public_key->
x));
151 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(kEcdsaP256PublicKeyCoordWords,
152 kOtbnVarBootY, public_key->
y));
162 util_reverse_bytes(pubkey->
x, kEcdsaP256PublicKeyCoordBytes);
163 util_reverse_bytes(pubkey->
y, kEcdsaP256PublicKeyCoordBytes);
169 HARDENED_RETURN_IF_ERROR(sc_keymgr_state_check(key.required_keymgr_state));
172 HARDENED_RETURN_IF_ERROR(otbn_boot_attestation_keygen(
173 key.keygen_seed_idx, key.type, *key.keymgr_diversifier, pubkey));
178 pubkey_le_to_be_convert(pubkey);
185 hmac_sha256(pubkey,
sizeof(*pubkey), pubkey_id);
186 util_reverse_bytes(pubkey_id,
sizeof(*pubkey_id));
191 rom_error_t otbn_boot_attestation_key_save(
192 uint32_t additional_seed_idx, sc_keymgr_key_type_t key_type,
195 HARDENED_RETURN_IF_ERROR(
196 sc_keymgr_generate_key_otbn(key_type, diversification));
199 uint32_t mode = kOtbnBootModeAttestationKeySave;
200 HARDENED_RETURN_IF_ERROR(
201 sc_otbn_dmem_write(kOtbnBootModeWords, &mode, kOtbnVarBootMode));
204 uint32_t seed[kAttestationSeedWords];
205 HARDENED_RETURN_IF_ERROR(
206 load_attestation_keygen_seed(additional_seed_idx, seed));
209 uint32_t zero_buf[kOtbnAttestationSeedBufferWords - kAttestationSeedWords] = {
211 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(
213 kOtbnVarBootAttestationAdditionalSeed + kAttestationSeedBytes));
216 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(
217 kAttestationSeedWords, seed, kOtbnVarBootAttestationAdditionalSeed));
220 HARDENED_RETURN_IF_ERROR(sc_otbn_execute());
228 rom_error_t otbn_boot_attestation_key_clear(
void) {
230 RETURN_IF_ERROR(sc_otbn_dmem_sec_wipe());
231 HARDENED_RETURN_IF_ERROR(sc_otbn_busy_wait_for_done());
236 return kErrorOtbnInvalidArgument;
239 const size_t data_num_words =
241 if (data_num_words > 0) {
242 HARDENED_RETURN_IF_ERROR(
249 rom_error_t otbn_boot_attestation_endorse(
const hmac_digest_t *digest,
252 uint32_t mode = kOtbnBootModeAttestationEndorse;
253 HARDENED_RETURN_IF_ERROR(
254 sc_otbn_dmem_write(kOtbnBootModeWords, &mode, kOtbnVarBootMode));
257 HARDENED_RETURN_IF_ERROR(
258 sc_otbn_dmem_write(kHmacDigestNumWords, digest->digest, kOtbnVarBootMsg));
261 HARDENED_RETURN_IF_ERROR(sc_otbn_execute());
267 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(kEcdsaP256SignatureComponentWords,
268 kOtbnVarBootR, sig->r));
269 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(kEcdsaP256SignatureComponentWords,
270 kOtbnVarBootS, sig->s));
278 uint32_t *recovered_r) {
280 uint32_t mode = kOtbnBootModeSigverify;
281 HARDENED_RETURN_IF_ERROR(
282 sc_otbn_dmem_write(kOtbnBootModeWords, &mode, kOtbnVarBootMode));
285 HARDENED_RETURN_IF_ERROR(
286 sc_otbn_dmem_write(kEcdsaP256PublicKeyCoordWords, key->x, kOtbnVarBootX));
287 HARDENED_RETURN_IF_ERROR(
288 sc_otbn_dmem_write(kEcdsaP256PublicKeyCoordWords, key->y, kOtbnVarBootY));
291 HARDENED_RETURN_IF_ERROR(
292 sc_otbn_dmem_write(kHmacDigestNumWords, digest->digest, kOtbnVarBootMsg));
295 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(kEcdsaP256SignatureComponentWords,
296 sig->r, kOtbnVarBootR));
297 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_write(kEcdsaP256SignatureComponentWords,
298 sig->s, kOtbnVarBootS));
301 HARDENED_RETURN_IF_ERROR(sc_otbn_execute());
306 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(1, kOtbnVarBootOk, &ok));
308 return kErrorSigverifyBadEcdsaSignature;
312 HARDENED_RETURN_IF_ERROR(sc_otbn_dmem_read(1, kOtbnVarBootOk, &ok));
318 return sc_otbn_dmem_read(kEcdsaP256SignatureComponentWords, kOtbnVarBootXr,