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