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