xref: /aosp_15_r20/external/mbedtls/programs/psa/crypto_examples.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  Copyright The Mbed TLS Contributors
3*62c56f98SSadaf Ebrahimi  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
4*62c56f98SSadaf Ebrahimi  */
5*62c56f98SSadaf Ebrahimi 
6*62c56f98SSadaf Ebrahimi #include "psa/crypto.h"
7*62c56f98SSadaf Ebrahimi #include <string.h>
8*62c56f98SSadaf Ebrahimi #include <stdio.h>
9*62c56f98SSadaf Ebrahimi #include <stdlib.h>
10*62c56f98SSadaf Ebrahimi 
11*62c56f98SSadaf Ebrahimi #define ASSERT(predicate)                                                   \
12*62c56f98SSadaf Ebrahimi     do                                                                        \
13*62c56f98SSadaf Ebrahimi     {                                                                         \
14*62c56f98SSadaf Ebrahimi         if (!(predicate))                                                 \
15*62c56f98SSadaf Ebrahimi         {                                                                     \
16*62c56f98SSadaf Ebrahimi             printf("\tassertion failed at %s:%d - '%s'\r\n",         \
17*62c56f98SSadaf Ebrahimi                    __FILE__, __LINE__, #predicate);                  \
18*62c56f98SSadaf Ebrahimi             goto exit;                                                        \
19*62c56f98SSadaf Ebrahimi         }                                                                     \
20*62c56f98SSadaf Ebrahimi     } while (0)
21*62c56f98SSadaf Ebrahimi 
22*62c56f98SSadaf Ebrahimi #define ASSERT_STATUS(actual, expected)                                     \
23*62c56f98SSadaf Ebrahimi     do                                                                        \
24*62c56f98SSadaf Ebrahimi     {                                                                         \
25*62c56f98SSadaf Ebrahimi         if ((actual) != (expected))                                      \
26*62c56f98SSadaf Ebrahimi         {                                                                     \
27*62c56f98SSadaf Ebrahimi             printf("\tassertion failed at %s:%d - "                  \
28*62c56f98SSadaf Ebrahimi                    "actual:%d expected:%d\r\n", __FILE__, __LINE__,  \
29*62c56f98SSadaf Ebrahimi                    (psa_status_t) actual, (psa_status_t) expected); \
30*62c56f98SSadaf Ebrahimi             goto exit;                                                        \
31*62c56f98SSadaf Ebrahimi         }                                                                     \
32*62c56f98SSadaf Ebrahimi     } while (0)
33*62c56f98SSadaf Ebrahimi 
34*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_PSA_CRYPTO_C) || !defined(MBEDTLS_AES_C) || \
35*62c56f98SSadaf Ebrahimi     !defined(MBEDTLS_CIPHER_MODE_CBC) || !defined(MBEDTLS_CIPHER_MODE_CTR) || \
36*62c56f98SSadaf Ebrahimi     !defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) || \
37*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER)
main(void)38*62c56f98SSadaf Ebrahimi int main(void)
39*62c56f98SSadaf Ebrahimi {
40*62c56f98SSadaf Ebrahimi     printf("MBEDTLS_PSA_CRYPTO_C and/or MBEDTLS_AES_C and/or "
41*62c56f98SSadaf Ebrahimi            "MBEDTLS_CIPHER_MODE_CBC and/or MBEDTLS_CIPHER_MODE_CTR "
42*62c56f98SSadaf Ebrahimi            "and/or MBEDTLS_CIPHER_MODE_WITH_PADDING "
43*62c56f98SSadaf Ebrahimi            "not defined and/or MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER"
44*62c56f98SSadaf Ebrahimi            " defined.\r\n");
45*62c56f98SSadaf Ebrahimi     return 0;
46*62c56f98SSadaf Ebrahimi }
47*62c56f98SSadaf Ebrahimi #else
48*62c56f98SSadaf Ebrahimi 
cipher_operation(psa_cipher_operation_t * operation,const uint8_t * input,size_t input_size,size_t part_size,uint8_t * output,size_t output_size,size_t * output_len)49*62c56f98SSadaf Ebrahimi static psa_status_t cipher_operation(psa_cipher_operation_t *operation,
50*62c56f98SSadaf Ebrahimi                                      const uint8_t *input,
51*62c56f98SSadaf Ebrahimi                                      size_t input_size,
52*62c56f98SSadaf Ebrahimi                                      size_t part_size,
53*62c56f98SSadaf Ebrahimi                                      uint8_t *output,
54*62c56f98SSadaf Ebrahimi                                      size_t output_size,
55*62c56f98SSadaf Ebrahimi                                      size_t *output_len)
56*62c56f98SSadaf Ebrahimi {
57*62c56f98SSadaf Ebrahimi     psa_status_t status;
58*62c56f98SSadaf Ebrahimi     size_t bytes_to_write = 0, bytes_written = 0, len = 0;
59*62c56f98SSadaf Ebrahimi 
60*62c56f98SSadaf Ebrahimi     *output_len = 0;
61*62c56f98SSadaf Ebrahimi     while (bytes_written != input_size) {
62*62c56f98SSadaf Ebrahimi         bytes_to_write = (input_size - bytes_written > part_size ?
63*62c56f98SSadaf Ebrahimi                           part_size :
64*62c56f98SSadaf Ebrahimi                           input_size - bytes_written);
65*62c56f98SSadaf Ebrahimi 
66*62c56f98SSadaf Ebrahimi         status = psa_cipher_update(operation, input + bytes_written,
67*62c56f98SSadaf Ebrahimi                                    bytes_to_write, output + *output_len,
68*62c56f98SSadaf Ebrahimi                                    output_size - *output_len, &len);
69*62c56f98SSadaf Ebrahimi         ASSERT_STATUS(status, PSA_SUCCESS);
70*62c56f98SSadaf Ebrahimi 
71*62c56f98SSadaf Ebrahimi         bytes_written += bytes_to_write;
72*62c56f98SSadaf Ebrahimi         *output_len += len;
73*62c56f98SSadaf Ebrahimi     }
74*62c56f98SSadaf Ebrahimi 
75*62c56f98SSadaf Ebrahimi     status = psa_cipher_finish(operation, output + *output_len,
76*62c56f98SSadaf Ebrahimi                                output_size - *output_len, &len);
77*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
78*62c56f98SSadaf Ebrahimi     *output_len += len;
79*62c56f98SSadaf Ebrahimi 
80*62c56f98SSadaf Ebrahimi exit:
81*62c56f98SSadaf Ebrahimi     return status;
82*62c56f98SSadaf Ebrahimi }
83*62c56f98SSadaf Ebrahimi 
cipher_encrypt(psa_key_id_t key,psa_algorithm_t alg,uint8_t * iv,size_t iv_size,const uint8_t * input,size_t input_size,size_t part_size,uint8_t * output,size_t output_size,size_t * output_len)84*62c56f98SSadaf Ebrahimi static psa_status_t cipher_encrypt(psa_key_id_t key,
85*62c56f98SSadaf Ebrahimi                                    psa_algorithm_t alg,
86*62c56f98SSadaf Ebrahimi                                    uint8_t *iv,
87*62c56f98SSadaf Ebrahimi                                    size_t iv_size,
88*62c56f98SSadaf Ebrahimi                                    const uint8_t *input,
89*62c56f98SSadaf Ebrahimi                                    size_t input_size,
90*62c56f98SSadaf Ebrahimi                                    size_t part_size,
91*62c56f98SSadaf Ebrahimi                                    uint8_t *output,
92*62c56f98SSadaf Ebrahimi                                    size_t output_size,
93*62c56f98SSadaf Ebrahimi                                    size_t *output_len)
94*62c56f98SSadaf Ebrahimi {
95*62c56f98SSadaf Ebrahimi     psa_status_t status;
96*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
97*62c56f98SSadaf Ebrahimi     size_t iv_len = 0;
98*62c56f98SSadaf Ebrahimi 
99*62c56f98SSadaf Ebrahimi     memset(&operation, 0, sizeof(operation));
100*62c56f98SSadaf Ebrahimi     status = psa_cipher_encrypt_setup(&operation, key, alg);
101*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
102*62c56f98SSadaf Ebrahimi 
103*62c56f98SSadaf Ebrahimi     status = psa_cipher_generate_iv(&operation, iv, iv_size, &iv_len);
104*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
105*62c56f98SSadaf Ebrahimi 
106*62c56f98SSadaf Ebrahimi     status = cipher_operation(&operation, input, input_size, part_size,
107*62c56f98SSadaf Ebrahimi                               output, output_size, output_len);
108*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
109*62c56f98SSadaf Ebrahimi 
110*62c56f98SSadaf Ebrahimi exit:
111*62c56f98SSadaf Ebrahimi     psa_cipher_abort(&operation);
112*62c56f98SSadaf Ebrahimi     return status;
113*62c56f98SSadaf Ebrahimi }
114*62c56f98SSadaf Ebrahimi 
cipher_decrypt(psa_key_id_t key,psa_algorithm_t alg,const uint8_t * iv,size_t iv_size,const uint8_t * input,size_t input_size,size_t part_size,uint8_t * output,size_t output_size,size_t * output_len)115*62c56f98SSadaf Ebrahimi static psa_status_t cipher_decrypt(psa_key_id_t key,
116*62c56f98SSadaf Ebrahimi                                    psa_algorithm_t alg,
117*62c56f98SSadaf Ebrahimi                                    const uint8_t *iv,
118*62c56f98SSadaf Ebrahimi                                    size_t iv_size,
119*62c56f98SSadaf Ebrahimi                                    const uint8_t *input,
120*62c56f98SSadaf Ebrahimi                                    size_t input_size,
121*62c56f98SSadaf Ebrahimi                                    size_t part_size,
122*62c56f98SSadaf Ebrahimi                                    uint8_t *output,
123*62c56f98SSadaf Ebrahimi                                    size_t output_size,
124*62c56f98SSadaf Ebrahimi                                    size_t *output_len)
125*62c56f98SSadaf Ebrahimi {
126*62c56f98SSadaf Ebrahimi     psa_status_t status;
127*62c56f98SSadaf Ebrahimi     psa_cipher_operation_t operation = PSA_CIPHER_OPERATION_INIT;
128*62c56f98SSadaf Ebrahimi 
129*62c56f98SSadaf Ebrahimi     memset(&operation, 0, sizeof(operation));
130*62c56f98SSadaf Ebrahimi     status = psa_cipher_decrypt_setup(&operation, key, alg);
131*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
132*62c56f98SSadaf Ebrahimi 
133*62c56f98SSadaf Ebrahimi     status = psa_cipher_set_iv(&operation, iv, iv_size);
134*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
135*62c56f98SSadaf Ebrahimi 
136*62c56f98SSadaf Ebrahimi     status = cipher_operation(&operation, input, input_size, part_size,
137*62c56f98SSadaf Ebrahimi                               output, output_size, output_len);
138*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
139*62c56f98SSadaf Ebrahimi 
140*62c56f98SSadaf Ebrahimi exit:
141*62c56f98SSadaf Ebrahimi     psa_cipher_abort(&operation);
142*62c56f98SSadaf Ebrahimi     return status;
143*62c56f98SSadaf Ebrahimi }
144*62c56f98SSadaf Ebrahimi 
145*62c56f98SSadaf Ebrahimi static psa_status_t
cipher_example_encrypt_decrypt_aes_cbc_nopad_1_block(void)146*62c56f98SSadaf Ebrahimi cipher_example_encrypt_decrypt_aes_cbc_nopad_1_block(void)
147*62c56f98SSadaf Ebrahimi {
148*62c56f98SSadaf Ebrahimi     enum {
149*62c56f98SSadaf Ebrahimi         block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES),
150*62c56f98SSadaf Ebrahimi         key_bits = 256,
151*62c56f98SSadaf Ebrahimi         part_size = block_size,
152*62c56f98SSadaf Ebrahimi     };
153*62c56f98SSadaf Ebrahimi     const psa_algorithm_t alg = PSA_ALG_CBC_NO_PADDING;
154*62c56f98SSadaf Ebrahimi 
155*62c56f98SSadaf Ebrahimi     psa_status_t status;
156*62c56f98SSadaf Ebrahimi     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
157*62c56f98SSadaf Ebrahimi     psa_key_id_t key = 0;
158*62c56f98SSadaf Ebrahimi     size_t output_len = 0;
159*62c56f98SSadaf Ebrahimi     uint8_t iv[block_size];
160*62c56f98SSadaf Ebrahimi     uint8_t input[block_size];
161*62c56f98SSadaf Ebrahimi     uint8_t encrypt[block_size];
162*62c56f98SSadaf Ebrahimi     uint8_t decrypt[block_size];
163*62c56f98SSadaf Ebrahimi 
164*62c56f98SSadaf Ebrahimi     status = psa_generate_random(input, sizeof(input));
165*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
166*62c56f98SSadaf Ebrahimi 
167*62c56f98SSadaf Ebrahimi     psa_set_key_usage_flags(&attributes,
168*62c56f98SSadaf Ebrahimi                             PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
169*62c56f98SSadaf Ebrahimi     psa_set_key_algorithm(&attributes, alg);
170*62c56f98SSadaf Ebrahimi     psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
171*62c56f98SSadaf Ebrahimi     psa_set_key_bits(&attributes, key_bits);
172*62c56f98SSadaf Ebrahimi 
173*62c56f98SSadaf Ebrahimi     status = psa_generate_key(&attributes, &key);
174*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
175*62c56f98SSadaf Ebrahimi 
176*62c56f98SSadaf Ebrahimi     status = cipher_encrypt(key, alg, iv, sizeof(iv),
177*62c56f98SSadaf Ebrahimi                             input, sizeof(input), part_size,
178*62c56f98SSadaf Ebrahimi                             encrypt, sizeof(encrypt), &output_len);
179*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
180*62c56f98SSadaf Ebrahimi 
181*62c56f98SSadaf Ebrahimi     status = cipher_decrypt(key, alg, iv, sizeof(iv),
182*62c56f98SSadaf Ebrahimi                             encrypt, output_len, part_size,
183*62c56f98SSadaf Ebrahimi                             decrypt, sizeof(decrypt), &output_len);
184*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
185*62c56f98SSadaf Ebrahimi 
186*62c56f98SSadaf Ebrahimi     status = memcmp(input, decrypt, sizeof(input));
187*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
188*62c56f98SSadaf Ebrahimi 
189*62c56f98SSadaf Ebrahimi exit:
190*62c56f98SSadaf Ebrahimi     psa_destroy_key(key);
191*62c56f98SSadaf Ebrahimi     return status;
192*62c56f98SSadaf Ebrahimi }
193*62c56f98SSadaf Ebrahimi 
cipher_example_encrypt_decrypt_aes_cbc_pkcs7_multi(void)194*62c56f98SSadaf Ebrahimi static psa_status_t cipher_example_encrypt_decrypt_aes_cbc_pkcs7_multi(void)
195*62c56f98SSadaf Ebrahimi {
196*62c56f98SSadaf Ebrahimi     enum {
197*62c56f98SSadaf Ebrahimi         block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES),
198*62c56f98SSadaf Ebrahimi         key_bits = 256,
199*62c56f98SSadaf Ebrahimi         input_size = 100,
200*62c56f98SSadaf Ebrahimi         part_size = 10,
201*62c56f98SSadaf Ebrahimi     };
202*62c56f98SSadaf Ebrahimi 
203*62c56f98SSadaf Ebrahimi     const psa_algorithm_t alg = PSA_ALG_CBC_PKCS7;
204*62c56f98SSadaf Ebrahimi 
205*62c56f98SSadaf Ebrahimi     psa_status_t status;
206*62c56f98SSadaf Ebrahimi     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
207*62c56f98SSadaf Ebrahimi     psa_key_id_t key = 0;
208*62c56f98SSadaf Ebrahimi     size_t output_len = 0;
209*62c56f98SSadaf Ebrahimi     uint8_t iv[block_size], input[input_size],
210*62c56f98SSadaf Ebrahimi             encrypt[input_size + block_size], decrypt[input_size + block_size];
211*62c56f98SSadaf Ebrahimi 
212*62c56f98SSadaf Ebrahimi     status = psa_generate_random(input, sizeof(input));
213*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
214*62c56f98SSadaf Ebrahimi 
215*62c56f98SSadaf Ebrahimi     psa_set_key_usage_flags(&attributes,
216*62c56f98SSadaf Ebrahimi                             PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
217*62c56f98SSadaf Ebrahimi     psa_set_key_algorithm(&attributes, alg);
218*62c56f98SSadaf Ebrahimi     psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
219*62c56f98SSadaf Ebrahimi     psa_set_key_bits(&attributes, key_bits);
220*62c56f98SSadaf Ebrahimi 
221*62c56f98SSadaf Ebrahimi     status = psa_generate_key(&attributes, &key);
222*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
223*62c56f98SSadaf Ebrahimi 
224*62c56f98SSadaf Ebrahimi     status = cipher_encrypt(key, alg, iv, sizeof(iv),
225*62c56f98SSadaf Ebrahimi                             input, sizeof(input), part_size,
226*62c56f98SSadaf Ebrahimi                             encrypt, sizeof(encrypt), &output_len);
227*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
228*62c56f98SSadaf Ebrahimi 
229*62c56f98SSadaf Ebrahimi     status = cipher_decrypt(key, alg, iv, sizeof(iv),
230*62c56f98SSadaf Ebrahimi                             encrypt, output_len, part_size,
231*62c56f98SSadaf Ebrahimi                             decrypt, sizeof(decrypt), &output_len);
232*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
233*62c56f98SSadaf Ebrahimi 
234*62c56f98SSadaf Ebrahimi     status = memcmp(input, decrypt, sizeof(input));
235*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
236*62c56f98SSadaf Ebrahimi 
237*62c56f98SSadaf Ebrahimi exit:
238*62c56f98SSadaf Ebrahimi     psa_destroy_key(key);
239*62c56f98SSadaf Ebrahimi     return status;
240*62c56f98SSadaf Ebrahimi }
241*62c56f98SSadaf Ebrahimi 
cipher_example_encrypt_decrypt_aes_ctr_multi(void)242*62c56f98SSadaf Ebrahimi static psa_status_t cipher_example_encrypt_decrypt_aes_ctr_multi(void)
243*62c56f98SSadaf Ebrahimi {
244*62c56f98SSadaf Ebrahimi     enum {
245*62c56f98SSadaf Ebrahimi         block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES),
246*62c56f98SSadaf Ebrahimi         key_bits = 256,
247*62c56f98SSadaf Ebrahimi         input_size = 100,
248*62c56f98SSadaf Ebrahimi         part_size = 10,
249*62c56f98SSadaf Ebrahimi     };
250*62c56f98SSadaf Ebrahimi     const psa_algorithm_t alg = PSA_ALG_CTR;
251*62c56f98SSadaf Ebrahimi 
252*62c56f98SSadaf Ebrahimi     psa_status_t status;
253*62c56f98SSadaf Ebrahimi     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
254*62c56f98SSadaf Ebrahimi     psa_key_id_t key = 0;
255*62c56f98SSadaf Ebrahimi     size_t output_len = 0;
256*62c56f98SSadaf Ebrahimi     uint8_t iv[block_size], input[input_size], encrypt[input_size],
257*62c56f98SSadaf Ebrahimi             decrypt[input_size];
258*62c56f98SSadaf Ebrahimi 
259*62c56f98SSadaf Ebrahimi     status = psa_generate_random(input, sizeof(input));
260*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
261*62c56f98SSadaf Ebrahimi 
262*62c56f98SSadaf Ebrahimi     psa_set_key_usage_flags(&attributes,
263*62c56f98SSadaf Ebrahimi                             PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
264*62c56f98SSadaf Ebrahimi     psa_set_key_algorithm(&attributes, alg);
265*62c56f98SSadaf Ebrahimi     psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
266*62c56f98SSadaf Ebrahimi     psa_set_key_bits(&attributes, key_bits);
267*62c56f98SSadaf Ebrahimi 
268*62c56f98SSadaf Ebrahimi     status = psa_generate_key(&attributes, &key);
269*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
270*62c56f98SSadaf Ebrahimi 
271*62c56f98SSadaf Ebrahimi     status = cipher_encrypt(key, alg, iv, sizeof(iv),
272*62c56f98SSadaf Ebrahimi                             input, sizeof(input), part_size,
273*62c56f98SSadaf Ebrahimi                             encrypt, sizeof(encrypt), &output_len);
274*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
275*62c56f98SSadaf Ebrahimi 
276*62c56f98SSadaf Ebrahimi     status = cipher_decrypt(key, alg, iv, sizeof(iv),
277*62c56f98SSadaf Ebrahimi                             encrypt, output_len, part_size,
278*62c56f98SSadaf Ebrahimi                             decrypt, sizeof(decrypt), &output_len);
279*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
280*62c56f98SSadaf Ebrahimi 
281*62c56f98SSadaf Ebrahimi     status = memcmp(input, decrypt, sizeof(input));
282*62c56f98SSadaf Ebrahimi     ASSERT_STATUS(status, PSA_SUCCESS);
283*62c56f98SSadaf Ebrahimi 
284*62c56f98SSadaf Ebrahimi exit:
285*62c56f98SSadaf Ebrahimi     psa_destroy_key(key);
286*62c56f98SSadaf Ebrahimi     return status;
287*62c56f98SSadaf Ebrahimi }
288*62c56f98SSadaf Ebrahimi 
cipher_examples(void)289*62c56f98SSadaf Ebrahimi static void cipher_examples(void)
290*62c56f98SSadaf Ebrahimi {
291*62c56f98SSadaf Ebrahimi     psa_status_t status;
292*62c56f98SSadaf Ebrahimi 
293*62c56f98SSadaf Ebrahimi     printf("cipher encrypt/decrypt AES CBC no padding:\r\n");
294*62c56f98SSadaf Ebrahimi     status = cipher_example_encrypt_decrypt_aes_cbc_nopad_1_block();
295*62c56f98SSadaf Ebrahimi     if (status == PSA_SUCCESS) {
296*62c56f98SSadaf Ebrahimi         printf("\tsuccess!\r\n");
297*62c56f98SSadaf Ebrahimi     }
298*62c56f98SSadaf Ebrahimi 
299*62c56f98SSadaf Ebrahimi     printf("cipher encrypt/decrypt AES CBC PKCS7 multipart:\r\n");
300*62c56f98SSadaf Ebrahimi     status = cipher_example_encrypt_decrypt_aes_cbc_pkcs7_multi();
301*62c56f98SSadaf Ebrahimi     if (status == PSA_SUCCESS) {
302*62c56f98SSadaf Ebrahimi         printf("\tsuccess!\r\n");
303*62c56f98SSadaf Ebrahimi     }
304*62c56f98SSadaf Ebrahimi 
305*62c56f98SSadaf Ebrahimi     printf("cipher encrypt/decrypt AES CTR multipart:\r\n");
306*62c56f98SSadaf Ebrahimi     status = cipher_example_encrypt_decrypt_aes_ctr_multi();
307*62c56f98SSadaf Ebrahimi     if (status == PSA_SUCCESS) {
308*62c56f98SSadaf Ebrahimi         printf("\tsuccess!\r\n");
309*62c56f98SSadaf Ebrahimi     }
310*62c56f98SSadaf Ebrahimi }
311*62c56f98SSadaf Ebrahimi 
main(void)312*62c56f98SSadaf Ebrahimi int main(void)
313*62c56f98SSadaf Ebrahimi {
314*62c56f98SSadaf Ebrahimi     ASSERT(psa_crypto_init() == PSA_SUCCESS);
315*62c56f98SSadaf Ebrahimi     cipher_examples();
316*62c56f98SSadaf Ebrahimi exit:
317*62c56f98SSadaf Ebrahimi     mbedtls_psa_crypto_free();
318*62c56f98SSadaf Ebrahimi     return 0;
319*62c56f98SSadaf Ebrahimi }
320*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_C && MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC &&
321*62c56f98SSadaf Ebrahimi           MBEDTLS_CIPHER_MODE_CTR && MBEDTLS_CIPHER_MODE_WITH_PADDING */
322