xref: /third_party/openssl/test/cmsapitest.c (revision e1051a39)
1/*
2 * Copyright 2018-2022 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
19static X509 *cert = NULL;
20static EVP_PKEY *privkey = NULL;
21static char *derin = NULL;
22
23static 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;
60}
61
62static int test_encrypt_decrypt_aes_cbc(void)
63{
64    return test_encrypt_decrypt(EVP_aes_128_cbc());
65}
66
67static int test_encrypt_decrypt_aes_128_gcm(void)
68{
69    return test_encrypt_decrypt(EVP_aes_128_gcm());
70}
71
72static int test_encrypt_decrypt_aes_192_gcm(void)
73{
74    return test_encrypt_decrypt(EVP_aes_192_gcm());
75}
76
77static int test_encrypt_decrypt_aes_256_gcm(void)
78{
79    return test_encrypt_decrypt(EVP_aes_256_gcm());
80}
81
82static 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;
290}
291
292static 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
321static 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;
351end:
352    CMS_ContentInfo_free(cms);
353    BIO_free(bio);
354    OPENSSL_free(buf);
355
356    return ret;
357}
358
359OPT_TEST_DECLARE_USAGE("certfile privkeyfile derfile\n")
360
361int 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
408void cleanup_tests(void)
409{
410    X509_free(cert);
411    EVP_PKEY_free(privkey);
412}
413