5 #include "sw/device/lib/crypto/impl/ecc/ecdsa_p256.h"
9 #include "sw/device/lib/crypto/drivers/otbn.h"
14 #define MODULE_ID MAKE_MODULE_ID('p', '2', 's')
34 static const otbn_addr_t kOtbnVarEcdsaMode =
OTBN_ADDR_T_INIT(p256_ecdsa, mode);
35 static const otbn_addr_t kOtbnVarEcdsaMsg =
OTBN_ADDR_T_INIT(p256_ecdsa, msg);
42 static const otbn_addr_t kOtbnVarEcdsaXr =
OTBN_ADDR_T_INIT(p256_ecdsa, x_r);
51 static const uint32_t kOtbnEcdsaModeKeygen =
53 static const uint32_t kOtbnEcdsaModeSign =
55 static const uint32_t kOtbnEcdsaModeVerify =
57 static const uint32_t kOtbnEcdsaModeSideloadKeygen =
59 static const uint32_t kOtbnEcdsaModeSideloadSign =
66 kOtbnEcdsaModeWords = 1,
69 status_t ecdsa_p256_keygen_start(
void) {
71 HARDENED_TRY(otbn_load_app(kOtbnAppEcdsa));
74 uint32_t mode = kOtbnEcdsaModeKeygen;
75 HARDENED_TRY(otbn_dmem_write(kOtbnEcdsaModeWords, &mode, kOtbnVarEcdsaMode));
78 return otbn_execute();
81 status_t ecdsa_p256_sideload_keygen_start(
void) {
83 HARDENED_TRY(otbn_load_app(kOtbnAppEcdsa));
86 uint32_t mode = kOtbnEcdsaModeSideloadKeygen;
87 HARDENED_TRY(otbn_dmem_write(kOtbnEcdsaModeWords, &mode, kOtbnVarEcdsaMode));
90 return otbn_execute();
96 HARDENED_TRY(otbn_busy_wait_for_done());
99 HARDENED_TRY(otbn_dmem_read(kP256MaskedScalarShareWords, kOtbnVarEcdsaD0,
101 HARDENED_TRY(otbn_dmem_read(kP256MaskedScalarShareWords, kOtbnVarEcdsaD1,
105 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarEcdsaX, public_key->
x));
106 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarEcdsaY, public_key->
y));
109 HARDENED_TRY(otbn_dmem_sec_wipe());
116 HARDENED_TRY(otbn_busy_wait_for_done());
119 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarEcdsaX, public_key->
x));
120 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarEcdsaY, public_key->
y));
123 HARDENED_TRY(otbn_dmem_sec_wipe());
137 static status_t set_message_digest(
const uint32_t digest[kP256ScalarWords]) {
142 uint32_t digest_little_endian[kP256ScalarWords];
144 for (; launder32(i) < kP256ScalarWords; i++) {
145 digest_little_endian[i] =
146 __builtin_bswap32(digest[kP256ScalarWords - 1 - i]);
149 return otbn_dmem_write(kP256ScalarWords, digest_little_endian,
153 status_t ecdsa_p256_sign_start(
const uint32_t digest[kP256ScalarWords],
156 HARDENED_TRY(otbn_load_app(kOtbnAppEcdsa));
159 uint32_t mode = kOtbnEcdsaModeSign;
160 HARDENED_TRY(otbn_dmem_write(kOtbnEcdsaModeWords, &mode, kOtbnVarEcdsaMode));
163 HARDENED_TRY(set_message_digest(digest));
167 p256_masked_scalar_write(private_key, kOtbnVarEcdsaD0, kOtbnVarEcdsaD1));
170 return otbn_execute();
173 status_t ecdsa_p256_sideload_sign_start(
174 const uint32_t digest[kP256ScalarWords]) {
176 HARDENED_TRY(otbn_load_app(kOtbnAppEcdsa));
179 uint32_t mode = kOtbnEcdsaModeSideloadSign;
180 HARDENED_TRY(otbn_dmem_write(kOtbnEcdsaModeWords, &mode, kOtbnVarEcdsaMode));
183 HARDENED_TRY(set_message_digest(digest));
186 return otbn_execute();
191 HARDENED_TRY(otbn_busy_wait_for_done());
194 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarEcdsaR, result->r));
197 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarEcdsaS, result->s));
200 HARDENED_TRY(otbn_dmem_sec_wipe());
206 const uint32_t digest[kP256ScalarWords],
209 HARDENED_TRY(otbn_load_app(kOtbnAppEcdsa));
212 uint32_t mode = kOtbnEcdsaModeVerify;
213 HARDENED_TRY(otbn_dmem_write(kOtbnEcdsaModeWords, &mode, kOtbnVarEcdsaMode));
216 HARDENED_TRY(set_message_digest(digest));
219 HARDENED_TRY(otbn_dmem_write(kP256ScalarWords, signature->r, kOtbnVarEcdsaR));
222 HARDENED_TRY(otbn_dmem_write(kP256ScalarWords, signature->s, kOtbnVarEcdsaS));
225 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
x, kOtbnVarEcdsaX));
228 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
y, kOtbnVarEcdsaY));
231 return otbn_execute();
237 HARDENED_TRY(otbn_busy_wait_for_done());
242 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarEcdsaOk, &ok));
244 return OTCRYPTO_BAD_ARGS;
249 uint32_t x_r[kP256ScalarWords];
250 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarEcdsaXr, x_r));
255 HARDENED_TRY(otbn_dmem_sec_wipe());