5 #include "sw/device/silicon_creator/lib/sigverify/ecdsa_p256_verify.h"
8 #include "sw/device/silicon_creator/lib/otbn_boot_services.h"
9 #include "sw/device/silicon_creator/lib/sigverify/ecdsa_p256_key.h"
11 #include "otp_ctrl_regs.h"
36 static const uint32_t kSigverifyShares[kEcdsaP256SignatureComponentWords] = {
37 0xaf28073b, 0x5eb7dcfb, 0x177240b5, 0xa8469df3,
38 0x2e92e9c0, 0x83ed133b, 0x0c9e99f0, 0xc04cd16d,
50 static rom_error_t sigverify_encoded_message_check(
79 static_assert(
sizeof(recovered_r->r) ==
sizeof(signature->r),
80 "Signature sizes must match");
81 static_assert(
ARRAYSIZE(signature->r) == kEcdsaP256SignatureComponentWords,
82 "Signature sizes must match");
84 uint32_t *recovered_r_ptr = recovered_r->r;
86 for (
size_t j = 0; launder32(j) < kEcdsaP256SignatureComponentWords;
88 recovered_r_ptr[i] ^= signature->r[j] ^ kSigverifyShares[i];
94 uint32_t flash_exec_ecdsa = 0;
96 for (i = 0; launder32(i) < kEcdsaP256SignatureComponentWords; ++i) {
99 diff |= recovered_r_ptr[i] ^ kSigverifyShares[i];
101 diff |= ~(diff >> 31) + 1;
103 flash_exec_ecdsa ^= recovered_r_ptr[i];
105 flash_exec_ecdsa |= diff;
111 rom_error_t result = sigverify_ecdsa_p256_success_to_ok(flash_exec_ecdsa);
112 *flash_exec ^= flash_exec_ecdsa;
113 if (launder32(result) == kErrorOk) {
118 return kErrorSigverifyBadEcdsaSignature;
124 uint32_t *flash_exec) {
127 otbn_boot_sigverify(key, signature, act_digest, (uint32_t *)&recovered_r);
128 if (launder32(error) != kErrorOk) {
129 *flash_exec ^= UINT32_MAX;
133 return sigverify_encoded_message_check(&recovered_r, signature, flash_exec);
137 extern uint32_t sigverify_ecdsa_p256_success_to_ok(uint32_t v);