5 #include "sw/device/lib/crypto/impl/rsa/rsa_encryption.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', 'e', 'n')
20 const uint8_t *message,
size_t message_bytelen,
21 const uint8_t *label,
size_t label_bytelen) {
24 HARDENED_TRY(rsa_padding_oaep_encode(
25 hash_mode, message, message_bytelen, label, label_bytelen,
26 ARRAYSIZE(encoded_message.data), encoded_message.data));
30 return rsa_modexp_vartime_2048_start(&encoded_message, public_key->e,
35 return rsa_modexp_2048_finalize(ciphertext);
41 return rsa_modexp_consttime_2048_start(ciphertext, &private_key->d,
46 const uint8_t *label,
size_t label_bytelen,
47 size_t plaintext_max_wordlen, uint8_t *plaintext,
48 size_t *plaintext_len) {
51 HARDENED_TRY(rsa_modexp_wait(&num_words));
54 if (plaintext_max_wordlen > UINT32_MAX /
sizeof(uint32_t)) {
55 return OTCRYPTO_BAD_ARGS;
59 size_t max_plaintext_bytelen = 0;
60 HARDENED_TRY(rsa_padding_oaep_max_message_bytelen(hash_mode, num_words,
61 &max_plaintext_bytelen));
62 if (plaintext_max_wordlen <
63 ceil_div(max_plaintext_bytelen,
sizeof(uint32_t))) {
64 return OTCRYPTO_BAD_ARGS;
66 HARDENED_CHECK_GE(plaintext_max_wordlen *
sizeof(uint32_t),
67 max_plaintext_bytelen);
72 case kRsa2048NumWords: {
74 HARDENED_TRY(rsa_modexp_2048_finalize(&recovered_message));
75 return rsa_padding_oaep_decode(
76 hash_mode, label, label_bytelen, recovered_message.data,
77 ARRAYSIZE(recovered_message.data), plaintext, plaintext_len);
79 case kRsa3072NumWords: {
81 HARDENED_TRY(rsa_modexp_3072_finalize(&recovered_message));
82 return rsa_padding_oaep_decode(
83 hash_mode, label, label_bytelen, recovered_message.data,
84 ARRAYSIZE(recovered_message.data), plaintext, plaintext_len);
86 case kRsa4096NumWords: {
88 HARDENED_TRY(rsa_modexp_4096_finalize(&recovered_message));
89 return rsa_padding_oaep_decode(
90 hash_mode, label, label_bytelen, recovered_message.data,
91 ARRAYSIZE(recovered_message.data), plaintext, plaintext_len);
95 return OTCRYPTO_FATAL_ERR;
100 return OTCRYPTO_FATAL_ERR;
105 const uint8_t *message,
size_t message_bytelen,
106 const uint8_t *label,
size_t label_bytelen) {
109 HARDENED_TRY(rsa_padding_oaep_encode(
110 hash_mode, message, message_bytelen, label, label_bytelen,
111 ARRAYSIZE(encoded_message.data), encoded_message.data));
115 return rsa_modexp_vartime_3072_start(&encoded_message, public_key->e,
120 return rsa_modexp_3072_finalize(ciphertext);
126 return rsa_modexp_consttime_3072_start(ciphertext, &private_key->d,
132 const uint8_t *message,
size_t message_bytelen,
133 const uint8_t *label,
size_t label_bytelen) {
136 HARDENED_TRY(rsa_padding_oaep_encode(
137 hash_mode, message, message_bytelen, label, label_bytelen,
138 ARRAYSIZE(encoded_message.data), encoded_message.data));
142 return rsa_modexp_vartime_4096_start(&encoded_message, public_key->e,
147 return rsa_modexp_4096_finalize(ciphertext);
153 return rsa_modexp_consttime_4096_start(ciphertext, &private_key->d,