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
19 static X509 *cert = NULL;
20 static EVP_PKEY *privkey = NULL;
21 static char *derin = NULL;
22
test_encrypt_decrypt(const EVP_CIPHER * cipher)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;
60 }
61
test_encrypt_decrypt_aes_cbc(void)62 static int test_encrypt_decrypt_aes_cbc(void)
63 {
64 return test_encrypt_decrypt(EVP_aes_128_cbc());
65 }
66
test_encrypt_decrypt_aes_128_gcm(void)67 static int test_encrypt_decrypt_aes_128_gcm(void)
68 {
69 return test_encrypt_decrypt(EVP_aes_128_gcm());
70 }
71
test_encrypt_decrypt_aes_192_gcm(void)72 static int test_encrypt_decrypt_aes_192_gcm(void)
73 {
74 return test_encrypt_decrypt(EVP_aes_192_gcm());
75 }
76
test_encrypt_decrypt_aes_256_gcm(void)77 static int test_encrypt_decrypt_aes_256_gcm(void)
78 {
79 return test_encrypt_decrypt(EVP_aes_256_gcm());
80 }
81
test_d2i_CMS_bio_NULL(void)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;
290 }
291
read_all(BIO * bio,long * p_len)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
test_d2i_CMS_decode(const int idx)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
setup_tests(void)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
cleanup_tests(void)408 void cleanup_tests(void)
409 {
410 X509_free(cert);
411 EVP_PKEY_free(privkey);
412 }
413