5 #include "sw/device/lib/crypto/impl/rsa/rsa_3072_verify.h"
10 #include "sw/device/lib/crypto/drivers/otbn.h"
11 #include "sw/device/lib/crypto/impl/status.h"
17 #define MODULE_ID MAKE_MODULE_ID('r', '3', 'v')
32 static const otbn_addr_t kOtbnVarRsaMode =
34 static const otbn_addr_t kOtbnVarRsaOutBuf =
36 static const otbn_addr_t kOtbnVarRsaInMod =
38 static const otbn_addr_t kOtbnVarRsaInBuf =
40 static const otbn_addr_t kOtbnVarRsaRR =
42 static const otbn_addr_t kOtbnVarRsaM0Inv =
46 static const uint32_t kOtbnRsaModeNumWords = 1;
47 static const uint32_t kOtbnRsaModeConstants = 1;
48 static const uint32_t kOtbnRsaModeModexp = 2;
50 status_t rsa_3072_encode_sha256(
const uint8_t *msg,
size_t msgLen,
52 if (msg == NULL && msgLen != 0) {
53 return OTCRYPTO_BAD_ARGS;
74 memset(result->data, 0xff,
sizeof(result->data));
77 result->data[kRsa3072NumWords - 1] = 0x0001ffff;
84 uint32_t digest_buf[kSha256DigestWords];
86 .mode = kOtcryptoHashModeSha256,
88 .len = kSha256DigestWords,
94 for (
size_t i = 0; i < kHmacSha256DigestWords; i++) {
96 __builtin_bswap32(digest.data[kHmacSha256DigestWords - 1 - i]);
100 result->data[kHmacSha256DigestWords] = 0x05000420;
101 result->data[kHmacSha256DigestWords + 1] = 0x03040201;
102 result->data[kHmacSha256DigestWords + 2] = 0x86480165;
103 result->data[kHmacSha256DigestWords + 3] = 0x0d060960;
104 result->data[kHmacSha256DigestWords + 4] = 0x00303130;
119 return otbn_dmem_write(kRsa3072NumWords, src->data, dst);
131 return otbn_dmem_read(kRsa3072NumWords, src, dst->data);
137 HARDENED_TRY(otbn_load_app(kOtbnAppRsa));
140 HARDENED_TRY(otbn_dmem_write(kOtbnRsaModeNumWords, &kOtbnRsaModeConstants,
144 HARDENED_TRY(write_rsa_3072_int_to_otbn(&public_key->n, kOtbnVarRsaInMod));
147 HARDENED_TRY(otbn_execute());
150 HARDENED_TRY(otbn_busy_wait_for_done());
153 HARDENED_TRY(read_rsa_3072_int_from_otbn(kOtbnVarRsaRR, &result->rr));
157 otbn_dmem_read(kOtbnWideWordNumWords, kOtbnVarRsaM0Inv, result->m0_inv));
166 if (public_key->e != 65537) {
167 return OTCRYPTO_BAD_ARGS;
172 if (
memrcmp(public_key->n.data, signature->data, kRsa3072NumBytes) <= 0) {
173 return OTCRYPTO_BAD_ARGS;
177 HARDENED_TRY(otbn_load_app(kOtbnAppRsa));
180 HARDENED_TRY(otbn_dmem_write(kOtbnRsaModeNumWords, &kOtbnRsaModeModexp,
184 HARDENED_TRY(write_rsa_3072_int_to_otbn(&public_key->n, kOtbnVarRsaInMod));
187 HARDENED_TRY(write_rsa_3072_int_to_otbn(signature, kOtbnVarRsaInBuf));
190 HARDENED_TRY(write_rsa_3072_int_to_otbn(&constants->rr, kOtbnVarRsaRR));
193 HARDENED_TRY(otbn_dmem_write(kOtbnWideWordNumWords, constants->m0_inv,
197 HARDENED_TRY(otbn_execute());
209 HARDENED_TRY(otbn_busy_wait_for_done());
214 read_rsa_3072_int_from_otbn(kOtbnVarRsaOutBuf, &recoveredMessage));
219 for (
int i = 0; i < kRsa3072NumWords; i++) {
220 if (recoveredMessage.data[i] != message->data[i]) {
238 HARDENED_TRY(rsa_3072_verify_start(signature, public_key, constants));
241 return rsa_3072_verify_finalize(message, result);