1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* apps/x509.c */
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved.
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com).
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL.
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to.  The following conditions
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA,
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed.
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used.
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package.
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met:
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer.
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    notice, this list of conditions and the following disclaimer in the
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    documentation and/or other materials provided with the distribution.
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    must display the following acknowledgement:
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes cryptographic software written by
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *     Eric Young (eay@cryptsoft.com)"
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    The word 'cryptographic' can be left out if the rouines from the library
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    being used are not cryptographic related :-).
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    the apps directory (application code) you must include an acknowledgement:
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE.
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed.  i.e. this code cannot simply be
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.]
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <assert.h>
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h>
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <string.h>
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_NO_STDIO
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define APPS_WIN16
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "apps.h"
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bio.h>
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/asn1.h>
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/err.h>
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bn.h>
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/evp.h>
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509.h>
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509v3.h>
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/objects.h>
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/pem.h>
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_RSA
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/rsa.h>
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_DSA
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/dsa.h>
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef PROG
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define PROG x509_main
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef POSTFIX
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define	POSTFIX	".srl"
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define DEF_DAYS	30
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic const char *x509_usage[]={
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"usage: x509 args\n",
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -inform arg     - input format - default PEM (one of DER, NET or PEM)\n",
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -outform arg    - output format - default PEM (one of DER, NET or PEM)\n",
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -keyform arg    - private key format - default PEM\n",
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CAform arg     - CA format - default PEM\n",
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CAkeyform arg  - CA key format - default PEM\n",
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -in arg         - input file - default stdin\n",
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -out arg        - output file - default stdout\n",
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -passin arg     - private key password source\n",
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -serial         - print serial number value\n",
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -subject_hash   - print subject hash value\n",
102480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
103480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org" -subject_hash_old   - print old-style (MD5) subject hash value\n",
104480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -issuer_hash    - print issuer hash value\n",
106480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
107480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org" -issuer_hash_old    - print old-style (MD5) issuer hash value\n",
108480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -hash           - synonym for -subject_hash\n",
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -subject        - print subject DN\n",
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -issuer         - print issuer DN\n",
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -email          - print email address(es)\n",
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -startdate      - notBefore field\n",
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -enddate        - notAfter field\n",
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -purpose        - print out certificate purposes\n",
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -dates          - both Before and After dates\n",
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -modulus        - print the RSA key modulus\n",
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -pubkey         - output the public key\n",
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -fingerprint    - print the certificate fingerprint\n",
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -alias          - output certificate alias\n",
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -noout          - no certificate output\n",
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -ocspid         - print OCSP hash values for the subject name and public key\n",
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -ocsp_uri       - print OCSP Responder URL(s)\n",
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -trustout       - output a \"trusted\" certificate\n",
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -clrtrust       - clear all trusted purposes\n",
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -clrreject      - clear all rejected purposes\n",
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -addtrust arg   - trust certificate for a given purpose\n",
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -addreject arg  - reject certificate for a given purpose\n",
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -setalias arg   - set certificate alias\n",
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -days arg       - How long till expiry of a signed certificate - def 30 days\n",
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -checkend arg   - check whether the cert expires in the next arg seconds\n",
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"                   exit 1 if so, 0 if not\n",
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -signkey arg    - self sign cert with arg\n",
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -x509toreq      - output a certification request object\n",
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -req            - input is a certificate request, sign and output.\n",
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CA arg         - set the CA certificate, must be PEM format.\n",
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CAkey arg      - set the CA key, must be PEM format\n",
138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org"                   missing, it is assumed to be in the CA file.\n",
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CAcreateserial - create serial number file if it does not exist\n",
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -CAserial arg   - serial file\n",
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -set_serial     - serial number to use\n",
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -text           - print the certificate in text form\n",
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -C              - print out C code forms\n",
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -md2/-md5/-sha1/-mdc2 - digest to use\n",
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -extfile        - configuration file with X509V3 extensions to add\n",
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -extensions     - section from config file with X509V3 extensions to add\n",
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -clrext         - delete extensions before signing and input certificate\n",
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -nameopt arg    - various certificate name options\n",
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -engine e       - use engine e, possibly a hardware device.\n",
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org" -certopt arg    - various certificate text options\n",
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgNULL
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org};
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int MS_CALLBACK callb(int ok, X509_STORE_CTX *ctx);
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sign (X509 *x, EVP_PKEY *pkey,int days,int clrext, const EVP_MD *digest,
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						CONF *conf, char *section);
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int x509_certify (X509_STORE *ctx,char *CAfile,const EVP_MD *digest,
1602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			 X509 *x,X509 *xca,EVP_PKEY *pkey,
1612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			 STACK_OF(OPENSSL_STRING) *sigopts,
1622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			 char *serial, int create ,int days, int clrext,
1632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			 CONF *conf, char *section, ASN1_INTEGER *sno);
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt);
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int reqfile=0;
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int, char **);
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int argc, char **argv)
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ENGINE *e = NULL;
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret=1;
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_REQ *req=NULL;
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509 *x=NULL,*xca=NULL;
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_OBJECT *objtmp;
1762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	STACK_OF(OPENSSL_STRING) *sigopts = NULL;
177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY *Upkey=NULL,*CApkey=NULL;
178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER *sno = NULL;
179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i,num,badops=0;
180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO *out=NULL;
181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO *STDout=NULL;
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STACK_OF(ASN1_OBJECT) *trust = NULL, *reject = NULL;
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int informat,outformat,keyformat,CAformat,CAkeyformat;
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *infile=NULL,*outfile=NULL,*keyfile=NULL,*CAfile=NULL;
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *CAkeyfile=NULL,*CAserial=NULL;
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *alias=NULL;
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int text=0,serial=0,subject=0,issuer=0,startdate=0,enddate=0;
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int next_serial=0;
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int subject_hash=0,issuer_hash=0,ocspid=0;
190480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
191480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	int subject_hash_old=0,issuer_hash_old=0;
192480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int noout=0,sign_flag=0,CA_flag=0,CA_createserial=0,email=0;
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ocsp_uri=0;
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int trustout=0,clrtrust=0,clrreject=0,aliasout=0,clrext=0;
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int C=0;
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int x509req=0,days=DEF_DAYS,modulus=0,pubkey=0;
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int pprint = 0;
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	const char **pp;
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE *ctx=NULL;
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_REQ *rq=NULL;
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int fingerprint=0;
203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char buf[256];
204480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	const EVP_MD *md_alg,*digest=NULL;
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CONF *extconf = NULL;
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *extsect = NULL, *extfile = NULL, *passin = NULL, *passargin = NULL;
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int need_rand = 0;
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int checkend=0,checkoffset=0;
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	unsigned long nmflag = 0, certflag = 0;
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *engine=NULL;
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	reqfile=0;
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	apps_startup();
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (bio_err == NULL)
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!load_config(bio_err, NULL))
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STDout=BIO_new_fp(stdout,BIO_NOCLOSE);
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO *tmpbio = BIO_new(BIO_f_linebuffer());
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	STDout = BIO_push(tmpbio, STDout);
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	informat=FORMAT_PEM;
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	outformat=FORMAT_PEM;
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	keyformat=FORMAT_PEM;
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CAformat=FORMAT_PEM;
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	CAkeyformat=FORMAT_PEM;
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ctx=X509_STORE_new();
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (ctx == NULL) goto end;
239480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	X509_STORE_set_verify_cb(ctx,callb);
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	argc--;
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	argv++;
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	num=0;
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while (argc >= 1)
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if 	(strcmp(*argv,"-inform") == 0)
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			informat=str2fmt(*(++argv));
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-outform") == 0)
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			outformat=str2fmt(*(++argv));
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-keyform") == 0)
257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			keyformat=str2fmt(*(++argv));
260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-req") == 0)
262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			reqfile=1;
264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			need_rand = 1;
265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CAform") == 0)
267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CAformat=str2fmt(*(++argv));
270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CAkeyform") == 0)
272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CAkeyformat=str2fmt(*(++argv));
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
2762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org		else if (strcmp(*argv,"-sigopt") == 0)
2772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			{
2782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			if (--argc < 1)
2792c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org				goto bad;
2802c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			if (!sigopts)
2812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org				sigopts = sk_OPENSSL_STRING_new_null();
2822c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv)))
2832c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org				goto bad;
2842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			}
285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-days") == 0)
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			days=atoi(*(++argv));
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (days == 0)
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
2917453c6c0666947e06d87565404f4397a4b387f91digit@chromium.org				BIO_printf(bio_err,"bad number of days\n");
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto bad;
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-passin") == 0)
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			passargin= *(++argv);
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-extfile") == 0)
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			extfile= *(++argv);
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-extensions") == 0)
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			extsect= *(++argv);
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-in") == 0)
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			infile= *(++argv);
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-out") == 0)
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			outfile= *(++argv);
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-signkey") == 0)
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			keyfile= *(++argv);
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sign_flag= ++num;
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			need_rand = 1;
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CA") == 0)
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CAfile= *(++argv);
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CA_flag= ++num;
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			need_rand = 1;
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CAkey") == 0)
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CAkeyfile= *(++argv);
338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CAserial") == 0)
340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CAserial= *(++argv);
343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-set_serial") == 0)
345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!(sno = s2i_ASN1_INTEGER(NULL, *(++argv))))
348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto bad;
349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-addtrust") == 0)
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!(objtmp = OBJ_txt2obj(*(++argv), 0)))
354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					"Invalid trust object value %s\n", *argv);
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto bad;
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!trust) trust = sk_ASN1_OBJECT_new_null();
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sk_ASN1_OBJECT_push(trust, objtmp);
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			trustout = 1;
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-addreject") == 0)
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!(objtmp = OBJ_txt2obj(*(++argv), 0)))
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					"Invalid reject object value %s\n", *argv);
370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto bad;
371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!reject) reject = sk_ASN1_OBJECT_new_null();
373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sk_ASN1_OBJECT_push(reject, objtmp);
374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			trustout = 1;
375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-setalias") == 0)
377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			alias= *(++argv);
380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			trustout = 1;
381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-certopt") == 0)
383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!set_cert_ex(&certflag, *(++argv))) goto bad;
386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-nameopt") == 0)
388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!set_name_ex(&nmflag, *(++argv))) goto bad;
391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-engine") == 0)
394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			engine= *(++argv);
397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-C") == 0)
400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			C= ++num;
401c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-email") == 0)
402c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			email= ++num;
403c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-ocsp_uri") == 0)
404c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ocsp_uri= ++num;
405c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-serial") == 0)
406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			serial= ++num;
407c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-next_serial") == 0)
408c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			next_serial= ++num;
409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-modulus") == 0)
410c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			modulus= ++num;
411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-pubkey") == 0)
412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pubkey= ++num;
413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-x509toreq") == 0)
414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			x509req= ++num;
415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-text") == 0)
416c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			text= ++num;
417c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-hash") == 0
418c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			|| strcmp(*argv,"-subject_hash") == 0)
419c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			subject_hash= ++num;
420480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
421480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (strcmp(*argv,"-subject_hash_old") == 0)
422480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			subject_hash_old= ++num;
423480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
424c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-issuer_hash") == 0)
425c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			issuer_hash= ++num;
426480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
427480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (strcmp(*argv,"-issuer_hash_old") == 0)
428480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			issuer_hash_old= ++num;
429480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
430c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-subject") == 0)
431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			subject= ++num;
432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-issuer") == 0)
433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			issuer= ++num;
434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-fingerprint") == 0)
435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			fingerprint= ++num;
436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-dates") == 0)
437c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
438c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			startdate= ++num;
439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			enddate= ++num;
440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-purpose") == 0)
442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pprint= ++num;
443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-startdate") == 0)
444c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			startdate= ++num;
445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-enddate") == 0)
446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			enddate= ++num;
447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-checkend") == 0)
448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
449c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			checkoffset=atoi(*(++argv));
451c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			checkend=1;
452c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
453c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-noout") == 0)
454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			noout= ++num;
455c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-trustout") == 0)
456c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			trustout= 1;
457c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-clrtrust") == 0)
458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			clrtrust= ++num;
459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-clrreject") == 0)
460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			clrreject= ++num;
461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-alias") == 0)
462c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			aliasout= ++num;
463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-CAcreateserial") == 0)
464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			CA_createserial= ++num;
465c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-clrext") == 0)
466c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			clrext = 1;
467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#if 1 /* stay backwards-compatible with 0.9.5; this should go away soon */
468c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-crlext") == 0)
469c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
470c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"use -clrext instead of -crlext\n");
471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			clrext = 1;
472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
474c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-ocspid") == 0)
475c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ocspid= ++num;
476c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((md_alg=EVP_get_digestbyname(*argv + 1)))
477c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
478c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* ok */
479c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			digest=md_alg;
480c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
481c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
482c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
483c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"unknown option %s\n",*argv);
484c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			badops=1;
485c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
486c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
487c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		argc--;
488c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		argv++;
489c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
490c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
491c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (badops)
492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgbad:
494c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (pp=x509_usage; (*pp != NULL); pp++)
495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"%s",*pp);
496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
497c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
498c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
499c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
500c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        e = setup_engine(bio_err, engine, 0);
501c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
502c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (need_rand)
504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		app_RAND_load_file(NULL, bio_err, 0);
505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
506c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ERR_load_crypto_strings();
507c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!app_passwd(bio_err, passargin, NULL, &passin, NULL))
509c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err, "Error getting password\n");
511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
514c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_STORE_set_default_paths(ctx))
515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
517c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
519c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if ((CAkeyfile == NULL) && (CA_flag) && (CAformat == FORMAT_PEM))
521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{ CAkeyfile=CAfile; }
522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if ((CA_flag) && (CAkeyfile == NULL))
523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
524c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"need to specify a CAkey if using the CA command\n");
525c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
526c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
527c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
528c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (extfile)
529c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
530c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		long errorline = -1;
531c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_CTX ctx2;
532c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		extconf = NCONF_new(NULL);
533c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!NCONF_load(extconf, extfile,&errorline))
534c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
535c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (errorline <= 0)
536c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,
537c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					"error loading the config file '%s'\n",
538c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org								extfile);
539c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                	else
540c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        	BIO_printf(bio_err,
541c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				       "error on line %ld of config file '%s'\n"
542c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org							,errorline,extfile);
543c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
544c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
545c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!extsect)
546c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
547c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			extsect = NCONF_get_string(extconf, "default", "extensions");
548c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!extsect)
549c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
550c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ERR_clear_error();
551c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				extsect = "default";
552c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
553c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
554c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_set_ctx_test(&ctx2);
555c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_set_nconf(&ctx2, extconf);
556c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!X509V3_EXT_add_nconf(extconf, &ctx2, extsect, NULL))
557c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
558c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,
559c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				"Error Loading extension section %s\n",
560c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org								 extsect);
561c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
562c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
563c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
564c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
565c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
566c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
567c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (reqfile)
568c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EVP_PKEY *pkey;
570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO *in;
571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!sign_flag && !CA_flag)
573c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
574c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"We need a private key to sign with\n");
575c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
576c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
577c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		in=BIO_new(BIO_s_file());
578c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (in == NULL)
579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (infile == NULL)
585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_set_fp(in,stdin,BIO_NOCLOSE|BIO_FP_TEXT);
586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (BIO_read_filename(in,infile) <= 0)
589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				perror(infile);
591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_free(in);
592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto end;
593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		req=PEM_read_bio_X509_REQ(in,NULL,NULL,NULL);
596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_free(in);
597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (req == NULL)
599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (	(req->req_info == NULL) ||
605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			(req->req_info->pubkey == NULL) ||
606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			(req->req_info->pubkey->public_key == NULL) ||
607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			(req->req_info->pubkey->public_key->data == NULL))
608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"The certificate request appears to corrupted\n");
610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"It does not contain a public key\n");
611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((pkey=X509_REQ_get_pubkey(req)) == NULL)
614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	                {
615c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	                BIO_printf(bio_err,"error unpacking public key\n");
616c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	                goto end;
617c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	                }
618c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i=X509_REQ_verify(req,pkey);
619c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EVP_PKEY_free(pkey);
620c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (i < 0)
621c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
622c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"Signature verification error\n");
623c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
624c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
625c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
626c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	        if (i == 0)
627c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
628c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"Signature did not match the certificate request\n");
629c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
630c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
631c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
632c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"Signature ok\n");
633c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
634c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		print_name(bio_err, "subject=", X509_REQ_get_subject_name(req), nmflag);
635c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
636c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((x=X509_new()) == NULL) goto end;
637c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
638c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (sno == NULL)
639c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
640c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sno = ASN1_INTEGER_new();
641c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!sno || !rand_serial(NULL, sno))
642c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto end;
643c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (!X509_set_serialNumber(x, sno))
644c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto end;
645c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ASN1_INTEGER_free(sno);
646c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			sno = NULL;
647c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
648c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (!X509_set_serialNumber(x, sno))
649c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
650c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
651c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!X509_set_issuer_name(x,req->req_info->subject)) goto end;
652c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!X509_set_subject_name(x,req->req_info->subject)) goto end;
653c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
654c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_gmtime_adj(X509_get_notBefore(x),0);
655480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	        X509_time_adj_ex(X509_get_notAfter(x),days, 0, NULL);
656c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
657c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		pkey = X509_REQ_get_pubkey(req);
658c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_set_pubkey(x,pkey);
659c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EVP_PKEY_free(pkey);
660c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
661c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
662c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		x=load_cert(bio_err,infile,informat,NULL,e,"Certificate");
663c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
664c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (x == NULL) goto end;
665c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (CA_flag)
666c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
667c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		xca=load_cert(bio_err,CAfile,CAformat,NULL,e,"CA Certificate");
668c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (xca == NULL) goto end;
669c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
670c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
671c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!noout || text || next_serial)
672c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
673c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		OBJ_create("2.99999.3",
674c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			"SET.ex3","SET x509v3 extension 3");
675c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
676c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		out=BIO_new(BIO_s_file());
677c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (out == NULL)
678c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
679c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
680c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
681c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
682c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (outfile == NULL)
683c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
684c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_set_fp(out,stdout,BIO_NOCLOSE);
685c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS
686c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
687c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO *tmpbio = BIO_new(BIO_f_linebuffer());
688c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			out = BIO_push(tmpbio, out);
689c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
690c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
691c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
692c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
693c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
694c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (BIO_write_filename(out,outfile) <= 0)
695c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
696c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				perror(outfile);
697c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				goto end;
698c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
699c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
700c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
701c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
702c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (alias) X509_alias_set1(x, (unsigned char *)alias, -1);
703c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
704c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (clrtrust) X509_trust_clear(x);
705c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (clrreject) X509_reject_clear(x);
706c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
707c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (trust)
708c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
709c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i = 0; i < sk_ASN1_OBJECT_num(trust); i++)
710c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
711c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			objtmp = sk_ASN1_OBJECT_value(trust, i);
712c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509_add1_trust_object(x, objtmp);
713c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
714c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
715c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
716c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (reject)
717c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
718c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i = 0; i < sk_ASN1_OBJECT_num(reject); i++)
719c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
720c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			objtmp = sk_ASN1_OBJECT_value(reject, i);
721c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509_add1_reject_object(x, objtmp);
722c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
723c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
724c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
725c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (num)
726c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
727c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (i=1; i<=num; i++)
728c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
729c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (issuer == i)
730c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
731c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				print_name(STDout, "issuer= ",
732c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509_get_issuer_name(x), nmflag);
733c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
734c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (subject == i)
735c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
736c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				print_name(STDout, "subject= ",
737c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509_get_subject_name(x), nmflag);
738c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
739c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (serial == i)
740c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
741c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"serial=");
742c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				i2a_ASN1_INTEGER(STDout,
743c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509_get_serialNumber(x));
744c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"\n");
745c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
746c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (next_serial == i)
747c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
748c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIGNUM *bnser;
749c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ASN1_INTEGER *ser;
750c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ser = X509_get_serialNumber(x);
751c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				bnser = ASN1_INTEGER_to_BN(ser, NULL);
752c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!bnser)
753c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
754c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!BN_add_word(bnser, 1))
755c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
756c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ser = BN_to_ASN1_INTEGER(bnser, NULL);
757c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!ser)
758c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
759c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BN_free(bnser);
760c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				i2a_ASN1_INTEGER(out, ser);
761c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ASN1_INTEGER_free(ser);
762c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_puts(out, "\n");
763c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
764c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((email == i) || (ocsp_uri == i))
765c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
766c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				int j;
767480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				STACK_OF(OPENSSL_STRING) *emlst;
768c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (email == i)
769c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					emlst = X509_get1_email(x);
770c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
771c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					emlst = X509_get1_ocsp(x);
772480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				for (j = 0; j < sk_OPENSSL_STRING_num(emlst); j++)
773480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org					BIO_printf(STDout, "%s\n",
774480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org						   sk_OPENSSL_STRING_value(emlst, j));
775c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509_email_free(emlst);
776c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
777c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (aliasout == i)
778c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
779c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				unsigned char *alstr;
780c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				alstr = X509_alias_get0(x, NULL);
781c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (alstr) BIO_printf(STDout,"%s\n", alstr);
782c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else BIO_puts(STDout,"<No Alias>\n");
783c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
784c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (subject_hash == i)
785c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
786c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"%08lx\n",X509_subject_name_hash(x));
787c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
788480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
789480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			else if (subject_hash_old == i)
790480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				{
791480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				BIO_printf(STDout,"%08lx\n",X509_subject_name_hash_old(x));
792480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				}
793480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
794c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (issuer_hash == i)
795c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
796c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"%08lx\n",X509_issuer_name_hash(x));
797c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
798480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifndef OPENSSL_NO_MD5
799480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			else if (issuer_hash_old == i)
800480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				{
801480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				BIO_printf(STDout,"%08lx\n",X509_issuer_name_hash_old(x));
802480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				}
803480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
804c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (pprint == i)
805c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
806c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509_PURPOSE *ptmp;
807c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				int j;
808c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout, "Certificate purposes:\n");
809c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (j = 0; j < X509_PURPOSE_get_count(); j++)
810c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
811c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					ptmp = X509_PURPOSE_get0(j);
812c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					purpose_print(STDout, x, ptmp);
813c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
814c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
815c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
816c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (modulus == i)
817c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
818c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY *pkey;
819c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
820c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				pkey=X509_get_pubkey(x);
821c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (pkey == NULL)
822c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
823c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(bio_err,"Modulus=unavailable\n");
824c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					ERR_print_errors(bio_err);
825c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
826c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
827c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"Modulus=");
828c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_RSA
829c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (pkey->type == EVP_PKEY_RSA)
830c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BN_print(STDout,pkey->pkey.rsa->n);
831c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
832c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
833c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_DSA
834c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (pkey->type == EVP_PKEY_DSA)
835c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BN_print(STDout,pkey->pkey.dsa->pub_key);
836c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
837c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
838c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(STDout,"Wrong Algorithm type");
839c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"\n");
840c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY_free(pkey);
841c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
842c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
843c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (pubkey == i)
844c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
845c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY *pkey;
846c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
847c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				pkey=X509_get_pubkey(x);
848c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (pkey == NULL)
849c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
850c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(bio_err,"Error getting public key\n");
851c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					ERR_print_errors(bio_err);
852c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
853c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
854c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				PEM_write_bio_PUBKEY(STDout, pkey);
855c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY_free(pkey);
856c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
857c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else
858c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (C == i)
859c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
860c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				unsigned char *d;
861c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				char *m;
862c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				int y,z;
863c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
864c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509_NAME_oneline(X509_get_subject_name(x),
865c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					buf,sizeof buf);
866c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"/* subject:%s */\n",buf);
867c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				m=X509_NAME_oneline(
868c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509_get_issuer_name(x),buf,
869c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					sizeof buf);
870c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"/* issuer :%s */\n",buf);
871c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
872c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				z=i2d_X509(x,NULL);
873c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				m=OPENSSL_malloc(z);
874c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
875c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				d=(unsigned char *)m;
876c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				z=i2d_X509_NAME(X509_get_subject_name(x),&d);
877c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"unsigned char XXX_subject_name[%d]={\n",z);
878c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				d=(unsigned char *)m;
879c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (y=0; y<z; y++)
880c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
881c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(STDout,"0x%02X,",d[y]);
882c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if ((y & 0x0f) == 0x0f) BIO_printf(STDout,"\n");
883c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
884c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (y%16 != 0) BIO_printf(STDout,"\n");
885c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"};\n");
886c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
887c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				z=i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x),&d);
888c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"unsigned char XXX_public_key[%d]={\n",z);
889c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				d=(unsigned char *)m;
890c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (y=0; y<z; y++)
891c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
892c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(STDout,"0x%02X,",d[y]);
893c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if ((y & 0x0f) == 0x0f)
894c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						BIO_printf(STDout,"\n");
895c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
896c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (y%16 != 0) BIO_printf(STDout,"\n");
897c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"};\n");
898c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
899c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				z=i2d_X509(x,&d);
900c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"unsigned char XXX_certificate[%d]={\n",z);
901c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				d=(unsigned char *)m;
902c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (y=0; y<z; y++)
903c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
904c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(STDout,"0x%02X,",d[y]);
905c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if ((y & 0x0f) == 0x0f)
906c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						BIO_printf(STDout,"\n");
907c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
908c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (y%16 != 0) BIO_printf(STDout,"\n");
909c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"};\n");
910c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
911c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				OPENSSL_free(m);
912c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
913c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (text == i)
914c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
9157453c6c0666947e06d87565404f4397a4b387f91digit@chromium.org				X509_print_ex(STDout,x,nmflag, certflag);
916c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
917c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (startdate == i)
918c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
919c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_puts(STDout,"notBefore=");
920c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ASN1_TIME_print(STDout,X509_get_notBefore(x));
921c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_puts(STDout,"\n");
922c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
923c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (enddate == i)
924c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
925c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_puts(STDout,"notAfter=");
926c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				ASN1_TIME_print(STDout,X509_get_notAfter(x));
927c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_puts(STDout,"\n");
928c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
929c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (fingerprint == i)
930c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
931c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				int j;
932c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				unsigned int n;
933c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				unsigned char md[EVP_MAX_MD_SIZE];
934480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				const EVP_MD *fdig = digest;
935480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
936480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				if (!fdig)
937480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org					fdig = EVP_sha1();
938c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
939480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org				if (!X509_digest(x,fdig,md,&n))
940c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
941c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(bio_err,"out of memory\n");
942c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
943c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
944c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(STDout,"%s Fingerprint=",
945480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org						OBJ_nid2sn(EVP_MD_type(fdig)));
946c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				for (j=0; j<(int)n; j++)
947c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
948c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(STDout,"%02X%c",md[j],
949c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						(j+1 == (int)n)
950c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						?'\n':':');
951c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
952c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
953c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
954c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			/* should be in the library */
955c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if ((sign_flag == i) && (x509req == 0))
956c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
957c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,"Getting Private key\n");
958c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (Upkey == NULL)
959c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
960c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					Upkey=load_key(bio_err,
961c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						keyfile, keyformat, 0,
962c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						passin, e, "Private key");
963c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if (Upkey == NULL) goto end;
964c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
965c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
966c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				assert(need_rand);
967c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!sign(x,Upkey,days,clrext,digest,
968c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						 extconf, extsect)) goto end;
969c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
970c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (CA_flag == i)
971c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
972c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,"Getting CA Private Key\n");
973c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (CAkeyfile != NULL)
974c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
975c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					CApkey=load_key(bio_err,
976c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						CAkeyfile, CAkeyformat,
977c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						0, passin, e,
978c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						"CA Private Key");
979c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if (CApkey == NULL) goto end;
980c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
981c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
982c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				assert(need_rand);
983c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!x509_certify(ctx,CAfile,digest,x,xca,
9842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org					CApkey, sigopts,
9852c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org					CAserial,CA_createserial,days, clrext,
986c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					extconf, extsect, sno))
987c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
988c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
989c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (x509req == i)
990c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
991c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY *pk;
992c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
993c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,"Getting request Private Key\n");
994c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (keyfile == NULL)
995c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
996c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					BIO_printf(bio_err,"no request key file specified\n");
997c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
998c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
999c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				else
1000c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
1001c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					pk=load_key(bio_err,
1002480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org						keyfile, keyformat, 0,
1003c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						passin, e, "request key");
1004c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					if (pk == NULL) goto end;
1005c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
1006c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1007c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				BIO_printf(bio_err,"Generating certificate request\n");
1008c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1009c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				rq=X509_to_X509_REQ(x,pk,digest);
1010c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				EVP_PKEY_free(pk);
1011c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (rq == NULL)
1012c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
1013c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					ERR_print_errors(bio_err);
1014c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					goto end;
1015c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
1016c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				if (!noout)
1017c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					{
1018c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					X509_REQ_print(out,rq);
1019c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					PEM_write_bio_X509_REQ(out,rq);
1020c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org					}
1021c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				noout=1;
1022c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
1023c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			else if (ocspid == i)
1024c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
1025c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				X509_ocspid_print(out, x);
1026c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
1027c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
1028c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1029c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1030c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (checkend)
1031c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1032c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		time_t tcheck=time(NULL) + checkoffset;
1033c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1034c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (X509_cmp_time(X509_get_notAfter(x), &tcheck) < 0)
1035c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
1036c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(out,"Certificate will expire\n");
1037c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ret=1;
1038c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
1039c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
1040c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
1041c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(out,"Certificate will not expire\n");
1042c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ret=0;
1043c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
1044c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1045c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1046c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1047c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (noout)
1048c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1049c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ret=0;
1050c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1051c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1052c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1053c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if 	(outformat == FORMAT_ASN1)
1054c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		i=i2d_X509_bio(out,x);
1055c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if (outformat == FORMAT_PEM)
1056c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1057c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (trustout) i=PEM_write_bio_X509_AUX(out,x);
1058c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else i=PEM_write_bio_X509(out,x);
1059c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1060c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if (outformat == FORMAT_NETSCAPE)
1061c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1062480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		NETSCAPE_X509 nx;
1063480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		ASN1_OCTET_STRING hdr;
1064c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1065480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		hdr.data=(unsigned char *)NETSCAPE_CERT_HDR;
1066480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		hdr.length=strlen(NETSCAPE_CERT_HDR);
1067480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		nx.header= &hdr;
1068480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		nx.cert=x;
1069c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1070480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		i=ASN1_item_i2d_bio(ASN1_ITEM_rptr(NETSCAPE_X509),out,&nx);
1071c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1072c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else	{
1073c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"bad output format specified for outfile\n");
1074c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1075c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1076c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!i)
1077c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1078c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"unable to write certificate\n");
1079c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
1080c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1081c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1082c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret=0;
1083c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgend:
1084c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (need_rand)
1085c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		app_RAND_write_file(NULL, bio_err);
1086c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OBJ_cleanup();
1087c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	NCONF_free(extconf);
1088c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO_free_all(out);
1089c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO_free_all(STDout);
1090c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE_free(ctx);
1091c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_REQ_free(req);
1092c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_free(x);
1093c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_free(xca);
1094c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_free(Upkey);
1095c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_free(CApkey);
10962c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	if (sigopts)
10972c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org		sk_OPENSSL_STRING_free(sigopts);
1098c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_REQ_free(rq);
1099c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER_free(sno);
1100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_ASN1_OBJECT_pop_free(trust, ASN1_OBJECT_free);
1101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	sk_ASN1_OBJECT_pop_free(reject, ASN1_OBJECT_free);
1102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (passin) OPENSSL_free(passin);
1103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	apps_shutdown();
1104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_EXIT(ret);
1105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
1106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic ASN1_INTEGER *x509_load_serial(char *CAfile, char *serialfile, int create)
1108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
1109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *buf = NULL, *p;
1110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER *bs = NULL;
1111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIGNUM *serial = NULL;
1112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	size_t len;
1113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	len = ((serialfile == NULL)
1115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		?(strlen(CAfile)+strlen(POSTFIX)+1)
1116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		:(strlen(serialfile)))+1;
1117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	buf=OPENSSL_malloc(len);
1118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (buf == NULL) { BIO_printf(bio_err,"out of mem\n"); goto end; }
1119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (serialfile == NULL)
1120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BUF_strlcpy(buf,CAfile,len);
1122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		for (p=buf; *p; p++)
1123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (*p == '.')
1124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				{
1125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				*p='\0';
1126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				break;
1127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				}
1128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BUF_strlcat(buf,POSTFIX,len);
1129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
1131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BUF_strlcpy(buf,serialfile,len);
1132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	serial = load_serial(buf, create, NULL);
1134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (serial == NULL) goto end;
1135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!BN_add_word(serial,1))
1137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{ BIO_printf(bio_err,"add_word failure\n"); goto end; }
1138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!save_serial(buf, NULL, serial, &bs)) goto end;
1140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org end:
1142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (buf) OPENSSL_free(buf);
1143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BN_free(serial);
1144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return bs;
1145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
1146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int x509_certify(X509_STORE *ctx, char *CAfile, const EVP_MD *digest,
11482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	     		X509 *x, X509 *xca, EVP_PKEY *pkey,
11492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			STACK_OF(OPENSSL_STRING) *sigopts,
11502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	  		char *serialfile, int create,
11512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	     		int days, int clrext, CONF *conf, char *section,
11522c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org			ASN1_INTEGER *sno)
1153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
1154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret=0;
1155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ASN1_INTEGER *bs=NULL;
1156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE_CTX xsc;
1157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY *upkey;
1158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	upkey = X509_get_pubkey(xca);
1160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_copy_parameters(upkey,pkey);
1161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_free(upkey);
1162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!X509_STORE_CTX_init(&xsc,ctx,x,NULL))
1164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"Error initialising X509 store\n");
1166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (sno) bs = sno;
1169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else if (!(bs = x509_load_serial(CAfile, serialfile, create)))
1170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/*	if (!X509_STORE_add_cert(ctx,x)) goto end;*/
1173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* NOTE: this certificate can/should be self signed, unless it was
1175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * a certificate request in which case it is not. */
1176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE_CTX_set_cert(&xsc,x);
1177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE_CTX_set_flags(&xsc, X509_V_FLAG_CHECK_SS_SIGNATURE);
1178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!reqfile && X509_verify_cert(&xsc) <= 0)
1179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_check_private_key(xca,pkey))
1182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"CA certificate and CA private key do not match\n");
1184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_set_issuer_name(x,X509_get_subject_name(xca))) goto end;
1188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_set_serialNumber(x,bs)) goto end;
1189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (X509_gmtime_adj(X509_get_notBefore(x),0L) == NULL)
1191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* hardwired expired */
1194480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if (X509_time_adj_ex(X509_get_notAfter(x),days, 0, NULL) == NULL)
1195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
1196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (clrext)
1198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		while (X509_get_ext_count(x) > 0) X509_delete_ext(x, 0);
1200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (conf)
1203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_CTX ctx2;
1205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_set_version(x,2); /* version 3 certificate */
1206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                X509V3_set_ctx(&ctx2, xca, x, NULL, NULL, 0);
1207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                X509V3_set_nconf(&ctx2, conf);
1208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                if (!X509V3_EXT_add_nconf(conf, &ctx2, section, x)) goto end;
1209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
12112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	if (!do_X509_sign(bio_err, x, pkey, digest, sigopts))
12122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org		goto end;
1213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ret=1;
1214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgend:
1215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509_STORE_CTX_cleanup(&xsc);
1216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!ret)
1217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
1218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!sno) ASN1_INTEGER_free(bs);
1219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return ret;
1220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
1221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int MS_CALLBACK callb(int ok, X509_STORE_CTX *ctx)
1223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
1224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int err;
1225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	X509 *err_cert;
1226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* it is ok to use a self signed certificate
1228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * This case will catch both the initial ok == 0 and the
1229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * final ok == 1 calls to this function */
1230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	err=X509_STORE_CTX_get_error(ctx);
1231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT)
1232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 1;
1233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* BAD we should have gotten an error.  Normally if everything
1235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * worked X509_STORE_CTX_get_error(ctx) will still be set to
1236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	 * DEPTH_ZERO_SELF_.... */
1237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (ok)
1238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"error with certificate to be certified - should be self signed\n");
1240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 0;
1241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
1243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		err_cert=X509_STORE_CTX_get_current_cert(ctx);
1245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		print_name(bio_err, NULL, X509_get_subject_name(err_cert),0);
1246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"error with certificate - error %d at depth %d\n%s\n",
1247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			err,X509_STORE_CTX_get_error_depth(ctx),
1248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			X509_verify_cert_error_string(err));
1249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		return 1;
1250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
1252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* self sign */
1254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest,
1255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org						CONF *conf, char *section)
1256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
1257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY *pktmp;
1259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	pktmp = X509_get_pubkey(x);
1261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_copy_parameters(pktmp,pkey);
1262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_save_parameters(pktmp,1);
1263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	EVP_PKEY_free(pktmp);
1264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_set_issuer_name(x,X509_get_subject_name(x))) goto err;
1266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (X509_gmtime_adj(X509_get_notBefore(x),0) == NULL) goto err;
1267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* Lets just make it 12:00am GMT, Jan 1 1970 */
1269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* memcpy(x->cert_info->validity->notBefore,"700101120000Z",13); */
1270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	/* 28 days to be certified */
1271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*days) == NULL)
1273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto err;
1274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_set_pubkey(x,pkey)) goto err;
1276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (clrext)
1277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		while (X509_get_ext_count(x) > 0) X509_delete_ext(x, 0);
1279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (conf)
1281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509V3_CTX ctx;
1283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		X509_set_version(x,2); /* version 3 certificate */
1284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0);
1285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                X509V3_set_nconf(&ctx, conf);
1286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) goto err;
1287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!X509_sign(x,pkey,digest)) goto err;
1289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
1290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr:
1291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ERR_print_errors(bio_err);
1292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 0;
1293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
1294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
1295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgstatic int purpose_print(BIO *bio, X509 *cert, X509_PURPOSE *pt)
1296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org{
1297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int id, i, idret;
1298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *pname;
1299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	id = X509_PURPOSE_get_id(pt);
1300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	pname = X509_PURPOSE_get0_name(pt);
1301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	for (i = 0; i < 2; i++)
1302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
1303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		idret = X509_check_purpose(cert, id, i);
1304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio, "%s%s : ", pname, i ? " CA" : "");
1305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (idret == 1) BIO_printf(bio, "Yes\n");
1306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (idret == 0) BIO_printf(bio, "No\n");
1307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else BIO_printf(bio, "Yes (WARNING code=%d)\n", idret);
1308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
1309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	return 1;
1310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org}
1311