5 #include "sw/device/lib/crypto/impl/rsa/rsa_keygen.h"
9 #include "sw/device/lib/crypto/drivers/otbn.h"
12 #define MODULE_ID MAKE_MODULE_ID('r', 'k', 'g')
24 static const otbn_addr_t kOtbnVarRsaMode =
26 static const otbn_addr_t kOtbnVarRsaN =
OTBN_ADDR_T_INIT(run_rsa_keygen, rsa_n);
27 static const otbn_addr_t kOtbnVarRsaD =
OTBN_ADDR_T_INIT(run_rsa_keygen, rsa_d);
28 static const otbn_addr_t kOtbnVarRsaCofactor =
36 static const uint32_t kOtbnRsaModeGen2048 =
38 static const uint32_t kOtbnRsaModeCofactor2048 =
40 static const uint32_t kOtbnRsaModeGen3072 =
42 static const uint32_t kOtbnRsaModeGen4096 =
48 kFixedPublicExponent = 65537,
50 kOtbnRsaModeWords = 1,
62 static status_t keygen_start(uint32_t mode) {
64 HARDENED_TRY(otbn_load_app(kOtbnAppRsaKeygen));
67 HARDENED_TRY(otbn_dmem_write(kOtbnRsaModeWords, &mode, kOtbnVarRsaMode));
68 return otbn_execute();
83 static status_t keygen_finalize(uint32_t exp_mode,
size_t num_words,
84 uint32_t *n, uint32_t *d) {
86 HARDENED_TRY(otbn_busy_wait_for_done());
89 uint32_t act_mode = 0;
90 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarRsaMode, &act_mode));
91 if (act_mode != exp_mode) {
92 return OTCRYPTO_FATAL_ERR;
96 HARDENED_TRY(otbn_dmem_read(num_words, kOtbnVarRsaN, n));
99 HARDENED_TRY(otbn_dmem_read(num_words, kOtbnVarRsaD, d));
102 HARDENED_TRY(otbn_dmem_sec_wipe());
107 status_t rsa_keygen_2048_start(
void) {
108 return keygen_start(kOtbnRsaModeGen2048);
113 HARDENED_TRY(keygen_finalize(kOtbnRsaModeGen2048, kRsa2048NumWords,
114 private_key->n.data, private_key->d.data));
122 public_key->e = kFixedPublicExponent;
127 status_t rsa_keygen_3072_start(
void) {
128 return keygen_start(kOtbnRsaModeGen3072);
133 HARDENED_TRY(keygen_finalize(kOtbnRsaModeGen3072, kRsa3072NumWords,
134 private_key->n.data, private_key->d.data));
142 public_key->e = kFixedPublicExponent;
147 status_t rsa_keygen_4096_start(
void) {
148 return keygen_start(kOtbnRsaModeGen4096);
153 HARDENED_TRY(keygen_finalize(kOtbnRsaModeGen4096, kRsa4096NumWords,
154 private_key->n.data, private_key->d.data));
162 public_key->e = kFixedPublicExponent;
167 status_t rsa_keygen_from_cofactor_2048_start(
171 if (public_key->e != kFixedPublicExponent) {
172 return OTCRYPTO_BAD_ARGS;
176 HARDENED_TRY(otbn_load_app(kOtbnAppRsaKeygen));
179 HARDENED_TRY(otbn_dmem_write(
ARRAYSIZE(public_key->n.data),
180 public_key->n.data, kOtbnVarRsaN));
181 HARDENED_TRY(otbn_dmem_write(
ARRAYSIZE(cofactor->data), cofactor->data,
182 kOtbnVarRsaCofactor));
185 uint32_t mode = kOtbnRsaModeCofactor2048;
186 HARDENED_TRY(otbn_dmem_write(kOtbnRsaModeWords, &mode, kOtbnVarRsaMode));
187 return otbn_execute();
190 status_t rsa_keygen_from_cofactor_2048_finalize(
192 HARDENED_TRY(keygen_finalize(kOtbnRsaModeCofactor2048, kRsa2048NumWords,
193 private_key->n.data, private_key->d.data));
201 public_key->e = kFixedPublicExponent;