6 #include "sw/device/lib/crypto/drivers/entropy.h"
7 #include "sw/device/lib/crypto/impl/integrity.h"
11 #include "sw/device/lib/testing/profile.h"
12 #include "sw/device/lib/testing/test_framework/check.h"
16 #define MODULE_ID MAKE_MODULE_ID('t', 's', 't')
19 kRsa3072NumBytes = 3072 / 8,
20 kRsa3072NumWords = kRsa3072NumBytes /
sizeof(uint32_t),
34 static uint32_t kTestModulus[kRsa3072NumWords] = {
35 0x5248e8eb, 0x61422b39, 0xc2242ceb, 0x239b6fe8, 0xddf894ca, 0x5b29ea9c,
36 0x30ca1103, 0xb9c19f86, 0x0241a25d, 0x7b1f16bd, 0xee956a86, 0x154da24d,
37 0x2318ca24, 0xf941f899, 0x1299c298, 0xbcd26c2b, 0x1e9c1ce3, 0x5fcfd55f,
38 0x6258c90c, 0x55bed694, 0xd2412d32, 0x3d9bdfff, 0xdde93cc0, 0xdd1beacf,
39 0x54ce8e23, 0x62ec62aa, 0xd95d6ff6, 0xe04eb5af, 0x7b8bc3e8, 0xe300d474,
40 0x0d15ec18, 0xedd8bc92, 0xabc571eb, 0x91fcadfe, 0xebf8d88d, 0xe576ea64,
41 0x482def92, 0x22df77e1, 0x5c36a62b, 0x53b671a0, 0x434ccc48, 0x5bb1b180,
42 0x5dfe37bc, 0xab5c1657, 0x3e1dfa99, 0x64a074ff, 0xde3a683d, 0xddecb80b,
43 0xf7e63faf, 0xea044e20, 0xac776aa1, 0x26d660d3, 0x09435541, 0x1988b5df,
44 0xb82214b1, 0x1cf0109b, 0x8094aee1, 0x4b2dab39, 0x9d0a8e49, 0x37c377b3,
45 0xf9d614e6, 0xd446f2cb, 0x2f8c428b, 0x46b16dd8, 0xabca3029, 0x84807eb9,
46 0x3fc8e542, 0x2cd843c3, 0x6b8cfc8e, 0x6398c69c, 0xdcbafdb2, 0x4bed7f9e,
47 0xd1a7e998, 0x0b53c50a, 0x7fdec0a9, 0x141f23d0, 0x46dcfa85, 0x53cdc14e,
48 0x0922ea46, 0xe82d5c81, 0xcc4ee3b8, 0x5b973b2c, 0x065433ac, 0x075a427b,
49 0xa4b442f1, 0x8adb26e8, 0xe827fc8c, 0xc6057b0b, 0x1c9f5a53, 0x833bf326,
50 0x7520180f, 0x24ec935f, 0xa90cc23b, 0xafe74287, 0x31261907, 0xa60f30a2,
52 static uint32_t kTestPrivateExponent[kRsa3072NumWords] = {
53 0xf3cc45d9, 0x8341feca, 0x919be340, 0xf1624a49, 0x8702a398, 0xb332bc60,
54 0xbf748b23, 0xc52df173, 0x25b096ec, 0x8a71c552, 0x1c7f4bd8, 0x7863c805,
55 0x1f44a192, 0x421f557a, 0xc0944ac3, 0x1753730b, 0x44688498, 0x15dae580,
56 0x3c7a23fa, 0xfe49e5b6, 0x15ce0940, 0x04a3767a, 0x5ce77382, 0xf8a09cd5,
57 0x7fc735a1, 0xde3d3702, 0xe8f2bd3b, 0xf7a1e86a, 0xa7bd0a88, 0x52fc2a22,
58 0x621c40e7, 0x2a95830d, 0x098a4e15, 0x374bb038, 0x26066b83, 0xb8d11858,
59 0xc27647b3, 0xcdb00270, 0x42b3cba4, 0x6f433451, 0xa8133125, 0x5efe857e,
60 0x483a0ef6, 0x3e812025, 0x3c4dcc1e, 0xf8f5486c, 0x5e73b4c9, 0x546a4e70,
61 0xa5e8d6fc, 0xf1bee362, 0x3ad9ea8c, 0x4029e0b8, 0xb1457a1b, 0x74deb3c1,
62 0xd929e23c, 0x10c31fa1, 0x65072772, 0xcb95724f, 0x7af4d123, 0x824db164,
63 0x206695e4, 0x742886cd, 0x884979bc, 0x93e6b99f, 0xfc700b23, 0xbfcc1f26,
64 0xbe115398, 0x1bedb018, 0x33e873c8, 0x8e4583b9, 0x666f2c03, 0x280ede59,
65 0x6a76acdc, 0xb2cd4058, 0xa25ce17f, 0xc24789ff, 0xd69f0f98, 0xee4622f0,
66 0x6cb3bd85, 0xb8d5ccb1, 0xcdb605eb, 0x4de47a43, 0x7bda0c86, 0x8b83c71e,
67 0x31837e6a, 0xb02d0228, 0x9be7eb6e, 0xe1746942, 0xb6b48e76, 0xbf8c79d3,
68 0xd81b2383, 0x9e277621, 0x8c4ca670, 0xcfa2b928, 0xd60f0279, 0x2e1fdefe,
70 static uint32_t kTestPublicExponent = 65537;
73 static const unsigned char kTestMessage[] =
"Test message.";
74 static const size_t kTestMessageLen =
sizeof(kTestMessage) - 1;
78 static const uint32_t kValidSignaturePkcs1v15[kRsa3072NumWords] = {
79 0xb091ff65, 0xd1edc6a5, 0x574498d4, 0x2d6e34d9, 0xb96eb9fe, 0x48194af9,
80 0x8973e3bd, 0x6f66bc1d, 0x55032373, 0x68d5ced7, 0x87998790, 0xe86f7eb1,
81 0x0f07e31b, 0x2842ada5, 0x2af683ab, 0x55245677, 0x4ac777e8, 0x130aa2d6,
82 0x0f7eebb5, 0x9dfa75db, 0x41bbe218, 0xf4f7a2d7, 0xff153220, 0x6e6cd5e8,
83 0xa44fd6b5, 0xfe085392, 0x60e2b298, 0x1c5f74f4, 0x032e2d39, 0xd1c16723,
84 0xa6ae5514, 0x357c60b7, 0x61a51bbc, 0x009391dd, 0x0142d92e, 0xd1593a14,
85 0xbffd75c3, 0x55fdbde2, 0x40533d4b, 0xb423ded9, 0x83106eee, 0x0a6bd1cc,
86 0x9c85a4cb, 0xfa1da7fe, 0x09b79f0c, 0x6ca08324, 0xa3182ce5, 0x9d9ee66d,
87 0x94213c86, 0x9ac854b3, 0x8803ad55, 0xc3ad2e23, 0x7f11620c, 0x56032b2d,
88 0xac4e36be, 0x553b2d2c, 0xc489cec1, 0x40846292, 0x9b4849fd, 0x0d63a0f4,
89 0x27abfa17, 0xec055e10, 0x310e3ef2, 0x953a6701, 0xf844985e, 0x2944b2df,
90 0x37c9097d, 0xcd40700e, 0x57759607, 0xdda27413, 0x77a65ad3, 0x8752df0c,
91 0x50329618, 0x14b74fa7, 0xc9236c54, 0xb8f07265, 0x5b9efc20, 0x15f5f821,
92 0xde9ca767, 0x34bf1a70, 0xca4d5d9c, 0x92725953, 0x998d1231, 0x73bd12aa,
93 0xc222b65f, 0xde00db56, 0xc9e1aaff, 0xb2d32c27, 0x05b93bb4, 0x94b52732,
94 0xbdc53790, 0x92e62a85, 0xc1cb4a8a, 0xff3fe179, 0x565f6d7f, 0x0f784c4a,
99 static const uint32_t kValidSignaturePss[kRsa3072NumWords] = {
100 0xff478de6, 0x9c32afcc, 0x606818a2, 0x10a3510f, 0x474819ee, 0x04be7c07,
101 0xd8bd7511, 0xcf392927, 0x6883efcd, 0x15986843, 0x26e311b9, 0x27d718ac,
102 0xc507b105, 0xfd519ef7, 0x1dd94e1e, 0x4bc8e633, 0x9c4acb4d, 0x21719940,
103 0x7c7b6449, 0x998cd74f, 0xd33c1989, 0x5ef49d96, 0x63e111b0, 0xcca6d7f5,
104 0x75c80acb, 0x07e8907d, 0x3e9d3fcd, 0x493a518e, 0x73aab881, 0xabdc13cc,
105 0x81ed48f2, 0x12395425, 0x7957265f, 0xde23f84b, 0xa7a51962, 0xbceac204,
106 0x1291a9bd, 0x72c83723, 0x9a110ca7, 0x46db7dcc, 0x8af37092, 0x27e9eacd,
107 0xe37be422, 0xeded8b48, 0xdaa20d27, 0xb855507b, 0xe5d45f30, 0x15d6e2e4,
108 0x795c88c2, 0xa7f130c7, 0x973ce990, 0x282625f7, 0x08f2ce39, 0xd8a2b491,
109 0xea037444, 0x41efd30d, 0x44a69d6a, 0xf59709be, 0xc42b92df, 0x516ab280,
110 0xe2f9c7b4, 0xcf3693a8, 0x9b28d5f3, 0x8cbda1ef, 0xa2a05f13, 0x344858e9,
111 0xb8372f6a, 0x4bdc6efd, 0x90ecabab, 0xdb0589e8, 0x1d59f90f, 0x531cf1f2,
112 0x486f3233, 0x6a946ee8, 0x302a6c49, 0x507dda2b, 0x21287d8f, 0x68ec5762,
113 0x81df3cdb, 0x7f0a0851, 0x69f0e825, 0x3bba8632, 0x6a98b6fd, 0xf0bdd53d,
114 0xc9d928a1, 0x6501fded, 0x0e4d8b0b, 0x11ffdc3a, 0xda6a6fa8, 0x567a7e65,
115 0xe2f6c106, 0x4569d9c9, 0x3d69f35e, 0x6d1ebc67, 0x0f4ecb9a, 0x31628ec0,
131 static status_t run_rsa_3072_sign(
const uint8_t *msg,
size_t msg_len,
135 switch (padding_mode) {
136 case kOtcryptoRsaPaddingPkcs:
137 key_mode = kOtcryptoKeyModeRsaSignPkcs;
139 case kOtcryptoRsaPaddingPss:
140 key_mode = kOtcryptoKeyModeRsaSignPss;
143 return INVALID_ARGUMENT();
148 .data = kTestPrivateExponent,
151 uint32_t share1[
ARRAYSIZE(kTestPrivateExponent)] = {0};
158 .version = kOtcryptoLibVersion1,
159 .key_mode = key_mode,
160 .key_length = kOtcryptoRsa3072PrivateKeyBytes,
162 .security_level = kOtcryptoKeySecurityLevelLow,
164 size_t keyblob_words =
165 ceil_div(kOtcryptoRsa3072PrivateKeyblobBytes,
sizeof(uint32_t));
166 uint32_t keyblob[keyblob_words];
168 .config = private_key_config,
170 .keyblob_length = kOtcryptoRsa3072PrivateKeyblobBytes,
173 .data = kTestModulus,
177 kTestPublicExponent, d_share0,
178 d_share1, &private_key));
182 uint32_t msg_digest_data[kSha512DigestWords];
184 .data = msg_digest_data,
186 .mode = kOtcryptoHashModeSha512,
192 .len = kRsa3072NumWords,
195 uint64_t t_start = profile_start();
197 profile_end_and_print(t_start,
"RSA signature generation");
216 static status_t run_rsa_3072_verify(
const uint8_t *msg,
size_t msg_len,
221 switch (padding_mode) {
222 case kOtcryptoRsaPaddingPkcs:
223 key_mode = kOtcryptoKeyModeRsaSignPkcs;
225 case kOtcryptoRsaPaddingPss:
226 key_mode = kOtcryptoKeyModeRsaSignPss;
229 return INVALID_ARGUMENT();
234 .data = kTestModulus,
237 uint32_t public_key_data[
ceil_div(kOtcryptoRsa3072PublicKeyBytes,
240 .key_mode = key_mode,
241 .key_length = kOtcryptoRsa3072PublicKeyBytes,
242 .key = public_key_data,
245 kTestPublicExponent, &public_key));
249 uint32_t msg_digest_data[kSha512DigestWords];
251 .data = msg_digest_data,
253 .mode = kOtcryptoHashModeSha512,
259 .len = kRsa3072NumWords,
262 uint64_t t_start = profile_start();
264 verification_result));
265 profile_end_and_print(t_start,
"RSA verify");
273 uint32_t sig[kRsa3072NumWords];
274 TRY(run_rsa_3072_sign(kTestMessage, kTestMessageLen, kOtcryptoRsaPaddingPkcs,
278 TRY_CHECK_ARRAYS_EQ(sig, kValidSignaturePkcs1v15,
283 status_t pkcs1v15_verify_valid_test(
void) {
286 TRY(run_rsa_3072_verify(kTestMessage, kTestMessageLen,
287 kValidSignaturePkcs1v15, kOtcryptoRsaPaddingPkcs,
288 &verification_result));
295 status_t pkcs1v15_verify_invalid_test(
void) {
298 TRY(run_rsa_3072_verify(kTestMessage, kTestMessageLen, kValidSignaturePss,
299 kOtcryptoRsaPaddingPkcs, &verification_result));
308 uint32_t sig[kRsa3072NumWords];
309 TRY(run_rsa_3072_sign(kTestMessage, kTestMessageLen, kOtcryptoRsaPaddingPss,
314 TRY(run_rsa_3072_verify(kTestMessage, kTestMessageLen, sig,
315 kOtcryptoRsaPaddingPss, &verification_result));
322 status_t pss_verify_valid_test(
void) {
325 TRY(run_rsa_3072_verify(kTestMessage, kTestMessageLen, kValidSignaturePss,
326 kOtcryptoRsaPaddingPss, &verification_result));
333 status_t pss_verify_invalid_test(
void) {
336 TRY(run_rsa_3072_verify(kTestMessage, kTestMessageLen,
337 kValidSignaturePkcs1v15, kOtcryptoRsaPaddingPss,
338 &verification_result));
345 OTTF_DEFINE_TEST_CONFIG();
349 CHECK_STATUS_OK(entropy_complex_init());
352 EXECUTE_TEST(test_result, pkcs1v15_verify_invalid_test);
356 return status_ok(test_result);