xref: /freebsd/crypto/openssl/test/cmsapitest.c (revision aa1a8ff2d6dbc51ef058f46f3db5a8bb77967145)
1 /*
2  * Copyright 2018-2023 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include <string.h>
11 
12 #include <openssl/cms.h>
13 #include <openssl/bio.h>
14 #include <openssl/x509.h>
15 #include <openssl/pem.h>
16 
17 #include "testutil.h"
18 
19 static X509 *cert = NULL;
20 static EVP_PKEY *privkey = NULL;
21 static char *derin = NULL;
22 
23 static int test_encrypt_decrypt(const EVP_CIPHER *cipher)
24 {
25     int testresult = 0;
26     STACK_OF(X509) *certstack = sk_X509_new_null();
27     const char *msg = "Hello world";
28     BIO *msgbio = BIO_new_mem_buf(msg, strlen(msg));
29     BIO *outmsgbio = BIO_new(BIO_s_mem());
30     CMS_ContentInfo* content = NULL;
31     char buf[80];
32 
33     if (!TEST_ptr(certstack) || !TEST_ptr(msgbio) || !TEST_ptr(outmsgbio))
34         goto end;
35 
36     if (!TEST_int_gt(sk_X509_push(certstack, cert), 0))
37         goto end;
38 
39     content = CMS_encrypt(certstack, msgbio, cipher, CMS_TEXT);
40     if (!TEST_ptr(content))
41         goto end;
42 
43     if (!TEST_true(CMS_decrypt(content, privkey, cert, NULL, outmsgbio,
44                                CMS_TEXT)))
45         goto end;
46 
47     /* Check we got the message we first started with */
48     if (!TEST_int_eq(BIO_gets(outmsgbio, buf, sizeof(buf)), strlen(msg))
49             || !TEST_int_eq(strcmp(buf, msg), 0))
50         goto end;
51 
52     testresult = 1;
53  end:
54     sk_X509_free(certstack);
55     BIO_free(msgbio);
56     BIO_free(outmsgbio);
57     CMS_ContentInfo_free(content);
58 
59     return testresult && TEST_int_eq(ERR_peek_error(), 0);
60 }
61 
62 static int test_encrypt_decrypt_aes_cbc(void)
63 {
64     return test_encrypt_decrypt(EVP_aes_128_cbc());
65 }
66 
67 static int test_encrypt_decrypt_aes_128_gcm(void)
68 {
69     return test_encrypt_decrypt(EVP_aes_128_gcm());
70 }
71 
72 static int test_encrypt_decrypt_aes_192_gcm(void)
73 {
74     return test_encrypt_decrypt(EVP_aes_192_gcm());
75 }
76 
77 static int test_encrypt_decrypt_aes_256_gcm(void)
78 {
79     return test_encrypt_decrypt(EVP_aes_256_gcm());
80 }
81 
82 static int test_d2i_CMS_bio_NULL(void)
83 {
84     BIO *bio;
85     CMS_ContentInfo *cms = NULL;
86     int ret = 0;
87 
88     /*
89      * Test data generated using:
90      * openssl cms -sign -md sha256 -signer ./test/certs/rootCA.pem -inkey \
91      * ./test/certs/rootCA.key -nodetach -outform DER -in ./in.txt -out out.der \
92      * -nosmimecap
93      */
94     static const unsigned char cms_data[] = {
95         0x30, 0x82, 0x05, 0xc5, 0x06, 0x09, 0x2a, 0x86,
96         0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0,
97         0x82, 0x05, 0xb6, 0x30, 0x82, 0x05, 0xb2, 0x02,
98         0x01, 0x01, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x09,
99         0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02,
100         0x01, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48,
101         0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x0f,
102         0x04, 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20,
103         0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0d, 0x0a, 0xa0,
104         0x82, 0x03, 0x83, 0x30, 0x82, 0x03, 0x7f, 0x30,
105         0x82, 0x02, 0x67, 0xa0, 0x03, 0x02, 0x01, 0x02,
106         0x02, 0x09, 0x00, 0x88, 0x43, 0x29, 0xcb, 0xc2,
107         0xeb, 0x15, 0x9a, 0x30, 0x0d, 0x06, 0x09, 0x2a,
108         0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
109         0x05, 0x00, 0x30, 0x56, 0x31, 0x0b, 0x30, 0x09,
110         0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41,
111         0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
112         0x04, 0x08, 0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65,
113         0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x31, 0x21,
114         0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
115         0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
116         0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 0x69, 0x74,
117         0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74,
118         0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55,
119         0x04, 0x03, 0x0c, 0x06, 0x72, 0x6f, 0x6f, 0x74,
120         0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x35,
121         0x30, 0x37, 0x30, 0x32, 0x31, 0x33, 0x31, 0x35,
122         0x31, 0x31, 0x5a, 0x17, 0x0d, 0x33, 0x35, 0x30,
123         0x37, 0x30, 0x32, 0x31, 0x33, 0x31, 0x35, 0x31,
124         0x31, 0x5a, 0x30, 0x56, 0x31, 0x0b, 0x30, 0x09,
125         0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41,
126         0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
127         0x04, 0x08, 0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65,
128         0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x31, 0x21,
129         0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
130         0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65,
131         0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 0x69, 0x74,
132         0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74,
133         0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55,
134         0x04, 0x03, 0x0c, 0x06, 0x72, 0x6f, 0x6f, 0x74,
135         0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
136         0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
137         0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
138         0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82,
139         0x01, 0x01, 0x00, 0xc0, 0xf1, 0x6b, 0x77, 0x88,
140         0xac, 0x35, 0xdf, 0xfb, 0x73, 0x53, 0x2f, 0x92,
141         0x80, 0x2f, 0x74, 0x16, 0x32, 0x4d, 0xf5, 0x10,
142         0x20, 0x6f, 0x6c, 0x3a, 0x8e, 0xd1, 0xdc, 0x6b,
143         0xe1, 0x2e, 0x3e, 0xc3, 0x04, 0x0f, 0xbf, 0x9b,
144         0xc4, 0xc9, 0x12, 0xd1, 0xe4, 0x0b, 0x45, 0x97,
145         0xe5, 0x06, 0xcd, 0x66, 0x3a, 0xe1, 0xe0, 0xe2,
146         0x2b, 0xdf, 0xa2, 0xc4, 0xec, 0x7b, 0xd3, 0x3d,
147         0x3c, 0x8a, 0xff, 0x5e, 0x74, 0xa0, 0xab, 0xa7,
148         0x03, 0x6a, 0x16, 0x5b, 0x5e, 0x92, 0xc4, 0x7e,
149         0x5b, 0x79, 0x8a, 0x69, 0xd4, 0xbc, 0x83, 0x5e,
150         0xae, 0x42, 0x92, 0x74, 0xa5, 0x2b, 0xe7, 0x00,
151         0xc1, 0xa9, 0xdc, 0xd5, 0xb1, 0x53, 0x07, 0x0f,
152         0x73, 0xf7, 0x8e, 0xad, 0x14, 0x3e, 0x25, 0x9e,
153         0xe5, 0x1e, 0xe6, 0xcc, 0x91, 0xcd, 0x95, 0x0c,
154         0x80, 0x44, 0x20, 0xc3, 0xfd, 0x17, 0xcf, 0x91,
155         0x3d, 0x63, 0x10, 0x1c, 0x14, 0x5b, 0xfb, 0xc3,
156         0xa8, 0xc1, 0x88, 0xb2, 0x77, 0xff, 0x9c, 0xdb,
157         0xfc, 0x6a, 0x44, 0x44, 0x44, 0xf7, 0x85, 0xec,
158         0x08, 0x2c, 0xd4, 0xdf, 0x81, 0xa3, 0x79, 0xc9,
159         0xfe, 0x1e, 0x9b, 0x93, 0x16, 0x53, 0xb7, 0x97,
160         0xab, 0xbe, 0x4f, 0x1a, 0xa5, 0xe2, 0xfa, 0x46,
161         0x05, 0xe4, 0x0d, 0x9c, 0x2a, 0xa4, 0xcc, 0xb9,
162         0x1e, 0x21, 0xa0, 0x6c, 0xc4, 0xab, 0x59, 0xb0,
163         0x40, 0x39, 0xbb, 0xf9, 0x88, 0xad, 0xfd, 0xdf,
164         0x8d, 0xb4, 0x0b, 0xaf, 0x7e, 0x41, 0xe0, 0x21,
165         0x3c, 0xc8, 0x33, 0x45, 0x49, 0x84, 0x2f, 0x93,
166         0x06, 0xee, 0xfd, 0x4f, 0xed, 0x4f, 0xf3, 0xbc,
167         0x9b, 0xde, 0xfc, 0x25, 0x5e, 0x55, 0xd5, 0x75,
168         0xd4, 0xc5, 0x7b, 0x3a, 0x40, 0x35, 0x06, 0x9f,
169         0xc4, 0x84, 0xb4, 0x6c, 0x93, 0x0c, 0xaf, 0x37,
170         0x5a, 0xaf, 0xb6, 0x41, 0x4d, 0x26, 0x23, 0x1c,
171         0xb8, 0x02, 0xb3, 0x02, 0x03, 0x01, 0x00, 0x01,
172         0xa3, 0x50, 0x30, 0x4e, 0x30, 0x0c, 0x06, 0x03,
173         0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01,
174         0x01, 0xff, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
175         0x0e, 0x04, 0x16, 0x04, 0x14, 0x85, 0x56, 0x89,
176         0x35, 0xe2, 0x9f, 0x00, 0x1a, 0xe1, 0x86, 0x03,
177         0x0b, 0x4b, 0xaf, 0x76, 0x12, 0x6b, 0x33, 0x6d,
178         0xfd, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,
179         0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x85, 0x56,
180         0x89, 0x35, 0xe2, 0x9f, 0x00, 0x1a, 0xe1, 0x86,
181         0x03, 0x0b, 0x4b, 0xaf, 0x76, 0x12, 0x6b, 0x33,
182         0x6d, 0xfd, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
183         0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05,
184         0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0x0a,
185         0xbf, 0x2a, 0x0a, 0xe2, 0xbb, 0x4f, 0x43, 0xce,
186         0x88, 0xda, 0x5a, 0x39, 0x10, 0x37, 0x80, 0xbb,
187         0x37, 0x2d, 0x5e, 0x2d, 0x88, 0xdd, 0x26, 0x69,
188         0x9c, 0xe7, 0xb4, 0x98, 0x20, 0xb1, 0x25, 0xe6,
189         0x61, 0x59, 0x6d, 0x12, 0xec, 0x9b, 0x87, 0xbe,
190         0x57, 0xe1, 0x12, 0x05, 0xc5, 0x04, 0xf1, 0x17,
191         0xce, 0x14, 0xb8, 0x1c, 0x92, 0xd4, 0x95, 0x95,
192         0x2c, 0x5b, 0x28, 0x89, 0xfb, 0x72, 0x9c, 0x20,
193         0xd3, 0x32, 0x81, 0xa8, 0x85, 0xec, 0xc8, 0x08,
194         0x7b, 0xa8, 0x59, 0x5b, 0x3a, 0x6c, 0x31, 0xab,
195         0x52, 0xe2, 0x66, 0xcd, 0x14, 0x49, 0x5c, 0xf3,
196         0xd3, 0x3e, 0x62, 0xbc, 0x91, 0x16, 0xb4, 0x1c,
197         0xf5, 0xdd, 0x54, 0xaa, 0x3c, 0x61, 0x97, 0x79,
198         0xac, 0xe4, 0xc8, 0x43, 0x35, 0xc3, 0x0f, 0xfc,
199         0xf3, 0x70, 0x1d, 0xaf, 0xf0, 0x9c, 0x8a, 0x2a,
200         0x92, 0x93, 0x48, 0xaa, 0xd0, 0xe8, 0x47, 0xbe,
201         0x35, 0xc1, 0xc6, 0x7b, 0x6d, 0xda, 0xfa, 0x5d,
202         0x57, 0x45, 0xf3, 0xea, 0x41, 0x8f, 0x36, 0xc1,
203         0x3c, 0xf4, 0x52, 0x7f, 0x6e, 0x31, 0xdd, 0xba,
204         0x9a, 0xbc, 0x70, 0x56, 0x71, 0x38, 0xdc, 0x49,
205         0x57, 0x0c, 0xfd, 0x91, 0x17, 0xc5, 0xea, 0x87,
206         0xe5, 0x23, 0x74, 0x19, 0xb2, 0xb6, 0x99, 0x0c,
207         0x6b, 0xa2, 0x05, 0xf8, 0x51, 0x68, 0xed, 0x97,
208         0xe0, 0xdf, 0x62, 0xf9, 0x7e, 0x7a, 0x3a, 0x44,
209         0x71, 0x83, 0x57, 0x28, 0x49, 0x88, 0x69, 0xb5,
210         0x14, 0x1e, 0xda, 0x46, 0xe3, 0x6e, 0x78, 0xe1,
211         0xcb, 0x8f, 0xb5, 0x98, 0xb3, 0x2d, 0x6e, 0x5b,
212         0xb7, 0xf6, 0x93, 0x24, 0x14, 0x1f, 0xa4, 0xf6,
213         0x69, 0xbd, 0xff, 0x4c, 0x52, 0x50, 0x02, 0xc5,
214         0x43, 0x8d, 0x14, 0xe2, 0xd0, 0x75, 0x9f, 0x12,
215         0x5e, 0x94, 0x89, 0xd1, 0xef, 0x77, 0x89, 0x7d,
216         0x89, 0xd9, 0x9e, 0x76, 0x99, 0x24, 0x31, 0x82,
217         0x01, 0xf7, 0x30, 0x82, 0x01, 0xf3, 0x02, 0x01,
218         0x01, 0x30, 0x63, 0x30, 0x56, 0x31, 0x0b, 0x30,
219         0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
220         0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
221         0x55, 0x04, 0x08, 0x0c, 0x0a, 0x53, 0x6f, 0x6d,
222         0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x31,
223         0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a,
224         0x0c, 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
225         0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 0x69,
226         0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c,
227         0x74, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03,
228         0x55, 0x04, 0x03, 0x0c, 0x06, 0x72, 0x6f, 0x6f,
229         0x74, 0x43, 0x41, 0x02, 0x09, 0x00, 0x88, 0x43,
230         0x29, 0xcb, 0xc2, 0xeb, 0x15, 0x9a, 0x30, 0x0b,
231         0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
232         0x04, 0x02, 0x01, 0xa0, 0x69, 0x30, 0x18, 0x06,
233         0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
234         0x09, 0x03, 0x31, 0x0b, 0x06, 0x09, 0x2a, 0x86,
235         0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0x30,
236         0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
237         0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d,
238         0x32, 0x30, 0x31, 0x32, 0x31, 0x31, 0x30, 0x39,
239         0x30, 0x30, 0x31, 0x33, 0x5a, 0x30, 0x2f, 0x06,
240         0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
241         0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0xb0, 0x80,
242         0x22, 0xd3, 0x15, 0xcf, 0x1e, 0xb1, 0x2d, 0x26,
243         0x65, 0xbd, 0xed, 0x0e, 0x6a, 0xf4, 0x06, 0x53,
244         0xc0, 0xa0, 0xbe, 0x97, 0x52, 0x32, 0xfb, 0x49,
245         0xbc, 0xbd, 0x02, 0x1c, 0xfc, 0x36, 0x30, 0x0d,
246         0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
247         0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01,
248         0x00, 0x37, 0x44, 0x39, 0x08, 0xb2, 0x19, 0x52,
249         0x35, 0x9c, 0xd0, 0x67, 0x87, 0xae, 0xb8, 0x1c,
250         0x80, 0xf4, 0x03, 0x29, 0x2e, 0xe3, 0x76, 0x4a,
251         0xb0, 0x98, 0x10, 0x00, 0x9a, 0x30, 0xdb, 0x05,
252         0x28, 0x53, 0x34, 0x31, 0x14, 0xbd, 0x87, 0xb9,
253         0x4d, 0x45, 0x07, 0x97, 0xa3, 0x57, 0x0b, 0x7e,
254         0xd1, 0x67, 0xfb, 0x4e, 0x0f, 0x5b, 0x90, 0xb2,
255         0x6f, 0xe6, 0xce, 0x49, 0xdd, 0x72, 0x46, 0x71,
256         0x26, 0xa1, 0x1b, 0x98, 0x23, 0x7d, 0x69, 0x73,
257         0x84, 0xdc, 0xf9, 0xd2, 0x1c, 0x6d, 0xf6, 0xf5,
258         0x17, 0x49, 0x6e, 0x9d, 0x4d, 0xf1, 0xe2, 0x43,
259         0x29, 0x53, 0x55, 0xa5, 0x22, 0x1e, 0x89, 0x2c,
260         0xaf, 0xf2, 0x43, 0x47, 0xd5, 0xfa, 0xad, 0xe7,
261         0x89, 0x60, 0xbf, 0x96, 0x35, 0x6f, 0xc2, 0x99,
262         0xb7, 0x55, 0xc5, 0xe3, 0x04, 0x25, 0x1b, 0xf6,
263         0x7e, 0xf2, 0x2b, 0x14, 0xa9, 0x57, 0x96, 0xbe,
264         0xbd, 0x6e, 0x95, 0x44, 0x94, 0xbd, 0xaf, 0x9a,
265         0x6d, 0x77, 0x55, 0x5e, 0x6c, 0xf6, 0x32, 0x37,
266         0xec, 0xef, 0xe5, 0x81, 0xb0, 0xe3, 0x35, 0xc7,
267         0x86, 0xea, 0x47, 0x59, 0x38, 0xb6, 0x16, 0xfb,
268         0x1d, 0x10, 0x55, 0x48, 0xb1, 0x44, 0x33, 0xde,
269         0xf6, 0x29, 0xbe, 0xbf, 0xbc, 0x71, 0x3e, 0x49,
270         0xba, 0xe7, 0x9f, 0x4d, 0x6c, 0xfb, 0xec, 0xd2,
271         0xe0, 0x12, 0xa9, 0x7c, 0xc9, 0x9a, 0x7b, 0x85,
272         0x83, 0xb8, 0xca, 0xdd, 0xf6, 0xb7, 0x15, 0x75,
273         0x7b, 0x4a, 0x69, 0xcf, 0x0a, 0xc7, 0x80, 0x01,
274         0xe7, 0x94, 0x16, 0x7f, 0x8d, 0x3c, 0xfa, 0x1f,
275         0x05, 0x71, 0x76, 0x15, 0xb0, 0xf6, 0x61, 0x30,
276         0x58, 0x16, 0xbe, 0x1b, 0xd1, 0x93, 0xc4, 0x1a,
277         0x91, 0x0c, 0x48, 0xe2, 0x1c, 0x8e, 0xa5, 0xc5,
278         0xa7, 0x81, 0x44, 0x48, 0x3b, 0x10, 0xc2, 0x74,
279         0x07, 0xdf, 0xa8, 0xae, 0x57, 0xee, 0x7f, 0xe3,
280         0x6a
281     };
282 
283     ret = TEST_ptr(bio = BIO_new_mem_buf(cms_data, sizeof(cms_data)))
284           && TEST_ptr(cms = d2i_CMS_bio(bio, NULL))
285           && TEST_true(CMS_verify(cms, NULL, NULL, NULL, NULL,
286                                   CMS_NO_SIGNER_CERT_VERIFY));
287     CMS_ContentInfo_free(cms);
288     BIO_free(bio);
289     return ret && TEST_int_eq(ERR_peek_error(), 0);
290 }
291 
292 static unsigned char *read_all(BIO *bio, long *p_len)
293 {
294     const int step = 256;
295     unsigned char *buf = NULL;
296     unsigned char *tmp = NULL;
297     int ret;
298 
299     *p_len = 0;
300     for (;;) {
301         tmp = OPENSSL_realloc(buf, *p_len + step);
302         if (tmp == NULL)
303             break;
304         buf = tmp;
305         ret = BIO_read(bio, buf + *p_len, step);
306         if (ret < 0)
307             break;
308 
309         *p_len += ret;
310 
311         if (ret < step)
312             return buf;
313     }
314 
315     /* Error */
316     OPENSSL_free(buf);
317     *p_len = 0;
318     return NULL;
319 }
320 
321 static int test_d2i_CMS_decode(const int idx)
322 {
323     BIO *bio = NULL;
324     CMS_ContentInfo *cms = NULL;
325     unsigned char *buf = NULL;
326     const unsigned char *tmp = NULL;
327     long buf_len = 0;
328     int ret = 0;
329 
330     if (!TEST_ptr(bio = BIO_new_file(derin, "r")))
331       goto end;
332 
333     switch (idx) {
334     case 0:
335         if (!TEST_ptr(cms = d2i_CMS_bio(bio, NULL)))
336             goto end;
337         break;
338     case 1:
339         if (!TEST_ptr(buf = read_all(bio, &buf_len)))
340             goto end;
341         tmp = buf;
342         if (!TEST_ptr(cms = d2i_CMS_ContentInfo(NULL, &tmp, buf_len)))
343             goto end;
344         break;
345     }
346 
347     if (!TEST_int_eq(ERR_peek_error(), 0))
348         goto end;
349 
350     ret = 1;
351 end:
352     CMS_ContentInfo_free(cms);
353     BIO_free(bio);
354     OPENSSL_free(buf);
355 
356     return ret;
357 }
358 
359 OPT_TEST_DECLARE_USAGE("certfile privkeyfile derfile\n")
360 
361 int setup_tests(void)
362 {
363     char *certin = NULL, *privkeyin = NULL;
364     BIO *certbio = NULL, *privkeybio = NULL;
365 
366     if (!test_skip_common_options()) {
367         TEST_error("Error parsing test options\n");
368         return 0;
369     }
370 
371     if (!TEST_ptr(certin = test_get_argument(0))
372             || !TEST_ptr(privkeyin = test_get_argument(1))
373             || !TEST_ptr(derin = test_get_argument(2)))
374         return 0;
375 
376     certbio = BIO_new_file(certin, "r");
377     if (!TEST_ptr(certbio))
378         return 0;
379     if (!TEST_true(PEM_read_bio_X509(certbio, &cert, NULL, NULL))) {
380         BIO_free(certbio);
381         return 0;
382     }
383     BIO_free(certbio);
384 
385     privkeybio = BIO_new_file(privkeyin, "r");
386     if (!TEST_ptr(privkeybio)) {
387         X509_free(cert);
388         cert = NULL;
389         return 0;
390     }
391     if (!TEST_true(PEM_read_bio_PrivateKey(privkeybio, &privkey, NULL, NULL))) {
392         BIO_free(privkeybio);
393         X509_free(cert);
394         cert = NULL;
395         return 0;
396     }
397     BIO_free(privkeybio);
398 
399     ADD_TEST(test_encrypt_decrypt_aes_cbc);
400     ADD_TEST(test_encrypt_decrypt_aes_128_gcm);
401     ADD_TEST(test_encrypt_decrypt_aes_192_gcm);
402     ADD_TEST(test_encrypt_decrypt_aes_256_gcm);
403     ADD_TEST(test_d2i_CMS_bio_NULL);
404     ADD_ALL_TESTS(test_d2i_CMS_decode, 2);
405     return 1;
406 }
407 
408 void cleanup_tests(void)
409 {
410     X509_free(cert);
411     EVP_PKEY_free(privkey);
412 }
413