Branch data Line data Source code
1 : : /* apps/cms.c */
2 : : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 : : * project.
4 : : */
5 : : /* ====================================================================
6 : : * Copyright (c) 2008 The OpenSSL Project. All rights reserved.
7 : : *
8 : : * Redistribution and use in source and binary forms, with or without
9 : : * modification, are permitted provided that the following conditions
10 : : * are met:
11 : : *
12 : : * 1. Redistributions of source code must retain the above copyright
13 : : * notice, this list of conditions and the following disclaimer.
14 : : *
15 : : * 2. Redistributions in binary form must reproduce the above copyright
16 : : * notice, this list of conditions and the following disclaimer in
17 : : * the documentation and/or other materials provided with the
18 : : * distribution.
19 : : *
20 : : * 3. All advertising materials mentioning features or use of this
21 : : * software must display the following acknowledgment:
22 : : * "This product includes software developed by the OpenSSL Project
23 : : * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 : : *
25 : : * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 : : * endorse or promote products derived from this software without
27 : : * prior written permission. For written permission, please contact
28 : : * licensing@OpenSSL.org.
29 : : *
30 : : * 5. Products derived from this software may not be called "OpenSSL"
31 : : * nor may "OpenSSL" appear in their names without prior written
32 : : * permission of the OpenSSL Project.
33 : : *
34 : : * 6. Redistributions of any form whatsoever must retain the following
35 : : * acknowledgment:
36 : : * "This product includes software developed by the OpenSSL Project
37 : : * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 : : *
39 : : * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 : : * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 : : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 : : * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 : : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 : : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 : : * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 : : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 : : * OF THE POSSIBILITY OF SUCH DAMAGE.
51 : : * ====================================================================
52 : : */
53 : :
54 : : /* CMS utility function */
55 : :
56 : : #include <stdio.h>
57 : : #include <string.h>
58 : : #include "apps.h"
59 : :
60 : : #ifndef OPENSSL_NO_CMS
61 : :
62 : : #include <openssl/crypto.h>
63 : : #include <openssl/pem.h>
64 : : #include <openssl/err.h>
65 : : #include <openssl/x509_vfy.h>
66 : : #include <openssl/x509v3.h>
67 : : #include <openssl/cms.h>
68 : :
69 : : #undef PROG
70 : : #define PROG cms_main
71 : : static int save_certs(char *signerfile, STACK_OF(X509) *signers);
72 : : static int cms_cb(int ok, X509_STORE_CTX *ctx);
73 : : static void receipt_request_print(BIO *out, CMS_ContentInfo *cms);
74 : : static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
75 : : int rr_allorfirst,
76 : : STACK_OF(OPENSSL_STRING) *rr_from);
77 : : static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
78 : : STACK_OF(OPENSSL_STRING) *param);
79 : :
80 : : #define SMIME_OP 0x10
81 : : #define SMIME_IP 0x20
82 : : #define SMIME_SIGNERS 0x40
83 : : #define SMIME_ENCRYPT (1 | SMIME_OP)
84 : : #define SMIME_DECRYPT (2 | SMIME_IP)
85 : : #define SMIME_SIGN (3 | SMIME_OP | SMIME_SIGNERS)
86 : : #define SMIME_VERIFY (4 | SMIME_IP)
87 : : #define SMIME_CMSOUT (5 | SMIME_IP | SMIME_OP)
88 : : #define SMIME_RESIGN (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS)
89 : : #define SMIME_DATAOUT (7 | SMIME_IP)
90 : : #define SMIME_DATA_CREATE (8 | SMIME_OP)
91 : : #define SMIME_DIGEST_VERIFY (9 | SMIME_IP)
92 : : #define SMIME_DIGEST_CREATE (10 | SMIME_OP)
93 : : #define SMIME_UNCOMPRESS (11 | SMIME_IP)
94 : : #define SMIME_COMPRESS (12 | SMIME_OP)
95 : : #define SMIME_ENCRYPTED_DECRYPT (13 | SMIME_IP)
96 : : #define SMIME_ENCRYPTED_ENCRYPT (14 | SMIME_OP)
97 : : #define SMIME_SIGN_RECEIPT (15 | SMIME_IP | SMIME_OP)
98 : : #define SMIME_VERIFY_RECEIPT (16 | SMIME_IP)
99 : :
100 : : int verify_err = 0;
101 : :
102 : : typedef struct cms_key_param_st cms_key_param;
103 : :
104 : : struct cms_key_param_st
105 : : {
106 : : int idx;
107 : : STACK_OF(OPENSSL_STRING)*param;
108 : : cms_key_param *next;
109 : : };
110 : :
111 : : int MAIN(int, char **);
112 : :
113 : 102 : int MAIN(int argc, char **argv)
114 : : {
115 : 102 : ENGINE *e = NULL;
116 : 102 : int operation = 0;
117 : 102 : int ret = 0;
118 : : char **args;
119 : 102 : const char *inmode = "r", *outmode = "w";
120 : 102 : char *infile = NULL, *outfile = NULL, *rctfile = NULL;
121 : 102 : char *signerfile = NULL, *recipfile = NULL;
122 : 102 : STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL;
123 : 102 : char *certfile = NULL, *keyfile = NULL, *contfile=NULL;
124 : 102 : char *certsoutfile = NULL;
125 : 102 : const EVP_CIPHER *cipher = NULL, *wrap_cipher = NULL;
126 : 102 : CMS_ContentInfo *cms = NULL, *rcms = NULL;
127 : 102 : X509_STORE *store = NULL;
128 : 102 : X509 *cert = NULL, *recip = NULL, *signer = NULL;
129 : 102 : EVP_PKEY *key = NULL;
130 : 102 : STACK_OF(X509) *encerts = NULL, *other = NULL;
131 : 102 : BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL;
132 : 102 : int badarg = 0;
133 : 102 : int flags = CMS_DETACHED, noout = 0, print = 0;
134 : 102 : int verify_retcode = 0;
135 : 102 : int rr_print = 0, rr_allorfirst = -1;
136 : 102 : STACK_OF(OPENSSL_STRING) *rr_to = NULL, *rr_from = NULL;
137 : 102 : CMS_ReceiptRequest *rr = NULL;
138 : 102 : char *to = NULL, *from = NULL, *subject = NULL;
139 : 102 : char *CAfile = NULL, *CApath = NULL;
140 : 102 : char *passargin = NULL, *passin = NULL;
141 : 102 : char *inrand = NULL;
142 : 102 : int need_rand = 0;
143 : 102 : const EVP_MD *sign_md = NULL;
144 : 102 : int informat = FORMAT_SMIME, outformat = FORMAT_SMIME;
145 : 102 : int rctformat = FORMAT_SMIME, keyform = FORMAT_PEM;
146 : : #ifndef OPENSSL_NO_ENGINE
147 : 102 : char *engine=NULL;
148 : : #endif
149 : 102 : unsigned char *secret_key = NULL, *secret_keyid = NULL;
150 : 102 : unsigned char *pwri_pass = NULL, *pwri_tmp = NULL;
151 : 102 : size_t secret_keylen = 0, secret_keyidlen = 0;
152 : :
153 : 102 : cms_key_param *key_first = NULL, *key_param = NULL;
154 : :
155 : 102 : ASN1_OBJECT *econtent_type = NULL;
156 : :
157 : 102 : X509_VERIFY_PARAM *vpm = NULL;
158 : :
159 : 102 : args = argv + 1;
160 : 102 : ret = 1;
161 : :
162 : 102 : apps_startup();
163 : :
164 [ - + ]: 102 : if (bio_err == NULL)
165 : : {
166 [ # # ]: 0 : if ((bio_err = BIO_new(BIO_s_file())) != NULL)
167 : 0 : BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
168 : : }
169 : :
170 [ + - ]: 102 : if (!load_config(bio_err, NULL))
171 : : goto end;
172 : :
173 [ + - ][ + + ]: 686 : while (!badarg && *args && *args[0] == '-')
[ + + ]
174 : : {
175 [ + + ]: 584 : if (!strcmp (*args, "-encrypt"))
176 : : operation = SMIME_ENCRYPT;
177 [ + + ]: 567 : else if (!strcmp (*args, "-decrypt"))
178 : : operation = SMIME_DECRYPT;
179 [ + + ]: 550 : else if (!strcmp (*args, "-sign"))
180 : : operation = SMIME_SIGN;
181 [ + + ]: 524 : else if (!strcmp (*args, "-sign_receipt"))
182 : : operation = SMIME_SIGN_RECEIPT;
183 [ + + ]: 523 : else if (!strcmp (*args, "-resign"))
184 : : operation = SMIME_RESIGN;
185 [ + + ]: 521 : else if (!strcmp (*args, "-verify"))
186 : : operation = SMIME_VERIFY;
187 [ + - ]: 493 : else if (!strcmp (*args, "-verify_retcode"))
188 : : verify_retcode = 1;
189 [ + + ]: 493 : else if (!strcmp(*args,"-verify_receipt"))
190 : : {
191 : 1 : operation = SMIME_VERIFY_RECEIPT;
192 [ + - ]: 1 : if (!args[1])
193 : : goto argerr;
194 : 1 : args++;
195 : 1 : rctfile = *args;
196 : : }
197 [ + - ]: 492 : else if (!strcmp (*args, "-cmsout"))
198 : : operation = SMIME_CMSOUT;
199 [ + + ]: 492 : else if (!strcmp (*args, "-data_out"))
200 : : operation = SMIME_DATAOUT;
201 [ + + ]: 491 : else if (!strcmp (*args, "-data_create"))
202 : : operation = SMIME_DATA_CREATE;
203 [ + - ]: 490 : else if (!strcmp (*args, "-digest_verify"))
204 : : operation = SMIME_DIGEST_VERIFY;
205 [ + - ]: 490 : else if (!strcmp (*args, "-digest_create"))
206 : : operation = SMIME_DIGEST_CREATE;
207 [ + - ]: 490 : else if (!strcmp (*args, "-compress"))
208 : : operation = SMIME_COMPRESS;
209 [ + - ]: 490 : else if (!strcmp (*args, "-uncompress"))
210 : : operation = SMIME_UNCOMPRESS;
211 [ + + ]: 490 : else if (!strcmp (*args, "-EncryptedData_decrypt"))
212 : : operation = SMIME_ENCRYPTED_DECRYPT;
213 [ + + ]: 486 : else if (!strcmp (*args, "-EncryptedData_encrypt"))
214 : : operation = SMIME_ENCRYPTED_ENCRYPT;
215 : : #ifndef OPENSSL_NO_DES
216 [ + + ]: 482 : else if (!strcmp (*args, "-des3"))
217 : 1 : cipher = EVP_des_ede3_cbc();
218 [ - + ]: 481 : else if (!strcmp (*args, "-des"))
219 : 0 : cipher = EVP_des_cbc();
220 [ - + ]: 481 : else if (!strcmp (*args, "-des3-wrap"))
221 : 0 : wrap_cipher = EVP_des_ede3_wrap();
222 : : #endif
223 : : #ifndef OPENSSL_NO_SEED
224 [ - + ]: 481 : else if (!strcmp (*args, "-seed"))
225 : 0 : cipher = EVP_seed_cbc();
226 : : #endif
227 : : #ifndef OPENSSL_NO_RC2
228 [ - + ]: 481 : else if (!strcmp (*args, "-rc2-40"))
229 : 0 : cipher = EVP_rc2_40_cbc();
230 [ - + ]: 481 : else if (!strcmp (*args, "-rc2-128"))
231 : 0 : cipher = EVP_rc2_cbc();
232 [ - + ]: 481 : else if (!strcmp (*args, "-rc2-64"))
233 : 0 : cipher = EVP_rc2_64_cbc();
234 : : #endif
235 : : #ifndef OPENSSL_NO_AES
236 [ + + ]: 481 : else if (!strcmp(*args,"-aes128"))
237 : 6 : cipher = EVP_aes_128_cbc();
238 [ - + ]: 475 : else if (!strcmp(*args,"-aes192"))
239 : 0 : cipher = EVP_aes_192_cbc();
240 [ + + ]: 475 : else if (!strcmp(*args,"-aes256"))
241 : 2 : cipher = EVP_aes_256_cbc();
242 [ - + ]: 473 : else if (!strcmp(*args,"-aes128-wrap"))
243 : 0 : wrap_cipher = EVP_aes_128_wrap();
244 [ - + ]: 473 : else if (!strcmp(*args,"-aes192-wrap"))
245 : 0 : wrap_cipher = EVP_aes_192_wrap();
246 [ - + ]: 473 : else if (!strcmp(*args,"-aes256-wrap"))
247 : 0 : wrap_cipher = EVP_aes_256_wrap();
248 : : #endif
249 : : #ifndef OPENSSL_NO_CAMELLIA
250 [ - + ]: 473 : else if (!strcmp(*args,"-camellia128"))
251 : 0 : cipher = EVP_camellia_128_cbc();
252 [ - + ]: 473 : else if (!strcmp(*args,"-camellia192"))
253 : 0 : cipher = EVP_camellia_192_cbc();
254 [ - + ]: 473 : else if (!strcmp(*args,"-camellia256"))
255 : 0 : cipher = EVP_camellia_256_cbc();
256 : : #endif
257 [ - + ]: 473 : else if (!strcmp (*args, "-debug_decrypt"))
258 : 0 : flags |= CMS_DEBUG_DECRYPT;
259 [ - + ]: 473 : else if (!strcmp (*args, "-text"))
260 : 0 : flags |= CMS_TEXT;
261 [ - + ]: 473 : else if (!strcmp (*args, "-asciicrlf"))
262 : 0 : flags |= CMS_ASCIICRLF;
263 [ - + ]: 473 : else if (!strcmp (*args, "-nointern"))
264 : 0 : flags |= CMS_NOINTERN;
265 [ + - ]: 473 : else if (!strcmp (*args, "-noverify")
266 [ - + ]: 473 : || !strcmp (*args, "-no_signer_cert_verify"))
267 : 0 : flags |= CMS_NO_SIGNER_CERT_VERIFY;
268 [ - + ]: 473 : else if (!strcmp (*args, "-nocerts"))
269 : 0 : flags |= CMS_NOCERTS;
270 [ + + ]: 473 : else if (!strcmp (*args, "-noattr"))
271 : 3 : flags |= CMS_NOATTR;
272 [ + + ]: 470 : else if (!strcmp (*args, "-nodetach"))
273 : 21 : flags &= ~CMS_DETACHED;
274 [ - + ]: 449 : else if (!strcmp (*args, "-nosmimecap"))
275 : 0 : flags |= CMS_NOSMIMECAP;
276 [ - + ]: 449 : else if (!strcmp (*args, "-binary"))
277 : 0 : flags |= CMS_BINARY;
278 [ + + ]: 449 : else if (!strcmp (*args, "-keyid"))
279 : 2 : flags |= CMS_USE_KEYID;
280 [ - + ]: 447 : else if (!strcmp (*args, "-nosigs"))
281 : 0 : flags |= CMS_NOSIGS;
282 [ - + ]: 447 : else if (!strcmp (*args, "-no_content_verify"))
283 : 0 : flags |= CMS_NO_CONTENT_VERIFY;
284 [ - + ]: 447 : else if (!strcmp (*args, "-no_attr_verify"))
285 : 0 : flags |= CMS_NO_ATTR_VERIFY;
286 [ + + ]: 447 : else if (!strcmp (*args, "-stream"))
287 : 36 : flags |= CMS_STREAM;
288 [ - + ]: 411 : else if (!strcmp (*args, "-indef"))
289 : 0 : flags |= CMS_STREAM;
290 [ - + ]: 411 : else if (!strcmp (*args, "-noindef"))
291 : 0 : flags &= ~CMS_STREAM;
292 [ - + ]: 411 : else if (!strcmp (*args, "-nooldmime"))
293 : 0 : flags |= CMS_NOOLDMIMETYPE;
294 [ - + ]: 411 : else if (!strcmp (*args, "-crlfeol"))
295 : 0 : flags |= CMS_CRLFEOL;
296 [ + - ]: 411 : else if (!strcmp (*args, "-noout"))
297 : : noout = 1;
298 [ + - ]: 411 : else if (!strcmp (*args, "-receipt_request_print"))
299 : : rr_print = 1;
300 [ + + ]: 411 : else if (!strcmp (*args, "-receipt_request_all"))
301 : : rr_allorfirst = 0;
302 [ + - ]: 410 : else if (!strcmp (*args, "-receipt_request_first"))
303 : : rr_allorfirst = 1;
304 [ - + ]: 410 : else if (!strcmp(*args,"-receipt_request_from"))
305 : : {
306 [ # # ]: 0 : if (!args[1])
307 : : goto argerr;
308 : 0 : args++;
309 [ # # ]: 0 : if (!rr_from)
310 : 0 : rr_from = sk_OPENSSL_STRING_new_null();
311 : 0 : sk_OPENSSL_STRING_push(rr_from, *args);
312 : : }
313 [ + + ]: 410 : else if (!strcmp(*args,"-receipt_request_to"))
314 : : {
315 [ + - ]: 1 : if (!args[1])
316 : : goto argerr;
317 : 1 : args++;
318 [ + - ]: 1 : if (!rr_to)
319 : 1 : rr_to = sk_OPENSSL_STRING_new_null();
320 : 1 : sk_OPENSSL_STRING_push(rr_to, *args);
321 : : }
322 [ + - ]: 409 : else if (!strcmp (*args, "-print"))
323 : : {
324 : : noout = 1;
325 : : print = 1;
326 : : }
327 [ + + ]: 409 : else if (!strcmp(*args,"-secretkey"))
328 : : {
329 : : long ltmp;
330 [ + - ]: 12 : if (!args[1])
331 : : goto argerr;
332 : 12 : args++;
333 : 12 : secret_key = string_to_hex(*args, <mp);
334 [ - + ]: 12 : if (!secret_key)
335 : : {
336 : 0 : BIO_printf(bio_err, "Invalid key %s\n", *args);
337 : 0 : goto argerr;
338 : : }
339 : 12 : secret_keylen = (size_t)ltmp;
340 : : }
341 [ + + ]: 397 : else if (!strcmp(*args,"-secretkeyid"))
342 : : {
343 : : long ltmp;
344 [ + - ]: 3 : if (!args[1])
345 : : goto argerr;
346 : 3 : args++;
347 : 3 : secret_keyid = string_to_hex(*args, <mp);
348 [ - + ]: 3 : if (!secret_keyid)
349 : : {
350 : 0 : BIO_printf(bio_err, "Invalid id %s\n", *args);
351 : 0 : goto argerr;
352 : : }
353 : 3 : secret_keyidlen = (size_t)ltmp;
354 : : }
355 [ - + ]: 394 : else if (!strcmp(*args,"-pwri_password"))
356 : : {
357 [ # # ]: 0 : if (!args[1])
358 : : goto argerr;
359 : 0 : args++;
360 : 0 : pwri_pass = (unsigned char *)*args;
361 : : }
362 [ - + ]: 394 : else if (!strcmp(*args,"-econtent_type"))
363 : : {
364 [ # # ]: 0 : if (!args[1])
365 : : goto argerr;
366 : 0 : args++;
367 : 0 : econtent_type = OBJ_txt2obj(*args, 0);
368 [ # # ]: 0 : if (!econtent_type)
369 : : {
370 : 0 : BIO_printf(bio_err, "Invalid OID %s\n", *args);
371 : 0 : goto argerr;
372 : : }
373 : : }
374 [ - + ]: 394 : else if (!strcmp(*args,"-rand"))
375 : : {
376 [ # # ]: 0 : if (!args[1])
377 : : goto argerr;
378 : 0 : args++;
379 : 0 : inrand = *args;
380 : 0 : need_rand = 1;
381 : : }
382 : : #ifndef OPENSSL_NO_ENGINE
383 [ - + ]: 394 : else if (!strcmp(*args,"-engine"))
384 : : {
385 [ # # ]: 0 : if (!args[1])
386 : : goto argerr;
387 : 0 : engine = *++args;
388 : : }
389 : : #endif
390 [ - + ]: 394 : else if (!strcmp(*args,"-passin"))
391 : : {
392 [ # # ]: 0 : if (!args[1])
393 : : goto argerr;
394 : 0 : passargin = *++args;
395 : : }
396 [ - + ]: 394 : else if (!strcmp (*args, "-to"))
397 : : {
398 [ # # ]: 0 : if (!args[1])
399 : : goto argerr;
400 : 0 : to = *++args;
401 : : }
402 [ - + ]: 394 : else if (!strcmp (*args, "-from"))
403 : : {
404 [ # # ]: 0 : if (!args[1])
405 : : goto argerr;
406 : 0 : from = *++args;
407 : : }
408 [ - + ]: 394 : else if (!strcmp (*args, "-subject"))
409 : : {
410 [ # # ]: 0 : if (!args[1])
411 : : goto argerr;
412 : 0 : subject = *++args;
413 : : }
414 [ + + ]: 394 : else if (!strcmp (*args, "-signer"))
415 : : {
416 [ + - ]: 59 : if (!args[1])
417 : : goto argerr;
418 : : /* If previous -signer argument add signer to list */
419 : :
420 [ + + ]: 59 : if (signerfile)
421 : : {
422 [ + + ]: 30 : if (!sksigners)
423 : 10 : sksigners = sk_OPENSSL_STRING_new_null();
424 : 30 : sk_OPENSSL_STRING_push(sksigners, signerfile);
425 [ + - ]: 30 : if (!keyfile)
426 : 30 : keyfile = signerfile;
427 [ + + ]: 30 : if (!skkeys)
428 : 10 : skkeys = sk_OPENSSL_STRING_new_null();
429 : 30 : sk_OPENSSL_STRING_push(skkeys, keyfile);
430 : 30 : keyfile = NULL;
431 : : }
432 : 59 : signerfile = *++args;
433 : : }
434 [ + + ]: 335 : else if (!strcmp (*args, "-recip"))
435 : : {
436 [ + - ]: 19 : if (!args[1])
437 : : goto argerr;
438 [ + + ]: 19 : if (operation == SMIME_ENCRYPT)
439 : : {
440 [ + - ]: 6 : if (!encerts)
441 : 6 : encerts = sk_X509_new_null();
442 : 6 : cert = load_cert(bio_err,*++args,FORMAT_PEM,
443 : : NULL, e,
444 : : "recipient certificate file");
445 [ + - ]: 6 : if (!cert)
446 : : goto end;
447 : 6 : sk_X509_push(encerts, cert);
448 : 6 : cert = NULL;
449 : : }
450 : : else
451 : 13 : recipfile = *++args;
452 : : }
453 [ - + ]: 316 : else if (!strcmp (*args, "-certsout"))
454 : : {
455 [ # # ]: 0 : if (!args[1])
456 : : goto argerr;
457 : 0 : certsoutfile = *++args;
458 : : }
459 [ - + ]: 316 : else if (!strcmp (*args, "-md"))
460 : : {
461 [ # # ]: 0 : if (!args[1])
462 : : goto argerr;
463 : 0 : sign_md = EVP_get_digestbyname(*++args);
464 [ # # ]: 0 : if (sign_md == NULL)
465 : : {
466 : 0 : BIO_printf(bio_err, "Unknown digest %s\n",
467 : : *args);
468 : 0 : goto argerr;
469 : : }
470 : : }
471 [ + + ]: 316 : else if (!strcmp (*args, "-inkey"))
472 : : {
473 [ + - ]: 2 : if (!args[1])
474 : : goto argerr;
475 : : /* If previous -inkey arument add signer to list */
476 [ - + ]: 2 : if (keyfile)
477 : : {
478 [ # # ]: 0 : if (!signerfile)
479 : : {
480 : 0 : BIO_puts(bio_err, "Illegal -inkey without -signer\n");
481 : 0 : goto argerr;
482 : : }
483 [ # # ]: 0 : if (!sksigners)
484 : 0 : sksigners = sk_OPENSSL_STRING_new_null();
485 : 0 : sk_OPENSSL_STRING_push(sksigners, signerfile);
486 : 0 : signerfile = NULL;
487 [ # # ]: 0 : if (!skkeys)
488 : 0 : skkeys = sk_OPENSSL_STRING_new_null();
489 : 0 : sk_OPENSSL_STRING_push(skkeys, keyfile);
490 : : }
491 : 2 : keyfile = *++args;
492 : : }
493 [ - + ]: 314 : else if (!strcmp (*args, "-keyform"))
494 : : {
495 [ # # ]: 0 : if (!args[1])
496 : : goto argerr;
497 : 0 : keyform = str2fmt(*++args);
498 : : }
499 [ + + ]: 314 : else if (!strcmp (*args, "-keyopt"))
500 : : {
501 : 10 : int keyidx = -1;
502 [ + - ]: 10 : if (!args[1])
503 : : goto argerr;
504 [ + + ]: 10 : if (operation == SMIME_ENCRYPT)
505 : : {
506 [ + - ]: 6 : if (encerts)
507 : 6 : keyidx += sk_X509_num(encerts);
508 : : }
509 : : else
510 : : {
511 [ + - ]: 4 : if (keyfile || signerfile)
512 : 4 : keyidx++;
513 [ - + ]: 4 : if (skkeys)
514 : 0 : keyidx += sk_OPENSSL_STRING_num(skkeys);
515 : : }
516 [ - + ]: 10 : if (keyidx < 0)
517 : : {
518 : 0 : BIO_printf(bio_err, "No key specified\n");
519 : 0 : goto argerr;
520 : : }
521 [ + + ][ - + ]: 10 : if (key_param == NULL || key_param->idx != keyidx)
522 : : {
523 : : cms_key_param *nparam;
524 : 7 : nparam = OPENSSL_malloc(sizeof(cms_key_param));
525 : 7 : nparam->idx = keyidx;
526 : 7 : nparam->param = sk_OPENSSL_STRING_new_null();
527 : 7 : nparam->next = NULL;
528 [ - + ]: 7 : if (key_first == NULL)
529 : : key_first = nparam;
530 : : else
531 : 0 : key_param->next = nparam;
532 : 7 : key_param = nparam;
533 : : }
534 : 10 : sk_OPENSSL_STRING_push(key_param->param, *++args);
535 : : }
536 [ - + ]: 304 : else if (!strcmp (*args, "-rctform"))
537 : : {
538 [ # # ]: 0 : if (!args[1])
539 : : goto argerr;
540 : 0 : rctformat = str2fmt(*++args);
541 : : }
542 [ + + ]: 304 : else if (!strcmp (*args, "-certfile"))
543 : : {
544 [ + - ]: 2 : if (!args[1])
545 : : goto argerr;
546 : 2 : certfile = *++args;
547 : : }
548 [ + + ]: 302 : else if (!strcmp (*args, "-CAfile"))
549 : : {
550 [ + - ]: 29 : if (!args[1])
551 : : goto argerr;
552 : 29 : CAfile = *++args;
553 : : }
554 [ - + ]: 273 : else if (!strcmp (*args, "-CApath"))
555 : : {
556 [ # # ]: 0 : if (!args[1])
557 : : goto argerr;
558 : 0 : CApath = *++args;
559 : : }
560 [ + + ]: 273 : else if (!strcmp (*args, "-in"))
561 : : {
562 [ + - ]: 102 : if (!args[1])
563 : : goto argerr;
564 : 102 : infile = *++args;
565 : : }
566 [ + + ]: 171 : else if (!strcmp (*args, "-inform"))
567 : : {
568 [ + - ]: 32 : if (!args[1])
569 : : goto argerr;
570 : 32 : informat = str2fmt(*++args);
571 : : }
572 [ + + ]: 139 : else if (!strcmp (*args, "-outform"))
573 : : {
574 [ + - ]: 30 : if (!args[1])
575 : : goto argerr;
576 : 30 : outformat = str2fmt(*++args);
577 : : }
578 [ + + ]: 109 : else if (!strcmp (*args, "-out"))
579 : : {
580 [ + - ]: 101 : if (!args[1])
581 : : goto argerr;
582 : 101 : outfile = *++args;
583 : : }
584 [ + + ]: 8 : else if (!strcmp (*args, "-content"))
585 : : {
586 [ + - ]: 6 : if (!args[1])
587 : : goto argerr;
588 : 6 : contfile = *++args;
589 : : }
590 [ - + ]: 2 : else if (args_verify(&args, NULL, &badarg, bio_err, &vpm))
591 : 0 : continue;
592 [ - + ]: 2 : else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL)
593 : 0 : badarg = 1;
594 : 584 : args++;
595 : : }
596 : :
597 [ + + ][ - + ]: 102 : if (((rr_allorfirst != -1) || rr_from) && !rr_to)
598 : : {
599 : 0 : BIO_puts(bio_err, "No Signed Receipts Recipients\n");
600 : 0 : goto argerr;
601 : : }
602 : :
603 [ + + ][ - + ]: 102 : if (!(operation & SMIME_SIGNERS) && (rr_to || rr_from))
604 : : {
605 : 0 : BIO_puts(bio_err, "Signed receipts only allowed with -sign\n");
606 : 0 : goto argerr;
607 : : }
608 [ + + ][ - + ]: 102 : if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners))
609 : : {
610 : 0 : BIO_puts(bio_err, "Multiple signers or keys not allowed\n");
611 : 0 : goto argerr;
612 : : }
613 : :
614 [ + + ]: 102 : if (operation & SMIME_SIGNERS)
615 : : {
616 [ - + ]: 28 : if (keyfile && !signerfile)
617 : : {
618 : 0 : BIO_puts(bio_err, "Illegal -inkey without -signer\n");
619 : 0 : goto argerr;
620 : : }
621 : : /* Check to see if any final signer needs to be appended */
622 [ + - ]: 28 : if (signerfile)
623 : : {
624 [ + + ]: 28 : if (!sksigners)
625 : 18 : sksigners = sk_OPENSSL_STRING_new_null();
626 : 28 : sk_OPENSSL_STRING_push(sksigners, signerfile);
627 [ + + ]: 28 : if (!skkeys)
628 : 18 : skkeys = sk_OPENSSL_STRING_new_null();
629 [ + - ]: 28 : if (!keyfile)
630 : 28 : keyfile = signerfile;
631 : 28 : sk_OPENSSL_STRING_push(skkeys, keyfile);
632 : : }
633 [ - + ]: 28 : if (!sksigners)
634 : : {
635 : 0 : BIO_printf(bio_err, "No signer certificate specified\n");
636 : 0 : badarg = 1;
637 : : }
638 : : signerfile = NULL;
639 : : keyfile = NULL;
640 : : need_rand = 1;
641 : : }
642 : :
643 [ + + ]: 74 : else if (operation == SMIME_DECRYPT)
644 : : {
645 [ + + ][ - + ]: 17 : if (!recipfile && !keyfile && !secret_key && !pwri_pass)
646 : : {
647 : 0 : BIO_printf(bio_err, "No recipient certificate or key specified\n");
648 : 0 : badarg = 1;
649 : : }
650 : : }
651 [ + + ]: 57 : else if (operation == SMIME_ENCRYPT)
652 : : {
653 [ + + ][ + + ]: 17 : if (!*args && !secret_key && !pwri_pass && !encerts)
[ - + ]
654 : : {
655 : 0 : BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n");
656 : 0 : badarg = 1;
657 : : }
658 : : need_rand = 1;
659 : : }
660 [ - + ]: 40 : else if (!operation)
661 : 0 : badarg = 1;
662 : :
663 [ - + ]: 102 : if (badarg)
664 : : {
665 : : argerr:
666 : 0 : BIO_printf (bio_err, "Usage cms [options] cert.pem ...\n");
667 : 0 : BIO_printf (bio_err, "where options are\n");
668 : 0 : BIO_printf (bio_err, "-encrypt encrypt message\n");
669 : 0 : BIO_printf (bio_err, "-decrypt decrypt encrypted message\n");
670 : 0 : BIO_printf (bio_err, "-sign sign message\n");
671 : 0 : BIO_printf (bio_err, "-verify verify signed message\n");
672 : 0 : BIO_printf (bio_err, "-cmsout output CMS structure\n");
673 : : #ifndef OPENSSL_NO_DES
674 : 0 : BIO_printf (bio_err, "-des3 encrypt with triple DES\n");
675 : 0 : BIO_printf (bio_err, "-des encrypt with DES\n");
676 : : #endif
677 : : #ifndef OPENSSL_NO_SEED
678 : 0 : BIO_printf (bio_err, "-seed encrypt with SEED\n");
679 : : #endif
680 : : #ifndef OPENSSL_NO_RC2
681 : 0 : BIO_printf (bio_err, "-rc2-40 encrypt with RC2-40 (default)\n");
682 : 0 : BIO_printf (bio_err, "-rc2-64 encrypt with RC2-64\n");
683 : 0 : BIO_printf (bio_err, "-rc2-128 encrypt with RC2-128\n");
684 : : #endif
685 : : #ifndef OPENSSL_NO_AES
686 : 0 : BIO_printf (bio_err, "-aes128, -aes192, -aes256\n");
687 : 0 : BIO_printf (bio_err, " encrypt PEM output with cbc aes\n");
688 : : #endif
689 : : #ifndef OPENSSL_NO_CAMELLIA
690 : 0 : BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n");
691 : 0 : BIO_printf (bio_err, " encrypt PEM output with cbc camellia\n");
692 : : #endif
693 : 0 : BIO_printf (bio_err, "-nointern don't search certificates in message for signer\n");
694 : 0 : BIO_printf (bio_err, "-nosigs don't verify message signature\n");
695 : 0 : BIO_printf (bio_err, "-noverify don't verify signers certificate\n");
696 : 0 : BIO_printf (bio_err, "-nocerts don't include signers certificate when signing\n");
697 : 0 : BIO_printf (bio_err, "-nodetach use opaque signing\n");
698 : 0 : BIO_printf (bio_err, "-noattr don't include any signed attributes\n");
699 : 0 : BIO_printf (bio_err, "-binary don't translate message to text\n");
700 : 0 : BIO_printf (bio_err, "-certfile file other certificates file\n");
701 : 0 : BIO_printf (bio_err, "-certsout file certificate output file\n");
702 : 0 : BIO_printf (bio_err, "-signer file signer certificate file\n");
703 : 0 : BIO_printf (bio_err, "-recip file recipient certificate file for decryption\n");
704 : 0 : BIO_printf (bio_err, "-keyid use subject key identifier\n");
705 : 0 : BIO_printf (bio_err, "-in file input file\n");
706 : 0 : BIO_printf (bio_err, "-inform arg input format SMIME (default), PEM or DER\n");
707 : 0 : BIO_printf (bio_err, "-inkey file input private key (if not signer or recipient)\n");
708 : 0 : BIO_printf (bio_err, "-keyform arg input private key format (PEM or ENGINE)\n");
709 : 0 : BIO_printf (bio_err, "-keyopt nm:v set public key parameters\n");
710 : 0 : BIO_printf (bio_err, "-out file output file\n");
711 : 0 : BIO_printf (bio_err, "-outform arg output format SMIME (default), PEM or DER\n");
712 : 0 : BIO_printf (bio_err, "-content file supply or override content for detached signature\n");
713 : 0 : BIO_printf (bio_err, "-to addr to address\n");
714 : 0 : BIO_printf (bio_err, "-from ad from address\n");
715 : 0 : BIO_printf (bio_err, "-subject s subject\n");
716 : 0 : BIO_printf (bio_err, "-text include or delete text MIME headers\n");
717 : 0 : BIO_printf (bio_err, "-CApath dir trusted certificates directory\n");
718 : 0 : BIO_printf (bio_err, "-CAfile file trusted certificates file\n");
719 : 0 : BIO_printf (bio_err, "-trusted_first use locally trusted certificates first when building trust chain\n");
720 : 0 : BIO_printf (bio_err, "-crl_check check revocation status of signer's certificate using CRLs\n");
721 : 0 : BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n");
722 : : #ifndef OPENSSL_NO_ENGINE
723 : 0 : BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n");
724 : : #endif
725 : 0 : BIO_printf (bio_err, "-passin arg input file pass phrase source\n");
726 : 0 : BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
727 : 0 : BIO_printf(bio_err, " load the file (or the files in the directory) into\n");
728 : 0 : BIO_printf(bio_err, " the random number generator\n");
729 : 0 : BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n");
730 : 0 : goto end;
731 : : }
732 : :
733 : : #ifndef OPENSSL_NO_ENGINE
734 : 102 : e = setup_engine(bio_err, engine, 0);
735 : : #endif
736 : :
737 [ - + ]: 102 : if (!app_passwd(bio_err, passargin, NULL, &passin, NULL))
738 : : {
739 : 0 : BIO_printf(bio_err, "Error getting password\n");
740 : 0 : goto end;
741 : : }
742 : :
743 [ + + ]: 102 : if (need_rand)
744 : : {
745 : 45 : app_RAND_load_file(NULL, bio_err, (inrand != NULL));
746 [ - + ]: 45 : if (inrand != NULL)
747 : 0 : BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
748 : : app_RAND_load_files(inrand));
749 : : }
750 : :
751 : 102 : ret = 2;
752 : :
753 [ + + ]: 102 : if (!(operation & SMIME_SIGNERS))
754 : 74 : flags &= ~CMS_DETACHED;
755 : :
756 [ + + ]: 102 : if (operation & SMIME_OP)
757 : : {
758 [ + + ]: 52 : if (outformat == FORMAT_ASN1)
759 : 19 : outmode = "wb";
760 : : }
761 : : else
762 : : {
763 [ - + ]: 50 : if (flags & CMS_BINARY)
764 : 0 : outmode = "wb";
765 : : }
766 : :
767 [ + + ]: 102 : if (operation & SMIME_IP)
768 : : {
769 [ + + ]: 54 : if (informat == FORMAT_ASN1)
770 : 21 : inmode = "rb";
771 : : }
772 : : else
773 : : {
774 [ - + ]: 48 : if (flags & CMS_BINARY)
775 : 0 : inmode = "rb";
776 : : }
777 : :
778 [ + + ]: 102 : if (operation == SMIME_ENCRYPT)
779 : : {
780 [ + + ]: 17 : if (!cipher)
781 : : {
782 : : #ifndef OPENSSL_NO_DES
783 : 10 : cipher = EVP_des_ede3_cbc();
784 : : #else
785 : : BIO_printf(bio_err, "No cipher selected\n");
786 : : goto end;
787 : : #endif
788 : : }
789 : :
790 [ - + ]: 17 : if (secret_key && !secret_keyid)
791 : : {
792 : 0 : BIO_printf(bio_err, "No secret key id\n");
793 : 0 : goto end;
794 : : }
795 : :
796 [ + + ][ + - ]: 17 : if (*args && !encerts)
797 : 17 : encerts = sk_X509_new_null();
798 [ + + ]: 44 : while (*args)
799 : : {
800 [ + - ]: 27 : if (!(cert = load_cert(bio_err,*args,FORMAT_PEM,
801 : : NULL, e, "recipient certificate file")))
802 : : goto end;
803 : 27 : sk_X509_push(encerts, cert);
804 : 27 : cert = NULL;
805 : 27 : args++;
806 : : }
807 : : }
808 : :
809 [ + + ]: 102 : if (certfile)
810 : : {
811 [ - + ]: 2 : if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL,
812 : : e, "certificate file")))
813 : : {
814 : 0 : ERR_print_errors(bio_err);
815 : 0 : goto end;
816 : : }
817 : : }
818 : :
819 [ + + ]: 102 : if (recipfile && (operation == SMIME_DECRYPT))
820 : : {
821 [ - + ]: 13 : if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL,
822 : : e, "recipient certificate file")))
823 : : {
824 : 0 : ERR_print_errors(bio_err);
825 : 0 : goto end;
826 : : }
827 : : }
828 : :
829 [ + + ]: 102 : if (operation == SMIME_SIGN_RECEIPT)
830 : : {
831 [ - + ]: 1 : if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL,
832 : : e, "receipt signer certificate file")))
833 : : {
834 : 0 : ERR_print_errors(bio_err);
835 : 0 : goto end;
836 : : }
837 : : }
838 : :
839 [ + + ]: 102 : if (operation == SMIME_DECRYPT)
840 : : {
841 [ + + ]: 17 : if (!keyfile)
842 : 15 : keyfile = recipfile;
843 : : }
844 [ + + ]: 85 : else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT))
845 : : {
846 [ + - ]: 27 : if (!keyfile)
847 : 27 : keyfile = signerfile;
848 : : }
849 : : else keyfile = NULL;
850 : :
851 [ + + ]: 102 : if (keyfile)
852 : : {
853 : 16 : key = load_key(bio_err, keyfile, keyform, 0, passin, e,
854 : : "signing key file");
855 [ + - ]: 16 : if (!key)
856 : : goto end;
857 : : }
858 : :
859 [ + - ]: 102 : if (infile)
860 : : {
861 [ - + ]: 102 : if (!(in = BIO_new_file(infile, inmode)))
862 : : {
863 : 0 : BIO_printf (bio_err,
864 : : "Can't open input file %s\n", infile);
865 : 0 : goto end;
866 : : }
867 : : }
868 : : else
869 : 0 : in = BIO_new_fp(stdin, BIO_NOCLOSE);
870 : :
871 [ + + ]: 102 : if (operation & SMIME_IP)
872 : : {
873 [ + + ]: 54 : if (informat == FORMAT_SMIME)
874 : 22 : cms = SMIME_read_CMS(in, &indata);
875 [ + + ]: 32 : else if (informat == FORMAT_PEM)
876 : 11 : cms = PEM_read_bio_CMS(in, NULL, NULL, NULL);
877 [ + - ]: 21 : else if (informat == FORMAT_ASN1)
878 : 21 : cms = d2i_CMS_bio(in, NULL);
879 : : else
880 : : {
881 : 0 : BIO_printf(bio_err, "Bad input format for CMS file\n");
882 : 0 : goto end;
883 : : }
884 : :
885 [ - + ]: 54 : if (!cms)
886 : : {
887 : 0 : BIO_printf(bio_err, "Error reading S/MIME message\n");
888 : 0 : goto end;
889 : : }
890 [ + + ]: 54 : if (contfile)
891 : : {
892 : 6 : BIO_free(indata);
893 [ - + ]: 6 : if (!(indata = BIO_new_file(contfile, "rb")))
894 : : {
895 : 0 : BIO_printf(bio_err, "Can't read content file %s\n", contfile);
896 : 0 : goto end;
897 : : }
898 : : }
899 [ - + ]: 54 : if (certsoutfile)
900 : : {
901 : : STACK_OF(X509) *allcerts;
902 : 0 : allcerts = CMS_get1_certs(cms);
903 [ # # ]: 0 : if (!save_certs(certsoutfile, allcerts))
904 : : {
905 : 0 : BIO_printf(bio_err,
906 : : "Error writing certs to %s\n",
907 : : certsoutfile);
908 : 0 : ret = 5;
909 : 0 : goto end;
910 : : }
911 : 0 : sk_X509_pop_free(allcerts, X509_free);
912 : : }
913 : : }
914 : :
915 [ + + ]: 102 : if (rctfile)
916 : : {
917 [ + - ]: 1 : char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r";
918 [ - + ]: 1 : if (!(rctin = BIO_new_file(rctfile, rctmode)))
919 : : {
920 : 0 : BIO_printf (bio_err,
921 : : "Can't open receipt file %s\n", rctfile);
922 : 0 : goto end;
923 : : }
924 : :
925 [ + - ]: 1 : if (rctformat == FORMAT_SMIME)
926 : 1 : rcms = SMIME_read_CMS(rctin, NULL);
927 [ # # ]: 0 : else if (rctformat == FORMAT_PEM)
928 : 0 : rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL);
929 [ # # ]: 0 : else if (rctformat == FORMAT_ASN1)
930 : 0 : rcms = d2i_CMS_bio(rctin, NULL);
931 : : else
932 : : {
933 : 0 : BIO_printf(bio_err, "Bad input format for receipt\n");
934 : 0 : goto end;
935 : : }
936 : :
937 [ - + ]: 1 : if (!rcms)
938 : : {
939 : 0 : BIO_printf(bio_err, "Error reading receipt\n");
940 : 0 : goto end;
941 : : }
942 : : }
943 : :
944 [ + + ]: 102 : if (outfile)
945 : : {
946 [ - + ]: 101 : if (!(out = BIO_new_file(outfile, outmode)))
947 : : {
948 : 0 : BIO_printf (bio_err,
949 : : "Can't open output file %s\n", outfile);
950 : 0 : goto end;
951 : : }
952 : : }
953 : : else
954 : : {
955 : 1 : out = BIO_new_fp(stdout, BIO_NOCLOSE);
956 : : #ifdef OPENSSL_SYS_VMS
957 : : {
958 : : BIO *tmpbio = BIO_new(BIO_f_linebuffer());
959 : : out = BIO_push(tmpbio, out);
960 : : }
961 : : #endif
962 : : }
963 : :
964 [ + + ]: 102 : if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT))
965 : : {
966 [ + - ]: 29 : if (!(store = setup_verify(bio_err, CAfile, CApath)))
967 : : goto end;
968 : 29 : X509_STORE_set_verify_cb(store, cms_cb);
969 [ - + ]: 29 : if (vpm)
970 : 0 : X509_STORE_set1_param(store, vpm);
971 : : }
972 : :
973 : :
974 : 102 : ret = 3;
975 : :
976 [ + + ]: 102 : if (operation == SMIME_DATA_CREATE)
977 : : {
978 : 1 : cms = CMS_data_create(in, flags);
979 : : }
980 [ - + ]: 101 : else if (operation == SMIME_DIGEST_CREATE)
981 : : {
982 : 0 : cms = CMS_digest_create(in, sign_md, flags);
983 : : }
984 [ - + ]: 101 : else if (operation == SMIME_COMPRESS)
985 : : {
986 : 0 : cms = CMS_compress(in, -1, flags);
987 : : }
988 [ + + ]: 101 : else if (operation == SMIME_ENCRYPT)
989 : : {
990 : : int i;
991 : 17 : flags |= CMS_PARTIAL;
992 : 17 : cms = CMS_encrypt(NULL, in, cipher, flags);
993 [ + - ]: 17 : if (!cms)
994 : : goto end;
995 [ + + ]: 50 : for (i = 0; i < sk_X509_num(encerts); i++)
996 : : {
997 : : CMS_RecipientInfo *ri;
998 : : cms_key_param *kparam;
999 : 33 : int tflags = flags;
1000 : 33 : X509 *x = sk_X509_value(encerts, i);
1001 [ + + ]: 33 : for(kparam = key_first; kparam; kparam = kparam->next)
1002 : : {
1003 [ + - ]: 4 : if(kparam->idx == i)
1004 : : {
1005 : 4 : tflags |= CMS_KEY_PARAM;
1006 : 4 : break;
1007 : : }
1008 : : }
1009 : 33 : ri = CMS_add1_recipient_cert(cms, x, tflags);
1010 [ + - ]: 33 : if (!ri)
1011 : : goto end;
1012 [ + + ]: 33 : if (kparam)
1013 : : {
1014 : : EVP_PKEY_CTX *pctx;
1015 : 4 : pctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
1016 [ + - ]: 4 : if (!cms_set_pkey_param(pctx, kparam->param))
1017 : : goto end;
1018 : : }
1019 [ + + ]: 33 : if (CMS_RecipientInfo_type(ri) == CMS_RECIPINFO_AGREE
1020 [ - + ]: 4 : && wrap_cipher)
1021 : : {
1022 : : EVP_CIPHER_CTX *wctx;
1023 : 0 : wctx = CMS_RecipientInfo_kari_get0_ctx(ri);
1024 : 0 : EVP_EncryptInit_ex(wctx, wrap_cipher,
1025 : : NULL, NULL, NULL);
1026 : : }
1027 : : }
1028 : :
1029 [ + + ]: 17 : if (secret_key)
1030 : : {
1031 [ + - ]: 2 : if (!CMS_add0_recipient_key(cms, NID_undef,
1032 : : secret_key, secret_keylen,
1033 : : secret_keyid, secret_keyidlen,
1034 : : NULL, NULL, NULL))
1035 : : goto end;
1036 : : /* NULL these because call absorbs them */
1037 : : secret_key = NULL;
1038 : : secret_keyid = NULL;
1039 : : }
1040 [ - + ]: 17 : if (pwri_pass)
1041 : : {
1042 : 0 : pwri_tmp = (unsigned char *)BUF_strdup((char *)pwri_pass);
1043 [ # # ]: 0 : if (!pwri_tmp)
1044 : : goto end;
1045 [ # # ]: 0 : if (!CMS_add0_recipient_password(cms,
1046 : : -1, NID_undef, NID_undef,
1047 : : pwri_tmp, -1, NULL))
1048 : : goto end;
1049 : : pwri_tmp = NULL;
1050 : : }
1051 [ - + ]: 17 : if (!(flags & CMS_STREAM))
1052 : : {
1053 [ # # ]: 0 : if (!CMS_final(cms, in, NULL, flags))
1054 : : goto end;
1055 : : }
1056 : : }
1057 [ + + ]: 84 : else if (operation == SMIME_ENCRYPTED_ENCRYPT)
1058 : : {
1059 : 4 : cms = CMS_EncryptedData_encrypt(in, cipher,
1060 : : secret_key, secret_keylen,
1061 : : flags);
1062 : :
1063 : : }
1064 [ + + ]: 80 : else if (operation == SMIME_SIGN_RECEIPT)
1065 : : {
1066 : 1 : CMS_ContentInfo *srcms = NULL;
1067 : : STACK_OF(CMS_SignerInfo) *sis;
1068 : : CMS_SignerInfo *si;
1069 : 1 : sis = CMS_get0_SignerInfos(cms);
1070 [ + - ]: 1 : if (!sis)
1071 : : goto end;
1072 : 1 : si = sk_CMS_SignerInfo_value(sis, 0);
1073 : 1 : srcms = CMS_sign_receipt(si, signer, key, other, flags);
1074 [ + - ]: 1 : if (!srcms)
1075 : : goto end;
1076 : 1 : CMS_ContentInfo_free(cms);
1077 : 1 : cms = srcms;
1078 : : }
1079 [ + + ]: 79 : else if (operation & SMIME_SIGNERS)
1080 : : {
1081 : : int i;
1082 : : /* If detached data content we enable streaming if
1083 : : * S/MIME output format.
1084 : : */
1085 [ + + ]: 28 : if (operation == SMIME_SIGN)
1086 : : {
1087 : :
1088 [ + + ]: 26 : if (flags & CMS_DETACHED)
1089 : : {
1090 [ + + ]: 6 : if (outformat == FORMAT_SMIME)
1091 : 2 : flags |= CMS_STREAM;
1092 : : }
1093 : 26 : flags |= CMS_PARTIAL;
1094 : 26 : cms = CMS_sign(NULL, NULL, other, in, flags);
1095 [ + - ]: 26 : if (!cms)
1096 : : goto end;
1097 [ - + ]: 26 : if (econtent_type)
1098 : 0 : CMS_set1_eContentType(cms, econtent_type);
1099 : :
1100 [ + + ]: 26 : if (rr_to)
1101 : : {
1102 : 1 : rr = make_receipt_request(rr_to, rr_allorfirst,
1103 : : rr_from);
1104 [ - + ]: 1 : if (!rr)
1105 : : {
1106 : 0 : BIO_puts(bio_err,
1107 : : "Signed Receipt Request Creation Error\n");
1108 : 0 : goto end;
1109 : : }
1110 : : }
1111 : : }
1112 : : else
1113 : 2 : flags |= CMS_REUSE_DIGEST;
1114 [ + + ]: 86 : for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++)
1115 : : {
1116 : : CMS_SignerInfo *si;
1117 : : cms_key_param *kparam;
1118 : 58 : int tflags = flags;
1119 : 58 : signerfile = sk_OPENSSL_STRING_value(sksigners, i);
1120 : 58 : keyfile = sk_OPENSSL_STRING_value(skkeys, i);
1121 : :
1122 : 58 : signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL,
1123 : : e, "signer certificate");
1124 [ + - ]: 58 : if (!signer)
1125 : : goto end;
1126 : 58 : key = load_key(bio_err, keyfile, keyform, 0, passin, e,
1127 : : "signing key file");
1128 [ + - ]: 58 : if (!key)
1129 : : goto end;
1130 [ + + ]: 58 : for(kparam = key_first; kparam; kparam = kparam->next)
1131 : : {
1132 [ + - ]: 3 : if(kparam->idx == i)
1133 : : {
1134 : 3 : tflags |= CMS_KEY_PARAM;
1135 : 3 : break;
1136 : : }
1137 : : }
1138 : 58 : si = CMS_add1_signer(cms, signer, key, sign_md, tflags);
1139 [ + - ]: 58 : if (!si)
1140 : : goto end;
1141 [ + + ]: 58 : if (kparam)
1142 : : {
1143 : : EVP_PKEY_CTX *pctx;
1144 : 3 : pctx = CMS_SignerInfo_get0_pkey_ctx(si);
1145 [ + - ]: 3 : if (!cms_set_pkey_param(pctx, kparam->param))
1146 : : goto end;
1147 : : }
1148 [ + + ][ + - ]: 58 : if (rr && !CMS_add1_ReceiptRequest(si, rr))
1149 : : goto end;
1150 : 58 : X509_free(signer);
1151 : 58 : signer = NULL;
1152 : 58 : EVP_PKEY_free(key);
1153 : 58 : key = NULL;
1154 : : }
1155 : : /* If not streaming or resigning finalize structure */
1156 [ + + ][ + + ]: 28 : if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM))
1157 : : {
1158 [ + - ]: 12 : if (!CMS_final(cms, in, NULL, flags))
1159 : : goto end;
1160 : : }
1161 : : }
1162 : :
1163 [ - + ]: 102 : if (!cms)
1164 : : {
1165 : 0 : BIO_printf(bio_err, "Error creating CMS structure\n");
1166 : 0 : goto end;
1167 : : }
1168 : :
1169 : 102 : ret = 4;
1170 [ + + ]: 102 : if (operation == SMIME_DECRYPT)
1171 : : {
1172 [ - + ]: 17 : if (flags & CMS_DEBUG_DECRYPT)
1173 : 0 : CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags);
1174 : :
1175 [ + + ]: 17 : if (secret_key)
1176 : : {
1177 [ - + ]: 2 : if (!CMS_decrypt_set1_key(cms,
1178 : : secret_key, secret_keylen,
1179 : : secret_keyid, secret_keyidlen))
1180 : : {
1181 : 0 : BIO_puts(bio_err,
1182 : : "Error decrypting CMS using secret key\n");
1183 : 0 : goto end;
1184 : : }
1185 : : }
1186 : :
1187 [ + + ]: 17 : if (key)
1188 : : {
1189 [ - + ]: 15 : if (!CMS_decrypt_set1_pkey(cms, key, recip))
1190 : : {
1191 : 0 : BIO_puts(bio_err,
1192 : : "Error decrypting CMS using private key\n");
1193 : 0 : goto end;
1194 : : }
1195 : : }
1196 : :
1197 [ - + ]: 17 : if (pwri_pass)
1198 : : {
1199 [ # # ]: 0 : if (!CMS_decrypt_set1_password(cms, pwri_pass, -1))
1200 : : {
1201 : 0 : BIO_puts(bio_err,
1202 : : "Error decrypting CMS using password\n");
1203 : 0 : goto end;
1204 : : }
1205 : : }
1206 : :
1207 [ - + ]: 17 : if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags))
1208 : : {
1209 : 0 : BIO_printf(bio_err, "Error decrypting CMS structure\n");
1210 : 0 : goto end;
1211 : : }
1212 : : }
1213 [ + + ]: 85 : else if (operation == SMIME_DATAOUT)
1214 : : {
1215 [ + - ]: 1 : if (!CMS_data(cms, out, flags))
1216 : : goto end;
1217 : : }
1218 [ - + ]: 84 : else if (operation == SMIME_UNCOMPRESS)
1219 : : {
1220 [ # # ]: 0 : if (!CMS_uncompress(cms, indata, out, flags))
1221 : : goto end;
1222 : : }
1223 [ - + ]: 84 : else if (operation == SMIME_DIGEST_VERIFY)
1224 : : {
1225 [ # # ]: 0 : if (CMS_digest_verify(cms, indata, out, flags) > 0)
1226 : 0 : BIO_printf(bio_err, "Verification successful\n");
1227 : : else
1228 : : {
1229 : 0 : BIO_printf(bio_err, "Verification failure\n");
1230 : 0 : goto end;
1231 : : }
1232 : : }
1233 [ + + ]: 84 : else if (operation == SMIME_ENCRYPTED_DECRYPT)
1234 : : {
1235 [ + - ]: 4 : if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen,
1236 : : indata, out, flags))
1237 : : goto end;
1238 : : }
1239 [ + + ]: 80 : else if (operation == SMIME_VERIFY)
1240 : : {
1241 [ + - ]: 28 : if (CMS_verify(cms, other, store, indata, out, flags) > 0)
1242 : 28 : BIO_printf(bio_err, "Verification successful\n");
1243 : : else
1244 : : {
1245 : 0 : BIO_printf(bio_err, "Verification failure\n");
1246 [ # # ]: 0 : if (verify_retcode)
1247 : 0 : ret = verify_err + 32;
1248 : : goto end;
1249 : : }
1250 [ - + ]: 28 : if (signerfile)
1251 : : {
1252 : : STACK_OF(X509) *signers;
1253 : 0 : signers = CMS_get0_signers(cms);
1254 [ # # ]: 0 : if (!save_certs(signerfile, signers))
1255 : : {
1256 : 0 : BIO_printf(bio_err,
1257 : : "Error writing signers to %s\n",
1258 : : signerfile);
1259 : 0 : ret = 5;
1260 : 0 : goto end;
1261 : : }
1262 : 0 : sk_X509_free(signers);
1263 : : }
1264 [ - + ]: 28 : if (rr_print)
1265 : 0 : receipt_request_print(bio_err, cms);
1266 : :
1267 : : }
1268 [ + + ]: 52 : else if (operation == SMIME_VERIFY_RECEIPT)
1269 : : {
1270 [ + - ]: 1 : if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0)
1271 : 1 : BIO_printf(bio_err, "Verification successful\n");
1272 : : else
1273 : : {
1274 : 0 : BIO_printf(bio_err, "Verification failure\n");
1275 : 0 : goto end;
1276 : : }
1277 : : }
1278 : : else
1279 : : {
1280 [ - + ]: 51 : if (noout)
1281 : : {
1282 [ # # ]: 0 : if (print)
1283 : 0 : CMS_ContentInfo_print_ctx(out, cms, 0, NULL);
1284 : : }
1285 [ + + ]: 51 : else if (outformat == FORMAT_SMIME)
1286 : : {
1287 [ - + ]: 21 : if (to)
1288 : 0 : BIO_printf(out, "To: %s\n", to);
1289 [ - + ]: 21 : if (from)
1290 : 0 : BIO_printf(out, "From: %s\n", from);
1291 [ - + ]: 21 : if (subject)
1292 : 0 : BIO_printf(out, "Subject: %s\n", subject);
1293 [ - + ]: 21 : if (operation == SMIME_RESIGN)
1294 : 0 : ret = SMIME_write_CMS(out, cms, indata, flags);
1295 : : else
1296 : 21 : ret = SMIME_write_CMS(out, cms, in, flags);
1297 : : }
1298 [ + + ]: 30 : else if (outformat == FORMAT_PEM)
1299 : 11 : ret = PEM_write_bio_CMS_stream(out, cms, in, flags);
1300 [ + - ]: 19 : else if (outformat == FORMAT_ASN1)
1301 : 19 : ret = i2d_CMS_bio_stream(out,cms, in, flags);
1302 : : else
1303 : : {
1304 : 0 : BIO_printf(bio_err, "Bad output format for CMS file\n");
1305 : 0 : goto end;
1306 : : }
1307 [ + - ]: 56 : if (ret <= 0)
1308 : : {
1309 : : ret = 6;
1310 : : goto end;
1311 : : }
1312 : : }
1313 : : ret = 0;
1314 : : end:
1315 [ - + ]: 102 : if (ret)
1316 : 0 : ERR_print_errors(bio_err);
1317 [ + + ]: 102 : if (need_rand)
1318 : 45 : app_RAND_write_file(NULL, bio_err);
1319 : 102 : sk_X509_pop_free(encerts, X509_free);
1320 : 102 : sk_X509_pop_free(other, X509_free);
1321 [ - + ]: 102 : if (vpm)
1322 : 0 : X509_VERIFY_PARAM_free(vpm);
1323 [ + + ]: 102 : if (sksigners)
1324 : 28 : sk_OPENSSL_STRING_free(sksigners);
1325 [ + + ]: 102 : if (skkeys)
1326 : 28 : sk_OPENSSL_STRING_free(skkeys);
1327 [ + + ]: 102 : if (secret_key)
1328 : 10 : OPENSSL_free(secret_key);
1329 [ + + ]: 102 : if (secret_keyid)
1330 : 1 : OPENSSL_free(secret_keyid);
1331 [ - + ]: 102 : if (pwri_tmp)
1332 : 0 : OPENSSL_free(pwri_tmp);
1333 [ - + ]: 102 : if (econtent_type)
1334 : 0 : ASN1_OBJECT_free(econtent_type);
1335 [ + + ]: 102 : if (rr)
1336 : 1 : CMS_ReceiptRequest_free(rr);
1337 [ + + ]: 102 : if (rr_to)
1338 : 1 : sk_OPENSSL_STRING_free(rr_to);
1339 [ - + ]: 102 : if (rr_from)
1340 : 0 : sk_OPENSSL_STRING_free(rr_from);
1341 [ + + ]: 109 : for(key_param = key_first; key_param;)
1342 : : {
1343 : : cms_key_param *tparam;
1344 : 7 : sk_OPENSSL_STRING_free(key_param->param);
1345 : 7 : tparam = key_param->next;
1346 : 7 : OPENSSL_free(key_param);
1347 : 7 : key_param = tparam;
1348 : : }
1349 : 102 : X509_STORE_free(store);
1350 : 102 : X509_free(cert);
1351 : 102 : X509_free(recip);
1352 : 102 : X509_free(signer);
1353 : 102 : EVP_PKEY_free(key);
1354 : 102 : CMS_ContentInfo_free(cms);
1355 : 102 : CMS_ContentInfo_free(rcms);
1356 : 102 : BIO_free(rctin);
1357 : 102 : BIO_free(in);
1358 : 102 : BIO_free(indata);
1359 : 102 : BIO_free_all(out);
1360 [ - + ]: 102 : if (passin) OPENSSL_free(passin);
1361 : 102 : return (ret);
1362 : : }
1363 : :
1364 : 0 : static int save_certs(char *signerfile, STACK_OF(X509) *signers)
1365 : : {
1366 : : int i;
1367 : : BIO *tmp;
1368 [ # # ]: 0 : if (!signerfile)
1369 : : return 1;
1370 : 0 : tmp = BIO_new_file(signerfile, "w");
1371 [ # # ]: 0 : if (!tmp) return 0;
1372 [ # # ]: 0 : for(i = 0; i < sk_X509_num(signers); i++)
1373 : 0 : PEM_write_bio_X509(tmp, sk_X509_value(signers, i));
1374 : 0 : BIO_free(tmp);
1375 : 0 : return 1;
1376 : : }
1377 : :
1378 : :
1379 : : /* Minimal callback just to output policy info (if any) */
1380 : :
1381 : 122 : static int cms_cb(int ok, X509_STORE_CTX *ctx)
1382 : : {
1383 : : int error;
1384 : :
1385 : 122 : error = X509_STORE_CTX_get_error(ctx);
1386 : :
1387 : 122 : verify_err = error;
1388 : :
1389 [ + - ]: 122 : if ((error != X509_V_ERR_NO_EXPLICIT_POLICY)
1390 [ - + ]: 122 : && ((error != X509_V_OK) || (ok != 2)))
1391 : : return ok;
1392 : :
1393 : 0 : policies_print(NULL, ctx);
1394 : :
1395 : 0 : return ok;
1396 : :
1397 : : }
1398 : :
1399 : 0 : static void gnames_stack_print(BIO *out, STACK_OF(GENERAL_NAMES) *gns)
1400 : : {
1401 : : STACK_OF(GENERAL_NAME) *gens;
1402 : : GENERAL_NAME *gen;
1403 : : int i, j;
1404 [ # # ]: 0 : for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++)
1405 : : {
1406 : 0 : gens = sk_GENERAL_NAMES_value(gns, i);
1407 [ # # ]: 0 : for (j = 0; j < sk_GENERAL_NAME_num(gens); j++)
1408 : : {
1409 : 0 : gen = sk_GENERAL_NAME_value(gens, j);
1410 : 0 : BIO_puts(out, " ");
1411 : 0 : GENERAL_NAME_print(out, gen);
1412 : 0 : BIO_puts(out, "\n");
1413 : : }
1414 : : }
1415 : 0 : return;
1416 : : }
1417 : :
1418 : 0 : static void receipt_request_print(BIO *out, CMS_ContentInfo *cms)
1419 : : {
1420 : : STACK_OF(CMS_SignerInfo) *sis;
1421 : : CMS_SignerInfo *si;
1422 : : CMS_ReceiptRequest *rr;
1423 : : int allorfirst;
1424 : : STACK_OF(GENERAL_NAMES) *rto, *rlist;
1425 : : ASN1_STRING *scid;
1426 : : int i, rv;
1427 : 0 : sis = CMS_get0_SignerInfos(cms);
1428 [ # # ]: 0 : for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++)
1429 : : {
1430 : 0 : si = sk_CMS_SignerInfo_value(sis, i);
1431 : 0 : rv = CMS_get1_ReceiptRequest(si, &rr);
1432 : 0 : BIO_printf(bio_err, "Signer %d:\n", i + 1);
1433 [ # # ]: 0 : if (rv == 0)
1434 : 0 : BIO_puts(bio_err, " No Receipt Request\n");
1435 [ # # ]: 0 : else if (rv < 0)
1436 : : {
1437 : 0 : BIO_puts(bio_err, " Receipt Request Parse Error\n");
1438 : 0 : ERR_print_errors(bio_err);
1439 : : }
1440 : : else
1441 : : {
1442 : : char *id;
1443 : : int idlen;
1444 : 0 : CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst,
1445 : : &rlist, &rto);
1446 : 0 : BIO_puts(out, " Signed Content ID:\n");
1447 : 0 : idlen = ASN1_STRING_length(scid);
1448 : 0 : id = (char *)ASN1_STRING_data(scid);
1449 : 0 : BIO_dump_indent(out, id, idlen, 4);
1450 : 0 : BIO_puts(out, " Receipts From");
1451 [ # # ]: 0 : if (rlist)
1452 : : {
1453 : 0 : BIO_puts(out, " List:\n");
1454 : 0 : gnames_stack_print(out, rlist);
1455 : : }
1456 [ # # ]: 0 : else if (allorfirst == 1)
1457 : 0 : BIO_puts(out, ": First Tier\n");
1458 [ # # ]: 0 : else if (allorfirst == 0)
1459 : 0 : BIO_puts(out, ": All\n");
1460 : : else
1461 : 0 : BIO_printf(out, " Unknown (%d)\n", allorfirst);
1462 : 0 : BIO_puts(out, " Receipts To:\n");
1463 : 0 : gnames_stack_print(out, rto);
1464 : : }
1465 [ # # ]: 0 : if (rr)
1466 : 0 : CMS_ReceiptRequest_free(rr);
1467 : : }
1468 : 0 : }
1469 : :
1470 : 1 : static STACK_OF(GENERAL_NAMES) *make_names_stack(STACK_OF(OPENSSL_STRING) *ns)
1471 : : {
1472 : : int i;
1473 : : STACK_OF(GENERAL_NAMES) *ret;
1474 : 1 : GENERAL_NAMES *gens = NULL;
1475 : 1 : GENERAL_NAME *gen = NULL;
1476 : 1 : ret = sk_GENERAL_NAMES_new_null();
1477 [ + - ]: 1 : if (!ret)
1478 : : goto err;
1479 [ + + ]: 2 : for (i = 0; i < sk_OPENSSL_STRING_num(ns); i++)
1480 : : {
1481 : 1 : char *str = sk_OPENSSL_STRING_value(ns, i);
1482 : 1 : gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL, str, 0);
1483 [ + - ]: 1 : if (!gen)
1484 : : goto err;
1485 : 1 : gens = GENERAL_NAMES_new();
1486 [ + - ]: 1 : if (!gens)
1487 : : goto err;
1488 [ + - ]: 1 : if (!sk_GENERAL_NAME_push(gens, gen))
1489 : : goto err;
1490 : 1 : gen = NULL;
1491 [ + - ]: 1 : if (!sk_GENERAL_NAMES_push(ret, gens))
1492 : : goto err;
1493 : 1 : gens = NULL;
1494 : : }
1495 : :
1496 : : return ret;
1497 : :
1498 : : err:
1499 [ # # ]: 0 : if (ret)
1500 : 0 : sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free);
1501 [ # # ]: 0 : if (gens)
1502 : 0 : GENERAL_NAMES_free(gens);
1503 [ # # ]: 0 : if (gen)
1504 : 0 : GENERAL_NAME_free(gen);
1505 : : return NULL;
1506 : : }
1507 : :
1508 : :
1509 : 1 : static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
1510 : : int rr_allorfirst,
1511 : : STACK_OF(OPENSSL_STRING) *rr_from)
1512 : : {
1513 : : STACK_OF(GENERAL_NAMES) *rct_to, *rct_from;
1514 : : CMS_ReceiptRequest *rr;
1515 : 1 : rct_to = make_names_stack(rr_to);
1516 [ + - ]: 1 : if (!rct_to)
1517 : : goto err;
1518 [ - + ]: 1 : if (rr_from)
1519 : : {
1520 : 0 : rct_from = make_names_stack(rr_from);
1521 [ # # ]: 0 : if (!rct_from)
1522 : : goto err;
1523 : : }
1524 : : else
1525 : : rct_from = NULL;
1526 : 1 : rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from,
1527 : : rct_to);
1528 : 1 : return rr;
1529 : : err:
1530 : : return NULL;
1531 : : }
1532 : :
1533 : 7 : static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
1534 : : STACK_OF(OPENSSL_STRING) *param)
1535 : : {
1536 : : char *keyopt;
1537 : : int i;
1538 [ + - ]: 7 : if (sk_OPENSSL_STRING_num(param) <= 0)
1539 : : return 1;
1540 [ + + ]: 17 : for (i = 0; i < sk_OPENSSL_STRING_num(param); i++)
1541 : : {
1542 : 10 : keyopt = sk_OPENSSL_STRING_value(param, i);
1543 [ - + ]: 10 : if (pkey_ctrl_string(pctx, keyopt) <= 0)
1544 : : {
1545 : 0 : BIO_printf(bio_err, "parameter error \"%s\"\n",
1546 : : keyopt);
1547 : 0 : ERR_print_errors(bio_err);
1548 : 0 : return 0;
1549 : : }
1550 : : }
1551 : : return 1;
1552 : : }
1553 : :
1554 : : #endif
|