5 #include "sw/device/lib/crypto/impl/ecc/p256.h"
9 #include "sw/device/lib/crypto/drivers/otbn.h"
14 #define MODULE_ID MAKE_MODULE_ID('p', '2', 'r')
51 static const uint32_t kOtbnP256ModeKeygen =
53 static const uint32_t kOtbnP256ModeSign =
OTBN_ADDR_T_INIT(run_p256, MODE_SIGN);
54 static const uint32_t kOtbnP256ModeVerify =
56 static const uint32_t kOtbnP256ModeEcdh =
OTBN_ADDR_T_INIT(run_p256, MODE_ECDH);
57 static const uint32_t kOtbnP256ModeSideloadKeygen =
59 static const uint32_t kOtbnP256ModeSideloadSign =
61 static const uint32_t kOtbnP256ModeSideloadEcdh =
68 kOtbnP256ModeWords = 1,
77 kMaskedScalarPaddingWords =
78 (kOtbnWideWordNumWords -
79 (kP256MaskedScalarShareWords % kOtbnWideWordNumWords)) %
80 kOtbnWideWordNumWords,
84 const otbn_addr_t share0_addr,
85 const otbn_addr_t share1_addr) {
87 otbn_dmem_write(kP256MaskedScalarShareWords, src->
share0, share0_addr));
89 otbn_dmem_write(kP256MaskedScalarShareWords, src->
share1, share1_addr));
93 HARDENED_TRY(otbn_dmem_set(kMaskedScalarPaddingWords, 0,
94 share0_addr + kP256MaskedScalarShareBytes));
95 HARDENED_TRY(otbn_dmem_set(kMaskedScalarPaddingWords, 0,
96 share1_addr + kP256MaskedScalarShareBytes));
103 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
106 uint32_t mode = kOtbnP256ModeKeygen;
107 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
110 return otbn_execute();
113 status_t p256_sideload_keygen_start(
void) {
115 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
118 uint32_t mode = kOtbnP256ModeSideloadKeygen;
119 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
122 return otbn_execute();
128 HARDENED_TRY(otbn_busy_wait_for_done());
131 HARDENED_TRY(otbn_dmem_read(kP256MaskedScalarShareWords, kOtbnVarD0,
133 HARDENED_TRY(otbn_dmem_read(kP256MaskedScalarShareWords, kOtbnVarD1,
137 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarX, public_key->
x));
138 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarY, public_key->
y));
141 HARDENED_TRY(otbn_dmem_sec_wipe());
148 HARDENED_TRY(otbn_busy_wait_for_done());
151 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarX, public_key->
x));
152 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarY, public_key->
y));
155 HARDENED_TRY(otbn_dmem_sec_wipe());
169 static status_t set_message_digest(
const uint32_t digest[kP256ScalarWords]) {
174 uint32_t digest_little_endian[kP256ScalarWords];
176 for (; launder32(i) < kP256ScalarWords; i++) {
177 digest_little_endian[i] =
178 __builtin_bswap32(digest[kP256ScalarWords - 1 - i]);
181 return otbn_dmem_write(kP256ScalarWords, digest_little_endian, kOtbnVarMsg);
184 status_t p256_ecdsa_sign_start(
const uint32_t digest[kP256ScalarWords],
187 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
190 uint32_t mode = kOtbnP256ModeSign;
191 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
194 HARDENED_TRY(set_message_digest(digest));
197 HARDENED_TRY(p256_masked_scalar_write(private_key, kOtbnVarD0, kOtbnVarD1));
200 return otbn_execute();
203 status_t p256_ecdsa_sideload_sign_start(
204 const uint32_t digest[kP256ScalarWords]) {
206 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
209 uint32_t mode = kOtbnP256ModeSideloadSign;
210 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
213 HARDENED_TRY(set_message_digest(digest));
216 return otbn_execute();
221 HARDENED_TRY(otbn_busy_wait_for_done());
224 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarR, result->r));
227 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarS, result->s));
230 HARDENED_TRY(otbn_dmem_sec_wipe());
236 const uint32_t digest[kP256ScalarWords],
239 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
242 uint32_t mode = kOtbnP256ModeVerify;
243 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
246 HARDENED_TRY(set_message_digest(digest));
249 HARDENED_TRY(otbn_dmem_write(kP256ScalarWords, signature->r, kOtbnVarR));
252 HARDENED_TRY(otbn_dmem_write(kP256ScalarWords, signature->s, kOtbnVarS));
255 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
x, kOtbnVarX));
258 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
y, kOtbnVarY));
261 return otbn_execute();
267 HARDENED_TRY(otbn_busy_wait_for_done());
272 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarOk, &ok));
274 return OTCRYPTO_BAD_ARGS;
279 uint32_t x_r[kP256ScalarWords];
280 HARDENED_TRY(otbn_dmem_read(kP256ScalarWords, kOtbnVarXr, x_r));
285 HARDENED_TRY(otbn_dmem_sec_wipe());
293 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
296 uint32_t mode = kOtbnP256ModeEcdh;
297 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
300 HARDENED_TRY(p256_masked_scalar_write(private_key, kOtbnVarD0, kOtbnVarD1));
303 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
x, kOtbnVarX));
306 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
y, kOtbnVarY));
309 return otbn_execute();
314 HARDENED_TRY(otbn_busy_wait_for_done());
318 HARDENED_TRY(otbn_dmem_read(1, kOtbnVarOk, &ok));
320 return OTCRYPTO_BAD_ARGS;
325 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarX, shared_key->share0));
326 HARDENED_TRY(otbn_dmem_read(kP256CoordWords, kOtbnVarY, shared_key->share1));
329 HARDENED_TRY(otbn_dmem_sec_wipe());
336 HARDENED_TRY(otbn_load_app(kOtbnAppP256));
339 uint32_t mode = kOtbnP256ModeSideloadEcdh;
340 HARDENED_TRY(otbn_dmem_write(kOtbnP256ModeWords, &mode, kOtbnVarMode));
343 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
x, kOtbnVarX));
346 HARDENED_TRY(otbn_dmem_write(kP256CoordWords, public_key->
y, kOtbnVarY));
349 return otbn_execute();