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