21
21
#include " unity.h"
22
22
#include " utest.h"
23
23
#include " psa/crypto.h"
24
+ #include " entropy.h"
25
+ #include " entropy_poll.h"
24
26
25
27
using namespace utest ::v1;
26
28
29
+ #ifdef MBEDTLS_ENTROPY_NV_SEED
30
+
31
+ #if !defined(MAX)
32
+ #define MAX (a,b ) (((a)>(b))?(a):(b))
33
+ #endif
34
+
35
+ #define MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE \
36
+ MAX (MBEDTLS_ENTROPY_MIN_PLATFORM, MBEDTLS_ENTROPY_BLOCK_SIZE)
37
+
38
+ void inject_entropy()
39
+ {
40
+ uint8_t seed[MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE] = { 0 };
41
+ for (int i = 0 ; i < MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE; ++i) {
42
+ seed[i] = i;
43
+ }
44
+ mbedtls_psa_inject_entropy (seed, MBEDTLS_PSA_INJECT_ENTROPY_MIN_SIZE);
45
+ }
46
+ #endif
47
+
27
48
void test_crypto_random (void )
28
49
{
29
50
static const unsigned char trail[] = " don't overwrite me" ;
@@ -32,8 +53,6 @@ void test_crypto_random(void)
32
53
size_t i, bytes = sizeof (changed);
33
54
unsigned int run;
34
55
35
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
36
-
37
56
memcpy (output + bytes, trail, sizeof (trail));
38
57
/* Run several times, to ensure that every output byte will be
39
58
* nonzero at least once with overwhelming probability
@@ -57,12 +76,11 @@ void test_crypto_random(void)
57
76
for (i = 0 ; i < bytes; i++) {
58
77
TEST_ASSERT_NOT_EQUAL (0 , changed[i]);
59
78
}
60
-
61
- mbedtls_psa_crypto_free ();
62
79
}
63
80
64
81
void test_crypto_asymmetric_encrypt_decrypt (void )
65
82
{
83
+ psa_status_t status = PSA_SUCCESS;
66
84
psa_key_slot_t slot = 1 ;
67
85
psa_key_type_t key_type = PSA_KEY_TYPE_RSA_KEYPAIR;
68
86
psa_algorithm_t alg = PSA_ALG_RSA_PKCS1V15_CRYPT;
@@ -72,12 +90,13 @@ void test_crypto_asymmetric_encrypt_decrypt(void)
72
90
unsigned char encrypted[64 ];
73
91
unsigned char decrypted[sizeof (input)];
74
92
75
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
76
-
77
93
psa_key_policy_init (&policy);
78
94
psa_key_policy_set_usage (&policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg);
79
95
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_set_key_policy (slot, &policy));
80
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_generate_key (slot, key_type, key_bits, NULL , 0 ));
96
+
97
+ status = psa_generate_key (slot, key_type, key_bits, NULL , 0 );
98
+ TEST_SKIP_UNLESS_MESSAGE (status != PSA_ERROR_NOT_SUPPORTED, " RSA key generation is not supported" );
99
+ TEST_ASSERT_EQUAL (PSA_SUCCESS, status);
81
100
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_get_key_information (slot, NULL , &got_bits));
82
101
TEST_ASSERT_EQUAL (key_bits, got_bits);
83
102
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_asymmetric_encrypt (slot, alg, input, sizeof (input), NULL , 0 ,
@@ -88,8 +107,6 @@ void test_crypto_asymmetric_encrypt_decrypt(void)
88
107
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_destroy_key (slot));
89
108
TEST_ASSERT_EQUAL (sizeof (input), output_length);
90
109
TEST_ASSERT_EQUAL_UINT8_ARRAY (input, decrypted, output_length);
91
-
92
- mbedtls_psa_crypto_free ();
93
110
}
94
111
95
112
void test_crypto_hash_verify (void )
@@ -103,13 +120,9 @@ void test_crypto_hash_verify(void)
103
120
0xa4 , 0x95 , 0x99 , 0x1b , 0x78 , 0x52 , 0xb8 , 0x55
104
121
};
105
122
106
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
107
-
108
123
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_hash_setup (&operation, alg));
109
124
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_hash_verify (&operation, hash, sizeof (hash)));
110
125
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_hash_abort (&operation));
111
-
112
- mbedtls_psa_crypto_free ();
113
126
}
114
127
115
128
void test_crypto_symmetric_cipher_encrypt_decrypt (void )
@@ -135,8 +148,6 @@ void test_crypto_symmetric_cipher_encrypt_decrypt(void)
135
148
unsigned char encrypted[sizeof (input)], decrypted[sizeof (input)], iv[16 ];
136
149
137
150
memset (iv, 0x2a , sizeof (iv));
138
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
139
-
140
151
psa_key_policy_init (&policy);
141
152
psa_key_policy_set_usage (&policy, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT, alg);
142
153
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_set_key_policy (slot, &policy));
@@ -159,8 +170,6 @@ void test_crypto_symmetric_cipher_encrypt_decrypt(void)
159
170
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_cipher_abort (&operation));
160
171
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_destroy_key (slot));
161
172
TEST_ASSERT_EQUAL_HEX8_ARRAY (input, decrypted, sizeof (input));
162
-
163
- mbedtls_psa_crypto_free ();
164
173
}
165
174
166
175
void test_crypto_asymmetric_sign_verify (void )
@@ -239,8 +248,6 @@ void test_crypto_asymmetric_sign_verify(void)
239
248
unsigned char signature[sizeof (expected_signature)];
240
249
size_t signature_len;
241
250
242
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
243
-
244
251
psa_key_policy_init (&policy);
245
252
psa_key_policy_set_usage (&policy, PSA_KEY_USAGE_SIGN | PSA_KEY_USAGE_VERIFY, alg);
246
253
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_set_key_policy (slot, &policy));
@@ -253,8 +260,6 @@ void test_crypto_asymmetric_sign_verify(void)
253
260
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_asymmetric_verify (slot, alg, input, sizeof (input),
254
261
signature, signature_len));
255
262
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_destroy_key (slot));
256
-
257
- mbedtls_psa_crypto_free ();
258
263
}
259
264
260
265
void test_crypto_key_derivation (void )
@@ -266,8 +271,6 @@ void test_crypto_key_derivation(void)
266
271
psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
267
272
size_t key_bits = 512 , derived_key_bits = 256 , got_bits;
268
273
269
- TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_crypto_init ());
270
-
271
274
psa_key_policy_init (&policy);
272
275
psa_key_policy_set_usage (&policy, PSA_KEY_USAGE_DERIVE, alg);
273
276
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_set_key_policy (slot, &policy));
@@ -284,15 +287,26 @@ void test_crypto_key_derivation(void)
284
287
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_generator_abort (&generator));
285
288
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_destroy_key (slot));
286
289
TEST_ASSERT_EQUAL (PSA_SUCCESS, psa_destroy_key (derived_slot));
290
+ }
287
291
288
- mbedtls_psa_crypto_free ();
292
+
293
+ utest::v1::status_t case_setup_handler (const Case *const source, const size_t index_of_case)
294
+ {
295
+ psa_status_t status = psa_crypto_init ();
296
+ #if defined(MBEDTLS_ENTROPY_NV_SEED)
297
+ if (status == PSA_ERROR_INSUFFICIENT_ENTROPY) {
298
+ inject_entropy ();
299
+ status = psa_crypto_init ();
300
+ }
301
+ #endif /* MBEDTLS_ENTROPY_NV_SEED */
302
+ TEST_ASSERT_EQUAL (PSA_SUCCESS, status);
303
+ return greentea_case_setup_handler (source, index_of_case);
289
304
}
290
305
291
- utest::v1::status_t case_failure_handler (const Case *const source, const failure_t reason )
306
+ utest::v1::status_t case_teardown_handler (const Case *const source, const size_t passed, const size_t failed, const failure_t failure )
292
307
{
293
308
mbedtls_psa_crypto_free ();
294
- greentea_case_failure_abort_handler (source, reason);
295
- return STATUS_CONTINUE;
309
+ return greentea_case_teardown_handler (source, passed, failed, failure);
296
310
}
297
311
298
312
utest::v1::status_t test_setup (const size_t number_of_cases)
@@ -302,12 +316,12 @@ utest::v1::status_t test_setup(const size_t number_of_cases)
302
316
}
303
317
304
318
Case cases[] = {
305
- Case (" mbed-crypto random" , test_crypto_random, case_failure_handler ),
306
- Case (" mbed-crypto asymmetric encrypt/decrypt" , test_crypto_asymmetric_encrypt_decrypt, case_failure_handler ),
307
- Case (" mbed-crypto hash verify" , test_crypto_hash_verify, case_failure_handler ),
308
- Case (" mbed-crypto symmetric cipher encrypt/decrypt" , test_crypto_symmetric_cipher_encrypt_decrypt, case_failure_handler ),
309
- Case (" mbed-crypto asymmetric sign/verify" , test_crypto_asymmetric_sign_verify, case_failure_handler ),
310
- Case (" mbed-crypto key derivation" , test_crypto_key_derivation, case_failure_handler ),
319
+ Case (" mbed-crypto random" , case_setup_handler, test_crypto_random, case_teardown_handler ),
320
+ Case (" mbed-crypto asymmetric encrypt/decrypt" , case_setup_handler, test_crypto_asymmetric_encrypt_decrypt, case_teardown_handler ),
321
+ Case (" mbed-crypto hash verify" , case_setup_handler, test_crypto_hash_verify, case_teardown_handler ),
322
+ Case (" mbed-crypto symmetric cipher encrypt/decrypt" , case_setup_handler, test_crypto_symmetric_cipher_encrypt_decrypt, case_teardown_handler ),
323
+ Case (" mbed-crypto asymmetric sign/verify" , case_setup_handler, test_crypto_asymmetric_sign_verify, case_teardown_handler ),
324
+ Case (" mbed-crypto key derivation" , case_setup_handler, test_crypto_key_derivation, case_teardown_handler ),
311
325
};
312
326
313
327
Specification specification (test_setup, cases);
0 commit comments