1 /* Copyright (c) 2024 Nordic Semiconductor
2  * SPDX-License-Identifier: Apache-2.0
3  */
4 #include <zephyr/ztest.h>
5 #include <zephyr/psa/key_ids.h>
6 #include <zephyr/sys/util.h>
7 #include <psa/crypto.h>
8 #include <psa/internal_trusted_storage.h>
9 #include <psa/protected_storage.h>
10 
11 ZTEST_SUITE(secure_storage_psa_crypto, NULL, NULL, NULL, NULL, NULL);
12 
13 #define ID       ZEPHYR_PSA_APPLICATION_KEY_ID_RANGE_BEGIN
14 #define KEY_TYPE PSA_KEY_TYPE_AES
15 #define ALG      PSA_ALG_CBC_NO_PADDING
16 #define KEY_BITS 256
17 
fill_key_attributes(psa_key_attributes_t * key_attributes)18 static void fill_key_attributes(psa_key_attributes_t *key_attributes)
19 {
20 	*key_attributes = psa_key_attributes_init();
21 	psa_set_key_lifetime(key_attributes, PSA_KEY_LIFETIME_PERSISTENT);
22 	psa_set_key_usage_flags(key_attributes, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
23 	psa_set_key_id(key_attributes, ID);
24 	psa_set_key_type(key_attributes, KEY_TYPE);
25 	psa_set_key_algorithm(key_attributes, ALG);
26 	psa_set_key_bits(key_attributes, KEY_BITS);
27 }
28 
compare_key_attributes(const psa_key_attributes_t * l,const psa_key_attributes_t * r)29 static void compare_key_attributes(const psa_key_attributes_t *l, const psa_key_attributes_t *r)
30 {
31 	zassert_equal(psa_get_key_lifetime(l), psa_get_key_lifetime(r));
32 	zassert_equal(psa_get_key_usage_flags(l), psa_get_key_usage_flags(r));
33 	zassert_equal(psa_get_key_id(l), psa_get_key_id(r));
34 	zassert_equal(psa_get_key_type(l), psa_get_key_type(r));
35 	zassert_equal(psa_get_key_algorithm(l), psa_get_key_algorithm(r));
36 	zassert_equal(psa_get_key_bits(l), psa_get_key_bits(r));
37 }
38 
fill_data(uint8_t * data,size_t size)39 static void fill_data(uint8_t *data, size_t size)
40 {
41 	zassert_equal(psa_generate_random(data, size), PSA_SUCCESS);
42 }
43 
ZTEST(secure_storage_psa_crypto,test_its_caller_isolation)44 ZTEST(secure_storage_psa_crypto, test_its_caller_isolation)
45 {
46 	psa_status_t ret;
47 	psa_key_attributes_t key_attributes;
48 	psa_key_attributes_t retrieved_key_attributes;
49 	psa_key_id_t key_id;
50 	uint8_t data[32];
51 	size_t data_length;
52 	uint8_t its_data[sizeof(data)];
53 	uint8_t ps_data[sizeof(data)];
54 
55 	fill_data(its_data, sizeof(its_data));
56 	fill_data(ps_data, sizeof(ps_data));
57 	zassert_true(memcmp(its_data, ps_data, sizeof(data)));
58 	ret = psa_its_set(ID, sizeof(its_data), its_data, PSA_STORAGE_FLAG_NONE);
59 	zassert_equal(ret, PSA_SUCCESS);
60 	ret = psa_ps_set(ID, sizeof(ps_data), ps_data, PSA_STORAGE_FLAG_NONE);
61 	zassert_equal(ret, PSA_SUCCESS);
62 
63 	fill_key_attributes(&key_attributes);
64 	ret = psa_generate_key(&key_attributes, &key_id);
65 	zassert_equal(ret, PSA_SUCCESS);
66 	zassert_equal(key_id, ID);
67 	ret = psa_purge_key(ID);
68 	zassert_equal(ret, PSA_SUCCESS);
69 
70 	ret = psa_its_get(ID, 0, sizeof(data), data, &data_length);
71 	zassert_equal(ret, PSA_SUCCESS);
72 	zassert_equal(data_length, sizeof(data));
73 	zassert_mem_equal(data, its_data, sizeof(data));
74 	ret = psa_its_remove(ID);
75 	zassert_equal(ret, PSA_SUCCESS);
76 	ret = psa_its_remove(ID);
77 	zassert_equal(ret, PSA_ERROR_DOES_NOT_EXIST);
78 
79 	ret = psa_ps_get(ID, 0, sizeof(data), data, &data_length);
80 	zassert_equal(ret, PSA_SUCCESS);
81 	zassert_equal(data_length, sizeof(data));
82 	zassert_mem_equal(data, ps_data, sizeof(data));
83 	ret = psa_ps_remove(ID);
84 	zassert_equal(ret, PSA_SUCCESS);
85 	ret = psa_ps_remove(ID);
86 	zassert_equal(ret, PSA_ERROR_DOES_NOT_EXIST);
87 
88 	ret = psa_get_key_attributes(ID, &retrieved_key_attributes);
89 	zassert_equal(ret, PSA_SUCCESS);
90 	compare_key_attributes(&retrieved_key_attributes, &key_attributes);
91 	ret = psa_destroy_key(ID);
92 	zassert_equal(ret, PSA_SUCCESS);
93 	ret = psa_get_key_attributes(ID, &retrieved_key_attributes);
94 	zassert_equal(ret, PSA_ERROR_INVALID_HANDLE);
95 }
96 
ZTEST(secure_storage_psa_crypto,test_persistent_key_usage)97 ZTEST(secure_storage_psa_crypto, test_persistent_key_usage)
98 {
99 	psa_status_t ret;
100 	psa_key_attributes_t key_attributes;
101 	psa_key_id_t key_id;
102 	uint8_t key_material[KEY_BITS / BITS_PER_BYTE];
103 
104 	fill_key_attributes(&key_attributes);
105 	fill_data(key_material, sizeof(key_material));
106 	ret = psa_import_key(&key_attributes, key_material, sizeof(key_material), &key_id);
107 	zassert_equal(ret, PSA_SUCCESS);
108 	zassert_equal(key_id, ID);
109 	ret = psa_purge_key(ID);
110 	zassert_equal(ret, PSA_SUCCESS);
111 
112 	static uint8_t plaintext[1024];
113 	static uint8_t ciphertext[PSA_CIPHER_ENCRYPT_OUTPUT_SIZE(KEY_TYPE, ALG, sizeof(plaintext))];
114 	static uint8_t decrypted_text[sizeof(plaintext)];
115 	size_t output_length;
116 
117 	fill_data(plaintext, sizeof(plaintext));
118 	ret = psa_cipher_encrypt(ID, ALG, plaintext, sizeof(plaintext),
119 				 ciphertext, sizeof(ciphertext), &output_length);
120 	zassert_equal(ret, PSA_SUCCESS);
121 	zassert_equal(output_length, sizeof(ciphertext));
122 	ret = psa_purge_key(ID);
123 	zassert_equal(ret, PSA_SUCCESS);
124 
125 	ret = psa_cipher_decrypt(ID, ALG, ciphertext, output_length,
126 				 decrypted_text, sizeof(decrypted_text), &output_length);
127 	zassert_equal(ret, PSA_SUCCESS);
128 	zassert_equal(output_length, sizeof(plaintext));
129 	zassert_mem_equal(plaintext, decrypted_text, sizeof(plaintext));
130 	ret = psa_purge_key(ID);
131 	zassert_equal(ret, PSA_SUCCESS);
132 
133 	ret = psa_destroy_key(ID);
134 	zassert_equal(ret, PSA_SUCCESS);
135 	ret = psa_destroy_key(ID);
136 	zassert_equal(ret, PSA_ERROR_INVALID_HANDLE);
137 }
138