7 #include "sw/device/lib/crypto/drivers/entropy.h"
8 #include "sw/device/lib/crypto/drivers/hmac.h"
9 #include "sw/device/lib/crypto/impl/ecc/p256.h"
10 #include "sw/device/lib/crypto/impl/ecc/p384.h"
11 #include "sw/device/lib/crypto/impl/integrity.h"
12 #include "sw/device/lib/crypto/impl/keyblob.h"
16 #define MODULE_ID MAKE_MODULE_ID('e', 'c', 'c')
54 public_key, message_digest, signature));
65 public_key, message_digest, signature));
99 return OTCRYPTO_NOT_IMPLEMENTED;
107 return OTCRYPTO_NOT_IMPLEMENTED;
116 return OTCRYPTO_NOT_IMPLEMENTED;
122 return OTCRYPTO_NOT_IMPLEMENTED;
129 return OTCRYPTO_NOT_IMPLEMENTED;
144 keyblob_to_keymgr_diversification(private_key, &diversification));
145 return keymgr_generate_key_otbn(diversification);
158 static status_t internal_p256_keygen_start(
161 HARDENED_TRY(entropy_complex_check());
165 HARDENED_TRY(sideload_key_seed(private_key));
166 return p256_sideload_keygen_start();
169 return p256_keygen_start();
171 return OTCRYPTO_BAD_ARGS;
178 if (private_key == NULL || private_key->keyblob == NULL) {
179 return OTCRYPTO_BAD_ARGS;
183 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256) {
184 return OTCRYPTO_BAD_ARGS;
188 return internal_p256_keygen_start(private_key);
201 static status_t internal_p384_keygen_start(
204 HARDENED_TRY(entropy_complex_check());
208 HARDENED_TRY(sideload_key_seed(private_key));
209 return p384_sideload_keygen_start();
212 return p384_keygen_start();
214 return OTCRYPTO_BAD_ARGS;
221 if (private_key == NULL || private_key->keyblob == NULL) {
222 return OTCRYPTO_BAD_ARGS;
226 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384) {
227 return OTCRYPTO_BAD_ARGS;
231 return internal_p384_keygen_start(private_key);
248 static status_t p256_private_key_length_check(
250 if (private_key->keyblob == NULL) {
251 return OTCRYPTO_BAD_ARGS;
262 if (launder32(private_key->config.key_length) != kP256ScalarBytes) {
263 return OTCRYPTO_BAD_ARGS;
268 if (launder32(keyblob_share_num_words(private_key->config)) !=
269 kP256MaskedScalarShareWords) {
270 return OTCRYPTO_BAD_ARGS;
273 kP256MaskedScalarShareWords);
277 return OTCRYPTO_BAD_ARGS;
298 static status_t p256_public_key_length_check(
300 if (launder32(public_key->key_length) !=
sizeof(
p256_point_t)) {
301 return OTCRYPTO_BAD_ARGS;
321 static status_t p384_private_key_length_check(
323 if (private_key->keyblob == NULL) {
324 return OTCRYPTO_BAD_ARGS;
335 if (launder32(private_key->config.key_length) != kP384ScalarBytes) {
336 return OTCRYPTO_BAD_ARGS;
341 if (launder32(keyblob_share_num_words(private_key->config)) !=
342 kP384MaskedScalarShareWords) {
343 return OTCRYPTO_BAD_ARGS;
346 kP384MaskedScalarShareWords);
350 return OTCRYPTO_BAD_ARGS;
371 static status_t p384_public_key_length_check(
373 if (launder32(public_key->key_length) !=
sizeof(
p384_point_t)) {
374 return OTCRYPTO_BAD_ARGS;
393 static status_t internal_p256_keygen_finalize(
396 HARDENED_TRY(p256_private_key_length_check(private_key));
397 HARDENED_TRY(p256_public_key_length_check(public_key));
407 HARDENED_TRY(p256_sideload_keygen_finalize(pk));
411 HARDENED_TRY(p256_keygen_finalize(sk, pk));
412 private_key->checksum = integrity_blinded_checksum(private_key);
414 return OTCRYPTO_BAD_ARGS;
418 public_key->checksum = integrity_unblinded_checksum(public_key);
421 return keymgr_sideload_clear_otbn();
437 static status_t internal_p384_keygen_finalize(
440 HARDENED_TRY(p384_private_key_length_check(private_key));
441 HARDENED_TRY(p384_public_key_length_check(public_key));
452 HARDENED_TRY(p384_sideload_keygen_finalize(pk));
460 HARDENED_TRY(p384_keygen_finalize(sk, pk));
461 private_key->checksum = integrity_blinded_checksum(private_key);
463 return OTCRYPTO_BAD_ARGS;
466 public_key->checksum = integrity_unblinded_checksum(public_key);
473 if (private_key == NULL || public_key == NULL ||
474 private_key->keyblob == NULL || public_key->key == NULL) {
475 return OTCRYPTO_BAD_ARGS;
479 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256 ||
480 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP256) {
481 return OTCRYPTO_BAD_ARGS;
486 return internal_p256_keygen_finalize(private_key, public_key);
492 if (private_key == NULL || public_key == NULL ||
493 private_key->keyblob == NULL || public_key->key == NULL) {
494 return OTCRYPTO_BAD_ARGS;
498 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384 ||
499 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP384) {
500 return OTCRYPTO_BAD_ARGS;
505 HARDENED_TRY(internal_p384_keygen_finalize(private_key, public_key));
508 return keymgr_sideload_clear_otbn();
514 if (private_key == NULL || private_key->keyblob == NULL ||
515 message_digest.data == NULL) {
516 return OTCRYPTO_BAD_ARGS;
520 if (launder32(integrity_blinded_key_check(private_key)) !=
522 return OTCRYPTO_BAD_ARGS;
528 HARDENED_TRY(entropy_complex_check());
530 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256) {
531 return OTCRYPTO_BAD_ARGS;
536 if (launder32(message_digest.len) != kP256ScalarWords) {
537 return OTCRYPTO_BAD_ARGS;
542 HARDENED_TRY(p256_private_key_length_check(private_key));
548 return p256_ecdsa_sign_start(message_digest.data, sk);
552 HARDENED_TRY(sideload_key_seed(private_key));
553 return p256_ecdsa_sideload_sign_start(message_digest.data);
557 return OTCRYPTO_BAD_ARGS;
563 if (private_key == NULL || private_key->keyblob == NULL ||
564 message_digest.data == NULL) {
565 return OTCRYPTO_BAD_ARGS;
569 if (launder32(integrity_blinded_key_check(private_key)) !=
571 return OTCRYPTO_BAD_ARGS;
577 HARDENED_TRY(entropy_complex_check());
579 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384) {
580 return OTCRYPTO_BAD_ARGS;
585 if (launder32(message_digest.len) != kP384ScalarWords) {
586 return OTCRYPTO_BAD_ARGS;
591 HARDENED_TRY(p384_private_key_length_check(private_key));
597 return p384_ecdsa_sign_start(message_digest.data, sk);
601 HARDENED_TRY(sideload_key_seed(private_key));
602 return p384_ecdsa_sideload_sign_start(message_digest.data);
606 return OTCRYPTO_BAD_ARGS;
619 static status_t p256_signature_length_check(
size_t len) {
620 if (launder32(len) > UINT32_MAX /
sizeof(uint32_t) ||
622 return OTCRYPTO_BAD_ARGS;
639 static status_t p384_signature_length_check(
size_t len) {
640 if (launder32(len) > UINT32_MAX /
sizeof(uint32_t) ||
642 return OTCRYPTO_BAD_ARGS;
651 if (signature.data == NULL) {
652 return OTCRYPTO_BAD_ARGS;
655 HARDENED_TRY(p256_signature_length_check(signature.len));
660 HARDENED_TRY(p256_ecdsa_sign_finalize(sig_p256));
663 return keymgr_sideload_clear_otbn();
668 if (signature.data == NULL) {
669 return OTCRYPTO_BAD_ARGS;
672 HARDENED_TRY(p384_signature_length_check(signature.len));
677 HARDENED_TRY(p384_ecdsa_sign_finalize(sig_p384));
680 return keymgr_sideload_clear_otbn();
687 if (public_key == NULL || signature.data == NULL ||
688 message_digest.data == NULL || public_key->key == NULL) {
689 return OTCRYPTO_BAD_ARGS;
693 if (launder32(integrity_unblinded_key_check(public_key)) !=
695 return OTCRYPTO_BAD_ARGS;
701 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP256) {
702 return OTCRYPTO_BAD_ARGS;
707 HARDENED_TRY(p256_public_key_length_check(public_key));
711 if (launder32(message_digest.len) != kP256ScalarWords) {
712 return OTCRYPTO_BAD_ARGS;
717 HARDENED_TRY(p256_signature_length_check(signature.len));
721 return p256_ecdsa_verify_start(sig, message_digest.data, pk);
727 if (verification_result == NULL) {
728 return OTCRYPTO_BAD_ARGS;
731 HARDENED_TRY(p256_signature_length_check(signature.len));
733 return p256_ecdsa_verify_finalize(sig_p256, verification_result);
740 if (public_key == NULL || signature.data == NULL ||
741 message_digest.data == NULL || public_key->key == NULL) {
742 return OTCRYPTO_BAD_ARGS;
746 if (launder32(integrity_unblinded_key_check(public_key)) !=
748 return OTCRYPTO_BAD_ARGS;
754 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP384) {
755 return OTCRYPTO_BAD_ARGS;
760 HARDENED_TRY(p384_public_key_length_check(public_key));
764 if (launder32(message_digest.len) != kP384ScalarWords) {
765 return OTCRYPTO_BAD_ARGS;
770 HARDENED_TRY(p384_signature_length_check(signature.len));
774 return p384_ecdsa_verify_start(sig, message_digest.data, pk);
780 if (verification_result == NULL) {
781 return OTCRYPTO_BAD_ARGS;
784 HARDENED_TRY(p384_signature_length_check(signature.len));
786 return p384_ecdsa_verify_finalize(sig_p384, verification_result);
791 if (private_key == NULL || private_key->keyblob == NULL) {
792 return OTCRYPTO_BAD_ARGS;
795 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256) {
796 return OTCRYPTO_BAD_ARGS;
799 return internal_p256_keygen_start(private_key);
804 if (private_key == NULL || private_key->keyblob == NULL) {
805 return OTCRYPTO_BAD_ARGS;
808 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384) {
809 return OTCRYPTO_BAD_ARGS;
812 return internal_p384_keygen_start(private_key);
818 if (private_key == NULL || public_key == NULL ||
819 private_key->keyblob == NULL || public_key->key == NULL) {
820 return OTCRYPTO_BAD_ARGS;
823 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP256 ||
824 launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256) {
825 return OTCRYPTO_BAD_ARGS;
829 return internal_p256_keygen_finalize(private_key, public_key);
835 if (private_key == NULL || public_key == NULL ||
836 private_key->keyblob == NULL || public_key->key == NULL) {
837 return OTCRYPTO_BAD_ARGS;
840 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP384 ||
841 launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384) {
842 return OTCRYPTO_BAD_ARGS;
846 return internal_p384_keygen_finalize(private_key, public_key);
852 if (private_key == NULL || public_key == NULL || public_key->key == NULL ||
853 private_key->keyblob == NULL) {
854 return OTCRYPTO_BAD_ARGS;
858 if (launder32(integrity_blinded_key_check(private_key)) !=
860 launder32(integrity_unblinded_key_check(public_key)) !=
862 return OTCRYPTO_BAD_ARGS;
870 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256 ||
871 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP256) {
872 return OTCRYPTO_BAD_ARGS;
878 HARDENED_TRY(p256_private_key_length_check(private_key));
879 HARDENED_TRY(p256_public_key_length_check(public_key));
884 HARDENED_TRY(sideload_key_seed(private_key));
885 return p256_sideload_ecdh_start(pk);
889 return p256_ecdh_start(sk, pk);
893 return OTCRYPTO_BAD_ARGS;
898 if (shared_secret == NULL || shared_secret->keyblob == NULL) {
899 return OTCRYPTO_BAD_ARGS;
904 return OTCRYPTO_BAD_ARGS;
909 if (launder32(shared_secret->config.key_length) != kP256CoordBytes) {
910 return OTCRYPTO_BAD_ARGS;
913 if (launder32(shared_secret->keyblob_length) !=
914 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t)) {
915 return OTCRYPTO_BAD_ARGS;
918 shared_secret->keyblob_length,
919 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t));
925 HARDENED_TRY(p256_ecdh_finalize(&ss));
927 keyblob_from_shares(ss.share0, ss.share1, shared_secret->config,
928 shared_secret->keyblob);
931 shared_secret->checksum = integrity_blinded_checksum(shared_secret);
934 return keymgr_sideload_clear_otbn();
940 if (private_key == NULL || public_key == NULL || public_key->key == NULL ||
941 private_key->keyblob == NULL) {
942 return OTCRYPTO_BAD_ARGS;
946 if (launder32(integrity_blinded_key_check(private_key)) !=
948 launder32(integrity_unblinded_key_check(public_key)) !=
950 return OTCRYPTO_BAD_ARGS;
958 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384 ||
959 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP384) {
960 return OTCRYPTO_BAD_ARGS;
966 HARDENED_TRY(p384_private_key_length_check(private_key));
967 HARDENED_TRY(p384_public_key_length_check(public_key));
972 HARDENED_TRY(sideload_key_seed(private_key));
973 return p384_sideload_ecdh_start(pk);
977 return p384_ecdh_start(sk, pk);
981 return OTCRYPTO_BAD_ARGS;
986 if (shared_secret == NULL || shared_secret->keyblob == NULL) {
987 return OTCRYPTO_BAD_ARGS;
992 return OTCRYPTO_BAD_ARGS;
997 if (launder32(shared_secret->config.key_length) != kP384CoordBytes) {
998 return OTCRYPTO_BAD_ARGS;
1001 if (launder32(shared_secret->keyblob_length) !=
1002 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t)) {
1003 return OTCRYPTO_BAD_ARGS;
1006 shared_secret->keyblob_length,
1007 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t));
1013 HARDENED_TRY(p384_ecdh_finalize(&ss));
1015 keyblob_from_shares(ss.share0, ss.share1, shared_secret->config,
1016 shared_secret->keyblob);
1019 shared_secret->checksum = integrity_blinded_checksum(shared_secret);
1022 return keymgr_sideload_clear_otbn();
1028 return OTCRYPTO_NOT_IMPLEMENTED;
1034 return OTCRYPTO_NOT_IMPLEMENTED;
1042 return OTCRYPTO_NOT_IMPLEMENTED;
1048 return OTCRYPTO_NOT_IMPLEMENTED;
1057 return OTCRYPTO_NOT_IMPLEMENTED;
1063 return OTCRYPTO_NOT_IMPLEMENTED;
1069 return OTCRYPTO_NOT_IMPLEMENTED;
1075 return OTCRYPTO_NOT_IMPLEMENTED;
1082 return OTCRYPTO_NOT_IMPLEMENTED;
1088 return OTCRYPTO_NOT_IMPLEMENTED;