1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* apps/dsa.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 <openssl/opensslconf.h>	/* for OPENSSL_NO_DSA */
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_DSA
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h>
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdlib.h>
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <string.h>
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <time.h>
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "apps.h"
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bio.h>
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/err.h>
68480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <openssl/dsa.h>
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/evp.h>
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509.h>
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/pem.h>
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/bn.h>
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef PROG
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#define PROG	dsa_main
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* -inform arg	- input format - default PEM (one of DER, NET or PEM)
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -outform arg - output format - default PEM
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -in arg	- input file - default stdin
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -out arg	- output file - default stdout
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -des		- encrypt output if PEM format with DES in cbc mode
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -des3	- encrypt output if PEM format
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -idea	- encrypt output if PEM format
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes128	- encrypt output if PEM format
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes192	- encrypt output if PEM format
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -aes256	- encrypt output if PEM format
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia128 - encrypt output if PEM format
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia192 - encrypt output if PEM format
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -camellia256 - encrypt output if PEM format
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -seed        - encrypt output if PEM format
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -text	- print a text version
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * -modulus	- print the DSA public key
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int, char **);
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint MAIN(int argc, char **argv)
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	{
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ENGINE *e = NULL;
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int ret=1;
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	DSA *dsa=NULL;
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int i,badops=0;
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	const EVP_CIPHER *enc=NULL;
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO *in=NULL,*out=NULL;
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int informat,outformat,text=0,noout=0;
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int pubin = 0, pubout = 0;
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *infile,*outfile,*prog;
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *engine;
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *passargin = NULL, *passargout = NULL;
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	char *passin = NULL, *passout = NULL;
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	int modulus=0;
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
115480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	int pvk_encr = 2;
116480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	apps_startup();
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (bio_err == NULL)
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (!load_config(bio_err, NULL))
124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	engine=NULL;
128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	infile=NULL;
130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	outfile=NULL;
131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	informat=FORMAT_PEM;
132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	outformat=FORMAT_PEM;
133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	prog=argv[0];
135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	argc--;
136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	argv++;
137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	while (argc >= 1)
138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if 	(strcmp(*argv,"-inform") == 0)
140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			informat=str2fmt(*(++argv));
143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-outform") == 0)
145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			outformat=str2fmt(*(++argv));
148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-in") == 0)
150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			infile= *(++argv);
153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-out") == 0)
155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			outfile= *(++argv);
158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-passin") == 0)
160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			passargin= *(++argv);
163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-passout") == 0)
165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			passargout= *(++argv);
168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-engine") == 0)
171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			if (--argc < 1) goto bad;
173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			engine= *(++argv);
174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
176480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (strcmp(*argv,"-pvk-strong") == 0)
177480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			pvk_encr=2;
178480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (strcmp(*argv,"-pvk-weak") == 0)
179480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			pvk_encr=1;
180480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (strcmp(*argv,"-pvk-none") == 0)
181480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			pvk_encr=0;
182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-noout") == 0)
183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			noout=1;
184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-text") == 0)
185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			text=1;
186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-modulus") == 0)
187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			modulus=1;
188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-pubin") == 0)
189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pubin=1;
190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if (strcmp(*argv,"-pubout") == 0)
191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pubout=1;
192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)
193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			BIO_printf(bio_err,"unknown option %s\n",*argv);
195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			badops=1;
196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			break;
197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		argc--;
199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		argv++;
200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (badops)
203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgbad:
205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"where options are\n");
207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -inform arg     input format - DER or PEM\n");
208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -outform arg    output format - DER or PEM\n");
209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -in arg         input file\n");
210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -passin arg     input file pass phrase source\n");
211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -out arg        output file\n");
212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -engine e       use engine e, possibly a hardware device.\n");
215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -des            encrypt PEM output with cbc des\n");
217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -des3           encrypt PEM output with ede cbc des using 168 bit key\n");
218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_IDEA
219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -idea           encrypt PEM output with cbc idea\n");
220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_AES
222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"                 encrypt PEM output with cbc aes\n");
224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_CAMELLIA
226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -camellia128, -camellia192, -camellia256\n");
227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"                 encrypt PEM output with cbc camellia\n");
228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_SEED
230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -seed           encrypt PEM output with cbc seed\n");
231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -text           print the key in text\n");
233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -noout          don't print key out\n");
234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err," -modulus        print the DSA public value\n");
235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	ERR_load_crypto_strings();
239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef OPENSSL_NO_ENGINE
241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        e = setup_engine(bio_err, engine, 0);
242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err, "Error getting passwords\n");
246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
249480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	in=BIO_new(BIO_s_file());
250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	out=BIO_new(BIO_s_file());
251480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if ((in == NULL) || (out == NULL))
252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
257480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if (infile == NULL)
258480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		BIO_set_fp(in,stdin,BIO_NOCLOSE);
259480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	else
260480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		{
261480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		if (BIO_read_filename(in,infile) <= 0)
262480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			{
263480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			perror(infile);
264480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			goto end;
265480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			}
266480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		}
267480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO_printf(bio_err,"read DSA key\n");
269480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
270480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		{
271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		EVP_PKEY	*pkey;
272480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (pubin)
274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pkey = load_pubkey(bio_err, infile, informat, 1,
275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				passin, e, "Public Key");
276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else
277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			pkey = load_key(bio_err, infile, informat, 1,
278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org				passin, e, "Private Key");
279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
280480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		if (pkey)
281480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			{
282480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			dsa = EVP_PKEY_get1_DSA(pkey);
283480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			EVP_PKEY_free(pkey);
284480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			}
285480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		}
286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (dsa == NULL)
287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"unable to load Key\n");
289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (outfile == NULL)
294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_set_fp(out,stdout,BIO_NOCLOSE);
296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef OPENSSL_SYS_VMS
297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO *tmpbio = BIO_new(BIO_f_linebuffer());
299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		out = BIO_push(tmpbio, out);
300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (BIO_write_filename(out,outfile) <= 0)
306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			perror(outfile);
308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (text)
313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if (!DSA_print(out,dsa,0))
314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			{
315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			perror(outfile);
316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			ERR_print_errors(bio_err);
317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			goto end;
318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			}
319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (modulus)
321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fprintf(stdout,"Public Key=");
323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BN_print(out,dsa->pub_key);
324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		fprintf(stdout,"\n");
325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if (noout) goto end;
328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	BIO_printf(bio_err,"writing DSA key\n");
329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if 	(outformat == FORMAT_ASN1) {
330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(pubin || pubout) i=i2d_DSA_PUBKEY_bio(out,dsa);
331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else i=i2d_DSAPrivateKey_bio(out,dsa);
332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else if (outformat == FORMAT_PEM) {
333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		if(pubin || pubout)
334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org			i=PEM_write_bio_DSA_PUBKEY(out,dsa);
335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc,
336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org							NULL,0,NULL, passout);
337480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_RC4)
338480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	} else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) {
339480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		EVP_PKEY *pk;
340480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		pk = EVP_PKEY_new();
341480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		EVP_PKEY_set1_DSA(pk, dsa);
342480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		if (outformat == FORMAT_PVK)
343480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout);
344480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else if (pubin || pubout)
345480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			i = i2b_PublicKey_bio(out, pk);
346480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		else
347480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org			i = i2b_PrivateKey_bio(out, pk);
348480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org		EVP_PKEY_free(pk);
349480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif
350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	} else {
351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"bad output format specified for outfile\n");
352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		goto end;
353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
354480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org	if (i <= 0)
355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		{
356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		BIO_printf(bio_err,"unable to write private key\n");
357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ERR_print_errors(bio_err);
358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		}
359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	else
360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org		ret=0;
361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgend:
362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(in != NULL) BIO_free(in);
363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(out != NULL) BIO_free_all(out);
364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(dsa != NULL) DSA_free(dsa);
365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(passin) OPENSSL_free(passin);
366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	if(passout) OPENSSL_free(passout);
367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	apps_shutdown();
368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	OPENSSL_EXIT(ret);
369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org	}
370480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#else /* !OPENSSL_NO_DSA */
371480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
372480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org# if PEDANTIC
373480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic void *dummy=&dummy;
374480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org# endif
375480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org
376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif
377