5 #include "sw/device/silicon_creator/lib/sigverify/rsa_verify.h"
7 #include "sw/device/silicon_creator/lib/drivers/otp.h"
8 #include "sw/device/silicon_creator/lib/sigverify/mod_exp_ibex.h"
10 #include "otp_ctrl_regs.h"
28 static const uint32_t kSigverifyShares[kSigVerifyRsaNumWords] = {
29 0xaf28073b, 0x5eb7dcfb, 0x177240b5, 0xa8469df3, 0x2e92e9c0, 0x83ed133b,
30 0x0c9e99f0, 0x25611bd9, 0x411a9d85, 0x5c52b3df, 0x4347a537, 0x1e78e574,
31 0x273e33af, 0x6f363bba, 0x11e4ee52, 0xd29ad9aa, 0x4fc2ac85, 0x52490c66,
32 0x59c2528c, 0xef8d3ab2, 0xe74d7eb8, 0x2822259c, 0xe58efaa3, 0xe702fa04,
33 0x82c670f6, 0x42be0a77, 0x3b021ea0, 0x09bd2a22, 0x26d656a4, 0x2f8e008f,
34 0xefca5842, 0xfbc3a713, 0x4ce07aa1, 0xc1826ecc, 0xc697d53f, 0xf6a69161,
35 0x4a7d7628, 0x87f2e957, 0x84db848d, 0xe05e01c5, 0x6188ff27, 0xbf1a2b31,
36 0xb51d4166, 0x85fd6e7c, 0x59c5d2d5, 0x13c6e4e6, 0xff83c944, 0xc78cd4bb,
37 0x8710d989, 0x7608c41e, 0x1061b036, 0x9c2fb244, 0x34a26844, 0x2bdc22a2,
38 0xfd1d95f3, 0x94ac4e84, 0x1a99ce21, 0xd54eb8f7, 0x54c2cd9f, 0x70a967c8,
39 0xde39d471, 0x652563cd, 0x3d4adea1, 0x1cf6631c, 0xb27d16ee, 0x3a18bafa,
40 0xd8a86a86, 0xd839cd7b, 0xda2ab05a, 0x37fc1d99, 0xbc702308, 0x01d57596,
41 0x480d3091, 0x51420446, 0xcc56d97c, 0x7aa57434, 0x7b6097ae, 0x45bca8ae,
42 0xb0b1e322, 0x5487b90f, 0x1045e6ef, 0x87ad10f0, 0x4c72b7f0, 0xc527c9a3,
43 0x29ed4350, 0xe345625b, 0x57063d83, 0xbb56900a, 0xbfb1be4c, 0x1c454e8f,
44 0xdb27c1b7, 0xbe02c694, 0x2604d74a, 0x4d6516dd, 0x322918ab, 0x5f320b43,
71 static rom_error_t sigverify_encoded_message_check(
73 uint32_t *flash_exec) {
101 uint32_t *enc_msg_ptr = enc_msg->data;
103 for (
size_t j = 0; launder32(j) < kHmacDigestNumWords; ++j, ++i) {
104 enc_msg_ptr[i] ^= act_digest->digest[j] ^ kSigverifyShares[i];
107 static const uint32_t kEncodedSha256[] = {
108 0x05000420, 0x03040201, 0x86480165, 0x0d060960, 0x00303130,
110 for (
size_t j = 0; launder32(j) <
ARRAYSIZE(kEncodedSha256); ++j, ++i) {
111 enc_msg_ptr[i] ^= kEncodedSha256[j] ^ kSigverifyShares[i];
114 static const size_t kPsLen =
ARRAYSIZE(enc_msg->data) -
118 for (
size_t j = 0; launder32(j) < kPsLen; ++j, ++i) {
119 enc_msg_ptr[i] ^= 0xffffffff ^ kSigverifyShares[i];
122 enc_msg_ptr[i] ^= 0x0001ffff ^ kSigverifyShares[i];
127 uint32_t flash_exec_rsa = 0;
129 for (i = 0; launder32(i) < kSigVerifyRsaNumWords; ++i) {
132 diff |= enc_msg_ptr[i] ^ kSigverifyShares[i];
134 diff |= ~(diff >> 31) + 1;
136 flash_exec_rsa ^= enc_msg_ptr[i];
138 flash_exec_rsa |= diff;
144 rom_error_t result = sigverify_rsa_success_to_ok(flash_exec_rsa);
145 *flash_exec ^= flash_exec_rsa;
146 if (launder32(result) == kErrorOk) {
151 return kErrorSigverifyBadRsaSignature;
157 lifecycle_state_t lc_state,
158 uint32_t *flash_exec) {
160 rom_error_t error = sigverify_mod_exp_ibex(key, signature, &enc_msg);
161 if (launder32(error) != kErrorOk) {
162 *flash_exec ^= UINT32_MAX;
166 return sigverify_encoded_message_check(&enc_msg, act_digest, flash_exec);
170 extern uint32_t sigverify_rsa_success_to_ok(uint32_t v);