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