5 #include "sw/device/lib/crypto/impl/rsa/rsa_signature.h"
10 #include "sw/device/lib/crypto/drivers/entropy.h"
11 #include "sw/device/lib/crypto/impl/rsa/rsa_modexp.h"
12 #include "sw/device/lib/crypto/impl/rsa/rsa_padding.h"
16 #define MODULE_ID MAKE_MODULE_ID('r', 's', 'v')
31 switch (digest.mode) {
32 case kOtcryptoHashModeSha3_224:
35 case kOtcryptoHashModeSha256:
37 case kOtcryptoHashModeSha3_256:
40 case kOtcryptoHashModeSha384:
42 case kOtcryptoHashModeSha3_384:
45 case kOtcryptoHashModeSha512:
47 case kOtcryptoHashModeSha3_512:
51 return OTCRYPTO_BAD_ARGS;
53 HARDENED_CHECK_GT(num_words, 0);
55 if (num_words != digest.len) {
56 return OTCRYPTO_BAD_ARGS;
72 const rsa_signature_padding_t padding_mode,
73 size_t encoded_message_len,
74 uint32_t *encoded_message) {
76 HARDENED_TRY(digest_check(message_digest));
78 switch (padding_mode) {
79 case kRsaSignaturePaddingPkcs1v15:
80 return rsa_padding_pkcs1v15_encode(message_digest, encoded_message_len,
82 case kRsaSignaturePaddingPss: {
84 uint32_t salt[message_digest.len];
85 HARDENED_TRY(entropy_complex_check());
86 HARDENED_TRY(entropy_csrng_uninstantiate());
87 HARDENED_TRY(entropy_csrng_instantiate(
89 HARDENED_TRY(entropy_csrng_generate(&kEntropyEmptySeed, salt,
92 HARDENED_TRY(entropy_csrng_uninstantiate());
93 return rsa_padding_pss_encode(message_digest, salt,
ARRAYSIZE(salt),
94 encoded_message_len, encoded_message);
98 return OTCRYPTO_BAD_ARGS;
103 return OTCRYPTO_FATAL_ERR;
123 static status_t encoded_message_verify(
125 const rsa_signature_padding_t padding_mode, uint32_t *encoded_message,
128 HARDENED_TRY(digest_check(message_digest));
130 switch (padding_mode) {
131 case kRsaSignaturePaddingPkcs1v15:
132 return rsa_padding_pkcs1v15_verify(message_digest, encoded_message,
133 encoded_message_len, result);
134 case kRsaSignaturePaddingPss:
135 return rsa_padding_pss_verify(message_digest, encoded_message,
136 encoded_message_len, result);
139 return OTCRYPTO_BAD_ARGS;
144 return OTCRYPTO_FATAL_ERR;
147 status_t rsa_signature_generate_2048_start(
150 const rsa_signature_padding_t padding_mode) {
153 HARDENED_TRY(message_encode(message_digest, padding_mode,
155 encoded_message.data));
158 return rsa_modexp_consttime_2048_start(&encoded_message, &private_key->d,
163 return rsa_modexp_2048_finalize(signature);
166 status_t rsa_signature_verify_2048_start(
169 return rsa_modexp_vartime_2048_start(signature, public_key->e,
173 status_t rsa_signature_verify_finalize(
175 const rsa_signature_padding_t padding_mode,
179 HARDENED_TRY(rsa_modexp_wait(&num_words));
184 case kRsa2048NumWords: {
186 HARDENED_TRY(rsa_modexp_2048_finalize(&recovered_message));
187 return encoded_message_verify(
188 message_digest, padding_mode, recovered_message.data,
189 ARRAYSIZE(recovered_message.data), verification_result);
191 case kRsa3072NumWords: {
193 HARDENED_TRY(rsa_modexp_3072_finalize(&recovered_message));
194 return encoded_message_verify(
195 message_digest, padding_mode, recovered_message.data,
196 ARRAYSIZE(recovered_message.data), verification_result);
198 case kRsa4096NumWords: {
200 HARDENED_TRY(rsa_modexp_4096_finalize(&recovered_message));
201 return encoded_message_verify(
202 message_digest, padding_mode, recovered_message.data,
203 ARRAYSIZE(recovered_message.data), verification_result);
207 return OTCRYPTO_FATAL_ERR;
212 return OTCRYPTO_FATAL_ERR;
215 status_t rsa_signature_generate_3072_start(
218 const rsa_signature_padding_t padding_mode) {
221 HARDENED_TRY(message_encode(message_digest, padding_mode,
223 encoded_message.data));
226 return rsa_modexp_consttime_3072_start(&encoded_message, &private_key->d,
231 return rsa_modexp_3072_finalize(signature);
234 status_t rsa_signature_verify_3072_start(
237 return rsa_modexp_vartime_3072_start(signature, public_key->e,
241 status_t rsa_signature_generate_4096_start(
244 const rsa_signature_padding_t padding_mode) {
247 HARDENED_TRY(message_encode(message_digest, padding_mode,
249 encoded_message.data));
252 return rsa_modexp_consttime_4096_start(&encoded_message, &private_key->d,
257 return rsa_modexp_4096_finalize(signature);
260 status_t rsa_signature_verify_4096_start(
263 return rsa_modexp_vartime_4096_start(signature, public_key->e,