xref: /freebsd/crypto/openssl/apps/dsa.c (revision 6f9291cea8b06d251243fd47a7234018541832a3)
174664626SKris Kennaway /* apps/dsa.c */
274664626SKris Kennaway /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
374664626SKris Kennaway  * All rights reserved.
474664626SKris Kennaway  *
574664626SKris Kennaway  * This package is an SSL implementation written
674664626SKris Kennaway  * by Eric Young (eay@cryptsoft.com).
774664626SKris Kennaway  * The implementation was written so as to conform with Netscapes SSL.
874664626SKris Kennaway  *
974664626SKris Kennaway  * This library is free for commercial and non-commercial use as long as
1074664626SKris Kennaway  * the following conditions are aheared to.  The following conditions
1174664626SKris Kennaway  * apply to all code found in this distribution, be it the RC4, RSA,
1274664626SKris Kennaway  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1374664626SKris Kennaway  * included with this distribution is covered by the same copyright terms
1474664626SKris Kennaway  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1574664626SKris Kennaway  *
1674664626SKris Kennaway  * Copyright remains Eric Young's, and as such any Copyright notices in
1774664626SKris Kennaway  * the code are not to be removed.
1874664626SKris Kennaway  * If this package is used in a product, Eric Young should be given attribution
1974664626SKris Kennaway  * as the author of the parts of the library used.
2074664626SKris Kennaway  * This can be in the form of a textual message at program startup or
2174664626SKris Kennaway  * in documentation (online or textual) provided with the package.
2274664626SKris Kennaway  *
2374664626SKris Kennaway  * Redistribution and use in source and binary forms, with or without
2474664626SKris Kennaway  * modification, are permitted provided that the following conditions
2574664626SKris Kennaway  * are met:
2674664626SKris Kennaway  * 1. Redistributions of source code must retain the copyright
2774664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer.
2874664626SKris Kennaway  * 2. Redistributions in binary form must reproduce the above copyright
2974664626SKris Kennaway  *    notice, this list of conditions and the following disclaimer in the
3074664626SKris Kennaway  *    documentation and/or other materials provided with the distribution.
3174664626SKris Kennaway  * 3. All advertising materials mentioning features or use of this software
3274664626SKris Kennaway  *    must display the following acknowledgement:
3374664626SKris Kennaway  *    "This product includes cryptographic software written by
3474664626SKris Kennaway  *     Eric Young (eay@cryptsoft.com)"
3574664626SKris Kennaway  *    The word 'cryptographic' can be left out if the rouines from the library
3674664626SKris Kennaway  *    being used are not cryptographic related :-).
3774664626SKris Kennaway  * 4. If you include any Windows specific code (or a derivative thereof) from
3874664626SKris Kennaway  *    the apps directory (application code) you must include an acknowledgement:
3974664626SKris Kennaway  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4074664626SKris Kennaway  *
4174664626SKris Kennaway  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4274664626SKris Kennaway  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4374664626SKris Kennaway  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4474664626SKris Kennaway  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4574664626SKris Kennaway  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4674664626SKris Kennaway  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4774664626SKris Kennaway  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4874664626SKris Kennaway  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4974664626SKris Kennaway  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5074664626SKris Kennaway  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5174664626SKris Kennaway  * SUCH DAMAGE.
5274664626SKris Kennaway  *
5374664626SKris Kennaway  * The licence and distribution terms for any publically available version or
5474664626SKris Kennaway  * derivative of this code cannot be changed.  i.e. this code cannot simply be
5574664626SKris Kennaway  * copied and put under another distribution licence
5674664626SKris Kennaway  * [including the GNU Public Licence.]
5774664626SKris Kennaway  */
5874664626SKris Kennaway 
593b4e3dcbSSimon L. B. Nielsen #include <openssl/opensslconf.h> /* for OPENSSL_NO_DSA */
605c87c606SMark Murray #ifndef OPENSSL_NO_DSA
6174664626SKris Kennaway # include <stdio.h>
6274664626SKris Kennaway # include <stdlib.h>
6374664626SKris Kennaway # include <string.h>
6474664626SKris Kennaway # include <time.h>
6574664626SKris Kennaway # include "apps.h"
6674664626SKris Kennaway # include <openssl/bio.h>
6774664626SKris Kennaway # include <openssl/err.h>
681f13597dSJung-uk Kim # include <openssl/dsa.h>
6974664626SKris Kennaway # include <openssl/evp.h>
7074664626SKris Kennaway # include <openssl/x509.h>
7174664626SKris Kennaway # include <openssl/pem.h>
723b4e3dcbSSimon L. B. Nielsen # include <openssl/bn.h>
7374664626SKris Kennaway 
7474664626SKris Kennaway # undef PROG
7574664626SKris Kennaway # define PROG    dsa_main
7674664626SKris Kennaway 
77*6f9291ceSJung-uk Kim /*-
78*6f9291ceSJung-uk Kim  * -inform arg  - input format - default PEM (one of DER, NET or PEM)
7974664626SKris Kennaway  * -outform arg - output format - default PEM
8074664626SKris Kennaway  * -in arg      - input file - default stdin
8174664626SKris Kennaway  * -out arg     - output file - default stdout
8274664626SKris Kennaway  * -des         - encrypt output if PEM format with DES in cbc mode
8374664626SKris Kennaway  * -des3        - encrypt output if PEM format
8474664626SKris Kennaway  * -idea        - encrypt output if PEM format
855c87c606SMark Murray  * -aes128      - encrypt output if PEM format
865c87c606SMark Murray  * -aes192      - encrypt output if PEM format
875c87c606SMark Murray  * -aes256      - encrypt output if PEM format
88ed5d4f9aSSimon L. B. Nielsen  * -camellia128 - encrypt output if PEM format
89ed5d4f9aSSimon L. B. Nielsen  * -camellia192 - encrypt output if PEM format
90ed5d4f9aSSimon L. B. Nielsen  * -camellia256 - encrypt output if PEM format
91db522d3aSSimon L. B. Nielsen  * -seed        - encrypt output if PEM format
9274664626SKris Kennaway  * -text        - print a text version
9374664626SKris Kennaway  * -modulus     - print the DSA public key
9474664626SKris Kennaway  */
9574664626SKris Kennaway 
96f579bf8eSKris Kennaway int MAIN(int, char **);
97f579bf8eSKris Kennaway 
9874664626SKris Kennaway int MAIN(int argc, char **argv)
9974664626SKris Kennaway {
1005c87c606SMark Murray     ENGINE *e = NULL;
10174664626SKris Kennaway     int ret = 1;
10274664626SKris Kennaway     DSA *dsa = NULL;
10374664626SKris Kennaway     int i, badops = 0;
10474664626SKris Kennaway     const EVP_CIPHER *enc = NULL;
10574664626SKris Kennaway     BIO *in = NULL, *out = NULL;
10674664626SKris Kennaway     int informat, outformat, text = 0, noout = 0;
107f579bf8eSKris Kennaway     int pubin = 0, pubout = 0;
108fceca8a3SJacques Vidrine     char *infile, *outfile, *prog;
109fceca8a3SJacques Vidrine # ifndef OPENSSL_NO_ENGINE
110fceca8a3SJacques Vidrine     char *engine;
111fceca8a3SJacques Vidrine # endif
112f579bf8eSKris Kennaway     char *passargin = NULL, *passargout = NULL;
113f579bf8eSKris Kennaway     char *passin = NULL, *passout = NULL;
11474664626SKris Kennaway     int modulus = 0;
11574664626SKris Kennaway 
1161f13597dSJung-uk Kim     int pvk_encr = 2;
1171f13597dSJung-uk Kim 
11874664626SKris Kennaway     apps_startup();
11974664626SKris Kennaway 
12074664626SKris Kennaway     if (bio_err == NULL)
12174664626SKris Kennaway         if ((bio_err = BIO_new(BIO_s_file())) != NULL)
12274664626SKris Kennaway             BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);
12374664626SKris Kennaway 
1245c87c606SMark Murray     if (!load_config(bio_err, NULL))
1255c87c606SMark Murray         goto end;
1265c87c606SMark Murray 
127fceca8a3SJacques Vidrine # ifndef OPENSSL_NO_ENGINE
1285c87c606SMark Murray     engine = NULL;
129fceca8a3SJacques Vidrine # endif
13074664626SKris Kennaway     infile = NULL;
13174664626SKris Kennaway     outfile = NULL;
13274664626SKris Kennaway     informat = FORMAT_PEM;
13374664626SKris Kennaway     outformat = FORMAT_PEM;
13474664626SKris Kennaway 
13574664626SKris Kennaway     prog = argv[0];
13674664626SKris Kennaway     argc--;
13774664626SKris Kennaway     argv++;
138*6f9291ceSJung-uk Kim     while (argc >= 1) {
139*6f9291ceSJung-uk Kim         if (strcmp(*argv, "-inform") == 0) {
140*6f9291ceSJung-uk Kim             if (--argc < 1)
141*6f9291ceSJung-uk Kim                 goto bad;
14274664626SKris Kennaway             informat = str2fmt(*(++argv));
143*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-outform") == 0) {
144*6f9291ceSJung-uk Kim             if (--argc < 1)
145*6f9291ceSJung-uk Kim                 goto bad;
14674664626SKris Kennaway             outformat = str2fmt(*(++argv));
147*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-in") == 0) {
148*6f9291ceSJung-uk Kim             if (--argc < 1)
149*6f9291ceSJung-uk Kim                 goto bad;
15074664626SKris Kennaway             infile = *(++argv);
151*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-out") == 0) {
152*6f9291ceSJung-uk Kim             if (--argc < 1)
153*6f9291ceSJung-uk Kim                 goto bad;
15474664626SKris Kennaway             outfile = *(++argv);
155*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-passin") == 0) {
156*6f9291ceSJung-uk Kim             if (--argc < 1)
157*6f9291ceSJung-uk Kim                 goto bad;
158f579bf8eSKris Kennaway             passargin = *(++argv);
159*6f9291ceSJung-uk Kim         } else if (strcmp(*argv, "-passout") == 0) {
160*6f9291ceSJung-uk Kim             if (--argc < 1)
161*6f9291ceSJung-uk Kim                 goto bad;
162f579bf8eSKris Kennaway             passargout = *(++argv);
163f579bf8eSKris Kennaway         }
164fceca8a3SJacques Vidrine # ifndef OPENSSL_NO_ENGINE
165*6f9291ceSJung-uk Kim         else if (strcmp(*argv, "-engine") == 0) {
166*6f9291ceSJung-uk Kim             if (--argc < 1)
167*6f9291ceSJung-uk Kim                 goto bad;
1685c87c606SMark Murray             engine = *(++argv);
1695c87c606SMark Murray         }
170fceca8a3SJacques Vidrine # endif
1711f13597dSJung-uk Kim         else if (strcmp(*argv, "-pvk-strong") == 0)
1721f13597dSJung-uk Kim             pvk_encr = 2;
1731f13597dSJung-uk Kim         else if (strcmp(*argv, "-pvk-weak") == 0)
1741f13597dSJung-uk Kim             pvk_encr = 1;
1751f13597dSJung-uk Kim         else if (strcmp(*argv, "-pvk-none") == 0)
1761f13597dSJung-uk Kim             pvk_encr = 0;
17774664626SKris Kennaway         else if (strcmp(*argv, "-noout") == 0)
17874664626SKris Kennaway             noout = 1;
17974664626SKris Kennaway         else if (strcmp(*argv, "-text") == 0)
18074664626SKris Kennaway             text = 1;
18174664626SKris Kennaway         else if (strcmp(*argv, "-modulus") == 0)
18274664626SKris Kennaway             modulus = 1;
183f579bf8eSKris Kennaway         else if (strcmp(*argv, "-pubin") == 0)
184f579bf8eSKris Kennaway             pubin = 1;
185f579bf8eSKris Kennaway         else if (strcmp(*argv, "-pubout") == 0)
186f579bf8eSKris Kennaway             pubout = 1;
187*6f9291ceSJung-uk Kim         else if ((enc = EVP_get_cipherbyname(&(argv[0][1]))) == NULL) {
18874664626SKris Kennaway             BIO_printf(bio_err, "unknown option %s\n", *argv);
18974664626SKris Kennaway             badops = 1;
19074664626SKris Kennaway             break;
19174664626SKris Kennaway         }
19274664626SKris Kennaway         argc--;
19374664626SKris Kennaway         argv++;
19474664626SKris Kennaway     }
19574664626SKris Kennaway 
196*6f9291ceSJung-uk Kim     if (badops) {
19774664626SKris Kennaway  bad:
19874664626SKris Kennaway         BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog);
19974664626SKris Kennaway         BIO_printf(bio_err, "where options are\n");
200f579bf8eSKris Kennaway         BIO_printf(bio_err, " -inform arg     input format - DER or PEM\n");
201f579bf8eSKris Kennaway         BIO_printf(bio_err, " -outform arg    output format - DER or PEM\n");
20274664626SKris Kennaway         BIO_printf(bio_err, " -in arg         input file\n");
203*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
204*6f9291ceSJung-uk Kim                    " -passin arg     input file pass phrase source\n");
20574664626SKris Kennaway         BIO_printf(bio_err, " -out arg        output file\n");
206*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
207*6f9291ceSJung-uk Kim                    " -passout arg    output file pass phrase source\n");
208fceca8a3SJacques Vidrine # ifndef OPENSSL_NO_ENGINE
209*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
210*6f9291ceSJung-uk Kim                    " -engine e       use engine e, possibly a hardware device.\n");
211fceca8a3SJacques Vidrine # endif
212*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
213*6f9291ceSJung-uk Kim                    " -des            encrypt PEM output with cbc des\n");
214*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
215*6f9291ceSJung-uk Kim                    " -des3           encrypt PEM output with ede cbc des using 168 bit key\n");
2165c87c606SMark Murray # ifndef OPENSSL_NO_IDEA
217*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
218*6f9291ceSJung-uk Kim                    " -idea           encrypt PEM output with cbc idea\n");
21974664626SKris Kennaway # endif
2205c87c606SMark Murray # ifndef OPENSSL_NO_AES
2215c87c606SMark Murray         BIO_printf(bio_err, " -aes128, -aes192, -aes256\n");
222*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
223*6f9291ceSJung-uk Kim                    "                 encrypt PEM output with cbc aes\n");
2245c87c606SMark Murray # endif
225ed5d4f9aSSimon L. B. Nielsen # ifndef OPENSSL_NO_CAMELLIA
226ed5d4f9aSSimon L. B. Nielsen         BIO_printf(bio_err, " -camellia128, -camellia192, -camellia256\n");
227*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
228*6f9291ceSJung-uk Kim                    "                 encrypt PEM output with cbc camellia\n");
229ed5d4f9aSSimon L. B. Nielsen # endif
230db522d3aSSimon L. B. Nielsen # ifndef OPENSSL_NO_SEED
231*6f9291ceSJung-uk Kim         BIO_printf(bio_err,
232*6f9291ceSJung-uk Kim                    " -seed           encrypt PEM output with cbc seed\n");
233db522d3aSSimon L. B. Nielsen # endif
23474664626SKris Kennaway         BIO_printf(bio_err, " -text           print the key in text\n");
23574664626SKris Kennaway         BIO_printf(bio_err, " -noout          don't print key out\n");
23674664626SKris Kennaway         BIO_printf(bio_err, " -modulus        print the DSA public value\n");
23774664626SKris Kennaway         goto end;
23874664626SKris Kennaway     }
23974664626SKris Kennaway 
24074664626SKris Kennaway     ERR_load_crypto_strings();
24174664626SKris Kennaway 
242fceca8a3SJacques Vidrine # ifndef OPENSSL_NO_ENGINE
2435c87c606SMark Murray     e = setup_engine(bio_err, engine, 0);
244fceca8a3SJacques Vidrine # endif
2455c87c606SMark Murray 
246f579bf8eSKris Kennaway     if (!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
247f579bf8eSKris Kennaway         BIO_printf(bio_err, "Error getting passwords\n");
248f579bf8eSKris Kennaway         goto end;
249f579bf8eSKris Kennaway     }
250f579bf8eSKris Kennaway 
2511f13597dSJung-uk Kim     in = BIO_new(BIO_s_file());
25274664626SKris Kennaway     out = BIO_new(BIO_s_file());
253*6f9291ceSJung-uk Kim     if ((in == NULL) || (out == NULL)) {
25474664626SKris Kennaway         ERR_print_errors(bio_err);
25574664626SKris Kennaway         goto end;
25674664626SKris Kennaway     }
25774664626SKris Kennaway 
2581f13597dSJung-uk Kim     if (infile == NULL)
2591f13597dSJung-uk Kim         BIO_set_fp(in, stdin, BIO_NOCLOSE);
260*6f9291ceSJung-uk Kim     else {
261*6f9291ceSJung-uk Kim         if (BIO_read_filename(in, infile) <= 0) {
2621f13597dSJung-uk Kim             perror(infile);
2631f13597dSJung-uk Kim             goto end;
2641f13597dSJung-uk Kim         }
2651f13597dSJung-uk Kim     }
2661f13597dSJung-uk Kim 
267f579bf8eSKris Kennaway     BIO_printf(bio_err, "read DSA key\n");
2681f13597dSJung-uk Kim 
26974664626SKris Kennaway     {
270db522d3aSSimon L. B. Nielsen         EVP_PKEY *pkey;
2711f13597dSJung-uk Kim 
272db522d3aSSimon L. B. Nielsen         if (pubin)
273db522d3aSSimon L. B. Nielsen             pkey = load_pubkey(bio_err, infile, informat, 1,
274db522d3aSSimon L. B. Nielsen                                passin, e, "Public Key");
275db522d3aSSimon L. B. Nielsen         else
276db522d3aSSimon L. B. Nielsen             pkey = load_key(bio_err, infile, informat, 1,
277db522d3aSSimon L. B. Nielsen                             passin, e, "Private Key");
278db522d3aSSimon L. B. Nielsen 
279*6f9291ceSJung-uk Kim         if (pkey) {
2801f13597dSJung-uk Kim             dsa = EVP_PKEY_get1_DSA(pkey);
281db522d3aSSimon L. B. Nielsen             EVP_PKEY_free(pkey);
28274664626SKris Kennaway         }
2831f13597dSJung-uk Kim     }
284*6f9291ceSJung-uk Kim     if (dsa == NULL) {
285f579bf8eSKris Kennaway         BIO_printf(bio_err, "unable to load Key\n");
28674664626SKris Kennaway         ERR_print_errors(bio_err);
28774664626SKris Kennaway         goto end;
28874664626SKris Kennaway     }
28974664626SKris Kennaway 
290*6f9291ceSJung-uk Kim     if (outfile == NULL) {
29174664626SKris Kennaway         BIO_set_fp(out, stdout, BIO_NOCLOSE);
2925c87c606SMark Murray # ifdef OPENSSL_SYS_VMS
293ddd58736SKris Kennaway         {
294ddd58736SKris Kennaway             BIO *tmpbio = BIO_new(BIO_f_linebuffer());
295ddd58736SKris Kennaway             out = BIO_push(tmpbio, out);
296ddd58736SKris Kennaway         }
297ddd58736SKris Kennaway # endif
298*6f9291ceSJung-uk Kim     } else {
299*6f9291ceSJung-uk Kim         if (BIO_write_filename(out, outfile) <= 0) {
30074664626SKris Kennaway             perror(outfile);
30174664626SKris Kennaway             goto end;
30274664626SKris Kennaway         }
30374664626SKris Kennaway     }
30474664626SKris Kennaway 
30574664626SKris Kennaway     if (text)
306*6f9291ceSJung-uk Kim         if (!DSA_print(out, dsa, 0)) {
30774664626SKris Kennaway             perror(outfile);
30874664626SKris Kennaway             ERR_print_errors(bio_err);
30974664626SKris Kennaway             goto end;
31074664626SKris Kennaway         }
31174664626SKris Kennaway 
312*6f9291ceSJung-uk Kim     if (modulus) {
31374664626SKris Kennaway         fprintf(stdout, "Public Key=");
31474664626SKris Kennaway         BN_print(out, dsa->pub_key);
31574664626SKris Kennaway         fprintf(stdout, "\n");
31674664626SKris Kennaway     }
31774664626SKris Kennaway 
318*6f9291ceSJung-uk Kim     if (noout)
319*6f9291ceSJung-uk Kim         goto end;
320f579bf8eSKris Kennaway     BIO_printf(bio_err, "writing DSA key\n");
321f579bf8eSKris Kennaway     if (outformat == FORMAT_ASN1) {
322*6f9291ceSJung-uk Kim         if (pubin || pubout)
323*6f9291ceSJung-uk Kim             i = i2d_DSA_PUBKEY_bio(out, dsa);
324*6f9291ceSJung-uk Kim         else
325*6f9291ceSJung-uk Kim             i = i2d_DSAPrivateKey_bio(out, dsa);
326f579bf8eSKris Kennaway     } else if (outformat == FORMAT_PEM) {
327f579bf8eSKris Kennaway         if (pubin || pubout)
328f579bf8eSKris Kennaway             i = PEM_write_bio_DSA_PUBKEY(out, dsa);
329*6f9291ceSJung-uk Kim         else
330*6f9291ceSJung-uk Kim             i = PEM_write_bio_DSAPrivateKey(out, dsa, enc,
331f579bf8eSKris Kennaway                                             NULL, 0, NULL, passout);
3321f13597dSJung-uk Kim # if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_RC4)
3331f13597dSJung-uk Kim     } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) {
3341f13597dSJung-uk Kim         EVP_PKEY *pk;
3351f13597dSJung-uk Kim         pk = EVP_PKEY_new();
3361f13597dSJung-uk Kim         EVP_PKEY_set1_DSA(pk, dsa);
3371f13597dSJung-uk Kim         if (outformat == FORMAT_PVK)
3381f13597dSJung-uk Kim             i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout);
3391f13597dSJung-uk Kim         else if (pubin || pubout)
3401f13597dSJung-uk Kim             i = i2b_PublicKey_bio(out, pk);
3411f13597dSJung-uk Kim         else
3421f13597dSJung-uk Kim             i = i2b_PrivateKey_bio(out, pk);
3431f13597dSJung-uk Kim         EVP_PKEY_free(pk);
3441f13597dSJung-uk Kim # endif
345f579bf8eSKris Kennaway     } else {
34674664626SKris Kennaway         BIO_printf(bio_err, "bad output format specified for outfile\n");
34774664626SKris Kennaway         goto end;
34874664626SKris Kennaway     }
349*6f9291ceSJung-uk Kim     if (i <= 0) {
35074664626SKris Kennaway         BIO_printf(bio_err, "unable to write private key\n");
35174664626SKris Kennaway         ERR_print_errors(bio_err);
352*6f9291ceSJung-uk Kim     } else
35374664626SKris Kennaway         ret = 0;
35474664626SKris Kennaway  end:
355*6f9291ceSJung-uk Kim     if (in != NULL)
356*6f9291ceSJung-uk Kim         BIO_free(in);
357*6f9291ceSJung-uk Kim     if (out != NULL)
358*6f9291ceSJung-uk Kim         BIO_free_all(out);
359*6f9291ceSJung-uk Kim     if (dsa != NULL)
360*6f9291ceSJung-uk Kim         DSA_free(dsa);
361*6f9291ceSJung-uk Kim     if (passin)
362*6f9291ceSJung-uk Kim         OPENSSL_free(passin);
363*6f9291ceSJung-uk Kim     if (passout)
364*6f9291ceSJung-uk Kim         OPENSSL_free(passout);
3655c87c606SMark Murray     apps_shutdown();
3665c87c606SMark Murray     OPENSSL_EXIT(ret);
36774664626SKris Kennaway }
3681f13597dSJung-uk Kim #else                           /* !OPENSSL_NO_DSA */
3691f13597dSJung-uk Kim 
3701f13597dSJung-uk Kim # if PEDANTIC
3711f13597dSJung-uk Kim static void *dummy = &dummy;
3721f13597dSJung-uk Kim # endif
3731f13597dSJung-uk Kim 
37474664626SKris Kennaway #endif
375