blob: 41a20f3e367c27287a02ce3e028a85d596005bff [file] [log] [blame]
Philipp Wagner4b6f3412020-11-04 17:00:38 +00001// Copyright lowRISC contributors.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5#include "sw/device/lib/dif/dif_otbn.h"
6#include "sw/device/lib/runtime/ibex.h"
7#include "sw/device/lib/runtime/log.h"
8#include "sw/device/lib/runtime/otbn.h"
Miguel Osoriod04b0482021-07-21 17:26:34 -07009#include "sw/device/lib/testing/entropy_testutils.h"
Miguel Young de la Sota09d4d012022-04-19 11:05:36 -040010#include "sw/device/lib/testing/test_framework/check.h"
Miguel Young de la Sota4d46eb92022-04-19 13:11:15 -040011#include "sw/device/lib/testing/test_framework/ottf_main.h"
Philipp Wagner4b6f3412020-11-04 17:00:38 +000012
13#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
14
15/**
16 * End-to-end RSA encryption and decryption test using OTBN.
17 *
18 * IMPORTANT: This test is not a secure, complete, or reusable implementation of
19 * RSA; it is not even close to being production-ready. It is only meant as an
20 * end-to-end test for OTBN during the bringup phase.
21 *
22 * This test loads the RSA application into OTBN, sets all required input
23 * arguments, and performs the encryption and decryption operations.
24 *
25 * To keep the test execution time reasonable some parts of the test can be
26 * disabled with the `kTestDecrypt` and `kTestRsaGreater1k` constants.
27 *
28 * The test contains constants and expected output, which can be independently
29 * and conveniently verified using a Python script.
30 *
31 * <code>
32 * # Optional: generate a new key
33 * $ openssl genpkey -algorithm RSA -out otbn_rsa_test_private_key_1024.pem \
34 * -pkeyopt rsa_keygen_bits:1024
35 *
36 * # Create all constants/variables
Philipp Wagner592ccff2021-02-15 18:31:22 +000037 * $ ./otbn_test_params.py rsa otbn_rsa_test_private_key_1024.pem \
38 * "Hello OTBN, can you encrypt and decrypt this for me?"
Philipp Wagner4b6f3412020-11-04 17:00:38 +000039 * </code>
40 */
41
42/**
43 * Performs encrypt and decrypt operations. (Otherwise, only encrypt is done.)
44 *
45 * Encryption is reasonably fast in RSA, taking between 50 thousand instructions
46 * for RSA 512, up to 17 million instructions for RSA 4096.
47 * Assuming a typical Verilator-based simulation of Earl Grey at 5 kHz, this
48 * results in simulation times between a couple of seconds and an hour for RSA
49 * encrypt.
50 *
51 * Decryption, on the other hand, is much more computationally expensive.
52 * Decryption takes around 0.5 million instructions for RSA 512, up to
53 * 128 million instructions for RSA 4096. Assuming the same simulation at 5 kHz,
54 * this translates to a RSA 512 decode taking around two minutes to execute,
55 * and a RSA 4096 decode taking over seven hours.
56 */
57static const bool kTestDecrypt = true;
58
59/**
60 * Tests RSA 2k, 3k, and 4k.
61 *
62 * If disabled, only RSA 512 and RSA 1k tests are executed. Longer keys take
63 * significantly longer to test, especially the decryption parts.
64 *
65 * See the description of `kTestDecrypt` for more details on execution times.
66 */
67static const bool kTestRsaGreater1k = false;
68
69OTBN_DECLARE_APP_SYMBOLS(rsa);
Rupert Swarbrick48b9a952022-01-14 16:20:16 +000070OTBN_DECLARE_SYMBOL_ADDR(rsa, mode);
71OTBN_DECLARE_SYMBOL_ADDR(rsa, n_limbs);
72OTBN_DECLARE_SYMBOL_ADDR(rsa, inout);
73OTBN_DECLARE_SYMBOL_ADDR(rsa, modulus);
74OTBN_DECLARE_SYMBOL_ADDR(rsa, exp);
Philipp Wagner4b6f3412020-11-04 17:00:38 +000075
76static const otbn_app_t kOtbnAppRsa = OTBN_APP_T_INIT(rsa);
Rupert Swarbrick48b9a952022-01-14 16:20:16 +000077static const otbn_addr_t kOtbnVarRsaMode = OTBN_ADDR_T_INIT(rsa, mode);
78static const otbn_addr_t kOtbnVarRsaNLimbs = OTBN_ADDR_T_INIT(rsa, n_limbs);
79static const otbn_addr_t kOtbnVarRsaInOut = OTBN_ADDR_T_INIT(rsa, inout);
80static const otbn_addr_t kOtbnVarRsaModulus = OTBN_ADDR_T_INIT(rsa, modulus);
81static const otbn_addr_t kOtbnVarRsaExp = OTBN_ADDR_T_INIT(rsa, exp);
Philipp Wagner4b6f3412020-11-04 17:00:38 +000082
83enum {
84 kRsa512SizeBytes = 512 / 8,
85 kRsa1024SizeBytes = 1024 / 8,
86 kRsa2048SizeBytes = 2048 / 8,
87 kRsa3072SizeBytes = 3072 / 8,
88 kRsa4096SizeBytes = 4096 / 8,
89};
90
Timothy Trippela6412d22021-11-23 20:13:04 +000091const test_config_t kTestConfig;
Philipp Wagner4b6f3412020-11-04 17:00:38 +000092
93/**
94 * Encrypts a message with RSA.
95 *
96 * @param otbn_ctx The OTBN context object.
97 * @param modulus The modulus (n).
98 * @param in The plaintext message.
99 * @param out The encrypted message.
100 * @param size_bytes The size of all buffers in bytes, i.e. the key/modulus
101 * length (i.e. 128 for RSA 1024). Valid range: 32..512 in
102 * 32 byte-steps (i.e. RSA 256 to RSA 4096).
103 */
104static void rsa_encrypt(otbn_t *otbn_ctx, const uint8_t *modulus,
105 const uint8_t *in, uint8_t *out, size_t size_bytes) {
106 CHECK(otbn_ctx != NULL);
107 CHECK(size_bytes % 32 == 0);
108
109 uint32_t n_limbs = size_bytes / 32;
110 CHECK(n_limbs != 0 && n_limbs <= 16);
111
112 // Write input arguments.
Rupert Swarbricka83df9d2021-09-03 17:37:35 +0100113 uint32_t mode = 1; // mode 1 => encrypt
114 CHECK(otbn_copy_data_to_otbn(otbn_ctx, sizeof(mode), &mode,
115 kOtbnVarRsaMode) == kOtbnOk);
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000116 CHECK(otbn_copy_data_to_otbn(otbn_ctx, sizeof(n_limbs), &n_limbs,
117 kOtbnVarRsaNLimbs) == kOtbnOk);
118 CHECK(otbn_copy_data_to_otbn(otbn_ctx, size_bytes, modulus,
119 kOtbnVarRsaModulus) == kOtbnOk);
Rupert Swarbrickbc424b22021-11-16 13:34:23 +0000120 CHECK(otbn_copy_data_to_otbn(otbn_ctx, size_bytes, in, kOtbnVarRsaInOut) ==
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000121 kOtbnOk);
122
123 // Call OTBN to perform operation, and wait for it to complete.
Rupert Swarbrick2fb857a2021-09-03 17:14:50 +0100124 CHECK(otbn_execute(otbn_ctx) == kOtbnOk);
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000125 CHECK(otbn_busy_wait_for_done(otbn_ctx) == kOtbnOk);
126
127 // Read back results.
Rupert Swarbrickbc424b22021-11-16 13:34:23 +0000128 CHECK(otbn_copy_data_from_otbn(otbn_ctx, size_bytes, kOtbnVarRsaInOut, out) ==
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000129 kOtbnOk);
130}
131
132/**
133 * Decrypts a message with RSA.
134 *
135 * @param otbn_ctx The OTBN context object.
136 * @param modulus The modulus (n).
137 * @param private_exponent The private exponent (d).
138 * @param in The encrypted message.
139 * @param out The decrypted (plaintext) message.
140 * @param size_bytes The size of all buffers in bytes, i.e. the key/modulus
141 * length (i.e. 128 for RSA 1024). Valid range: 32..512 in
142 * 32 byte-steps (i.e. RSA 256 to RSA 4096).
143 */
144static void rsa_decrypt(otbn_t *otbn_ctx, const uint8_t *modulus,
145 const uint8_t *private_exponent, const uint8_t *in,
146 uint8_t *out, size_t size_bytes) {
147 CHECK(otbn_ctx != NULL);
148 CHECK(size_bytes % 32 == 0);
149
150 // Limbs are 256b words.
151 uint32_t n_limbs = size_bytes / 32;
152 CHECK(n_limbs != 0 && n_limbs <= 16);
153
154 // Write input arguments.
Rupert Swarbricka83df9d2021-09-03 17:37:35 +0100155 uint32_t mode = 2; // mode 2 => decrypt
156 CHECK(otbn_copy_data_to_otbn(otbn_ctx, sizeof(mode), &mode,
157 kOtbnVarRsaMode) == kOtbnOk);
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000158 CHECK(otbn_copy_data_to_otbn(otbn_ctx, sizeof(n_limbs), &n_limbs,
159 kOtbnVarRsaNLimbs) == kOtbnOk);
160 CHECK(otbn_copy_data_to_otbn(otbn_ctx, size_bytes, modulus,
161 kOtbnVarRsaModulus) == kOtbnOk);
162 CHECK(otbn_copy_data_to_otbn(otbn_ctx, size_bytes, private_exponent,
163 kOtbnVarRsaExp) == kOtbnOk);
Rupert Swarbrickbc424b22021-11-16 13:34:23 +0000164 CHECK(otbn_copy_data_to_otbn(otbn_ctx, size_bytes, in, kOtbnVarRsaInOut) ==
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000165 kOtbnOk);
166
167 // Call OTBN to perform operation
Rupert Swarbrick2fb857a2021-09-03 17:14:50 +0100168 CHECK(otbn_execute(otbn_ctx) == kOtbnOk);
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000169 CHECK(otbn_busy_wait_for_done(otbn_ctx) == kOtbnOk);
170
171 // Read back results.
Rupert Swarbrickbc424b22021-11-16 13:34:23 +0000172 CHECK(otbn_copy_data_from_otbn(otbn_ctx, size_bytes, kOtbnVarRsaInOut, out) ==
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000173 kOtbnOk);
174}
175
176/**
177 * CHECK()s that the actual data matches the expected data.
178 *
179 * @param actual The actual data.
180 * @param expected The expected data.
181 * @param size_bytes The size of the actual/expected data.
182 */
183static void check_data(const uint8_t *actual, const uint8_t *expected,
184 size_t size_bytes) {
185 for (int i = 0; i < size_bytes; ++i) {
186 CHECK(actual[i] == expected[i],
187 "Data mismatch at byte %d: 0x%x (actual) != 0x%x (expected)", i,
188 actual[i], expected[i]);
189 }
190}
191
192static uint64_t t_start;
193static uint64_t t_end;
194
195/**
196 * Starts a profiling section.
197 *
198 * Call this function at the start of a section that should be profiled, and
199 * call `profile_end()` at the end of it to display the results.
200 *
201 * Profiling section may not overlap, i.e. `profile_start()`/`profile_end()`
202 * pairs may not be nested.
203 */
204static void profile_start(void) { t_start = ibex_mcycle_read(); }
205
206/**
207 * Ends a profiling section.
208 *
209 * The time since `profile_start()` is printed as log message.
210 *
211 * @param msg Name of the operation (for logging purposes).
212 */
213static void profile_end(const char *msg) {
214 t_end = ibex_mcycle_read();
215 uint32_t cycles = t_end - t_start;
216 uint32_t time_us = cycles / 100;
217 LOG_INFO("%s took %u cycles or %u us @ 100 MHz.", msg, cycles, time_us);
218}
219
220/**
221 * Performs a RSA roundtrip test.
222 *
223 * A roundtrip consists of three steps:
224 * - Initialize OTBN.
225 * - Encrypt data. Check that the OTBN-produced data matches
226 * `encrypted_expected`.
227 * - If `kTestDecrypt` is set: Decrypt the encrypted data. Check that the OTBN-
228 * produced plaintext matches the original plaintext in `in`.
229 *
230 * @param size_bytes Size of all data arguments/buffers, in bytes.
231 * @param modulus The modulus (n).
232 * @param private_exponent The private exponent (d).
233 * @param in The input data of size `size_bytes`.
234 * @param encrypted_expected The encrypted version of `in`.
235 * @param out_encrypted Buffer to hold the encrypted data, as produced by OTBN.
236 * @param out_decrypted Buffer to hold the decrypted data, as produced by OTBN.
237 */
238static void rsa_roundtrip(uint32_t size_bytes, const uint8_t *modulus,
239 const uint8_t *private_exponent, const uint8_t *in,
240 const uint8_t *encrypted_expected,
241 uint8_t *out_encrypted, uint8_t *out_decrypted) {
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000242 otbn_t otbn_ctx;
243
244 // Initialize
245 profile_start();
Timothy Trippelb7ed5022021-09-29 21:11:56 +0000246 CHECK(otbn_init(&otbn_ctx, mmio_region_from_addr(
247 TOP_EARLGREY_OTBN_BASE_ADDR)) == kOtbnOk);
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000248 CHECK(otbn_load_app(&otbn_ctx, kOtbnAppRsa) == kOtbnOk);
249 profile_end("Initialization");
250
251 // Encrypt
252 LOG_INFO("Encrypting");
253 profile_start();
254 rsa_encrypt(&otbn_ctx, modulus, in, out_encrypted, size_bytes);
255 check_data(out_encrypted, encrypted_expected, size_bytes);
256 profile_end("Encryption");
257
258 if (kTestDecrypt) {
259 // Decrypt
260 LOG_INFO("Decrypting");
261 profile_start();
262 rsa_decrypt(&otbn_ctx, modulus, private_exponent, encrypted_expected,
263 out_decrypted, size_bytes);
264 check_data(out_decrypted, in, size_bytes);
265 profile_end("Decryption");
266 }
267}
268
269static void test_rsa512_roundtrip(void) {
270 static const uint8_t kModulus[kRsa512SizeBytes] = {
271 0xf3, 0xb7, 0x91, 0xce, 0x6e, 0xc0, 0x57, 0xcd, 0x19, 0x63, 0xb9,
272 0x6b, 0x81, 0x97, 0x96, 0x40, 0x81, 0xd8, 0x89, 0x27, 0xec, 0x0a,
273 0xb1, 0xf2, 0x4a, 0xda, 0x2e, 0x68, 0xe1, 0x80, 0xa4, 0x4f, 0xe0,
274 0x82, 0x87, 0x1f, 0x98, 0xdc, 0x42, 0xc7, 0xc2, 0xce, 0xa2, 0xb2,
275 0x1a, 0x3f, 0x77, 0xdc, 0xc6, 0x27, 0x6d, 0x83, 0x5c, 0xcd, 0x1d,
276 0xdf, 0xe5, 0xf3, 0x98, 0xe6, 0x8b, 0xe6, 0x5b, 0xd4};
277
278 static const uint8_t kPrivateExponent[kRsa512SizeBytes] = {
279 0xc1, 0xf3, 0x5d, 0x18, 0x12, 0x7e, 0xe7, 0x0c, 0xbf, 0x33, 0xd0,
280 0x1c, 0xd8, 0x5d, 0x91, 0x26, 0xb6, 0xc5, 0xae, 0x78, 0xda, 0x4c,
281 0xae, 0x43, 0xa1, 0x57, 0xab, 0x32, 0xcf, 0xa4, 0xd4, 0x72, 0x20,
282 0x53, 0x30, 0x55, 0x7a, 0x93, 0xd9, 0xae, 0x75, 0x32, 0x9d, 0x09,
283 0x18, 0x06, 0xc8, 0x26, 0x64, 0x28, 0xcf, 0x2c, 0x3b, 0x6e, 0x6b,
284 0x5c, 0x28, 0xde, 0x76, 0x6c, 0x2f, 0xcc, 0xf3, 0x31};
285
286 static const uint8_t kEncryptedExpected[kRsa512SizeBytes] = {
287 0xb7, 0x02, 0x28, 0xcb, 0x63, 0x5e, 0xa6, 0xfd, 0x55, 0x4a, 0x85,
288 0x43, 0x1d, 0x26, 0x13, 0xb3, 0x78, 0x66, 0xd9, 0xe2, 0xe1, 0xbf,
289 0x29, 0xc6, 0xc6, 0xdd, 0x90, 0x76, 0x3f, 0x1d, 0x43, 0xc0, 0x76,
290 0x51, 0x75, 0x10, 0x66, 0x61, 0x8c, 0x3c, 0x99, 0xd9, 0x90, 0xd2,
291 0x59, 0x45, 0x0a, 0x7a, 0x6d, 0x58, 0xaa, 0x75, 0xf2, 0x63, 0xb3,
292 0xe1, 0x06, 0x4b, 0x82, 0x0a, 0xdd, 0x07, 0x44, 0x2a};
293
294 static const uint8_t kIn[kRsa512SizeBytes] = {
295 "Hello OTBN, can you encrypt and decrypt this for me?"};
296 uint8_t out_encrypted[kRsa512SizeBytes] = {0};
297 uint8_t out_decrypted[kRsa512SizeBytes] = {0};
298
299 LOG_INFO("Running RSA512 test");
300 rsa_roundtrip(kRsa512SizeBytes, kModulus, kPrivateExponent, kIn,
301 kEncryptedExpected, out_encrypted, out_decrypted);
302}
303
304static void test_rsa1024_roundtrip(void) {
305 static const uint8_t kModulus[kRsa1024SizeBytes] = {
306 0x69, 0xef, 0x70, 0x5d, 0xcd, 0xf5, 0x15, 0xb5, 0x6b, 0xa2, 0xcd, 0x2b,
307 0x76, 0x3c, 0x6e, 0xdc, 0x13, 0x7, 0x6a, 0x9, 0x80, 0xe2, 0x2a, 0x24,
308 0xc2, 0xb0, 0x32, 0x36, 0x67, 0x1b, 0x1d, 0xf2, 0xaa, 0xf9, 0xd4, 0xeb,
309 0xc6, 0xf0, 0x3c, 0xe5, 0x94, 0x85, 0xd9, 0xc8, 0xa4, 0x79, 0x35, 0x77,
310 0x38, 0x10, 0x1, 0x74, 0xc3, 0xd7, 0x6b, 0x10, 0xc2, 0xc1, 0x5d, 0xa0,
311 0x57, 0x11, 0xd8, 0xc7, 0xd9, 0xdf, 0x78, 0xc5, 0xc3, 0x9, 0x84, 0x4d,
312 0x28, 0x6c, 0xea, 0x55, 0x87, 0x35, 0x44, 0x85, 0xde, 0x70, 0xa8, 0xec,
313 0x60, 0x3b, 0x7c, 0x5, 0x12, 0xb5, 0xb3, 0xbd, 0x75, 0x4, 0x40, 0x2b,
314 0x6a, 0x35, 0x4, 0x21, 0x73, 0x5, 0x94, 0x8, 0x8, 0x2c, 0xe9, 0xb4,
315 0x8c, 0xd, 0x7c, 0x76, 0xc5, 0x85, 0xa7, 0xa, 0xa1, 0x91, 0xe0, 0xad,
316 0xae, 0xfa, 0xb, 0xc5, 0xc4, 0x88, 0x7e, 0xbe};
317
318 static const uint8_t kPrivateExponent[kRsa1024SizeBytes] = {
319 0x1, 0x66, 0x7f, 0x2, 0xdb, 0x27, 0x92, 0x7d, 0xd6, 0x41, 0x4e, 0xbf,
320 0x47, 0x31, 0x95, 0x8e, 0xfb, 0x5d, 0xee, 0xa1, 0xdf, 0x6d, 0x31, 0xd2,
321 0xeb, 0xee, 0xe2, 0xf4, 0xa4, 0x21, 0xa9, 0xb9, 0xd2, 0xcf, 0x94, 0xfe,
322 0x13, 0x74, 0xc8, 0xc8, 0xc1, 0x38, 0x6f, 0xb0, 0x84, 0x9c, 0x57, 0x1,
323 0x58, 0x91, 0xd6, 0x4, 0x4b, 0x9d, 0x49, 0x3, 0x6, 0x2e, 0x5c, 0xb1,
324 0xe2, 0xb7, 0x66, 0x0, 0xf7, 0xad, 0xbb, 0xce, 0xc, 0x46, 0xa5, 0xeb,
325 0xd9, 0x32, 0xc2, 0xf8, 0xca, 0xe7, 0xf1, 0xae, 0x8, 0x77, 0xce, 0xc4,
326 0xa0, 0xa0, 0xdc, 0xef, 0x6d, 0x4c, 0xd7, 0xf0, 0x7a, 0x66, 0xf3, 0x2f,
327 0xd5, 0x54, 0xde, 0xa8, 0xe5, 0xfb, 0xa9, 0xa2, 0x36, 0x21, 0xae, 0xff,
328 0xd, 0xfa, 0xba, 0x6b, 0xfd, 0xa3, 0x6a, 0x84, 0xa4, 0x8b, 0x95, 0xd6,
329 0xac, 0x5d, 0x4e, 0x2e, 0x7b, 0x14, 0x1f, 0x3d};
330
331 static const uint8_t kEncryptedExpected[kRsa1024SizeBytes] = {
332 0x76, 0x71, 0x99, 0x16, 0x38, 0x3a, 0xe0, 0xca, 0x9e, 0xc4, 0x5e, 0x9b,
333 0x68, 0xb6, 0x3f, 0x78, 0x0d, 0x6e, 0x43, 0x7c, 0xaf, 0x24, 0xcc, 0x3e,
334 0x4a, 0xd0, 0x3c, 0x15, 0xc6, 0x10, 0xf8, 0x3a, 0x1a, 0x6e, 0xe8, 0x8f,
335 0x9e, 0x6b, 0xdb, 0x3d, 0xd3, 0x48, 0x51, 0x20, 0x8a, 0xb9, 0x36, 0xfb,
336 0x9c, 0x2a, 0xd9, 0xef, 0xfc, 0x24, 0x7f, 0xb7, 0x81, 0x7d, 0x81, 0xb2,
337 0x6f, 0xd0, 0x1e, 0xdd, 0x5c, 0x70, 0x1b, 0x79, 0x3b, 0x67, 0xe5, 0xfa,
338 0xaf, 0x2e, 0xf3, 0xb2, 0xc6, 0xb1, 0xb9, 0x6d, 0x18, 0x79, 0x1a, 0xed,
339 0x29, 0xfd, 0xf5, 0x27, 0x8c, 0xf2, 0x6e, 0xe4, 0x48, 0x88, 0xaf, 0x75,
340 0xf5, 0xed, 0x09, 0xe7, 0x92, 0xbb, 0x30, 0x97, 0x1e, 0x45, 0x68, 0x81,
341 0x6d, 0x69, 0x75, 0xcb, 0xbb, 0xbc, 0xc2, 0x51, 0x6e, 0xb8, 0xc9, 0x46,
342 0x57, 0xe5, 0x27, 0xf7, 0x21, 0xb8, 0xd7, 0x2f};
343
344 static const uint8_t kIn[kRsa1024SizeBytes] = {
345 "Hello OTBN, can you encrypt and decrypt this for me?"};
346 uint8_t out_encrypted[kRsa1024SizeBytes] = {0};
347 uint8_t out_decrypted[kRsa1024SizeBytes] = {0};
348
349 LOG_INFO("Running RSA1024 test");
350 rsa_roundtrip(kRsa1024SizeBytes, kModulus, kPrivateExponent, kIn,
351 kEncryptedExpected, out_encrypted, out_decrypted);
352}
353
354static void test_rsa2048_roundtrip(void) {
355 static const uint8_t kModulus[kRsa2048SizeBytes] = {
356 0xf9, 0x90, 0xc7, 0x94, 0xcf, 0x96, 0xd3, 0x12, 0x6f, 0x16, 0xa6, 0x50,
357 0x5d, 0xcb, 0xe9, 0x29, 0x53, 0xc8, 0x44, 0x04, 0xda, 0x69, 0x2d, 0x1a,
358 0xc1, 0xb8, 0xa8, 0x70, 0x97, 0xb5, 0x96, 0xd8, 0x07, 0xef, 0x2c, 0x3a,
359 0x66, 0x90, 0x16, 0xf9, 0x27, 0x1e, 0xf9, 0x82, 0x2b, 0x32, 0x31, 0x17,
360 0x9d, 0x3b, 0x2a, 0x86, 0x0f, 0xb8, 0x2b, 0x51, 0xab, 0xd8, 0x79, 0x99,
361 0x1e, 0xfe, 0x94, 0x86, 0x68, 0x12, 0xae, 0x20, 0x03, 0x07, 0xc3, 0xb3,
362 0x84, 0x23, 0x36, 0x91, 0xe9, 0x26, 0xc8, 0xff, 0xc7, 0xb9, 0x8c, 0x35,
363 0xfb, 0xec, 0xd0, 0xb5, 0xde, 0x60, 0xb2, 0xd4, 0x64, 0x3c, 0x60, 0x94,
364 0x22, 0x6f, 0xc9, 0x6c, 0x5b, 0x61, 0x13, 0x6e, 0x45, 0x26, 0x4f, 0x48,
365 0xc2, 0x1e, 0xe0, 0x16, 0x58, 0x1a, 0x31, 0x69, 0x22, 0x93, 0x10, 0xa0,
366 0x3d, 0x26, 0xc3, 0x92, 0xa3, 0xc3, 0x40, 0xd3, 0x33, 0x1d, 0xa3, 0x31,
367 0xc7, 0xe1, 0x61, 0xc5, 0xf4, 0xb5, 0x66, 0xc1, 0x31, 0xc6, 0x4f, 0xf6,
368 0xa5, 0x2d, 0x1a, 0x73, 0xf4, 0x67, 0x75, 0x88, 0xf4, 0xc8, 0xc4, 0xa1,
369 0x3b, 0xab, 0x47, 0xc7, 0x18, 0x5b, 0x8c, 0x47, 0x28, 0x82, 0xba, 0xad,
370 0x7f, 0x39, 0x80, 0x04, 0xf5, 0x77, 0x07, 0x08, 0xe5, 0x39, 0xff, 0x8c,
371 0x7f, 0xfc, 0x72, 0x41, 0x1a, 0x99, 0x5a, 0x4d, 0xf7, 0xe9, 0x71, 0xf2,
372 0x74, 0x6c, 0xc9, 0x11, 0xb1, 0xb8, 0x13, 0x3f, 0x9f, 0x8e, 0x08, 0x12,
373 0xa7, 0x5a, 0x40, 0xd0, 0xe3, 0xaa, 0x26, 0x48, 0xb2, 0x6e, 0xa7, 0x39,
374 0x08, 0x06, 0x8e, 0x43, 0x74, 0xce, 0x8d, 0xfa, 0x49, 0x10, 0xf9, 0x7b,
375 0xd2, 0x4a, 0xa4, 0x2f, 0x93, 0x24, 0x9d, 0x0f, 0xda, 0xd9, 0x2c, 0xd5,
376 0x21, 0xc0, 0xc9, 0x61, 0xc3, 0xc6, 0x1f, 0xaf, 0xf4, 0x47, 0x1a, 0xa5,
377 0x2d, 0xa9, 0xc5, 0xbd};
378
379 static const uint8_t kPrivateExponent[kRsa2048SizeBytes] = {
380 0xfd, 0x82, 0x16, 0x63, 0x74, 0xc0, 0x2a, 0xde, 0x83, 0x69, 0x77, 0x3d,
381 0x1a, 0x5c, 0x07, 0xbb, 0x97, 0x34, 0xd4, 0xcb, 0x28, 0xc3, 0x28, 0xc0,
382 0x6a, 0x28, 0xaf, 0x05, 0xfd, 0x24, 0x84, 0x76, 0xd6, 0xc5, 0xfa, 0x3f,
383 0xc6, 0x02, 0x56, 0x08, 0x2f, 0x75, 0xbe, 0x9c, 0x92, 0x0e, 0x37, 0x8b,
384 0x5a, 0x67, 0x4e, 0xe3, 0x90, 0xb3, 0x16, 0x13, 0x4c, 0x75, 0xa2, 0xa4,
385 0xeb, 0x10, 0x03, 0x46, 0xc2, 0x09, 0xa9, 0xb5, 0x7a, 0x1e, 0x53, 0xaf,
386 0x5c, 0x61, 0xe7, 0x94, 0x6b, 0x1d, 0x06, 0x7d, 0x55, 0xc6, 0xb4, 0xe7,
387 0xa6, 0x56, 0x81, 0x59, 0x47, 0xee, 0xdc, 0x30, 0x7d, 0xc6, 0x49, 0xfd,
388 0xb8, 0x05, 0xa1, 0xc2, 0x55, 0xb1, 0xf1, 0x68, 0x47, 0xc5, 0x97, 0x9a,
389 0x31, 0xf3, 0x03, 0x3e, 0xc7, 0xf3, 0xe8, 0x70, 0xae, 0x80, 0xbd, 0x79,
390 0xfd, 0xe6, 0x15, 0x31, 0x12, 0xc6, 0xcb, 0xaa, 0xd1, 0x84, 0x6d, 0x5a,
391 0xed, 0x31, 0x4f, 0x17, 0x6b, 0x1b, 0x95, 0x89, 0x91, 0x3f, 0x9f, 0xa7,
392 0x2c, 0xec, 0x4a, 0xbe, 0xc2, 0x15, 0x28, 0xc0, 0xb8, 0xf0, 0xec, 0xd8,
393 0x80, 0x25, 0xd7, 0x98, 0x84, 0xde, 0x07, 0xb4, 0x67, 0xc0, 0x78, 0x79,
394 0x5c, 0x2a, 0x21, 0x87, 0x47, 0x76, 0x84, 0x1d, 0x26, 0x1e, 0x81, 0x6b,
395 0x02, 0x5e, 0xe2, 0x05, 0x1c, 0x17, 0xcb, 0xf5, 0xc1, 0x15, 0x00, 0xa4,
396 0xd6, 0x1b, 0xf2, 0x5c, 0x21, 0x55, 0xb6, 0x35, 0x24, 0x8e, 0x3d, 0x9c,
397 0x5c, 0xf3, 0x0c, 0xb3, 0x64, 0xff, 0x9e, 0x5e, 0x7f, 0xe8, 0x71, 0xe9,
398 0x04, 0xf6, 0xdd, 0x54, 0x00, 0x4f, 0x7f, 0x0a, 0x63, 0x64, 0x88, 0xa5,
399 0x36, 0x76, 0xc8, 0x0e, 0x2c, 0xd6, 0x39, 0x57, 0x6c, 0x9c, 0xcb, 0x19,
400 0x2c, 0x63, 0x73, 0xcb, 0x6b, 0x89, 0x2e, 0xe1, 0xf7, 0xc4, 0x74, 0x61,
401 0x67, 0x9a, 0x63, 0x9e};
402
403 static const uint8_t kEncryptedExpected[kRsa2048SizeBytes] = {
404 0x54, 0x83, 0x7c, 0xb0, 0xd9, 0x77, 0x76, 0xb5, 0xf5, 0xc8, 0x51, 0x02,
405 0x41, 0xab, 0xeb, 0xa6, 0x8e, 0x01, 0x15, 0x54, 0x30, 0x9b, 0x05, 0xb6,
406 0xbf, 0x40, 0x3d, 0xd2, 0x95, 0x62, 0xf7, 0x42, 0x4d, 0xf8, 0x3b, 0xd6,
407 0x0b, 0x9e, 0xef, 0x27, 0x2f, 0x95, 0x8e, 0x8a, 0xaf, 0x07, 0xe9, 0x54,
408 0x66, 0xc0, 0xe9, 0x1c, 0xdd, 0x1b, 0xfb, 0x91, 0xe3, 0xa6, 0x83, 0x6f,
409 0xa4, 0x74, 0x49, 0x75, 0x7f, 0x35, 0x8e, 0x40, 0x04, 0x72, 0xb9, 0xe2,
410 0x78, 0x4c, 0x4a, 0x3e, 0x37, 0xe9, 0x19, 0xe8, 0x61, 0xf4, 0xaa, 0x7d,
411 0x27, 0xd1, 0x55, 0x40, 0x59, 0x5b, 0x3c, 0x88, 0x70, 0x76, 0x09, 0x49,
412 0x8c, 0x3c, 0x66, 0xe1, 0x85, 0x8e, 0xe9, 0x79, 0xfe, 0x8f, 0xc0, 0xfd,
413 0x40, 0xbf, 0xf3, 0x87, 0xa9, 0x45, 0xb1, 0xce, 0xb2, 0xb8, 0x4b, 0xc2,
414 0x60, 0xcd, 0xda, 0xe5, 0x30, 0xf3, 0xd2, 0x38, 0xfd, 0x9d, 0x6e, 0x15,
415 0x5f, 0xa3, 0x24, 0x22, 0x90, 0x08, 0x09, 0x2b, 0x2d, 0x6e, 0x15, 0xe0,
416 0x97, 0x31, 0x1f, 0x85, 0x47, 0x72, 0x69, 0xf9, 0xd2, 0x5a, 0xcc, 0xe4,
417 0x9d, 0x17, 0xf2, 0x81, 0x73, 0x8c, 0x40, 0x61, 0x56, 0x6f, 0xbf, 0xd0,
418 0xa5, 0x20, 0xed, 0x37, 0x22, 0x5a, 0xab, 0xb6, 0x8e, 0x12, 0x87, 0x1b,
419 0xcd, 0x34, 0xda, 0x79, 0x0d, 0x35, 0x7c, 0xa4, 0xd1, 0xfa, 0x44, 0x09,
420 0xb9, 0xf0, 0x0b, 0xb2, 0xfb, 0xd3, 0xf1, 0xfd, 0xd8, 0x2f, 0x30, 0x15,
421 0xe2, 0x75, 0x18, 0x90, 0x3b, 0x33, 0xc5, 0x4a, 0x3d, 0x19, 0xd1, 0xb9,
422 0x35, 0x59, 0x2d, 0x2a, 0x0a, 0x51, 0xfe, 0xad, 0x03, 0xcd, 0x05, 0x8c,
423 0xb6, 0xeb, 0x5f, 0x66, 0xb9, 0x40, 0x1e, 0xd0, 0xce, 0xa5, 0xe1, 0x8e,
424 0x47, 0xb7, 0xb7, 0x55, 0x06, 0x92, 0xe5, 0x6f, 0xc9, 0x92, 0xc7, 0x80,
425 0x26, 0x2d, 0x3f, 0x2d};
426
427 static const uint8_t kIn[kRsa2048SizeBytes] = {"OTBN is great!"};
428 uint8_t out_encrypted[kRsa2048SizeBytes] = {0};
429 uint8_t out_decrypted[kRsa2048SizeBytes] = {0};
430
431 LOG_INFO("Running RSA2048 test");
432 rsa_roundtrip(kRsa2048SizeBytes, kModulus, kPrivateExponent, kIn,
433 kEncryptedExpected, out_encrypted, out_decrypted);
434}
435
436static void test_rsa3072_roundtrip(void) {
437 static const uint8_t kModulus[kRsa3072SizeBytes] = {
438 0x4f, 0x2b, 0xc7, 0xac, 0x81, 0x3a, 0xe8, 0x3e, 0xa4, 0x6c, 0x47, 0x9c,
439 0x9e, 0xdc, 0x5b, 0x94, 0x45, 0x0f, 0x14, 0x69, 0x53, 0x20, 0xc2, 0x47,
440 0x81, 0x4d, 0x3b, 0x96, 0xb9, 0x34, 0x9f, 0x7b, 0x47, 0x02, 0x8c, 0xe6,
441 0x35, 0x47, 0x04, 0x68, 0x9d, 0x07, 0xeb, 0x5e, 0xcb, 0x80, 0x22, 0x75,
442 0xd3, 0x42, 0xa1, 0xd8, 0xa2, 0xfe, 0x82, 0x4a, 0xb8, 0x01, 0x50, 0x8e,
443 0x06, 0xd4, 0x0f, 0xc4, 0x9a, 0xb9, 0x9d, 0xd6, 0xe8, 0x60, 0x71, 0xfb,
444 0xe4, 0xb4, 0x91, 0xd1, 0x4c, 0xf6, 0x00, 0xa1, 0x86, 0x41, 0x14, 0x73,
445 0xa3, 0xf5, 0x0f, 0xfb, 0x54, 0x81, 0x63, 0x2b, 0x61, 0xd1, 0x5d, 0x53,
446 0xfd, 0x22, 0x71, 0x3f, 0x17, 0xe5, 0x86, 0xd1, 0x9a, 0x13, 0x3d, 0x64,
447 0xbb, 0xb5, 0xc2, 0xc8, 0x08, 0xac, 0xa1, 0x68, 0xd6, 0x1c, 0x4d, 0x5a,
448 0x24, 0x21, 0x53, 0x03, 0xa2, 0x33, 0xef, 0xb6, 0x94, 0x91, 0x25, 0x11,
449 0x72, 0xe2, 0x21, 0x43, 0x9a, 0xee, 0x9f, 0x00, 0xca, 0x67, 0x99, 0x86,
450 0x04, 0x0a, 0x4a, 0x05, 0x2c, 0xbe, 0x1b, 0x08, 0xb5, 0x08, 0x8a, 0x43,
451 0xfa, 0xcd, 0xb2, 0xac, 0xac, 0x87, 0x32, 0xa7, 0x40, 0x76, 0xea, 0x44,
452 0x91, 0x46, 0x7a, 0x9a, 0x21, 0x2e, 0xb6, 0x96, 0x3b, 0xa0, 0xfb, 0x5e,
453 0xfd, 0x65, 0xbf, 0x5a, 0x10, 0xbf, 0x4a, 0xd2, 0x1c, 0xff, 0x06, 0x31,
454 0xb4, 0xe2, 0x4e, 0x73, 0xc7, 0x3d, 0xe0, 0xf1, 0x99, 0x64, 0x89, 0xca,
455 0xf7, 0x02, 0x28, 0x8a, 0x91, 0xfa, 0x68, 0x22, 0x34, 0xe4, 0x89, 0x22,
456 0xbd, 0x33, 0xb3, 0xdb, 0xb0, 0xe8, 0x52, 0x98, 0xdb, 0x41, 0x20, 0xb6,
457 0xc3, 0xf2, 0xf0, 0x81, 0x2d, 0x3e, 0x30, 0xa3, 0xbf, 0x09, 0xfb, 0xdc,
458 0x3f, 0x83, 0xc5, 0x8a, 0x58, 0x3b, 0xf3, 0x5e, 0x52, 0x40, 0x7b, 0xab,
459 0x57, 0xd5, 0x8e, 0x0f, 0x46, 0x43, 0xa3, 0x8a, 0x07, 0x6e, 0xed, 0x9c,
460 0x60, 0x08, 0x2d, 0x8a, 0x3c, 0xa9, 0x25, 0x2a, 0x78, 0xb1, 0xd5, 0x3a,
461 0x85, 0x2d, 0xb2, 0xe6, 0xcc, 0x4d, 0xa1, 0x62, 0xd3, 0x97, 0xe7, 0x86,
462 0x04, 0x7a, 0xb8, 0xe5, 0x60, 0xea, 0xb5, 0x5f, 0x6f, 0xb7, 0x15, 0x3c,
463 0x4b, 0x54, 0x8d, 0xb1, 0x77, 0x05, 0x51, 0x66, 0x54, 0x4e, 0xbd, 0x6f,
464 0xb7, 0x74, 0x98, 0x4d, 0x88, 0xbe, 0xf4, 0xbb, 0x14, 0x13, 0xcc, 0x7b,
465 0x4b, 0xe3, 0xf1, 0x52, 0x57, 0x2a, 0x18, 0x35, 0x87, 0x40, 0x28, 0xd5,
466 0xc4, 0xb6, 0x62, 0x54, 0xa9, 0xa1, 0xca, 0xd4, 0x87, 0x42, 0x62, 0x5d,
467 0x96, 0x58, 0x41, 0x1e, 0x2e, 0x44, 0x34, 0xde, 0x89, 0x04, 0xf3, 0xd6,
468 0x89, 0x89, 0x92, 0xc3, 0x67, 0x97, 0x97, 0x0c, 0x26, 0xcd, 0xec, 0x6b,
469 0xbd, 0x2e, 0xc3, 0xa4, 0xa5, 0x86, 0xf1, 0xd5, 0x56, 0x9b, 0xb2, 0xac};
470
471 static const uint8_t kPrivateExponent[kRsa3072SizeBytes] = {
472 0x01, 0xd7, 0x1b, 0x43, 0xb7, 0x32, 0x49, 0x3b, 0xc0, 0x5c, 0x93, 0x33,
473 0xfa, 0x2d, 0xd6, 0x33, 0x70, 0x6f, 0xeb, 0x5b, 0x53, 0xdb, 0x2c, 0x0f,
474 0x72, 0x26, 0x6a, 0x7c, 0x10, 0x0a, 0x02, 0x1f, 0xed, 0xf0, 0x5f, 0x8d,
475 0x7e, 0xb5, 0xd7, 0xa2, 0x3a, 0x8e, 0xa7, 0xa1, 0x6b, 0x20, 0xe6, 0xde,
476 0x5e, 0xcf, 0x53, 0xd0, 0xf4, 0x30, 0x7e, 0xf4, 0xa8, 0xa3, 0xcf, 0x3e,
477 0x47, 0x23, 0x8f, 0x73, 0x5d, 0x23, 0x2c, 0x03, 0x8a, 0x21, 0xe6, 0x34,
478 0xd3, 0x69, 0x80, 0x62, 0x3b, 0x25, 0x08, 0x99, 0x7e, 0xc9, 0xf0, 0xf0,
479 0x57, 0xd5, 0x48, 0xe6, 0xd6, 0x6b, 0xeb, 0x80, 0x68, 0x7a, 0xa9, 0xdc,
480 0xa2, 0x9b, 0x73, 0x8a, 0xb2, 0x79, 0x1a, 0xb7, 0x61, 0x25, 0x86, 0x4c,
481 0x19, 0x25, 0xc3, 0x77, 0xde, 0x9b, 0xed, 0xf5, 0xab, 0xe3, 0x83, 0x05,
482 0x24, 0x40, 0x34, 0xbd, 0xcf, 0xe9, 0x41, 0xc1, 0x27, 0x69, 0x45, 0x4d,
483 0x1b, 0x94, 0x7e, 0xee, 0x91, 0x75, 0x9c, 0x6e, 0x37, 0x5d, 0xdc, 0xee,
484 0x38, 0xbe, 0x8d, 0x89, 0xd1, 0x36, 0x01, 0x5b, 0xd6, 0x4f, 0xb2, 0x8c,
485 0x87, 0x95, 0xad, 0x96, 0x0a, 0x6c, 0xd2, 0x41, 0x1d, 0x2a, 0xeb, 0x40,
486 0x8f, 0xbf, 0xb3, 0x59, 0x6b, 0xdc, 0x0d, 0xef, 0x9b, 0x23, 0xfb, 0xd3,
487 0x3d, 0x48, 0xbf, 0x42, 0x77, 0x2d, 0xed, 0x92, 0x21, 0xff, 0x4c, 0x92,
488 0xdf, 0x40, 0xea, 0xb7, 0x0e, 0x77, 0x2d, 0x49, 0x47, 0x67, 0x7a, 0xc6,
489 0x3d, 0x7d, 0x22, 0xf2, 0x34, 0xa3, 0x40, 0x79, 0x27, 0x2a, 0x44, 0xa9,
490 0x3d, 0xda, 0xb7, 0x3a, 0x21, 0x79, 0xad, 0x7f, 0x78, 0xe1, 0xf7, 0x03,
491 0x7a, 0xe0, 0x2d, 0xce, 0x7c, 0x80, 0xdd, 0x6c, 0xbd, 0x33, 0x53, 0xa5,
492 0x56, 0xe4, 0x36, 0x08, 0x3f, 0x4a, 0xf5, 0x60, 0x31, 0xef, 0xfa, 0xa1,
493 0x92, 0x0e, 0x46, 0x8a, 0xb1, 0xd3, 0xd9, 0xfc, 0x01, 0x1d, 0xc8, 0xb7,
494 0x89, 0x4c, 0x3f, 0x9e, 0x49, 0x50, 0x7a, 0x6d, 0x76, 0x9a, 0xbb, 0x18,
495 0x72, 0x8a, 0x1d, 0x6d, 0xba, 0x5d, 0xcc, 0x5e, 0x00, 0xf6, 0xbf, 0xc5,
496 0x51, 0x30, 0x32, 0x13, 0x9c, 0x26, 0x62, 0xfb, 0x4d, 0xd4, 0xa6, 0x54,
497 0x45, 0x20, 0xec, 0x26, 0x6c, 0xfd, 0xc0, 0x4c, 0xb2, 0x7c, 0xbc, 0xd3,
498 0x2e, 0x91, 0xc4, 0xbe, 0xa2, 0x5c, 0xda, 0x10, 0xe0, 0xbd, 0x81, 0xae,
499 0x38, 0x49, 0x6e, 0x3c, 0xfd, 0x29, 0x02, 0xc8, 0x99, 0x20, 0xf2, 0x90,
500 0x38, 0xe8, 0xd9, 0x7a, 0x1e, 0x10, 0x39, 0xff, 0x85, 0x38, 0x3d, 0x18,
501 0xb3, 0xc9, 0x02, 0x60, 0xcb, 0x7c, 0x94, 0xd0, 0x11, 0x21, 0xf5, 0xf9,
502 0x8c, 0xc5, 0x2b, 0x2b, 0x7e, 0x65, 0x22, 0x19, 0xf5, 0x71, 0x58, 0xa3,
503 0xd2, 0x25, 0xa9, 0xb6, 0xc8, 0x8d, 0x85, 0x8c, 0x00, 0x45, 0xf9, 0x32};
504
505 static const uint8_t kEncryptedExpected[kRsa3072SizeBytes] = {
506 0x45, 0x91, 0x09, 0xad, 0x6a, 0xbd, 0xc1, 0x7f, 0x68, 0xea, 0x1e, 0xad,
507 0xb7, 0x59, 0xfa, 0x98, 0xa6, 0x13, 0x03, 0x35, 0x45, 0x45, 0x64, 0xca,
508 0x10, 0xa3, 0x47, 0x08, 0x45, 0xc9, 0x25, 0x7a, 0xd4, 0x62, 0x77, 0xe7,
509 0xfa, 0xb8, 0x03, 0x96, 0xfc, 0xb7, 0x0c, 0x20, 0x0c, 0x1f, 0xd6, 0xcc,
510 0x13, 0xe0, 0x0c, 0x47, 0x11, 0x8b, 0x82, 0x77, 0x3f, 0x9b, 0x65, 0x90,
511 0x54, 0x8a, 0xff, 0x83, 0xbe, 0xf4, 0xa1, 0x2a, 0xf0, 0x3c, 0xb4, 0x1b,
512 0xdd, 0x03, 0xd4, 0x87, 0x20, 0xad, 0x5d, 0x1e, 0xb8, 0x74, 0xc7, 0x91,
513 0x0c, 0x14, 0x56, 0x92, 0xda, 0xc4, 0x99, 0x43, 0x2d, 0x27, 0x80, 0x72,
514 0x5f, 0x20, 0xfe, 0xf8, 0xcb, 0x2e, 0xd4, 0xe4, 0x47, 0x19, 0x64, 0x72,
515 0xb8, 0x45, 0xd8, 0x58, 0x45, 0x60, 0x53, 0xf3, 0x81, 0xa9, 0xd9, 0xad,
516 0xac, 0x02, 0xc1, 0x1a, 0xf0, 0x6d, 0x93, 0xcc, 0x42, 0xda, 0x74, 0xd9,
517 0x48, 0x05, 0xde, 0xd7, 0x4e, 0x23, 0x79, 0x63, 0x81, 0x3e, 0xc9, 0x23,
518 0xff, 0x24, 0x61, 0x84, 0x01, 0x65, 0xea, 0x10, 0xa9, 0xc9, 0xc1, 0x77,
519 0xcd, 0x06, 0x79, 0xb9, 0xeb, 0xeb, 0x2f, 0xd6, 0x43, 0xe1, 0xa3, 0x6d,
520 0xfc, 0xb7, 0x1f, 0x6d, 0x05, 0x9d, 0x8c, 0x9f, 0xd5, 0xb7, 0x73, 0xdc,
521 0xf0, 0x52, 0xe9, 0x18, 0x17, 0x1d, 0x12, 0x95, 0xa8, 0xc1, 0xff, 0x99,
522 0xa7, 0x93, 0x6e, 0x3b, 0x93, 0x0a, 0x9d, 0x15, 0x21, 0x19, 0xe2, 0xa8,
523 0x42, 0x1c, 0x3b, 0xf5, 0x5f, 0x33, 0xa9, 0x0e, 0x74, 0x84, 0xd6, 0x4c,
524 0x37, 0x92, 0x84, 0x87, 0xdb, 0xa4, 0x80, 0x65, 0x39, 0x3f, 0xf8, 0x0e,
525 0xb7, 0x77, 0xd9, 0x1d, 0x7c, 0x0a, 0x7f, 0x57, 0x7e, 0xa6, 0xce, 0xc3,
526 0x61, 0x3d, 0x34, 0x8c, 0x48, 0x12, 0x4c, 0x80, 0x85, 0x14, 0xa5, 0x85,
527 0x6c, 0x95, 0x3e, 0xaf, 0xca, 0xd3, 0x51, 0x4b, 0xf8, 0xc9, 0x16, 0x1f,
528 0xfa, 0x5c, 0x4a, 0xe5, 0x9d, 0xab, 0xc4, 0xa3, 0xf4, 0xc3, 0xe9, 0x71,
529 0x81, 0x1f, 0x2e, 0x40, 0x35, 0x35, 0x24, 0xf2, 0x6d, 0x26, 0xb9, 0x0d,
530 0x9e, 0x23, 0x4f, 0xfb, 0xc2, 0x9e, 0x32, 0x4e, 0x05, 0xa0, 0xee, 0x6c,
531 0xe6, 0x6e, 0x94, 0x1d, 0x1c, 0xf0, 0xb8, 0x53, 0x56, 0x88, 0x36, 0x0b,
532 0x78, 0x96, 0x6e, 0x3f, 0x94, 0x00, 0xe8, 0x93, 0x4a, 0x37, 0xa5, 0xf8,
533 0xe6, 0x20, 0xa4, 0x56, 0x4b, 0xf2, 0x41, 0x34, 0x4e, 0x20, 0x5e, 0x65,
534 0xa4, 0x0b, 0xd6, 0xe9, 0x6f, 0x1b, 0x9f, 0x4b, 0x09, 0xd7, 0x47, 0x97,
535 0x99, 0xb4, 0x03, 0xbc, 0x84, 0x82, 0xc0, 0xc0, 0x34, 0x53, 0xcc, 0x29,
536 0xb3, 0xe7, 0x2d, 0xf8, 0xd8, 0x4d, 0x94, 0x47, 0xb2, 0xc5, 0xef, 0x36,
537 0xef, 0x65, 0x15, 0x32, 0x4f, 0x91, 0x99, 0x24, 0x15, 0x69, 0x65, 0x0c};
538
539 static const uint8_t kIn[kRsa3072SizeBytes] = {
540 "OpenTitan proudly presents: OTBN"};
541 uint8_t out_encrypted[kRsa3072SizeBytes] = {0};
542 uint8_t out_decrypted[kRsa3072SizeBytes] = {0};
543
544 LOG_INFO("Running RSA3072 test");
545 rsa_roundtrip(kRsa3072SizeBytes, kModulus, kPrivateExponent, kIn,
546 kEncryptedExpected, out_encrypted, out_decrypted);
547}
548
549static void test_rsa4096_roundtrip(void) {
550 static const uint8_t kModulus[kRsa4096SizeBytes] = {
551 0xd1, 0xde, 0xe6, 0xd0, 0x09, 0x86, 0xfd, 0xd2, 0xb8, 0xcf, 0xf0, 0x57,
552 0x46, 0xac, 0x71, 0xda, 0x1d, 0x02, 0xcc, 0xf8, 0xf4, 0x66, 0x86, 0x3a,
553 0x92, 0x98, 0x5a, 0x89, 0x48, 0xca, 0x48, 0x9e, 0xab, 0x48, 0x53, 0xbf,
554 0xf1, 0x8c, 0xb5, 0x2f, 0xb1, 0xe0, 0x10, 0xd0, 0x44, 0x31, 0x16, 0x52,
555 0xce, 0x18, 0xb1, 0xe0, 0x2c, 0x2f, 0xf8, 0x95, 0xdd, 0xe5, 0xa0, 0x2f,
556 0x11, 0xa0, 0xba, 0xec, 0xfb, 0xa9, 0x77, 0x95, 0x72, 0xfe, 0xe2, 0x5f,
557 0x00, 0xc7, 0x38, 0x4b, 0x5b, 0xe9, 0x78, 0xe5, 0x87, 0x1b, 0xcc, 0xdc,
558 0xa6, 0x09, 0xc2, 0xfd, 0x0d, 0xd9, 0x03, 0xc9, 0xbc, 0x35, 0xac, 0x30,
559 0xcc, 0x0b, 0x79, 0xef, 0x6b, 0x6b, 0xf1, 0x85, 0x4a, 0x58, 0x9b, 0xe0,
560 0x0a, 0xff, 0x7d, 0x60, 0x7a, 0x39, 0xfe, 0xd9, 0xeb, 0x75, 0xcb, 0x18,
561 0x18, 0x8e, 0x89, 0x7d, 0x81, 0xd2, 0x24, 0x40, 0x11, 0xf4, 0xe9, 0x6f,
562 0x28, 0x1f, 0xb9, 0xc8, 0x5a, 0xaf, 0x9c, 0x97, 0x51, 0xf8, 0xbe, 0xef,
563 0x03, 0x64, 0x5b, 0xbb, 0x77, 0xda, 0xfc, 0xa8, 0xc9, 0xd5, 0x32, 0x04,
564 0x2e, 0x75, 0x60, 0x99, 0x4a, 0x20, 0x64, 0x5c, 0x6d, 0x5b, 0xf3, 0x02,
565 0xf7, 0xe5, 0x66, 0x83, 0x6b, 0xfb, 0x3f, 0x88, 0x9d, 0x9b, 0x73, 0xf7,
566 0x5c, 0x43, 0x43, 0xfd, 0x0d, 0xb4, 0x34, 0x18, 0xd8, 0x10, 0xb9, 0x3b,
567 0x30, 0x37, 0x31, 0x61, 0x83, 0x6c, 0x24, 0x44, 0x28, 0x7f, 0x76, 0x95,
568 0xd7, 0x2f, 0xdb, 0x0b, 0xc9, 0x7a, 0x72, 0xc7, 0x93, 0xb9, 0x51, 0xd4,
569 0xb0, 0xb7, 0x4f, 0xd6, 0x8c, 0xe6, 0xb2, 0x7a, 0x12, 0xae, 0xd2, 0x24,
570 0x54, 0x74, 0x36, 0x75, 0xbb, 0x6e, 0xc7, 0x3a, 0xc8, 0xb4, 0x82, 0xd1,
571 0x8d, 0x6f, 0x60, 0x08, 0xc7, 0x2a, 0xf8, 0xc1, 0x74, 0x1d, 0x3c, 0x05,
572 0x26, 0xd0, 0x31, 0x20, 0xf5, 0xe5, 0x14, 0xbc, 0xe6, 0x83, 0x77, 0xae,
573 0xbb, 0xf3, 0x9c, 0x93, 0x61, 0x8b, 0xb0, 0xa0, 0xfa, 0xc7, 0x13, 0xc8,
574 0x8d, 0xca, 0x36, 0xd9, 0x5e, 0xec, 0x37, 0xe8, 0x71, 0x3a, 0x39, 0x78,
575 0x26, 0xdd, 0x1e, 0x03, 0xba, 0x9d, 0xea, 0xb2, 0x99, 0x3b, 0x89, 0xb9,
576 0xc5, 0x6e, 0x5d, 0x38, 0x06, 0xf7, 0x7a, 0x89, 0x1a, 0xfa, 0x49, 0xff,
577 0x05, 0x75, 0x56, 0xd0, 0xbd, 0x8e, 0xb5, 0x1e, 0xf3, 0xc2, 0x4d, 0x4e,
578 0x24, 0x61, 0x8a, 0x5b, 0xfe, 0x62, 0xbb, 0x43, 0x25, 0xd0, 0x63, 0xf7,
579 0xa2, 0x2a, 0x6d, 0x09, 0x0f, 0xe2, 0x4d, 0x81, 0x54, 0x9a, 0xfc, 0x89,
580 0x66, 0x00, 0x51, 0xf3, 0x9c, 0x13, 0xa7, 0x62, 0x63, 0x59, 0x71, 0x51,
581 0xbc, 0x22, 0xba, 0xa3, 0xa5, 0x6a, 0x34, 0xa2, 0x67, 0xfd, 0xe1, 0xd3,
582 0x6c, 0xfa, 0x64, 0xa4, 0x3b, 0x54, 0x8b, 0x50, 0x7d, 0x54, 0x1a, 0x11,
583 0x74, 0xd5, 0x35, 0x25, 0x6d, 0x8b, 0x14, 0xf1, 0xa0, 0xfc, 0xce, 0x8d,
584 0x5f, 0xa5, 0xe9, 0x20, 0xc2, 0x95, 0xa9, 0xb2, 0x93, 0xb7, 0xfa, 0x41,
585 0x95, 0x0a, 0xdc, 0xa7, 0xe9, 0xe9, 0x87, 0xb5, 0x35, 0xab, 0x4d, 0xa0,
586 0x15, 0x9a, 0xb3, 0xba, 0x64, 0x50, 0x25, 0xf9, 0xf5, 0xb1, 0x1c, 0x9f,
587 0xa1, 0x34, 0x18, 0xd3, 0xab, 0x8b, 0xe9, 0x35, 0x77, 0xca, 0x45, 0x77,
588 0x10, 0xe8, 0x41, 0xfb, 0x04, 0x12, 0x00, 0x04, 0x70, 0x95, 0xa9, 0x70,
589 0xcc, 0xa6, 0xae, 0xe3, 0xe2, 0x18, 0xca, 0x8a, 0x29, 0x57, 0x17, 0x1c,
590 0x48, 0x67, 0xbd, 0x1e, 0x54, 0x6d, 0x45, 0x5e, 0x45, 0x2c, 0x34, 0x64,
591 0x71, 0xc0, 0xdb, 0x61, 0xe1, 0x73, 0x98, 0x25, 0x41, 0xf2, 0x18, 0xd9,
592 0x28, 0xfb, 0xef, 0x16, 0xa5, 0xf9, 0x9d, 0xe0, 0x54, 0x13, 0xf8, 0x28,
593 0x98, 0xb7, 0x1a, 0x4a, 0x7f, 0xa2, 0x74, 0xf0};
594
595 static const uint8_t kPrivateExponent[kRsa4096SizeBytes] = {
596 0xc1, 0x91, 0x67, 0x67, 0xb2, 0xe7, 0xd2, 0xba, 0x16, 0xf1, 0x70, 0xec,
597 0xbf, 0x6e, 0x73, 0x6f, 0x3b, 0x4f, 0x09, 0xed, 0x09, 0x91, 0xc1, 0xc3,
598 0x73, 0x8c, 0x19, 0x33, 0x93, 0xcd, 0xd2, 0xb2, 0x9d, 0x53, 0x49, 0xa4,
599 0xf7, 0xce, 0xde, 0x09, 0xbf, 0x58, 0x56, 0xd6, 0xd7, 0x10, 0x0c, 0xcc,
600 0x08, 0x68, 0xe4, 0xdd, 0xfb, 0x31, 0xc2, 0x9b, 0x0e, 0xc6, 0xf4, 0x21,
601 0x59, 0x13, 0x83, 0xbd, 0xb8, 0x04, 0x68, 0xaf, 0xd9, 0x97, 0xf9, 0x0e,
602 0xf9, 0x5d, 0x90, 0x76, 0xdb, 0xae, 0x9e, 0xb4, 0x16, 0xb0, 0x14, 0xcf,
603 0xeb, 0x2c, 0x2b, 0xde, 0x2a, 0xb9, 0x93, 0xc1, 0xb7, 0x5d, 0x6d, 0xec,
604 0x46, 0x09, 0xe2, 0x12, 0xf1, 0x38, 0x45, 0x61, 0x4d, 0x17, 0x54, 0x17,
605 0xb1, 0x06, 0x29, 0x53, 0x85, 0x56, 0xc9, 0x3b, 0xb4, 0xf3, 0x28, 0xeb,
606 0xc1, 0x0a, 0x3f, 0x05, 0xbc, 0xed, 0x7b, 0x64, 0x09, 0xab, 0xbd, 0x99,
607 0x22, 0x71, 0xbf, 0x40, 0x27, 0x3d, 0x8a, 0xcf, 0xb3, 0x31, 0xfd, 0x6b,
608 0xdf, 0x85, 0x46, 0x39, 0x3a, 0x7c, 0x6f, 0xbd, 0x04, 0xb0, 0x4e, 0xf4,
609 0xe2, 0x89, 0xc0, 0x86, 0xb4, 0xa8, 0xf8, 0x29, 0x85, 0x99, 0x1f, 0x80,
610 0x09, 0xa8, 0x77, 0xcc, 0xdf, 0x1f, 0x4d, 0x1b, 0xe9, 0x6e, 0x2d, 0xe3,
611 0x15, 0x43, 0x7e, 0x07, 0x6c, 0x4d, 0x97, 0xb0, 0x07, 0x23, 0xe1, 0x07,
612 0xf7, 0xcc, 0x6d, 0x9f, 0x8e, 0xd9, 0xd3, 0xa3, 0xa3, 0x7e, 0xbd, 0xa5,
613 0x23, 0xb7, 0xab, 0x54, 0xe5, 0xc3, 0xa9, 0xb4, 0xe4, 0xa2, 0xf4, 0x33,
614 0x40, 0xa9, 0x5f, 0xa2, 0x60, 0x65, 0xaa, 0xaa, 0x2c, 0x44, 0x59, 0xca,
615 0x2e, 0x4e, 0xd5, 0x8a, 0x48, 0xd6, 0x65, 0xfd, 0x43, 0x51, 0x11, 0x2d,
616 0x64, 0x07, 0x99, 0x63, 0x8d, 0x17, 0xe4, 0xb2, 0xe0, 0xa3, 0x9a, 0xc1,
617 0xb8, 0xb6, 0x8f, 0x2c, 0x84, 0x95, 0xa5, 0xb3, 0x54, 0xca, 0xd0, 0x1f,
618 0xce, 0x11, 0x57, 0x06, 0x1c, 0x54, 0xa5, 0x93, 0x7a, 0x0b, 0xa8, 0x9d,
619 0xa9, 0x77, 0x9d, 0xe1, 0x63, 0xd9, 0xfd, 0x6c, 0x62, 0x9b, 0x7c, 0x48,
620 0x80, 0x0f, 0x9b, 0x7f, 0x6c, 0x22, 0x9f, 0x8d, 0x76, 0x41, 0xfb, 0xa9,
621 0x24, 0x23, 0x6f, 0xe2, 0x2e, 0x17, 0x1a, 0x16, 0x07, 0x7f, 0xba, 0x90,
622 0xea, 0x10, 0xed, 0x60, 0x74, 0xb5, 0x71, 0x51, 0xd2, 0xff, 0x0f, 0xbb,
623 0xe9, 0x91, 0xad, 0x73, 0xa8, 0x82, 0xd7, 0xd9, 0xd0, 0xd3, 0xda, 0x56,
624 0x28, 0x2c, 0x9a, 0x24, 0xa5, 0xd8, 0xf1, 0x96, 0x0d, 0xb7, 0x92, 0xbd,
625 0x62, 0xf4, 0x9d, 0x62, 0x69, 0xb5, 0x0f, 0xd4, 0xf7, 0xff, 0x6f, 0x9c,
626 0xca, 0xde, 0x15, 0xa4, 0x6f, 0x9e, 0xb8, 0xd4, 0xa7, 0x3f, 0x66, 0x2a,
627 0x15, 0x72, 0x0f, 0xe0, 0xbd, 0xa0, 0xe0, 0x9c, 0xbd, 0x44, 0x8f, 0xfd,
628 0x89, 0xf1, 0x25, 0xd3, 0x17, 0xc4, 0xbc, 0x5f, 0x3a, 0x1a, 0x70, 0x26,
629 0x1b, 0x4b, 0x70, 0x97, 0x0d, 0x30, 0x1f, 0x4d, 0x0c, 0x44, 0x7b, 0x89,
630 0x6f, 0xa3, 0x76, 0xec, 0xc6, 0xba, 0x2a, 0x42, 0x96, 0x51, 0xa7, 0xea,
631 0xa8, 0xca, 0x21, 0xa0, 0x2d, 0xd0, 0x05, 0x25, 0xa7, 0x14, 0x16, 0xcf,
632 0x94, 0xbb, 0x85, 0x36, 0x19, 0xeb, 0x40, 0x64, 0x11, 0x60, 0xcb, 0x63,
633 0xd5, 0xd7, 0xbf, 0x65, 0x20, 0x87, 0xea, 0x0d, 0xf4, 0xbe, 0x21, 0x76,
634 0x15, 0x18, 0x10, 0x34, 0x6f, 0xaa, 0xef, 0x4b, 0x2b, 0x10, 0xf5, 0x67,
635 0x07, 0xc2, 0xf3, 0x76, 0x76, 0xe7, 0x55, 0xbe, 0x3f, 0xdb, 0x73, 0xce,
636 0xfa, 0xec, 0x2b, 0xb6, 0x5a, 0x08, 0x73, 0x55, 0xb6, 0xed, 0x74, 0x11,
637 0xec, 0x28, 0x79, 0x17, 0xa6, 0x9f, 0xca, 0x15, 0xe1, 0xd6, 0x67, 0x35,
638 0x6f, 0x9b, 0x99, 0x46, 0x7f, 0x20, 0x4a, 0x43};
639
640 static const uint8_t kEncryptedExpected[kRsa4096SizeBytes] = {
641 0x59, 0x13, 0x5c, 0x73, 0xb2, 0xee, 0xe6, 0x48, 0x24, 0x95, 0x80, 0xe3,
642 0x5b, 0x54, 0x08, 0x7d, 0x81, 0x98, 0x4a, 0x64, 0xb0, 0xf4, 0x06, 0x29,
643 0x6d, 0x4a, 0x51, 0x9c, 0x12, 0xcd, 0xe3, 0x4a, 0x5b, 0x48, 0x7a, 0x84,
644 0x8c, 0x0c, 0x76, 0x77, 0x28, 0x23, 0xf2, 0x77, 0x62, 0x32, 0xfa, 0x03,
645 0x31, 0x62, 0x83, 0x2f, 0x04, 0x97, 0x94, 0x28, 0x56, 0xa9, 0x0d, 0xaf,
646 0x25, 0x85, 0xb4, 0x55, 0x87, 0x50, 0xde, 0xed, 0x1f, 0x37, 0xd4, 0xc8,
647 0x39, 0x51, 0x70, 0x7a, 0x1e, 0x36, 0xd3, 0x24, 0x04, 0x94, 0x5f, 0xa3,
648 0xc1, 0xf9, 0x14, 0x62, 0x1e, 0x03, 0xb6, 0x3c, 0xd6, 0x7b, 0x55, 0x1d,
649 0x23, 0x64, 0x9d, 0x7e, 0xcc, 0x74, 0xba, 0x9a, 0x57, 0x29, 0xcd, 0xea,
650 0x13, 0xf9, 0x41, 0xca, 0xe7, 0x31, 0x95, 0xf3, 0x78, 0x2f, 0x8f, 0x91,
651 0x59, 0x36, 0x11, 0x28, 0xae, 0x01, 0x82, 0x05, 0x78, 0x68, 0xc9, 0x6a,
652 0xee, 0x1c, 0x7b, 0x48, 0x4d, 0x55, 0xa5, 0x64, 0x43, 0xe2, 0x90, 0x4e,
653 0x1e, 0x12, 0x4b, 0x5c, 0xa6, 0xb9, 0x12, 0x57, 0xe0, 0x9a, 0x19, 0x88,
654 0xa8, 0x10, 0x8b, 0x92, 0x26, 0xf8, 0x62, 0x9e, 0x46, 0xcf, 0x65, 0xcf,
655 0xdd, 0xcc, 0xb1, 0x23, 0xaf, 0x55, 0x3a, 0x8f, 0x47, 0xa6, 0x8a, 0xd9,
656 0x1b, 0x19, 0x5b, 0x5e, 0x5f, 0x6c, 0xa6, 0x4e, 0xb8, 0xa7, 0x6d, 0x2f,
657 0x6b, 0x0e, 0xd0, 0x0c, 0xf2, 0x01, 0xa3, 0xfd, 0x2a, 0x67, 0x5b, 0x81,
658 0x21, 0x32, 0x25, 0x79, 0x95, 0x8f, 0x78, 0x05, 0x92, 0x45, 0x4a, 0x67,
659 0x26, 0xd6, 0xc6, 0x5e, 0x17, 0xd3, 0xbb, 0x00, 0x14, 0x13, 0xb9, 0xa4,
660 0x0d, 0x0a, 0xd4, 0x98, 0xff, 0x8f, 0x57, 0x13, 0xc2, 0x16, 0x0c, 0xc0,
661 0x70, 0x67, 0x1a, 0x5d, 0xd0, 0xc7, 0xa1, 0x58, 0x28, 0x74, 0x67, 0x9c,
662 0x19, 0xee, 0xef, 0x94, 0x79, 0xc4, 0x60, 0xb8, 0x6e, 0x47, 0x45, 0xe1,
663 0x51, 0xd9, 0x57, 0x53, 0x24, 0x4d, 0x44, 0xc5, 0xf3, 0xbc, 0x15, 0x7e,
664 0xfe, 0x7d, 0x2b, 0xb0, 0x51, 0xa3, 0x77, 0x76, 0xd4, 0x85, 0x51, 0x6d,
665 0xeb, 0x6f, 0x31, 0x45, 0x63, 0x1e, 0x64, 0xac, 0x11, 0x2f, 0xbc, 0x2c,
666 0xc0, 0xe8, 0x39, 0x8d, 0x8c, 0x40, 0x01, 0x41, 0x03, 0xd1, 0xce, 0xfb,
667 0x68, 0x42, 0x0e, 0x63, 0xf3, 0xd0, 0x63, 0xf6, 0xc9, 0xc9, 0x84, 0xfc,
668 0x90, 0x59, 0x2d, 0x7a, 0x85, 0x1a, 0x7d, 0xd6, 0x11, 0x73, 0xe2, 0x45,
669 0x40, 0x72, 0x82, 0x08, 0xcd, 0x3b, 0x19, 0x26, 0x20, 0x7c, 0x86, 0x1d,
670 0xde, 0xbf, 0x4f, 0xb7, 0x49, 0x2b, 0xc3, 0x2f, 0x1a, 0x8e, 0x5b, 0xeb,
671 0x1e, 0xf5, 0xa9, 0xb6, 0x59, 0xdf, 0xca, 0x5a, 0x07, 0x95, 0xaf, 0x1a,
672 0xbf, 0x2c, 0x2a, 0x18, 0x02, 0xeb, 0x76, 0xa3, 0xad, 0x53, 0x4e, 0xf3,
673 0x18, 0xe4, 0xb9, 0xac, 0x76, 0x80, 0x8a, 0xe0, 0x37, 0x36, 0x29, 0x34,
674 0x20, 0x52, 0x45, 0x81, 0x80, 0xb0, 0x1c, 0xd4, 0xac, 0x56, 0x50, 0xc6,
675 0x1b, 0xe3, 0xbf, 0xa4, 0xd8, 0x55, 0xd8, 0xdd, 0xbe, 0x3a, 0x9e, 0x5f,
676 0x65, 0xc7, 0xa0, 0x14, 0xb8, 0xa8, 0x75, 0x61, 0x5f, 0x50, 0xba, 0x2b,
677 0x41, 0x6c, 0xf5, 0x4b, 0x9e, 0xf1, 0x66, 0xc4, 0x2a, 0xbb, 0xc5, 0xaf,
678 0x10, 0x92, 0x70, 0xc9, 0x1b, 0xcd, 0x59, 0x3a, 0x17, 0xaa, 0x5e, 0xf3,
679 0x6c, 0x48, 0x1b, 0xe8, 0xee, 0x8f, 0x00, 0xbb, 0xcf, 0xa6, 0x90, 0xa1,
680 0xfd, 0x61, 0x19, 0x5d, 0xba, 0x55, 0xbe, 0x50, 0x77, 0xd5, 0xcc, 0xea,
681 0xe8, 0x0a, 0x98, 0x48, 0x15, 0xb5, 0xee, 0x22, 0xc4, 0xab, 0x04, 0xfb,
682 0xcb, 0x2c, 0x05, 0x1f, 0xef, 0x72, 0x4d, 0xf9, 0x5b, 0x29, 0x1c, 0x07,
683 0x9e, 0xd4, 0x63, 0xe2, 0x9f, 0xfd, 0x04, 0x39};
684
685 static const uint8_t kIn[kRsa4096SizeBytes] = {"OTBN is doing RSA here"};
686 uint8_t out_encrypted[kRsa4096SizeBytes] = {0};
687 uint8_t out_decrypted[kRsa4096SizeBytes] = {0};
688
689 LOG_INFO("Running RSA4096 test");
690 rsa_roundtrip(kRsa4096SizeBytes, kModulus, kPrivateExponent, kIn,
691 kEncryptedExpected, out_encrypted, out_decrypted);
692}
693
694bool test_main() {
Miguel Osoriod04b0482021-07-21 17:26:34 -0700695 entropy_testutils_boot_mode_init();
Greg Chadwickb168ae92021-04-14 16:04:03 +0100696
Philipp Wagner4b6f3412020-11-04 17:00:38 +0000697 test_rsa512_roundtrip();
698 test_rsa1024_roundtrip();
699
700 if (kTestRsaGreater1k) {
701 test_rsa2048_roundtrip();
702 test_rsa3072_roundtrip();
703 test_rsa4096_roundtrip();
704 }
705
706 return true;
707}