xref: /openssl/test/cmsapitest.c (revision 7ed6de99)
1 /*
2  * Copyright 2018-2024 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 
test_encrypt_decrypt(const EVP_CIPHER * cipher)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 
test_encrypt_decrypt_aes_cbc(void)71 static int test_encrypt_decrypt_aes_cbc(void)
72 {
73     return test_encrypt_decrypt(EVP_aes_128_cbc());
74 }
75 
test_encrypt_decrypt_aes_128_gcm(void)76 static int test_encrypt_decrypt_aes_128_gcm(void)
77 {
78     return test_encrypt_decrypt(EVP_aes_128_gcm());
79 }
80 
test_encrypt_decrypt_aes_192_gcm(void)81 static int test_encrypt_decrypt_aes_192_gcm(void)
82 {
83     return test_encrypt_decrypt(EVP_aes_192_gcm());
84 }
85 
test_encrypt_decrypt_aes_256_gcm(void)86 static int test_encrypt_decrypt_aes_256_gcm(void)
87 {
88     return test_encrypt_decrypt(EVP_aes_256_gcm());
89 }
90 
test_CMS_add1_cert(void)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 
test_d2i_CMS_bio_NULL(void)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 
read_all(BIO * bio,long * p_len)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         if (LONG_MAX - ret < *p_len)
336             break;
337 
338         *p_len += ret;
339 
340         if (ret < step)
341             return buf;
342     }
343 
344     /* Error */
345     OPENSSL_free(buf);
346     *p_len = 0;
347     return NULL;
348 }
349 
test_d2i_CMS_decode(const int idx)350 static int test_d2i_CMS_decode(const int idx)
351 {
352     BIO *bio = NULL;
353     CMS_ContentInfo *cms = NULL;
354     unsigned char *buf = NULL;
355     const unsigned char *tmp = NULL;
356     long buf_len = 0;
357     int ret = 0;
358 
359     if (!TEST_ptr(bio = BIO_new_file(derin, "r")))
360       goto end;
361 
362     switch (idx) {
363     case 0:
364         if (!TEST_ptr(cms = d2i_CMS_bio(bio, NULL)))
365             goto end;
366         break;
367     case 1:
368         if (!TEST_ptr(buf = read_all(bio, &buf_len)))
369             goto end;
370         tmp = buf;
371         if (!TEST_ptr(cms = d2i_CMS_ContentInfo(NULL, &tmp, buf_len)))
372             goto end;
373         break;
374     }
375 
376     if (!TEST_int_eq(ERR_peek_error(), 0))
377         goto end;
378 
379     ret = 1;
380 end:
381     CMS_ContentInfo_free(cms);
382     BIO_free(bio);
383     OPENSSL_free(buf);
384 
385     return ret;
386 }
387 
388 OPT_TEST_DECLARE_USAGE("certfile privkeyfile derfile\n")
389 
setup_tests(void)390 int setup_tests(void)
391 {
392     char *certin = NULL, *privkeyin = NULL;
393     BIO *certbio = NULL, *privkeybio = NULL;
394 
395     if (!test_skip_common_options()) {
396         TEST_error("Error parsing test options\n");
397         return 0;
398     }
399 
400     if (!TEST_ptr(certin = test_get_argument(0))
401             || !TEST_ptr(privkeyin = test_get_argument(1))
402             || !TEST_ptr(derin = test_get_argument(2)))
403         return 0;
404 
405     certbio = BIO_new_file(certin, "r");
406     if (!TEST_ptr(certbio))
407         return 0;
408     if (!TEST_true(PEM_read_bio_X509(certbio, &cert, NULL, NULL))) {
409         BIO_free(certbio);
410         return 0;
411     }
412     BIO_free(certbio);
413 
414     privkeybio = BIO_new_file(privkeyin, "r");
415     if (!TEST_ptr(privkeybio)) {
416         X509_free(cert);
417         cert = NULL;
418         return 0;
419     }
420     if (!TEST_true(PEM_read_bio_PrivateKey(privkeybio, &privkey, NULL, NULL))) {
421         BIO_free(privkeybio);
422         X509_free(cert);
423         cert = NULL;
424         return 0;
425     }
426     BIO_free(privkeybio);
427 
428     ADD_TEST(test_encrypt_decrypt_aes_cbc);
429     ADD_TEST(test_encrypt_decrypt_aes_128_gcm);
430     ADD_TEST(test_encrypt_decrypt_aes_192_gcm);
431     ADD_TEST(test_encrypt_decrypt_aes_256_gcm);
432     ADD_TEST(test_CMS_add1_cert);
433     ADD_TEST(test_d2i_CMS_bio_NULL);
434     ADD_ALL_TESTS(test_d2i_CMS_decode, 2);
435     return 1;
436 }
437 
cleanup_tests(void)438 void cleanup_tests(void)
439 {
440     X509_free(cert);
441     EVP_PKEY_free(privkey);
442 }
443