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));
94 return OTCRYPTO_NOT_IMPLEMENTED;
102 return OTCRYPTO_NOT_IMPLEMENTED;
111 return OTCRYPTO_NOT_IMPLEMENTED;
117 return OTCRYPTO_NOT_IMPLEMENTED;
124 return OTCRYPTO_NOT_IMPLEMENTED;
139 keyblob_to_keymgr_diversification(private_key, &diversification));
140 return keymgr_generate_key_otbn(diversification);
153 static status_t internal_p256_keygen_start(
156 HARDENED_TRY(entropy_complex_check());
160 HARDENED_TRY(sideload_key_seed(private_key));
161 return p256_sideload_keygen_start();
164 return p256_keygen_start();
166 return OTCRYPTO_BAD_ARGS;
173 if (private_key == NULL || private_key->keyblob == NULL) {
174 return OTCRYPTO_BAD_ARGS;
178 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256) {
179 return OTCRYPTO_BAD_ARGS;
183 return internal_p256_keygen_start(private_key);
196 static status_t internal_p384_keygen_start(
199 HARDENED_TRY(entropy_complex_check());
203 HARDENED_TRY(sideload_key_seed(private_key));
204 return p384_sideload_keygen_start();
207 return p384_keygen_start();
209 return OTCRYPTO_BAD_ARGS;
216 if (private_key == NULL || private_key->keyblob == NULL) {
217 return OTCRYPTO_BAD_ARGS;
221 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384) {
222 return OTCRYPTO_BAD_ARGS;
226 return internal_p384_keygen_start(private_key);
243 static status_t p256_private_key_length_check(
245 if (private_key->keyblob == NULL) {
246 return OTCRYPTO_BAD_ARGS;
257 if (launder32(private_key->config.key_length) != kP256ScalarBytes) {
258 return OTCRYPTO_BAD_ARGS;
263 if (launder32(keyblob_share_num_words(private_key->config)) !=
264 kP256MaskedScalarShareWords) {
265 return OTCRYPTO_BAD_ARGS;
268 kP256MaskedScalarShareWords);
272 return OTCRYPTO_BAD_ARGS;
293 static status_t p256_public_key_length_check(
295 if (launder32(public_key->key_length) !=
sizeof(
p256_point_t)) {
296 return OTCRYPTO_BAD_ARGS;
316 static status_t p384_private_key_length_check(
318 if (private_key->keyblob == NULL) {
319 return OTCRYPTO_BAD_ARGS;
330 if (launder32(private_key->config.key_length) != kP384ScalarBytes) {
331 return OTCRYPTO_BAD_ARGS;
336 if (launder32(keyblob_share_num_words(private_key->config)) !=
337 kP384MaskedScalarShareWords) {
338 return OTCRYPTO_BAD_ARGS;
341 kP384MaskedScalarShareWords);
345 return OTCRYPTO_BAD_ARGS;
366 static status_t p384_public_key_length_check(
368 if (launder32(public_key->key_length) !=
sizeof(
p384_point_t)) {
369 return OTCRYPTO_BAD_ARGS;
388 static status_t internal_p256_keygen_finalize(
391 HARDENED_TRY(p256_private_key_length_check(private_key));
392 HARDENED_TRY(p256_public_key_length_check(public_key));
402 HARDENED_TRY(p256_sideload_keygen_finalize(pk));
406 HARDENED_TRY(p256_keygen_finalize(sk, pk));
407 private_key->checksum = integrity_blinded_checksum(private_key);
409 return OTCRYPTO_BAD_ARGS;
413 public_key->checksum = integrity_unblinded_checksum(public_key);
416 return keymgr_sideload_clear_otbn();
432 static status_t internal_p384_keygen_finalize(
435 HARDENED_TRY(p384_private_key_length_check(private_key));
436 HARDENED_TRY(p384_public_key_length_check(public_key));
447 HARDENED_TRY(p384_sideload_keygen_finalize(pk));
455 HARDENED_TRY(p384_keygen_finalize(sk, pk));
456 private_key->checksum = integrity_blinded_checksum(private_key);
458 return OTCRYPTO_BAD_ARGS;
461 public_key->checksum = integrity_unblinded_checksum(public_key);
468 if (private_key == NULL || public_key == NULL ||
469 private_key->keyblob == NULL || public_key->key == NULL) {
470 return OTCRYPTO_BAD_ARGS;
474 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256 ||
475 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP256) {
476 return OTCRYPTO_BAD_ARGS;
481 return internal_p256_keygen_finalize(private_key, public_key);
487 if (private_key == NULL || public_key == NULL ||
488 private_key->keyblob == NULL || public_key->key == NULL) {
489 return OTCRYPTO_BAD_ARGS;
493 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384 ||
494 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP384) {
495 return OTCRYPTO_BAD_ARGS;
500 HARDENED_TRY(internal_p384_keygen_finalize(private_key, public_key));
503 return keymgr_sideload_clear_otbn();
509 if (private_key == NULL || private_key->keyblob == NULL ||
510 message_digest.data == NULL) {
511 return OTCRYPTO_BAD_ARGS;
515 if (launder32(integrity_blinded_key_check(private_key)) !=
517 return OTCRYPTO_BAD_ARGS;
523 HARDENED_TRY(entropy_complex_check());
525 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP256) {
526 return OTCRYPTO_BAD_ARGS;
531 if (launder32(message_digest.len) != kP256ScalarWords) {
532 return OTCRYPTO_BAD_ARGS;
537 HARDENED_TRY(p256_private_key_length_check(private_key));
543 return p256_ecdsa_sign_start(message_digest.data, sk);
547 HARDENED_TRY(sideload_key_seed(private_key));
548 return p256_ecdsa_sideload_sign_start(message_digest.data);
552 return OTCRYPTO_BAD_ARGS;
558 if (private_key == NULL || private_key->keyblob == NULL ||
559 message_digest.data == NULL) {
560 return OTCRYPTO_BAD_ARGS;
564 if (launder32(integrity_blinded_key_check(private_key)) !=
566 return OTCRYPTO_BAD_ARGS;
572 HARDENED_TRY(entropy_complex_check());
574 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdsaP384) {
575 return OTCRYPTO_BAD_ARGS;
580 if (launder32(message_digest.len) != kP384ScalarWords) {
581 return OTCRYPTO_BAD_ARGS;
586 HARDENED_TRY(p384_private_key_length_check(private_key));
592 return p384_ecdsa_sign_start(message_digest.data, sk);
596 HARDENED_TRY(sideload_key_seed(private_key));
597 return p384_ecdsa_sideload_sign_start(message_digest.data);
601 return OTCRYPTO_BAD_ARGS;
614 static status_t p256_signature_length_check(
size_t len) {
615 if (launder32(len) > UINT32_MAX /
sizeof(uint32_t) ||
617 return OTCRYPTO_BAD_ARGS;
634 static status_t p384_signature_length_check(
size_t len) {
635 if (launder32(len) > UINT32_MAX /
sizeof(uint32_t) ||
637 return OTCRYPTO_BAD_ARGS;
646 if (signature.data == NULL) {
647 return OTCRYPTO_BAD_ARGS;
650 HARDENED_TRY(p256_signature_length_check(signature.len));
655 HARDENED_TRY(p256_ecdsa_sign_finalize(sig_p256));
658 return keymgr_sideload_clear_otbn();
663 if (signature.data == NULL) {
664 return OTCRYPTO_BAD_ARGS;
667 HARDENED_TRY(p384_signature_length_check(signature.len));
672 HARDENED_TRY(p384_ecdsa_sign_finalize(sig_p384));
675 return keymgr_sideload_clear_otbn();
682 if (public_key == NULL || signature.data == NULL ||
683 message_digest.data == NULL || public_key->key == NULL) {
684 return OTCRYPTO_BAD_ARGS;
688 if (launder32(integrity_unblinded_key_check(public_key)) !=
690 return OTCRYPTO_BAD_ARGS;
696 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP256) {
697 return OTCRYPTO_BAD_ARGS;
702 HARDENED_TRY(p256_public_key_length_check(public_key));
706 if (launder32(message_digest.len) != kP256ScalarWords) {
707 return OTCRYPTO_BAD_ARGS;
712 HARDENED_TRY(p256_signature_length_check(signature.len));
716 return p256_ecdsa_verify_start(sig, message_digest.data, pk);
722 if (verification_result == NULL) {
723 return OTCRYPTO_BAD_ARGS;
726 HARDENED_TRY(p256_signature_length_check(signature.len));
728 return p256_ecdsa_verify_finalize(sig_p256, verification_result);
735 if (public_key == NULL || signature.data == NULL ||
736 message_digest.data == NULL || public_key->key == NULL) {
737 return OTCRYPTO_BAD_ARGS;
741 if (launder32(integrity_unblinded_key_check(public_key)) !=
743 return OTCRYPTO_BAD_ARGS;
749 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdsaP384) {
750 return OTCRYPTO_BAD_ARGS;
755 HARDENED_TRY(p384_public_key_length_check(public_key));
759 if (launder32(message_digest.len) != kP384ScalarWords) {
760 return OTCRYPTO_BAD_ARGS;
765 HARDENED_TRY(p384_signature_length_check(signature.len));
769 return p384_ecdsa_verify_start(sig, message_digest.data, pk);
775 if (verification_result == NULL) {
776 return OTCRYPTO_BAD_ARGS;
779 HARDENED_TRY(p384_signature_length_check(signature.len));
781 return p384_ecdsa_verify_finalize(sig_p384, verification_result);
786 if (private_key == NULL || private_key->keyblob == NULL) {
787 return OTCRYPTO_BAD_ARGS;
790 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256) {
791 return OTCRYPTO_BAD_ARGS;
794 return internal_p256_keygen_start(private_key);
799 if (private_key == NULL || private_key->keyblob == NULL) {
800 return OTCRYPTO_BAD_ARGS;
803 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384) {
804 return OTCRYPTO_BAD_ARGS;
807 return internal_p384_keygen_start(private_key);
813 if (private_key == NULL || public_key == NULL ||
814 private_key->keyblob == NULL || public_key->key == NULL) {
815 return OTCRYPTO_BAD_ARGS;
818 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP256 ||
819 launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256) {
820 return OTCRYPTO_BAD_ARGS;
824 return internal_p256_keygen_finalize(private_key, public_key);
830 if (private_key == NULL || public_key == NULL ||
831 private_key->keyblob == NULL || public_key->key == NULL) {
832 return OTCRYPTO_BAD_ARGS;
835 if (launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP384 ||
836 launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384) {
837 return OTCRYPTO_BAD_ARGS;
841 return internal_p384_keygen_finalize(private_key, public_key);
852 static status_t internal_ecdh_p256_start(
855 HARDENED_TRY(p256_private_key_length_check(private_key));
856 HARDENED_TRY(p256_public_key_length_check(public_key));
861 HARDENED_TRY(sideload_key_seed(private_key));
862 return p256_sideload_ecdh_start(pk);
866 return p256_ecdh_start(sk, pk);
870 return OTCRYPTO_BAD_ARGS;
881 static status_t internal_ecdh_p384_start(
884 HARDENED_TRY(p384_private_key_length_check(private_key));
885 HARDENED_TRY(p384_public_key_length_check(public_key));
890 HARDENED_TRY(sideload_key_seed(private_key));
891 return p384_sideload_ecdh_start(pk);
895 return p384_ecdh_start(sk, pk);
899 return OTCRYPTO_BAD_ARGS;
906 if (private_key == NULL || public_key == NULL || elliptic_curve == NULL ||
907 public_key->key == NULL || private_key->keyblob == NULL) {
908 return OTCRYPTO_BAD_ARGS;
912 if (launder32(integrity_blinded_key_check(private_key)) !=
914 launder32(integrity_unblinded_key_check(public_key)) !=
916 return OTCRYPTO_BAD_ARGS;
924 switch (launder32(elliptic_curve->curve_type)) {
925 case kOtcryptoEccCurveTypeNistP256:
927 kOtcryptoEccCurveTypeNistP256);
928 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP256 ||
929 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP256) {
930 return OTCRYPTO_BAD_ARGS;
934 HARDENED_TRY(internal_ecdh_p256_start(private_key, public_key));
936 case kOtcryptoEccCurveTypeNistP384:
938 kOtcryptoEccCurveTypeNistP384);
939 if (launder32(private_key->config.key_mode) != kOtcryptoKeyModeEcdhP384 ||
940 launder32(public_key->key_mode) != kOtcryptoKeyModeEcdhP384) {
941 return OTCRYPTO_BAD_ARGS;
945 HARDENED_TRY(internal_ecdh_p384_start(private_key, public_key));
947 case kEccCurveTypeBrainpoolP256R1:
949 case kOtcryptoEccCurveTypeCustom:
951 return OTCRYPTO_NOT_IMPLEMENTED;
953 return OTCRYPTO_BAD_ARGS;
958 return OTCRYPTO_FATAL_ERR;
968 static status_t internal_ecdh_p256_finalize(
972 return OTCRYPTO_BAD_ARGS;
976 if (shared_secret->keyblob == NULL) {
977 return OTCRYPTO_BAD_ARGS;
980 if (launder32(shared_secret->config.key_length) != kP256CoordBytes) {
981 return OTCRYPTO_BAD_ARGS;
985 if (launder32(shared_secret->keyblob_length) !=
986 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t)) {
987 return OTCRYPTO_BAD_ARGS;
990 shared_secret->keyblob_length,
991 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t));
997 HARDENED_TRY(p256_ecdh_finalize(&ss));
999 keyblob_from_shares(ss.share0, ss.share1, shared_secret->config,
1000 shared_secret->keyblob);
1003 shared_secret->checksum = integrity_blinded_checksum(shared_secret);
1006 return keymgr_sideload_clear_otbn();
1016 static status_t internal_ecdh_p384_finalize(
1020 return OTCRYPTO_BAD_ARGS;
1024 if (shared_secret->keyblob == NULL) {
1025 return OTCRYPTO_BAD_ARGS;
1028 if (launder32(shared_secret->config.key_length) != kP384CoordBytes) {
1029 return OTCRYPTO_BAD_ARGS;
1033 if (launder32(shared_secret->keyblob_length) !=
1034 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t)) {
1035 return OTCRYPTO_BAD_ARGS;
1038 shared_secret->keyblob_length,
1039 keyblob_num_words(shared_secret->config) *
sizeof(uint32_t));
1045 HARDENED_TRY(p384_ecdh_finalize(&ss));
1047 keyblob_from_shares(ss.share0, ss.share1, shared_secret->config,
1048 shared_secret->keyblob);
1051 shared_secret->checksum = integrity_blinded_checksum(shared_secret);
1054 return keymgr_sideload_clear_otbn();
1060 if (shared_secret == NULL || elliptic_curve == NULL) {
1061 return OTCRYPTO_BAD_ARGS;
1065 switch (launder32(elliptic_curve->curve_type)) {
1066 case kOtcryptoEccCurveTypeNistP256:
1068 kOtcryptoEccCurveTypeNistP256);
1069 HARDENED_TRY(internal_ecdh_p256_finalize(shared_secret));
1071 case kOtcryptoEccCurveTypeNistP384:
1073 kOtcryptoEccCurveTypeNistP384);
1074 HARDENED_TRY(internal_ecdh_p384_finalize(shared_secret));
1076 case kEccCurveTypeBrainpoolP256R1:
1078 case kOtcryptoEccCurveTypeCustom:
1080 return OTCRYPTO_NOT_IMPLEMENTED;
1082 return OTCRYPTO_BAD_ARGS;
1086 return keymgr_sideload_clear_otbn();
1092 return OTCRYPTO_NOT_IMPLEMENTED;
1098 return OTCRYPTO_NOT_IMPLEMENTED;
1106 return OTCRYPTO_NOT_IMPLEMENTED;
1112 return OTCRYPTO_NOT_IMPLEMENTED;
1121 return OTCRYPTO_NOT_IMPLEMENTED;
1127 return OTCRYPTO_NOT_IMPLEMENTED;
1133 return OTCRYPTO_NOT_IMPLEMENTED;
1139 return OTCRYPTO_NOT_IMPLEMENTED;
1146 return OTCRYPTO_NOT_IMPLEMENTED;
1152 return OTCRYPTO_NOT_IMPLEMENTED;