Update LibreSSL from version 2.4.4 => 2.9.1
[dragonfly.git] / crypto / libressl / apps / openssl / apps.c
1 /* $OpenBSD: apps.c,v 1.51 2019/02/09 15:49:21 inoguchi Exp $ */
2 /*
3  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
18  * All rights reserved.
19  *
20  * This package is an SSL implementation written
21  * by Eric Young (eay@cryptsoft.com).
22  * The implementation was written so as to conform with Netscapes SSL.
23  *
24  * This library is free for commercial and non-commercial use as long as
25  * the following conditions are aheared to.  The following conditions
26  * apply to all code found in this distribution, be it the RC4, RSA,
27  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
28  * included with this distribution is covered by the same copyright terms
29  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
30  *
31  * Copyright remains Eric Young's, and as such any Copyright notices in
32  * the code are not to be removed.
33  * If this package is used in a product, Eric Young should be given attribution
34  * as the author of the parts of the library used.
35  * This can be in the form of a textual message at program startup or
36  * in documentation (online or textual) provided with the package.
37  *
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions
40  * are met:
41  * 1. Redistributions of source code must retain the copyright
42  *    notice, this list of conditions and the following disclaimer.
43  * 2. Redistributions in binary form must reproduce the above copyright
44  *    notice, this list of conditions and the following disclaimer in the
45  *    documentation and/or other materials provided with the distribution.
46  * 3. All advertising materials mentioning features or use of this software
47  *    must display the following acknowledgement:
48  *    "This product includes cryptographic software written by
49  *     Eric Young (eay@cryptsoft.com)"
50  *    The word 'cryptographic' can be left out if the rouines from the library
51  *    being used are not cryptographic related :-).
52  * 4. If you include any Windows specific code (or a derivative thereof) from
53  *    the apps directory (application code) you must include an acknowledgement:
54  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
55  *
56  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
57  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
58  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
59  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
60  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
61  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
62  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
63  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
64  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66  * SUCH DAMAGE.
67  *
68  * The licence and distribution terms for any publically available version or
69  * derivative of this code cannot be changed.  i.e. this code cannot simply be
70  * copied and put under another distribution licence
71  * [including the GNU Public Licence.]
72  */
73 /* ====================================================================
74  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
75  *
76  * Redistribution and use in source and binary forms, with or without
77  * modification, are permitted provided that the following conditions
78  * are met:
79  *
80  * 1. Redistributions of source code must retain the above copyright
81  *    notice, this list of conditions and the following disclaimer.
82  *
83  * 2. Redistributions in binary form must reproduce the above copyright
84  *    notice, this list of conditions and the following disclaimer in
85  *    the documentation and/or other materials provided with the
86  *    distribution.
87  *
88  * 3. All advertising materials mentioning features or use of this
89  *    software must display the following acknowledgment:
90  *    "This product includes software developed by the OpenSSL Project
91  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
92  *
93  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
94  *    endorse or promote products derived from this software without
95  *    prior written permission. For written permission, please contact
96  *    openssl-core@openssl.org.
97  *
98  * 5. Products derived from this software may not be called "OpenSSL"
99  *    nor may "OpenSSL" appear in their names without prior written
100  *    permission of the OpenSSL Project.
101  *
102  * 6. Redistributions of any form whatsoever must retain the following
103  *    acknowledgment:
104  *    "This product includes software developed by the OpenSSL Project
105  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
106  *
107  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
108  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
109  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
110  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
111  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
112  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
113  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
114  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
115  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
116  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
117  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
118  * OF THE POSSIBILITY OF SUCH DAMAGE.
119  * ====================================================================
120  *
121  * This product includes cryptographic software written by Eric Young
122  * (eay@cryptsoft.com).  This product includes software written by Tim
123  * Hudson (tjh@cryptsoft.com).
124  *
125  */
126
127 #include <sys/types.h>
128 #include <sys/stat.h>
129
130 #include <ctype.h>
131 #include <errno.h>
132 #include <stdio.h>
133 #include <stdlib.h>
134 #include <limits.h>
135 #include <string.h>
136 #include <unistd.h>
137
138 #include "apps.h"
139
140 #include <openssl/bn.h>
141 #include <openssl/err.h>
142 #include <openssl/pem.h>
143 #include <openssl/pkcs12.h>
144 #include <openssl/safestack.h>
145 #include <openssl/x509.h>
146 #include <openssl/x509v3.h>
147
148 #include <openssl/rsa.h>
149
150 typedef struct {
151         const char *name;
152         unsigned long flag;
153         unsigned long mask;
154 } NAME_EX_TBL;
155
156 UI_METHOD *ui_method = NULL;
157
158 static int set_table_opts(unsigned long *flags, const char *arg,
159     const NAME_EX_TBL *in_tbl);
160 static int set_multi_opts(unsigned long *flags, const char *arg,
161     const NAME_EX_TBL *in_tbl);
162
163 #if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
164 /* Looks like this stuff is worth moving into separate function */
165 static EVP_PKEY *load_netscape_key(BIO *err, BIO *key, const char *file,
166     const char *key_descrip, int format);
167 #endif
168
169 int
170 str2fmt(char *s)
171 {
172         if (s == NULL)
173                 return FORMAT_UNDEF;
174         if ((*s == 'D') || (*s == 'd'))
175                 return (FORMAT_ASN1);
176         else if ((*s == 'T') || (*s == 't'))
177                 return (FORMAT_TEXT);
178         else if ((*s == 'N') || (*s == 'n'))
179                 return (FORMAT_NETSCAPE);
180         else if ((*s == 'S') || (*s == 's'))
181                 return (FORMAT_SMIME);
182         else if ((*s == 'M') || (*s == 'm'))
183                 return (FORMAT_MSBLOB);
184         else if ((*s == '1') ||
185             (strcmp(s, "PKCS12") == 0) || (strcmp(s, "pkcs12") == 0) ||
186             (strcmp(s, "P12") == 0) || (strcmp(s, "p12") == 0))
187                 return (FORMAT_PKCS12);
188         else if ((*s == 'P') || (*s == 'p')) {
189                 if (s[1] == 'V' || s[1] == 'v')
190                         return FORMAT_PVK;
191                 else
192                         return (FORMAT_PEM);
193         } else
194                 return (FORMAT_UNDEF);
195 }
196
197 void
198 program_name(char *in, char *out, int size)
199 {
200         char *p;
201
202         p = strrchr(in, '/');
203         if (p != NULL)
204                 p++;
205         else
206                 p = in;
207         strlcpy(out, p, size);
208 }
209
210 int
211 chopup_args(ARGS *arg, char *buf, int *argc, char **argv[])
212 {
213         int num, i;
214         char *p;
215
216         *argc = 0;
217         *argv = NULL;
218
219         i = 0;
220         if (arg->count == 0) {
221                 arg->count = 20;
222                 arg->data = reallocarray(NULL, arg->count, sizeof(char *));
223                 if (arg->data == NULL)
224                         return 0;
225         }
226         for (i = 0; i < arg->count; i++)
227                 arg->data[i] = NULL;
228
229         num = 0;
230         p = buf;
231         for (;;) {
232                 /* first scan over white space */
233                 if (!*p)
234                         break;
235                 while (*p && ((*p == ' ') || (*p == '\t') || (*p == '\n')))
236                         p++;
237                 if (!*p)
238                         break;
239
240                 /* The start of something good :-) */
241                 if (num >= arg->count) {
242                         char **tmp_p;
243                         int tlen = arg->count + 20;
244                         tmp_p = reallocarray(arg->data, tlen, sizeof(char *));
245                         if (tmp_p == NULL)
246                                 return 0;
247                         arg->data = tmp_p;
248                         arg->count = tlen;
249                         /* initialize newly allocated data */
250                         for (i = num; i < arg->count; i++)
251                                 arg->data[i] = NULL;
252                 }
253                 arg->data[num++] = p;
254
255                 /* now look for the end of this */
256                 if ((*p == '\'') || (*p == '\"')) {     /* scan for closing
257                                                          * quote */
258                         i = *(p++);
259                         arg->data[num - 1]++;   /* jump over quote */
260                         while (*p && (*p != i))
261                                 p++;
262                         *p = '\0';
263                 } else {
264                         while (*p && ((*p != ' ') &&
265                             (*p != '\t') && (*p != '\n')))
266                                 p++;
267
268                         if (*p == '\0')
269                                 p--;
270                         else
271                                 *p = '\0';
272                 }
273                 p++;
274         }
275         *argc = num;
276         *argv = arg->data;
277         return (1);
278 }
279
280 int
281 dump_cert_text(BIO *out, X509 *x)
282 {
283         char *p;
284
285         p = X509_NAME_oneline(X509_get_subject_name(x), NULL, 0);
286         BIO_puts(out, "subject=");
287         BIO_puts(out, p);
288         free(p);
289
290         p = X509_NAME_oneline(X509_get_issuer_name(x), NULL, 0);
291         BIO_puts(out, "\nissuer=");
292         BIO_puts(out, p);
293         BIO_puts(out, "\n");
294         free(p);
295
296         return 0;
297 }
298
299 int
300 ui_open(UI *ui)
301 {
302         return UI_method_get_opener(UI_OpenSSL()) (ui);
303 }
304
305 int
306 ui_read(UI *ui, UI_STRING *uis)
307 {
308         const char *password;
309         int string_type;
310
311         if (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD &&
312             UI_get0_user_data(ui)) {
313                 string_type = UI_get_string_type(uis);
314                 if (string_type == UIT_PROMPT || string_type == UIT_VERIFY) {
315                         password =
316                             ((PW_CB_DATA *)UI_get0_user_data(ui))->password;
317                         if (password && password[0] != '\0') {
318                                 UI_set_result(ui, uis, password);
319                                 return 1;
320                         }
321                 }
322         }
323         return UI_method_get_reader(UI_OpenSSL()) (ui, uis);
324 }
325
326 int
327 ui_write(UI *ui, UI_STRING *uis)
328 {
329         const char *password;
330         int string_type;
331
332         if (UI_get_input_flags(uis) & UI_INPUT_FLAG_DEFAULT_PWD &&
333             UI_get0_user_data(ui)) {
334                 string_type = UI_get_string_type(uis);
335                 if (string_type == UIT_PROMPT || string_type == UIT_VERIFY) {
336                         password =
337                             ((PW_CB_DATA *)UI_get0_user_data(ui))->password;
338                         if (password && password[0] != '\0')
339                                 return 1;
340                 }
341         }
342         return UI_method_get_writer(UI_OpenSSL()) (ui, uis);
343 }
344
345 int
346 ui_close(UI *ui)
347 {
348         return UI_method_get_closer(UI_OpenSSL()) (ui);
349 }
350
351 int
352 password_callback(char *buf, int bufsiz, int verify, void *arg)
353 {
354         PW_CB_DATA *cb_tmp = arg;
355         UI *ui = NULL;
356         int res = 0;
357         const char *prompt_info = NULL;
358         const char *password = NULL;
359         PW_CB_DATA *cb_data = (PW_CB_DATA *) cb_tmp;
360
361         if (cb_data) {
362                 if (cb_data->password)
363                         password = cb_data->password;
364                 if (cb_data->prompt_info)
365                         prompt_info = cb_data->prompt_info;
366         }
367         if (password) {
368                 res = strlen(password);
369                 if (res > bufsiz)
370                         res = bufsiz;
371                 memcpy(buf, password, res);
372                 return res;
373         }
374         ui = UI_new_method(ui_method);
375         if (ui) {
376                 int ok = 0;
377                 char *buff = NULL;
378                 int ui_flags = 0;
379                 char *prompt = NULL;
380
381                 prompt = UI_construct_prompt(ui, "pass phrase", prompt_info);
382
383                 ui_flags |= UI_INPUT_FLAG_DEFAULT_PWD;
384                 UI_ctrl(ui, UI_CTRL_PRINT_ERRORS, 1, 0, 0);
385
386                 if (ok >= 0)
387                         ok = UI_add_input_string(ui, prompt, ui_flags, buf,
388                             PW_MIN_LENGTH, bufsiz - 1);
389                 if (ok >= 0 && verify) {
390                         buff = malloc(bufsiz);
391                         ok = UI_add_verify_string(ui, prompt, ui_flags, buff,
392                             PW_MIN_LENGTH, bufsiz - 1, buf);
393                 }
394                 if (ok >= 0)
395                         do {
396                                 ok = UI_process(ui);
397                         } while (ok < 0 &&
398                             UI_ctrl(ui, UI_CTRL_IS_REDOABLE, 0, 0, 0));
399
400                 freezero(buff, (unsigned int) bufsiz);
401                 if (ok >= 0)
402                         res = strlen(buf);
403                 if (ok == -1) {
404                         BIO_printf(bio_err, "User interface error\n");
405                         ERR_print_errors(bio_err);
406                         explicit_bzero(buf, (unsigned int) bufsiz);
407                         res = 0;
408                 }
409                 if (ok == -2) {
410                         BIO_printf(bio_err, "aborted!\n");
411                         explicit_bzero(buf, (unsigned int) bufsiz);
412                         res = 0;
413                 }
414                 UI_free(ui);
415                 free(prompt);
416         }
417         return res;
418 }
419
420 static char *app_get_pass(BIO *err, char *arg, int keepbio);
421
422 int
423 app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2)
424 {
425         int same;
426
427         if (!arg2 || !arg1 || strcmp(arg1, arg2))
428                 same = 0;
429         else
430                 same = 1;
431         if (arg1) {
432                 *pass1 = app_get_pass(err, arg1, same);
433                 if (!*pass1)
434                         return 0;
435         } else if (pass1)
436                 *pass1 = NULL;
437         if (arg2) {
438                 *pass2 = app_get_pass(err, arg2, same ? 2 : 0);
439                 if (!*pass2)
440                         return 0;
441         } else if (pass2)
442                 *pass2 = NULL;
443         return 1;
444 }
445
446 static char *
447 app_get_pass(BIO *err, char *arg, int keepbio)
448 {
449         char *tmp, tpass[APP_PASS_LEN];
450         static BIO *pwdbio = NULL;
451         const char *errstr = NULL;
452         int i;
453
454         if (!strncmp(arg, "pass:", 5))
455                 return strdup(arg + 5);
456         if (!strncmp(arg, "env:", 4)) {
457                 tmp = getenv(arg + 4);
458                 if (!tmp) {
459                         BIO_printf(err, "Can't read environment variable %s\n",
460                             arg + 4);
461                         return NULL;
462                 }
463                 return strdup(tmp);
464         }
465         if (!keepbio || !pwdbio) {
466                 if (!strncmp(arg, "file:", 5)) {
467                         pwdbio = BIO_new_file(arg + 5, "r");
468                         if (!pwdbio) {
469                                 BIO_printf(err, "Can't open file %s\n",
470                                     arg + 5);
471                                 return NULL;
472                         }
473                 } else if (!strncmp(arg, "fd:", 3)) {
474                         BIO *btmp;
475                         i = strtonum(arg + 3, 0, INT_MAX, &errstr);
476                         if (errstr) {
477                                 BIO_printf(err,
478                                     "Invalid file descriptor %s: %s\n",
479                                     arg, errstr);
480                                 return NULL;
481                         }
482                         pwdbio = BIO_new_fd(i, BIO_NOCLOSE);
483                         if (!pwdbio) {
484                                 BIO_printf(err,
485                                     "Can't access file descriptor %s\n",
486                                     arg + 3);
487                                 return NULL;
488                         }
489                         /*
490                          * Can't do BIO_gets on an fd BIO so add a buffering
491                          * BIO
492                          */
493                         btmp = BIO_new(BIO_f_buffer());
494                         pwdbio = BIO_push(btmp, pwdbio);
495                 } else if (!strcmp(arg, "stdin")) {
496                         pwdbio = BIO_new_fp(stdin, BIO_NOCLOSE);
497                         if (!pwdbio) {
498                                 BIO_printf(err, "Can't open BIO for stdin\n");
499                                 return NULL;
500                         }
501                 } else {
502                         BIO_printf(err, "Invalid password argument \"%s\"\n",
503                             arg);
504                         return NULL;
505                 }
506         }
507         i = BIO_gets(pwdbio, tpass, APP_PASS_LEN);
508         if (keepbio != 1) {
509                 BIO_free_all(pwdbio);
510                 pwdbio = NULL;
511         }
512         if (i <= 0) {
513                 BIO_printf(err, "Error reading password from BIO\n");
514                 return NULL;
515         }
516         tmp = strchr(tpass, '\n');
517         if (tmp)
518                 *tmp = 0;
519         return strdup(tpass);
520 }
521
522 int
523 add_oid_section(BIO *err, CONF *conf)
524 {
525         char *p;
526         STACK_OF(CONF_VALUE) *sktmp;
527         CONF_VALUE *cnf;
528         int i;
529
530         if (!(p = NCONF_get_string(conf, NULL, "oid_section"))) {
531                 ERR_clear_error();
532                 return 1;
533         }
534         if (!(sktmp = NCONF_get_section(conf, p))) {
535                 BIO_printf(err, "problem loading oid section %s\n", p);
536                 return 0;
537         }
538         for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
539                 cnf = sk_CONF_VALUE_value(sktmp, i);
540                 if (OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
541                         BIO_printf(err, "problem creating object %s=%s\n",
542                             cnf->name, cnf->value);
543                         return 0;
544                 }
545         }
546         return 1;
547 }
548
549 static int
550 load_pkcs12(BIO *err, BIO *in, const char *desc, pem_password_cb *pem_cb,
551     void *cb_data, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
552 {
553         const char *pass;
554         char tpass[PEM_BUFSIZE];
555         int len, ret = 0;
556         PKCS12 *p12;
557
558         p12 = d2i_PKCS12_bio(in, NULL);
559         if (p12 == NULL) {
560                 BIO_printf(err, "Error loading PKCS12 file for %s\n", desc);
561                 goto die;
562         }
563         /* See if an empty password will do */
564         if (PKCS12_verify_mac(p12, "", 0) || PKCS12_verify_mac(p12, NULL, 0))
565                 pass = "";
566         else {
567                 if (!pem_cb)
568                         pem_cb = password_callback;
569                 len = pem_cb(tpass, PEM_BUFSIZE, 0, cb_data);
570                 if (len < 0) {
571                         BIO_printf(err, "Passpharse callback error for %s\n",
572                             desc);
573                         goto die;
574                 }
575                 if (len < PEM_BUFSIZE)
576                         tpass[len] = 0;
577                 if (!PKCS12_verify_mac(p12, tpass, len)) {
578                         BIO_printf(err,
579                             "Mac verify error (wrong password?) in PKCS12 file for %s\n", desc);
580                         goto die;
581                 }
582                 pass = tpass;
583         }
584         ret = PKCS12_parse(p12, pass, pkey, cert, ca);
585
586  die:
587         PKCS12_free(p12);
588         return ret;
589 }
590
591 X509 *
592 load_cert(BIO *err, const char *file, int format, const char *pass,
593     const char *cert_descrip)
594 {
595         X509 *x = NULL;
596         BIO *cert;
597
598         if ((cert = BIO_new(BIO_s_file())) == NULL) {
599                 ERR_print_errors(err);
600                 goto end;
601         }
602         if (file == NULL) {
603                 setvbuf(stdin, NULL, _IONBF, 0);
604                 BIO_set_fp(cert, stdin, BIO_NOCLOSE);
605         } else {
606                 if (BIO_read_filename(cert, file) <= 0) {
607                         BIO_printf(err, "Error opening %s %s\n",
608                             cert_descrip, file);
609                         ERR_print_errors(err);
610                         goto end;
611                 }
612         }
613
614         if (format == FORMAT_ASN1)
615                 x = d2i_X509_bio(cert, NULL);
616         else if (format == FORMAT_NETSCAPE) {
617                 NETSCAPE_X509 *nx;
618                 nx = ASN1_item_d2i_bio(&NETSCAPE_X509_it,
619                     cert, NULL);
620                 if (nx == NULL)
621                         goto end;
622
623                 if ((strncmp(NETSCAPE_CERT_HDR, (char *) nx->header->data,
624                     nx->header->length) != 0)) {
625                         NETSCAPE_X509_free(nx);
626                         BIO_printf(err,
627                             "Error reading header on certificate\n");
628                         goto end;
629                 }
630                 x = nx->cert;
631                 nx->cert = NULL;
632                 NETSCAPE_X509_free(nx);
633         } else if (format == FORMAT_PEM)
634                 x = PEM_read_bio_X509_AUX(cert, NULL, password_callback, NULL);
635         else if (format == FORMAT_PKCS12) {
636                 if (!load_pkcs12(err, cert, cert_descrip, NULL, NULL,
637                     NULL, &x, NULL))
638                         goto end;
639         } else {
640                 BIO_printf(err, "bad input format specified for %s\n",
641                     cert_descrip);
642                 goto end;
643         }
644
645  end:
646         if (x == NULL) {
647                 BIO_printf(err, "unable to load certificate\n");
648                 ERR_print_errors(err);
649         }
650         BIO_free(cert);
651         return (x);
652 }
653
654 EVP_PKEY *
655 load_key(BIO *err, const char *file, int format, int maybe_stdin,
656     const char *pass, const char *key_descrip)
657 {
658         BIO *key = NULL;
659         EVP_PKEY *pkey = NULL;
660         PW_CB_DATA cb_data;
661
662         cb_data.password = pass;
663         cb_data.prompt_info = file;
664
665         if (file == NULL && (!maybe_stdin)) {
666                 BIO_printf(err, "no keyfile specified\n");
667                 goto end;
668         }
669         key = BIO_new(BIO_s_file());
670         if (key == NULL) {
671                 ERR_print_errors(err);
672                 goto end;
673         }
674         if (file == NULL && maybe_stdin) {
675                 setvbuf(stdin, NULL, _IONBF, 0);
676                 BIO_set_fp(key, stdin, BIO_NOCLOSE);
677         } else if (BIO_read_filename(key, file) <= 0) {
678                 BIO_printf(err, "Error opening %s %s\n",
679                     key_descrip, file);
680                 ERR_print_errors(err);
681                 goto end;
682         }
683         if (format == FORMAT_ASN1) {
684                 pkey = d2i_PrivateKey_bio(key, NULL);
685         } else if (format == FORMAT_PEM) {
686                 pkey = PEM_read_bio_PrivateKey(key, NULL, password_callback, &cb_data);
687         }
688 #if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
689         else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC)
690                 pkey = load_netscape_key(err, key, file, key_descrip, format);
691 #endif
692         else if (format == FORMAT_PKCS12) {
693                 if (!load_pkcs12(err, key, key_descrip, password_callback, &cb_data,
694                     &pkey, NULL, NULL))
695                         goto end;
696         }
697 #if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4)
698         else if (format == FORMAT_MSBLOB)
699                 pkey = b2i_PrivateKey_bio(key);
700         else if (format == FORMAT_PVK)
701                 pkey = b2i_PVK_bio(key, password_callback,
702                     &cb_data);
703 #endif
704         else {
705                 BIO_printf(err, "bad input format specified for key file\n");
706                 goto end;
707         }
708  end:
709         BIO_free(key);
710         if (pkey == NULL) {
711                 BIO_printf(err, "unable to load %s\n", key_descrip);
712                 ERR_print_errors(err);
713         }
714         return (pkey);
715 }
716
717 EVP_PKEY *
718 load_pubkey(BIO *err, const char *file, int format, int maybe_stdin,
719     const char *pass, const char *key_descrip)
720 {
721         BIO *key = NULL;
722         EVP_PKEY *pkey = NULL;
723         PW_CB_DATA cb_data;
724
725         cb_data.password = pass;
726         cb_data.prompt_info = file;
727
728         if (file == NULL && !maybe_stdin) {
729                 BIO_printf(err, "no keyfile specified\n");
730                 goto end;
731         }
732         key = BIO_new(BIO_s_file());
733         if (key == NULL) {
734                 ERR_print_errors(err);
735                 goto end;
736         }
737         if (file == NULL && maybe_stdin) {
738                 setvbuf(stdin, NULL, _IONBF, 0);
739                 BIO_set_fp(key, stdin, BIO_NOCLOSE);
740         } else if (BIO_read_filename(key, file) <= 0) {
741                 BIO_printf(err, "Error opening %s %s\n", key_descrip, file);
742                 ERR_print_errors(err);
743                 goto end;
744         }
745         if (format == FORMAT_ASN1) {
746                 pkey = d2i_PUBKEY_bio(key, NULL);
747         }
748         else if (format == FORMAT_ASN1RSA) {
749                 RSA *rsa;
750                 rsa = d2i_RSAPublicKey_bio(key, NULL);
751                 if (rsa) {
752                         pkey = EVP_PKEY_new();
753                         if (pkey)
754                                 EVP_PKEY_set1_RSA(pkey, rsa);
755                         RSA_free(rsa);
756                 } else
757                         pkey = NULL;
758         } else if (format == FORMAT_PEMRSA) {
759                 RSA *rsa;
760                 rsa = PEM_read_bio_RSAPublicKey(key, NULL, password_callback, &cb_data);
761                 if (rsa) {
762                         pkey = EVP_PKEY_new();
763                         if (pkey)
764                                 EVP_PKEY_set1_RSA(pkey, rsa);
765                         RSA_free(rsa);
766                 } else
767                         pkey = NULL;
768         }
769         else if (format == FORMAT_PEM) {
770                 pkey = PEM_read_bio_PUBKEY(key, NULL, password_callback, &cb_data);
771         }
772 #if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
773         else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC)
774                 pkey = load_netscape_key(err, key, file, key_descrip, format);
775 #endif
776 #if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA)
777         else if (format == FORMAT_MSBLOB)
778                 pkey = b2i_PublicKey_bio(key);
779 #endif
780         else {
781                 BIO_printf(err, "bad input format specified for key file\n");
782                 goto end;
783         }
784
785  end:
786         BIO_free(key);
787         if (pkey == NULL)
788                 BIO_printf(err, "unable to load %s\n", key_descrip);
789         return (pkey);
790 }
791
792 #if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA)
793 static EVP_PKEY *
794 load_netscape_key(BIO *err, BIO *key, const char *file,
795     const char *key_descrip, int format)
796 {
797         EVP_PKEY *pkey;
798         BUF_MEM *buf;
799         RSA *rsa;
800         const unsigned char *p;
801         int size, i;
802
803         buf = BUF_MEM_new();
804         pkey = EVP_PKEY_new();
805         size = 0;
806         if (buf == NULL || pkey == NULL)
807                 goto error;
808         for (;;) {
809                 if (!BUF_MEM_grow_clean(buf, size + 1024 * 10))
810                         goto error;
811                 i = BIO_read(key, &(buf->data[size]), 1024 * 10);
812                 size += i;
813                 if (i == 0)
814                         break;
815                 if (i < 0) {
816                         BIO_printf(err, "Error reading %s %s",
817                             key_descrip, file);
818                         goto error;
819                 }
820         }
821         p = (unsigned char *) buf->data;
822         rsa = d2i_RSA_NET(NULL, &p, (long) size, NULL,
823             (format == FORMAT_IISSGC ? 1 : 0));
824         if (rsa == NULL)
825                 goto error;
826         BUF_MEM_free(buf);
827         EVP_PKEY_set1_RSA(pkey, rsa);
828         return pkey;
829
830  error:
831         BUF_MEM_free(buf);
832         EVP_PKEY_free(pkey);
833         return NULL;
834 }
835 #endif                          /* ndef OPENSSL_NO_RC4 */
836
837 static int
838 load_certs_crls(BIO *err, const char *file, int format, const char *pass,
839     const char *desc, STACK_OF(X509) **pcerts,
840     STACK_OF(X509_CRL) **pcrls)
841 {
842         int i;
843         BIO *bio;
844         STACK_OF(X509_INFO) *xis = NULL;
845         X509_INFO *xi;
846         PW_CB_DATA cb_data;
847         int rv = 0;
848
849         cb_data.password = pass;
850         cb_data.prompt_info = file;
851
852         if (format != FORMAT_PEM) {
853                 BIO_printf(err, "bad input format specified for %s\n", desc);
854                 return 0;
855         }
856         if (file == NULL)
857                 bio = BIO_new_fp(stdin, BIO_NOCLOSE);
858         else
859                 bio = BIO_new_file(file, "r");
860
861         if (bio == NULL) {
862                 BIO_printf(err, "Error opening %s %s\n",
863                     desc, file ? file : "stdin");
864                 ERR_print_errors(err);
865                 return 0;
866         }
867         xis = PEM_X509_INFO_read_bio(bio, NULL, password_callback, &cb_data);
868
869         BIO_free(bio);
870
871         if (pcerts) {
872                 *pcerts = sk_X509_new_null();
873                 if (!*pcerts)
874                         goto end;
875         }
876         if (pcrls) {
877                 *pcrls = sk_X509_CRL_new_null();
878                 if (!*pcrls)
879                         goto end;
880         }
881         for (i = 0; i < sk_X509_INFO_num(xis); i++) {
882                 xi = sk_X509_INFO_value(xis, i);
883                 if (xi->x509 && pcerts) {
884                         if (!sk_X509_push(*pcerts, xi->x509))
885                                 goto end;
886                         xi->x509 = NULL;
887                 }
888                 if (xi->crl && pcrls) {
889                         if (!sk_X509_CRL_push(*pcrls, xi->crl))
890                                 goto end;
891                         xi->crl = NULL;
892                 }
893         }
894
895         if (pcerts && sk_X509_num(*pcerts) > 0)
896                 rv = 1;
897
898         if (pcrls && sk_X509_CRL_num(*pcrls) > 0)
899                 rv = 1;
900
901  end:
902         sk_X509_INFO_pop_free(xis, X509_INFO_free);
903
904         if (rv == 0) {
905                 if (pcerts) {
906                         sk_X509_pop_free(*pcerts, X509_free);
907                         *pcerts = NULL;
908                 }
909                 if (pcrls) {
910                         sk_X509_CRL_pop_free(*pcrls, X509_CRL_free);
911                         *pcrls = NULL;
912                 }
913                 BIO_printf(err, "unable to load %s\n",
914                     pcerts ? "certificates" : "CRLs");
915                 ERR_print_errors(err);
916         }
917         return rv;
918 }
919
920 STACK_OF(X509) *
921 load_certs(BIO *err, const char *file, int format, const char *pass,
922     const char *desc)
923 {
924         STACK_OF(X509) *certs;
925
926         if (!load_certs_crls(err, file, format, pass, desc, &certs, NULL))
927                 return NULL;
928         return certs;
929 }
930
931 STACK_OF(X509_CRL) *
932 load_crls(BIO *err, const char *file, int format, const char *pass,
933     const char *desc)
934 {
935         STACK_OF(X509_CRL) *crls;
936
937         if (!load_certs_crls(err, file, format, pass, desc, NULL, &crls))
938                 return NULL;
939         return crls;
940 }
941
942 #define X509V3_EXT_UNKNOWN_MASK         (0xfL << 16)
943 /* Return error for unknown extensions */
944 #define X509V3_EXT_DEFAULT              0
945 /* Print error for unknown extensions */
946 #define X509V3_EXT_ERROR_UNKNOWN        (1L << 16)
947 /* ASN1 parse unknown extensions */
948 #define X509V3_EXT_PARSE_UNKNOWN        (2L << 16)
949 /* BIO_dump unknown extensions */
950 #define X509V3_EXT_DUMP_UNKNOWN         (3L << 16)
951
952 #define X509_FLAG_CA (X509_FLAG_NO_ISSUER | X509_FLAG_NO_PUBKEY | \
953                          X509_FLAG_NO_HEADER | X509_FLAG_NO_VERSION)
954
955 int
956 set_cert_ex(unsigned long *flags, const char *arg)
957 {
958         static const NAME_EX_TBL cert_tbl[] = {
959                 {"compatible", X509_FLAG_COMPAT, 0xffffffffl},
960                 {"ca_default", X509_FLAG_CA, 0xffffffffl},
961                 {"no_header", X509_FLAG_NO_HEADER, 0},
962                 {"no_version", X509_FLAG_NO_VERSION, 0},
963                 {"no_serial", X509_FLAG_NO_SERIAL, 0},
964                 {"no_signame", X509_FLAG_NO_SIGNAME, 0},
965                 {"no_validity", X509_FLAG_NO_VALIDITY, 0},
966                 {"no_subject", X509_FLAG_NO_SUBJECT, 0},
967                 {"no_issuer", X509_FLAG_NO_ISSUER, 0},
968                 {"no_pubkey", X509_FLAG_NO_PUBKEY, 0},
969                 {"no_extensions", X509_FLAG_NO_EXTENSIONS, 0},
970                 {"no_sigdump", X509_FLAG_NO_SIGDUMP, 0},
971                 {"no_aux", X509_FLAG_NO_AUX, 0},
972                 {"no_attributes", X509_FLAG_NO_ATTRIBUTES, 0},
973                 {"ext_default", X509V3_EXT_DEFAULT, X509V3_EXT_UNKNOWN_MASK},
974                 {"ext_error", X509V3_EXT_ERROR_UNKNOWN, X509V3_EXT_UNKNOWN_MASK},
975                 {"ext_parse", X509V3_EXT_PARSE_UNKNOWN, X509V3_EXT_UNKNOWN_MASK},
976                 {"ext_dump", X509V3_EXT_DUMP_UNKNOWN, X509V3_EXT_UNKNOWN_MASK},
977                 {NULL, 0, 0}
978         };
979         return set_multi_opts(flags, arg, cert_tbl);
980 }
981
982 int
983 set_name_ex(unsigned long *flags, const char *arg)
984 {
985         static const NAME_EX_TBL ex_tbl[] = {
986                 {"esc_2253", ASN1_STRFLGS_ESC_2253, 0},
987                 {"esc_ctrl", ASN1_STRFLGS_ESC_CTRL, 0},
988                 {"esc_msb", ASN1_STRFLGS_ESC_MSB, 0},
989                 {"use_quote", ASN1_STRFLGS_ESC_QUOTE, 0},
990                 {"utf8", ASN1_STRFLGS_UTF8_CONVERT, 0},
991                 {"ignore_type", ASN1_STRFLGS_IGNORE_TYPE, 0},
992                 {"show_type", ASN1_STRFLGS_SHOW_TYPE, 0},
993                 {"dump_all", ASN1_STRFLGS_DUMP_ALL, 0},
994                 {"dump_nostr", ASN1_STRFLGS_DUMP_UNKNOWN, 0},
995                 {"dump_der", ASN1_STRFLGS_DUMP_DER, 0},
996                 {"compat", XN_FLAG_COMPAT, 0xffffffffL},
997                 {"sep_comma_plus", XN_FLAG_SEP_COMMA_PLUS, XN_FLAG_SEP_MASK},
998                 {"sep_comma_plus_space", XN_FLAG_SEP_CPLUS_SPC, XN_FLAG_SEP_MASK},
999                 {"sep_semi_plus_space", XN_FLAG_SEP_SPLUS_SPC, XN_FLAG_SEP_MASK},
1000                 {"sep_multiline", XN_FLAG_SEP_MULTILINE, XN_FLAG_SEP_MASK},
1001                 {"dn_rev", XN_FLAG_DN_REV, 0},
1002                 {"nofname", XN_FLAG_FN_NONE, XN_FLAG_FN_MASK},
1003                 {"sname", XN_FLAG_FN_SN, XN_FLAG_FN_MASK},
1004                 {"lname", XN_FLAG_FN_LN, XN_FLAG_FN_MASK},
1005                 {"align", XN_FLAG_FN_ALIGN, 0},
1006                 {"oid", XN_FLAG_FN_OID, XN_FLAG_FN_MASK},
1007                 {"space_eq", XN_FLAG_SPC_EQ, 0},
1008                 {"dump_unknown", XN_FLAG_DUMP_UNKNOWN_FIELDS, 0},
1009                 {"RFC2253", XN_FLAG_RFC2253, 0xffffffffL},
1010                 {"oneline", XN_FLAG_ONELINE, 0xffffffffL},
1011                 {"multiline", XN_FLAG_MULTILINE, 0xffffffffL},
1012                 {"ca_default", XN_FLAG_MULTILINE, 0xffffffffL},
1013                 {NULL, 0, 0}
1014         };
1015         return set_multi_opts(flags, arg, ex_tbl);
1016 }
1017
1018 int
1019 set_ext_copy(int *copy_type, const char *arg)
1020 {
1021         if (!strcasecmp(arg, "none"))
1022                 *copy_type = EXT_COPY_NONE;
1023         else if (!strcasecmp(arg, "copy"))
1024                 *copy_type = EXT_COPY_ADD;
1025         else if (!strcasecmp(arg, "copyall"))
1026                 *copy_type = EXT_COPY_ALL;
1027         else
1028                 return 0;
1029         return 1;
1030 }
1031
1032 int
1033 copy_extensions(X509 *x, X509_REQ *req, int copy_type)
1034 {
1035         STACK_OF(X509_EXTENSION) *exts = NULL;
1036         X509_EXTENSION *ext, *tmpext;
1037         ASN1_OBJECT *obj;
1038         int i, idx, ret = 0;
1039
1040         if (!x || !req || (copy_type == EXT_COPY_NONE))
1041                 return 1;
1042         exts = X509_REQ_get_extensions(req);
1043
1044         for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
1045                 ext = sk_X509_EXTENSION_value(exts, i);
1046                 obj = X509_EXTENSION_get_object(ext);
1047                 idx = X509_get_ext_by_OBJ(x, obj, -1);
1048                 /* Does extension exist? */
1049                 if (idx != -1) {
1050                         /* If normal copy don't override existing extension */
1051                         if (copy_type == EXT_COPY_ADD)
1052                                 continue;
1053                         /* Delete all extensions of same type */
1054                         do {
1055                                 tmpext = X509_get_ext(x, idx);
1056                                 X509_delete_ext(x, idx);
1057                                 X509_EXTENSION_free(tmpext);
1058                                 idx = X509_get_ext_by_OBJ(x, obj, -1);
1059                         } while (idx != -1);
1060                 }
1061                 if (!X509_add_ext(x, ext, -1))
1062                         goto end;
1063         }
1064
1065         ret = 1;
1066
1067  end:
1068         sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
1069
1070         return ret;
1071 }
1072
1073 static int
1074 set_multi_opts(unsigned long *flags, const char *arg,
1075     const NAME_EX_TBL *in_tbl)
1076 {
1077         STACK_OF(CONF_VALUE) *vals;
1078         CONF_VALUE *val;
1079         int i, ret = 1;
1080
1081         if (!arg)
1082                 return 0;
1083         vals = X509V3_parse_list(arg);
1084         for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
1085                 val = sk_CONF_VALUE_value(vals, i);
1086                 if (!set_table_opts(flags, val->name, in_tbl))
1087                         ret = 0;
1088         }
1089         sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
1090         return ret;
1091 }
1092
1093 static int
1094 set_table_opts(unsigned long *flags, const char *arg,
1095     const NAME_EX_TBL *in_tbl)
1096 {
1097         char c;
1098         const NAME_EX_TBL *ptbl;
1099
1100         c = arg[0];
1101         if (c == '-') {
1102                 c = 0;
1103                 arg++;
1104         } else if (c == '+') {
1105                 c = 1;
1106                 arg++;
1107         } else
1108                 c = 1;
1109
1110         for (ptbl = in_tbl; ptbl->name; ptbl++) {
1111                 if (!strcasecmp(arg, ptbl->name)) {
1112                         *flags &= ~ptbl->mask;
1113                         if (c)
1114                                 *flags |= ptbl->flag;
1115                         else
1116                                 *flags &= ~ptbl->flag;
1117                         return 1;
1118                 }
1119         }
1120         return 0;
1121 }
1122
1123 void
1124 print_name(BIO *out, const char *title, X509_NAME *nm, unsigned long lflags)
1125 {
1126         char *buf;
1127         char mline = 0;
1128         int indent = 0;
1129
1130         if (title)
1131                 BIO_puts(out, title);
1132         if ((lflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
1133                 mline = 1;
1134                 indent = 4;
1135         }
1136         if (lflags == XN_FLAG_COMPAT) {
1137                 buf = X509_NAME_oneline(nm, 0, 0);
1138                 BIO_puts(out, buf);
1139                 BIO_puts(out, "\n");
1140                 free(buf);
1141         } else {
1142                 if (mline)
1143                         BIO_puts(out, "\n");
1144                 X509_NAME_print_ex(out, nm, indent, lflags);
1145                 BIO_puts(out, "\n");
1146         }
1147 }
1148
1149 X509_STORE *
1150 setup_verify(BIO *bp, char *CAfile, char *CApath)
1151 {
1152         X509_STORE *store;
1153         X509_LOOKUP *lookup;
1154
1155         if (!(store = X509_STORE_new()))
1156                 goto end;
1157         lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());
1158         if (lookup == NULL)
1159                 goto end;
1160         if (CAfile) {
1161                 if (!X509_LOOKUP_load_file(lookup, CAfile, X509_FILETYPE_PEM)) {
1162                         BIO_printf(bp, "Error loading file %s\n", CAfile);
1163                         goto end;
1164                 }
1165         } else
1166                 X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
1167
1168         lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir());
1169         if (lookup == NULL)
1170                 goto end;
1171         if (CApath) {
1172                 if (!X509_LOOKUP_add_dir(lookup, CApath, X509_FILETYPE_PEM)) {
1173                         BIO_printf(bp, "Error loading directory %s\n", CApath);
1174                         goto end;
1175                 }
1176         } else
1177                 X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
1178
1179         ERR_clear_error();
1180         return store;
1181
1182  end:
1183         X509_STORE_free(store);
1184         return NULL;
1185 }
1186
1187 int
1188 load_config(BIO *err, CONF *cnf)
1189 {
1190         static int load_config_called = 0;
1191
1192         if (load_config_called)
1193                 return 1;
1194         load_config_called = 1;
1195         if (cnf == NULL)
1196                 cnf = config;
1197         if (cnf == NULL)
1198                 return 1;
1199
1200         OPENSSL_load_builtin_modules();
1201
1202         if (CONF_modules_load(cnf, NULL, 0) <= 0) {
1203                 BIO_printf(err, "Error configuring OpenSSL\n");
1204                 ERR_print_errors(err);
1205                 return 0;
1206         }
1207         return 1;
1208 }
1209
1210 char *
1211 make_config_name()
1212 {
1213         const char *t = X509_get_default_cert_area();
1214         char *p;
1215
1216         if (asprintf(&p, "%s/openssl.cnf", t) == -1)
1217                 return NULL;
1218         return p;
1219 }
1220
1221 static unsigned long
1222 index_serial_hash(const OPENSSL_CSTRING *a)
1223 {
1224         const char *n;
1225
1226         n = a[DB_serial];
1227         while (*n == '0')
1228                 n++;
1229         return (lh_strhash(n));
1230 }
1231
1232 static int
1233 index_serial_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b)
1234 {
1235         const char *aa, *bb;
1236
1237         for (aa = a[DB_serial]; *aa == '0'; aa++)
1238                 ;
1239         for (bb = b[DB_serial]; *bb == '0'; bb++)
1240                 ;
1241         return (strcmp(aa, bb));
1242 }
1243
1244 static int
1245 index_name_qual(char **a)
1246 {
1247         return (a[0][0] == 'V');
1248 }
1249
1250 static unsigned long
1251 index_name_hash(const OPENSSL_CSTRING *a)
1252 {
1253         return (lh_strhash(a[DB_name]));
1254 }
1255
1256 int
1257 index_name_cmp(const OPENSSL_CSTRING *a, const OPENSSL_CSTRING *b)
1258 {
1259         return (strcmp(a[DB_name], b[DB_name]));
1260 }
1261
1262 static IMPLEMENT_LHASH_HASH_FN(index_serial, OPENSSL_CSTRING)
1263 static IMPLEMENT_LHASH_COMP_FN(index_serial, OPENSSL_CSTRING)
1264 static IMPLEMENT_LHASH_HASH_FN(index_name, OPENSSL_CSTRING)
1265 static IMPLEMENT_LHASH_COMP_FN(index_name, OPENSSL_CSTRING)
1266
1267 BIGNUM *
1268 load_serial(char *serialfile, int create, ASN1_INTEGER **retai)
1269 {
1270         BIO *in = NULL;
1271         BIGNUM *ret = NULL;
1272         char buf[1024];
1273         ASN1_INTEGER *ai = NULL;
1274
1275         ai = ASN1_INTEGER_new();
1276         if (ai == NULL)
1277                 goto err;
1278
1279         if ((in = BIO_new(BIO_s_file())) == NULL) {
1280                 ERR_print_errors(bio_err);
1281                 goto err;
1282         }
1283         if (BIO_read_filename(in, serialfile) <= 0) {
1284                 if (!create) {
1285                         perror(serialfile);
1286                         goto err;
1287                 } else {
1288                         ret = BN_new();
1289                         if (ret == NULL || !rand_serial(ret, ai))
1290                                 BIO_printf(bio_err, "Out of memory\n");
1291                 }
1292         } else {
1293                 if (!a2i_ASN1_INTEGER(in, ai, buf, sizeof buf)) {
1294                         BIO_printf(bio_err, "unable to load number from %s\n",
1295                             serialfile);
1296                         goto err;
1297                 }
1298                 ret = ASN1_INTEGER_to_BN(ai, NULL);
1299                 if (ret == NULL) {
1300                         BIO_printf(bio_err,
1301                             "error converting number from bin to BIGNUM\n");
1302                         goto err;
1303                 }
1304         }
1305
1306         if (ret && retai) {
1307                 *retai = ai;
1308                 ai = NULL;
1309         }
1310
1311  err:
1312         BIO_free(in);
1313         ASN1_INTEGER_free(ai);
1314         return (ret);
1315 }
1316
1317 int
1318 save_serial(char *serialfile, char *suffix, BIGNUM *serial,
1319     ASN1_INTEGER **retai)
1320 {
1321         char serialpath[PATH_MAX];
1322         BIO *out = NULL;
1323         int ret = 0, n;
1324         ASN1_INTEGER *ai = NULL;
1325
1326         if (suffix == NULL)
1327                 n = strlcpy(serialpath, serialfile, sizeof serialpath);
1328         else
1329                 n = snprintf(serialpath, sizeof serialpath, "%s.%s",
1330                     serialfile, suffix);
1331         if (n == -1 || n >= sizeof(serialpath)) {
1332                 BIO_printf(bio_err, "serial too long\n");
1333                 goto err;
1334         }
1335         out = BIO_new(BIO_s_file());
1336         if (out == NULL) {
1337                 ERR_print_errors(bio_err);
1338                 goto err;
1339         }
1340         if (BIO_write_filename(out, serialpath) <= 0) {
1341                 perror(serialfile);
1342                 goto err;
1343         }
1344         if ((ai = BN_to_ASN1_INTEGER(serial, NULL)) == NULL) {
1345                 BIO_printf(bio_err,
1346                     "error converting serial to ASN.1 format\n");
1347                 goto err;
1348         }
1349         i2a_ASN1_INTEGER(out, ai);
1350         BIO_puts(out, "\n");
1351         ret = 1;
1352         if (retai) {
1353                 *retai = ai;
1354                 ai = NULL;
1355         }
1356
1357  err:
1358         BIO_free_all(out);
1359         ASN1_INTEGER_free(ai);
1360         return (ret);
1361 }
1362
1363 int
1364 rotate_serial(char *serialfile, char *new_suffix, char *old_suffix)
1365 {
1366         char opath[PATH_MAX], npath[PATH_MAX];
1367
1368         if (snprintf(npath, sizeof npath, "%s.%s", serialfile,
1369             new_suffix) >= sizeof npath) {
1370                 BIO_printf(bio_err, "file name too long\n");
1371                 goto err;
1372         }
1373
1374         if (snprintf(opath, sizeof opath, "%s.%s", serialfile,
1375             old_suffix) >= sizeof opath) {
1376                 BIO_printf(bio_err, "file name too long\n");
1377                 goto err;
1378         }
1379
1380         if (rename(serialfile, opath) < 0 &&
1381             errno != ENOENT && errno != ENOTDIR) {
1382                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1383                     serialfile, opath);
1384                 perror("reason");
1385                 goto err;
1386         }
1387
1388
1389         if (rename(npath, serialfile) < 0) {
1390                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1391                     npath, serialfile);
1392                 perror("reason");
1393                 if (rename(opath, serialfile) < 0) {
1394                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1395                             opath, serialfile);
1396                         perror("reason");
1397                 }
1398                 goto err;
1399         }
1400         return 1;
1401
1402  err:
1403         return 0;
1404 }
1405
1406 int
1407 rand_serial(BIGNUM *b, ASN1_INTEGER *ai)
1408 {
1409         BIGNUM *btmp;
1410         int ret = 0;
1411
1412         if (b)
1413                 btmp = b;
1414         else
1415                 btmp = BN_new();
1416
1417         if (!btmp)
1418                 return 0;
1419
1420         if (!BN_pseudo_rand(btmp, SERIAL_RAND_BITS, 0, 0))
1421                 goto error;
1422         if (ai && !BN_to_ASN1_INTEGER(btmp, ai))
1423                 goto error;
1424
1425         ret = 1;
1426
1427  error:
1428         if (b != btmp)
1429                 BN_free(btmp);
1430
1431         return ret;
1432 }
1433
1434 CA_DB *
1435 load_index(char *dbfile, DB_ATTR *db_attr)
1436 {
1437         CA_DB *retdb = NULL;
1438         TXT_DB *tmpdb = NULL;
1439         BIO *in = BIO_new(BIO_s_file());
1440         CONF *dbattr_conf = NULL;
1441         char attrpath[PATH_MAX];
1442         long errorline = -1;
1443
1444         if (in == NULL) {
1445                 ERR_print_errors(bio_err);
1446                 goto err;
1447         }
1448         if (BIO_read_filename(in, dbfile) <= 0) {
1449                 perror(dbfile);
1450                 BIO_printf(bio_err, "unable to open '%s'\n", dbfile);
1451                 goto err;
1452         }
1453         if ((tmpdb = TXT_DB_read(in, DB_NUMBER)) == NULL)
1454                 goto err;
1455
1456         if (snprintf(attrpath, sizeof attrpath, "%s.attr", dbfile)
1457             >= sizeof attrpath) {
1458                 BIO_printf(bio_err, "attr filename too long\n");
1459                 goto err;
1460         }
1461
1462         dbattr_conf = NCONF_new(NULL);
1463         if (NCONF_load(dbattr_conf, attrpath, &errorline) <= 0) {
1464                 if (errorline > 0) {
1465                         BIO_printf(bio_err,
1466                             "error on line %ld of db attribute file '%s'\n",
1467                             errorline, attrpath);
1468                         goto err;
1469                 } else {
1470                         NCONF_free(dbattr_conf);
1471                         dbattr_conf = NULL;
1472                 }
1473         }
1474         if ((retdb = malloc(sizeof(CA_DB))) == NULL) {
1475                 fprintf(stderr, "Out of memory\n");
1476                 goto err;
1477         }
1478         retdb->db = tmpdb;
1479         tmpdb = NULL;
1480         if (db_attr)
1481                 retdb->attributes = *db_attr;
1482         else {
1483                 retdb->attributes.unique_subject = 1;
1484         }
1485
1486         if (dbattr_conf) {
1487                 char *p = NCONF_get_string(dbattr_conf, NULL, "unique_subject");
1488                 if (p) {
1489                         retdb->attributes.unique_subject = parse_yesno(p, 1);
1490                 }
1491         }
1492
1493  err:
1494         NCONF_free(dbattr_conf);
1495         TXT_DB_free(tmpdb);
1496         BIO_free_all(in);
1497         return retdb;
1498 }
1499
1500 int
1501 index_index(CA_DB *db)
1502 {
1503         if (!TXT_DB_create_index(db->db, DB_serial, NULL,
1504             LHASH_HASH_FN(index_serial), LHASH_COMP_FN(index_serial))) {
1505                 BIO_printf(bio_err,
1506                     "error creating serial number index:(%ld,%ld,%ld)\n",
1507                     db->db->error, db->db->arg1, db->db->arg2);
1508                 return 0;
1509         }
1510         if (db->attributes.unique_subject &&
1511             !TXT_DB_create_index(db->db, DB_name, index_name_qual,
1512             LHASH_HASH_FN(index_name), LHASH_COMP_FN(index_name))) {
1513                 BIO_printf(bio_err, "error creating name index:(%ld,%ld,%ld)\n",
1514                     db->db->error, db->db->arg1, db->db->arg2);
1515                 return 0;
1516         }
1517         return 1;
1518 }
1519
1520 int
1521 save_index(const char *file, const char *suffix, CA_DB *db)
1522 {
1523         char attrpath[PATH_MAX], dbfile[PATH_MAX];
1524         BIO *out = BIO_new(BIO_s_file());
1525         int j;
1526
1527         if (out == NULL) {
1528                 ERR_print_errors(bio_err);
1529                 goto err;
1530         }
1531         if (snprintf(attrpath, sizeof attrpath, "%s.attr.%s",
1532             file, suffix) >= sizeof attrpath) {
1533                 BIO_printf(bio_err, "file name too long\n");
1534                 goto err;
1535         }
1536         if (snprintf(dbfile, sizeof dbfile, "%s.%s",
1537             file, suffix) >= sizeof dbfile) {
1538                 BIO_printf(bio_err, "file name too long\n");
1539                 goto err;
1540         }
1541
1542         if (BIO_write_filename(out, dbfile) <= 0) {
1543                 perror(dbfile);
1544                 BIO_printf(bio_err, "unable to open '%s'\n", dbfile);
1545                 goto err;
1546         }
1547         j = TXT_DB_write(out, db->db);
1548         if (j <= 0)
1549                 goto err;
1550
1551         BIO_free(out);
1552
1553         out = BIO_new(BIO_s_file());
1554
1555         if (BIO_write_filename(out, attrpath) <= 0) {
1556                 perror(attrpath);
1557                 BIO_printf(bio_err, "unable to open '%s'\n", attrpath);
1558                 goto err;
1559         }
1560         BIO_printf(out, "unique_subject = %s\n",
1561             db->attributes.unique_subject ? "yes" : "no");
1562         BIO_free(out);
1563
1564         return 1;
1565
1566  err:
1567         return 0;
1568 }
1569
1570 int
1571 rotate_index(const char *dbfile, const char *new_suffix, const char *old_suffix)
1572 {
1573         char attrpath[PATH_MAX], nattrpath[PATH_MAX], oattrpath[PATH_MAX];
1574         char dbpath[PATH_MAX], odbpath[PATH_MAX];
1575
1576         if (snprintf(attrpath, sizeof attrpath, "%s.attr",
1577             dbfile) >= sizeof attrpath) {
1578                 BIO_printf(bio_err, "file name too long\n");
1579                 goto err;
1580         }
1581         if (snprintf(nattrpath, sizeof nattrpath, "%s.attr.%s",
1582             dbfile, new_suffix) >= sizeof nattrpath) {
1583                 BIO_printf(bio_err, "file name too long\n");
1584                 goto err;
1585         }
1586         if (snprintf(oattrpath, sizeof oattrpath, "%s.attr.%s",
1587             dbfile, old_suffix) >= sizeof oattrpath) {
1588                 BIO_printf(bio_err, "file name too long\n");
1589                 goto err;
1590         }
1591         if (snprintf(dbpath, sizeof dbpath, "%s.%s",
1592             dbfile, new_suffix) >= sizeof dbpath) {
1593                 BIO_printf(bio_err, "file name too long\n");
1594                 goto err;
1595         }
1596         if (snprintf(odbpath, sizeof odbpath, "%s.%s",
1597             dbfile, old_suffix) >= sizeof odbpath) {
1598                 BIO_printf(bio_err, "file name too long\n");
1599                 goto err;
1600         }
1601
1602         if (rename(dbfile, odbpath) < 0 && errno != ENOENT && errno != ENOTDIR) {
1603                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1604                     dbfile, odbpath);
1605                 perror("reason");
1606                 goto err;
1607         }
1608
1609         if (rename(dbpath, dbfile) < 0) {
1610                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1611                     dbpath, dbfile);
1612                 perror("reason");
1613                 if (rename(odbpath, dbfile) < 0) {
1614                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1615                             odbpath, dbfile);
1616                         perror("reason");
1617                 }
1618                 goto err;
1619         }
1620
1621         if (rename(attrpath, oattrpath) < 0 && errno != ENOENT && errno != ENOTDIR) {
1622                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1623                     attrpath, oattrpath);
1624                 perror("reason");
1625                 if (rename(dbfile, dbpath) < 0) {
1626                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1627                             dbfile, dbpath);
1628                         perror("reason");
1629                 }
1630                 if (rename(odbpath, dbfile) < 0) {
1631                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1632                             odbpath, dbfile);
1633                         perror("reason");
1634                 }
1635                 goto err;
1636         }
1637
1638         if (rename(nattrpath, attrpath) < 0) {
1639                 BIO_printf(bio_err, "unable to rename %s to %s\n",
1640                     nattrpath, attrpath);
1641                 perror("reason");
1642                 if (rename(oattrpath, attrpath) < 0) {
1643                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1644                             oattrpath, attrpath);
1645                         perror("reason");
1646                 }
1647                 if (rename(dbfile, dbpath) < 0) {
1648                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1649                             dbfile, dbpath);
1650                         perror("reason");
1651                 }
1652                 if (rename(odbpath, dbfile) < 0) {
1653                         BIO_printf(bio_err, "unable to rename %s to %s\n",
1654                             odbpath, dbfile);
1655                         perror("reason");
1656                 }
1657                 goto err;
1658         }
1659         return 1;
1660
1661  err:
1662         return 0;
1663 }
1664
1665 void
1666 free_index(CA_DB *db)
1667 {
1668         if (db) {
1669                 TXT_DB_free(db->db);
1670                 free(db);
1671         }
1672 }
1673
1674 int
1675 parse_yesno(const char *str, int def)
1676 {
1677         int ret = def;
1678
1679         if (str) {
1680                 switch (*str) {
1681                 case 'f':       /* false */
1682                 case 'F':       /* FALSE */
1683                 case 'n':       /* no */
1684                 case 'N':       /* NO */
1685                 case '0':       /* 0 */
1686                         ret = 0;
1687                         break;
1688                 case 't':       /* true */
1689                 case 'T':       /* TRUE */
1690                 case 'y':       /* yes */
1691                 case 'Y':       /* YES */
1692                 case '1':       /* 1 */
1693                         ret = 1;
1694                         break;
1695                 default:
1696                         ret = def;
1697                         break;
1698                 }
1699         }
1700         return ret;
1701 }
1702
1703 /*
1704  * subject is expected to be in the format /type0=value0/type1=value1/type2=...
1705  * where characters may be escaped by \
1706  */
1707 X509_NAME *
1708 parse_name(char *subject, long chtype, int multirdn)
1709 {
1710         X509_NAME *name = NULL;
1711         size_t buflen, max_ne;
1712         char **ne_types, **ne_values;
1713         char *buf, *bp, *sp;
1714         int i, nid, ne_num = 0;
1715         int *mval;
1716
1717         /*
1718          * Buffer to copy the types and values into. Due to escaping the
1719          * copy can only become shorter.
1720          */
1721         buflen = strlen(subject) + 1;
1722         buf = malloc(buflen);
1723
1724         /* Maximum number of name elements. */
1725         max_ne = buflen / 2 + 1;
1726         ne_types = reallocarray(NULL, max_ne, sizeof(char *));
1727         ne_values = reallocarray(NULL, max_ne, sizeof(char *));
1728         mval = reallocarray(NULL, max_ne, sizeof(int));
1729
1730         if (buf == NULL || ne_types == NULL || ne_values == NULL ||
1731             mval == NULL) {
1732                 BIO_printf(bio_err, "malloc error\n");
1733                 goto error;
1734         }
1735
1736         bp = buf;
1737         sp = subject;
1738
1739         if (*subject != '/') {
1740                 BIO_printf(bio_err, "Subject does not start with '/'.\n");
1741                 goto error;
1742         }
1743
1744         /* Skip leading '/'. */
1745         sp++;
1746
1747         /* No multivalued RDN by default. */
1748         mval[ne_num] = 0;
1749
1750         while (*sp) {
1751                 /* Collect type. */
1752                 ne_types[ne_num] = bp;
1753                 while (*sp) {
1754                         /* is there anything to escape in the type...? */
1755                         if (*sp == '\\') {
1756                                 if (*++sp)
1757                                         *bp++ = *sp++;
1758                                 else {
1759                                         BIO_printf(bio_err, "escape character "
1760                                             "at end of string\n");
1761                                         goto error;
1762                                 }
1763                         } else if (*sp == '=') {
1764                                 sp++;
1765                                 *bp++ = '\0';
1766                                 break;
1767                         } else
1768                                 *bp++ = *sp++;
1769                 }
1770                 if (!*sp) {
1771                         BIO_printf(bio_err, "end of string encountered while "
1772                             "processing type of subject name element #%d\n",
1773                             ne_num);
1774                         goto error;
1775                 }
1776                 ne_values[ne_num] = bp;
1777                 while (*sp) {
1778                         if (*sp == '\\') {
1779                                 if (*++sp)
1780                                         *bp++ = *sp++;
1781                                 else {
1782                                         BIO_printf(bio_err, "escape character "
1783                                             "at end of string\n");
1784                                         goto error;
1785                                 }
1786                         } else if (*sp == '/') {
1787                                 sp++;
1788                                 /* no multivalued RDN by default */
1789                                 mval[ne_num + 1] = 0;
1790                                 break;
1791                         } else if (*sp == '+' && multirdn) {
1792                                 /* a not escaped + signals a multivalued RDN */
1793                                 sp++;
1794                                 mval[ne_num + 1] = -1;
1795                                 break;
1796                         } else
1797                                 *bp++ = *sp++;
1798                 }
1799                 *bp++ = '\0';
1800                 ne_num++;
1801         }
1802
1803         if ((name = X509_NAME_new()) == NULL)
1804                 goto error;
1805
1806         for (i = 0; i < ne_num; i++) {
1807                 if ((nid = OBJ_txt2nid(ne_types[i])) == NID_undef) {
1808                         BIO_printf(bio_err,
1809                             "Subject Attribute %s has no known NID, skipped\n",
1810                             ne_types[i]);
1811                         continue;
1812                 }
1813                 if (!*ne_values[i]) {
1814                         BIO_printf(bio_err, "No value provided for Subject "
1815                             "Attribute %s, skipped\n", ne_types[i]);
1816                         continue;
1817                 }
1818                 if (!X509_NAME_add_entry_by_NID(name, nid, chtype,
1819                     (unsigned char *) ne_values[i], -1, -1, mval[i]))
1820                         goto error;
1821         }
1822         goto done;
1823
1824  error:
1825         X509_NAME_free(name);
1826         name = NULL;
1827
1828  done:
1829         free(ne_values);
1830         free(ne_types);
1831         free(mval);
1832         free(buf);
1833
1834         return name;
1835 }
1836
1837 int
1838 args_verify(char ***pargs, int *pargc, int *badarg, BIO *err,
1839     X509_VERIFY_PARAM **pm)
1840 {
1841         ASN1_OBJECT *otmp = NULL;
1842         unsigned long flags = 0;
1843         int i;
1844         int purpose = 0, depth = -1;
1845         char **oldargs = *pargs;
1846         char *arg = **pargs, *argn = (*pargs)[1];
1847         time_t at_time = 0;
1848         const char *errstr = NULL;
1849
1850         if (!strcmp(arg, "-policy")) {
1851                 if (!argn)
1852                         *badarg = 1;
1853                 else {
1854                         otmp = OBJ_txt2obj(argn, 0);
1855                         if (!otmp) {
1856                                 BIO_printf(err, "Invalid Policy \"%s\"\n",
1857                                     argn);
1858                                 *badarg = 1;
1859                         }
1860                 }
1861                 (*pargs)++;
1862         } else if (strcmp(arg, "-purpose") == 0) {
1863                 X509_PURPOSE *xptmp;
1864                 if (!argn)
1865                         *badarg = 1;
1866                 else {
1867                         i = X509_PURPOSE_get_by_sname(argn);
1868                         if (i < 0) {
1869                                 BIO_printf(err, "unrecognized purpose\n");
1870                                 *badarg = 1;
1871                         } else {
1872                                 xptmp = X509_PURPOSE_get0(i);
1873                                 purpose = X509_PURPOSE_get_id(xptmp);
1874                         }
1875                 }
1876                 (*pargs)++;
1877         } else if (strcmp(arg, "-verify_depth") == 0) {
1878                 if (!argn)
1879                         *badarg = 1;
1880                 else {
1881                         depth = strtonum(argn, 1, INT_MAX, &errstr);
1882                         if (errstr) {
1883                                 BIO_printf(err, "invalid depth %s: %s\n",
1884                                     argn, errstr);
1885                                 *badarg = 1;
1886                         }
1887                 }
1888                 (*pargs)++;
1889         } else if (strcmp(arg, "-attime") == 0) {
1890                 if (!argn)
1891                         *badarg = 1;
1892                 else {
1893                         long long timestamp;
1894                         /*
1895                          * interpret the -attime argument as seconds since
1896                          * Epoch
1897                          */
1898                         if (sscanf(argn, "%lli", &timestamp) != 1) {
1899                                 BIO_printf(bio_err,
1900                                     "Error parsing timestamp %s\n",
1901                                     argn);
1902                                 *badarg = 1;
1903                         }
1904                         /* XXX 2038 truncation */
1905                         at_time = (time_t) timestamp;
1906                 }
1907                 (*pargs)++;
1908         } else if (!strcmp(arg, "-ignore_critical"))
1909                 flags |= X509_V_FLAG_IGNORE_CRITICAL;
1910         else if (!strcmp(arg, "-issuer_checks"))
1911                 flags |= X509_V_FLAG_CB_ISSUER_CHECK;
1912         else if (!strcmp(arg, "-crl_check"))
1913                 flags |= X509_V_FLAG_CRL_CHECK;
1914         else if (!strcmp(arg, "-crl_check_all"))
1915                 flags |= X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL;
1916         else if (!strcmp(arg, "-policy_check"))
1917                 flags |= X509_V_FLAG_POLICY_CHECK;
1918         else if (!strcmp(arg, "-explicit_policy"))
1919                 flags |= X509_V_FLAG_EXPLICIT_POLICY;
1920         else if (!strcmp(arg, "-inhibit_any"))
1921                 flags |= X509_V_FLAG_INHIBIT_ANY;
1922         else if (!strcmp(arg, "-inhibit_map"))
1923                 flags |= X509_V_FLAG_INHIBIT_MAP;
1924         else if (!strcmp(arg, "-x509_strict"))
1925                 flags |= X509_V_FLAG_X509_STRICT;
1926         else if (!strcmp(arg, "-extended_crl"))
1927                 flags |= X509_V_FLAG_EXTENDED_CRL_SUPPORT;
1928         else if (!strcmp(arg, "-use_deltas"))
1929                 flags |= X509_V_FLAG_USE_DELTAS;
1930         else if (!strcmp(arg, "-policy_print"))
1931                 flags |= X509_V_FLAG_NOTIFY_POLICY;
1932         else if (!strcmp(arg, "-check_ss_sig"))
1933                 flags |= X509_V_FLAG_CHECK_SS_SIGNATURE;
1934         else
1935                 return 0;
1936
1937         if (*badarg) {
1938                 X509_VERIFY_PARAM_free(*pm);
1939                 *pm = NULL;
1940                 goto end;
1941         }
1942         if (!*pm && !(*pm = X509_VERIFY_PARAM_new())) {
1943                 *badarg = 1;
1944                 goto end;
1945         }
1946         if (otmp) {
1947                 X509_VERIFY_PARAM_add0_policy(*pm, otmp);
1948                 otmp = NULL;
1949         }
1950         if (flags)
1951                 X509_VERIFY_PARAM_set_flags(*pm, flags);
1952
1953         if (purpose)
1954                 X509_VERIFY_PARAM_set_purpose(*pm, purpose);
1955
1956         if (depth >= 0)
1957                 X509_VERIFY_PARAM_set_depth(*pm, depth);
1958
1959         if (at_time)
1960                 X509_VERIFY_PARAM_set_time(*pm, at_time);
1961
1962  end:
1963         (*pargs)++;
1964
1965         if (pargc)
1966                 *pargc -= *pargs - oldargs;
1967
1968         ASN1_OBJECT_free(otmp);
1969         return 1;
1970 }
1971
1972 /* Read whole contents of a BIO into an allocated memory buffer and
1973  * return it.
1974  */
1975
1976 int
1977 bio_to_mem(unsigned char **out, int maxlen, BIO *in)
1978 {
1979         BIO *mem;
1980         int len, ret;
1981         unsigned char tbuf[1024];
1982
1983         mem = BIO_new(BIO_s_mem());
1984         if (!mem)
1985                 return -1;
1986         for (;;) {
1987                 if ((maxlen != -1) && maxlen < 1024)
1988                         len = maxlen;
1989                 else
1990                         len = 1024;
1991                 len = BIO_read(in, tbuf, len);
1992                 if (len <= 0)
1993                         break;
1994                 if (BIO_write(mem, tbuf, len) != len) {
1995                         BIO_free(mem);
1996                         return -1;
1997                 }
1998                 maxlen -= len;
1999
2000                 if (maxlen == 0)
2001                         break;
2002         }
2003         ret = BIO_get_mem_data(mem, (char **) out);
2004         BIO_set_flags(mem, BIO_FLAGS_MEM_RDONLY);
2005         BIO_free(mem);
2006         return ret;
2007 }
2008
2009 int
2010 pkey_ctrl_string(EVP_PKEY_CTX *ctx, char *value)
2011 {
2012         int rv;
2013         char *stmp, *vtmp = NULL;
2014
2015         if (value == NULL)
2016                 return -1;
2017         stmp = strdup(value);
2018         if (!stmp)
2019                 return -1;
2020         vtmp = strchr(stmp, ':');
2021         if (vtmp) {
2022                 *vtmp = 0;
2023                 vtmp++;
2024         }
2025         rv = EVP_PKEY_CTX_ctrl_str(ctx, stmp, vtmp);
2026         free(stmp);
2027
2028         return rv;
2029 }
2030
2031 static void
2032 nodes_print(BIO *out, const char *name, STACK_OF(X509_POLICY_NODE) *nodes)
2033 {
2034         X509_POLICY_NODE *node;
2035         int i;
2036
2037         BIO_printf(out, "%s Policies:", name);
2038         if (nodes) {
2039                 BIO_puts(out, "\n");
2040                 for (i = 0; i < sk_X509_POLICY_NODE_num(nodes); i++) {
2041                         node = sk_X509_POLICY_NODE_value(nodes, i);
2042                         X509_POLICY_NODE_print(out, node, 2);
2043                 }
2044         } else
2045                 BIO_puts(out, " <empty>\n");
2046 }
2047
2048 void
2049 policies_print(BIO *out, X509_STORE_CTX *ctx)
2050 {
2051         X509_POLICY_TREE *tree;
2052         int explicit_policy;
2053         int free_out = 0;
2054
2055         if (out == NULL) {
2056                 out = BIO_new_fp(stderr, BIO_NOCLOSE);
2057                 free_out = 1;
2058         }
2059         tree = X509_STORE_CTX_get0_policy_tree(ctx);
2060         explicit_policy = X509_STORE_CTX_get_explicit_policy(ctx);
2061
2062         BIO_printf(out, "Require explicit Policy: %s\n",
2063             explicit_policy ? "True" : "False");
2064
2065         nodes_print(out, "Authority", X509_policy_tree_get0_policies(tree));
2066         nodes_print(out, "User", X509_policy_tree_get0_user_policies(tree));
2067
2068         if (free_out)
2069                 BIO_free(out);
2070 }
2071
2072 /*
2073  * next_protos_parse parses a comma separated list of strings into a string
2074  * in a format suitable for passing to SSL_CTX_set_next_protos_advertised.
2075  *   outlen: (output) set to the length of the resulting buffer on success.
2076  *   err: (maybe NULL) on failure, an error message line is written to this BIO.
2077  *   in: a NUL termianted string like "abc,def,ghi"
2078  *
2079  *   returns: a malloced buffer or NULL on failure.
2080  */
2081 unsigned char *
2082 next_protos_parse(unsigned short *outlen, const char *in)
2083 {
2084         size_t len;
2085         unsigned char *out;
2086         size_t i, start = 0;
2087
2088         len = strlen(in);
2089         if (len >= 65535)
2090                 return NULL;
2091
2092         out = malloc(strlen(in) + 1);
2093         if (!out)
2094                 return NULL;
2095
2096         for (i = 0; i <= len; ++i) {
2097                 if (i == len || in[i] == ',') {
2098                         if (i - start > 255) {
2099                                 free(out);
2100                                 return NULL;
2101                         }
2102                         out[start] = i - start;
2103                         start = i + 1;
2104                 } else
2105                         out[i + 1] = in[i];
2106         }
2107
2108         *outlen = len + 1;
2109         return out;
2110 }
2111
2112 int
2113 app_isdir(const char *name)
2114 {
2115         struct stat st;
2116
2117         if (stat(name, &st) == 0)
2118                 return S_ISDIR(st.st_mode);
2119         return -1;
2120 }
2121
2122 #define OPTION_WIDTH 18
2123
2124 void
2125 options_usage(struct option *opts)
2126 {
2127         const char *p, *q;
2128         char optstr[32];
2129         int i;
2130
2131         for (i = 0; opts[i].name != NULL; i++) {
2132                 if (opts[i].desc == NULL)
2133                         continue;
2134
2135                 snprintf(optstr, sizeof(optstr), "-%s %s", opts[i].name,
2136                     (opts[i].argname != NULL) ? opts[i].argname : "");
2137                 fprintf(stderr, " %-*s", OPTION_WIDTH, optstr);
2138                 if (strlen(optstr) > OPTION_WIDTH)
2139                         fprintf(stderr, "\n %-*s", OPTION_WIDTH, "");
2140
2141                 p = opts[i].desc;
2142                 while ((q = strchr(p, '\n')) != NULL) {
2143                         fprintf(stderr, " %.*s", (int)(q - p), p);
2144                         fprintf(stderr, "\n %-*s", OPTION_WIDTH, "");
2145                         p = q + 1;
2146                 }
2147                 fprintf(stderr, " %s\n", p);
2148         }
2149 }
2150
2151 int
2152 options_parse(int argc, char **argv, struct option *opts, char **unnamed,
2153     int *argsused)
2154 {
2155         const char *errstr;
2156         struct option *opt;
2157         long long val;
2158         char *arg, *p;
2159         int fmt, used;
2160         int ord = 0;
2161         int i, j;
2162
2163         if (unnamed != NULL)
2164                 *unnamed = NULL;
2165
2166         for (i = 1; i < argc; i++) {
2167                 p = arg = argv[i];
2168
2169                 /* Single unnamed argument (without leading hyphen). */
2170                 if (*p++ != '-') {
2171                         if (argsused != NULL)
2172                                 goto done;
2173                         if (unnamed == NULL)
2174                                 goto unknown;
2175                         if (*unnamed != NULL)
2176                                 goto toomany;
2177                         *unnamed = arg;
2178                         continue;
2179                 }
2180
2181                 /* End of named options (single hyphen). */
2182                 if (*p == '\0') {
2183                         if (++i >= argc)
2184                                 goto done;
2185                         if (argsused != NULL)
2186                                 goto done;
2187                         if (unnamed != NULL && i == argc - 1) {
2188                                 if (*unnamed != NULL)
2189                                         goto toomany;
2190                                 *unnamed = argv[i];
2191                                 continue;
2192                         }
2193                         goto unknown;
2194                 }
2195
2196                 /* See if there is a matching option... */
2197                 for (j = 0; opts[j].name != NULL; j++) {
2198                         if (strcmp(p, opts[j].name) == 0)
2199                                 break;
2200                 }
2201                 opt = &opts[j];
2202                 if (opt->name == NULL && opt->type == 0)
2203                         goto unknown;
2204
2205                 if (opt->type == OPTION_ARG ||
2206                     opt->type == OPTION_ARG_FORMAT ||
2207                     opt->type == OPTION_ARG_FUNC ||
2208                     opt->type == OPTION_ARG_INT ||
2209                     opt->type == OPTION_ARG_LONG ||
2210                     opt->type == OPTION_ARG_TIME) {
2211                         if (++i >= argc) {
2212                                 fprintf(stderr, "missing %s argument for -%s\n",
2213                                     opt->argname, opt->name);
2214                                 return (1);
2215                         }
2216                 }
2217
2218                 switch (opt->type) {
2219                 case OPTION_ARG:
2220                         *opt->opt.arg = argv[i];
2221                         break;
2222
2223                 case OPTION_ARGV_FUNC:
2224                         if (opt->opt.argvfunc(argc - i, &argv[i], &used) != 0)
2225                                 return (1);
2226                         i += used - 1;
2227                         break;
2228
2229                 case OPTION_ARG_FORMAT:
2230                         fmt = str2fmt(argv[i]);
2231                         if (fmt == FORMAT_UNDEF) {
2232                                 fprintf(stderr, "unknown %s '%s' for -%s\n",
2233                                     opt->argname, argv[i], opt->name);
2234                                 return (1);
2235                         }
2236                         *opt->opt.value = fmt;
2237                         break;
2238
2239                 case OPTION_ARG_FUNC:
2240                         if (opt->opt.argfunc(argv[i]) != 0)
2241                                 return (1);
2242                         break;
2243
2244                 case OPTION_ARG_INT:
2245                         val = strtonum(argv[i], 0, INT_MAX, &errstr);
2246                         if (errstr != NULL) {
2247                                 fprintf(stderr, "%s %s argument for -%s\n",
2248                                     errstr, opt->argname, opt->name);
2249                                 return (1);
2250                         }
2251                         *opt->opt.value = (int)val;
2252                         break;
2253
2254                 case OPTION_ARG_LONG:
2255                         val = strtonum(argv[i], 0, LONG_MAX, &errstr);
2256                         if (errstr != NULL) {
2257                                 fprintf(stderr, "%s %s argument for -%s\n",
2258                                     errstr, opt->argname, opt->name);
2259                                 return (1);
2260                         }
2261                         *opt->opt.lvalue = (long)val;
2262                         break;
2263
2264                 case OPTION_ARG_TIME:
2265                         val = strtonum(argv[i], 0, LLONG_MAX, &errstr);
2266                         if (errstr != NULL) {
2267                                 fprintf(stderr, "%s %s argument for -%s\n",
2268                                     errstr, opt->argname, opt->name);
2269                                 return (1);
2270                         }
2271                         *opt->opt.tvalue = val;
2272                         break;
2273
2274                 case OPTION_DISCARD:
2275                         break;
2276
2277                 case OPTION_FUNC:
2278                         if (opt->opt.func() != 0)
2279                                 return (1);
2280                         break;
2281
2282                 case OPTION_FLAG:
2283                         *opt->opt.flag = 1;
2284                         break;
2285
2286                 case OPTION_FLAG_ORD:
2287                         *opt->opt.flag = ++ord;
2288                         break;
2289
2290                 case OPTION_VALUE:
2291                         *opt->opt.value = opt->value;
2292                         break;
2293
2294                 case OPTION_VALUE_AND:
2295                         *opt->opt.value &= opt->value;
2296                         break;
2297
2298                 case OPTION_VALUE_OR:
2299                         *opt->opt.value |= opt->value;
2300                         break;
2301
2302                 default:
2303                         fprintf(stderr, "option %s - unknown type %i\n",
2304                             opt->name, opt->type);
2305                         return (1);
2306                 }
2307         }
2308
2309  done:
2310         if (argsused != NULL)
2311                 *argsused = i;
2312
2313         return (0);
2314
2315  toomany:
2316         fprintf(stderr, "too many arguments\n");
2317         return (1);
2318
2319  unknown:
2320         fprintf(stderr, "unknown option '%s'\n", arg);
2321         return (1);
2322 }
2323
2324 void
2325 show_cipher(const OBJ_NAME *name, void *arg)
2326 {
2327         int *n = arg;
2328
2329         if (!islower((unsigned char)*name->name))
2330                 return;
2331
2332         fprintf(stderr, " -%-24s%s", name->name, (++*n % 3 != 0 ? "" : "\n"));
2333 }
2334