5 #include "sw/device/lib/crypto/impl/ecc/p384.h"
9 #include "sw/device/lib/crypto/drivers/otbn.h"
14 #define MODULE_ID MAKE_MODULE_ID('p', '3', 'r')
51 static const uint32_t kP384ModeKeygen =
OTBN_ADDR_T_INIT(run_p384, MODE_KEYGEN);
53 static const uint32_t kP384ModeVerify =
OTBN_ADDR_T_INIT(run_p384, MODE_VERIFY);
55 static const uint32_t kP384ModeSideloadKeygen =
57 static const uint32_t kP384ModeSideloadSign =
59 static const uint32_t kP384ModeSideloadEcdh =
75 kMaskedScalarPaddingWords =
76 (kOtbnWideWordNumWords -
77 (kP384MaskedScalarShareWords % kOtbnWideWordNumWords)) %
78 kOtbnWideWordNumWords,
82 const otbn_addr_t share0_addr,
83 const otbn_addr_t share1_addr) {
85 otbn_dmem_write(kP384MaskedScalarShareWords, src->
share0, share0_addr));
87 otbn_dmem_write(kP384MaskedScalarShareWords, src->
share1, share1_addr));
91 HARDENED_TRY(otbn_dmem_set(kMaskedScalarPaddingWords, 0,
92 share0_addr + kP384MaskedScalarShareBytes));
93 HARDENED_TRY(otbn_dmem_set(kMaskedScalarPaddingWords, 0,
94 share1_addr + kP384MaskedScalarShareBytes));
99 static status_t set_message_digest(
const uint32_t digest[kP384ScalarWords],
100 const otbn_addr_t dst) {
105 uint32_t digest_little_endian[kP384ScalarWords];
107 for (; launder32(i) < kP384ScalarWords; i++) {
108 digest_little_endian[i] =
109 __builtin_bswap32(digest[kP384ScalarWords - 1 - i]);
112 return otbn_dmem_write(kP384ScalarWords, digest_little_endian, dst);
117 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
120 uint32_t mode = kP384ModeKeygen;
121 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
124 return otbn_execute();
130 HARDENED_TRY(otbn_busy_wait_for_done());
133 HARDENED_TRY(otbn_dmem_read(kP384MaskedScalarShareWords, kOtbnVarD0,
135 HARDENED_TRY(otbn_dmem_read(kP384MaskedScalarShareWords, kOtbnVarD1,
139 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarX, public_key->
x));
140 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarY, public_key->
y));
143 HARDENED_TRY(otbn_dmem_sec_wipe());
148 status_t p384_sideload_keygen_start(
void) {
150 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
153 uint32_t mode = kP384ModeSideloadKeygen;
154 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
157 return otbn_execute();
162 HARDENED_TRY(otbn_busy_wait_for_done());
165 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarX, public_key->
x));
166 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarY, public_key->
y));
169 HARDENED_TRY(otbn_dmem_sec_wipe());
174 status_t p384_ecdsa_sign_start(
const uint32_t digest[kP384ScalarWords],
177 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
180 uint32_t mode = kP384ModeSign;
181 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
184 HARDENED_TRY(set_message_digest(digest, kOtbnVarMsg));
187 HARDENED_TRY(p384_masked_scalar_write(private_key, kOtbnVarD0, kOtbnVarD1));
190 return otbn_execute();
193 status_t p384_ecdsa_sideload_sign_start(
194 const uint32_t digest[kP384ScalarWords]) {
196 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
199 uint32_t mode = kP384ModeSideloadSign;
200 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
203 HARDENED_TRY(set_message_digest(digest, kOtbnVarMsg));
206 return otbn_execute();
211 HARDENED_TRY(otbn_busy_wait_for_done());
214 HARDENED_TRY(otbn_dmem_read(kP384ScalarWords, kOtbnVarR, result->r));
217 HARDENED_TRY(otbn_dmem_read(kP384ScalarWords, kOtbnVarS, result->s));
220 HARDENED_TRY(otbn_dmem_sec_wipe());
226 const uint32_t digest[kP384ScalarWords],
229 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
232 uint32_t mode = kP384ModeVerify;
233 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
236 HARDENED_TRY(set_message_digest(digest, kOtbnVarMsg));
239 HARDENED_TRY(otbn_dmem_write(kP384ScalarWords, signature->r, kOtbnVarR));
242 HARDENED_TRY(otbn_dmem_write(kP384ScalarWords, signature->s, kOtbnVarS));
245 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
x, kOtbnVarX));
248 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
y, kOtbnVarY));
251 return otbn_execute();
257 HARDENED_TRY(otbn_busy_wait_for_done());
262 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarOk, &ok));
264 return OTCRYPTO_BAD_ARGS;
269 uint32_t x_r[kP384ScalarWords];
270 HARDENED_TRY(otbn_dmem_read(kP384ScalarWords, kOtbnVarXr, x_r));
275 HARDENED_TRY(otbn_dmem_sec_wipe());
283 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
286 uint32_t mode = kP384ModeEcdh;
287 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
290 HARDENED_TRY(p384_masked_scalar_write(private_key, kOtbnVarD0, kOtbnVarD1));
293 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
x, kOtbnVarX));
296 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
y, kOtbnVarY));
299 return otbn_execute();
304 HARDENED_TRY(otbn_busy_wait_for_done());
309 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarOk, &ok));
311 return OTCRYPTO_BAD_ARGS;
316 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarX, shared_key->share0));
317 HARDENED_TRY(otbn_dmem_read(kP384CoordWords, kOtbnVarY, shared_key->share1));
320 HARDENED_TRY(otbn_dmem_sec_wipe());
327 HARDENED_TRY(otbn_load_app(kOtbnAppP384));
330 uint32_t mode = kP384ModeSideloadEcdh;
331 HARDENED_TRY(otbn_dmem_write(kP384ModeWords, &mode, kOtbnVarMode));
334 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
x, kOtbnVarX));
337 HARDENED_TRY(otbn_dmem_write(kP384CoordWords, public_key->
y, kOtbnVarY));
340 return otbn_execute();