source: trunk/third/openssl/apps/dsa.c @ 18442

Revision 18442, 9.3 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18441, which included commits to RCS files with non-trunk default branches.
Line 
1/* apps/dsa.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to.  The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 *    notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 *    notice, this list of conditions and the following disclaimer in the
30 *    documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 *    must display the following acknowledgement:
33 *    "This product includes cryptographic software written by
34 *     Eric Young (eay@cryptsoft.com)"
35 *    The word 'cryptographic' can be left out if the rouines from the library
36 *    being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 *    the apps directory (application code) you must include an acknowledgement:
39 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#ifndef OPENSSL_NO_DSA
60#include <stdio.h>
61#include <stdlib.h>
62#include <string.h>
63#include <time.h>
64#include "apps.h"
65#include <openssl/bio.h>
66#include <openssl/err.h>
67#include <openssl/dsa.h>
68#include <openssl/evp.h>
69#include <openssl/x509.h>
70#include <openssl/pem.h>
71
72#undef PROG
73#define PROG    dsa_main
74
75/* -inform arg  - input format - default PEM (one of DER, NET or PEM)
76 * -outform arg - output format - default PEM
77 * -in arg      - input file - default stdin
78 * -out arg     - output file - default stdout
79 * -des         - encrypt output if PEM format with DES in cbc mode
80 * -des3        - encrypt output if PEM format
81 * -idea        - encrypt output if PEM format
82 * -aes128      - encrypt output if PEM format
83 * -aes192      - encrypt output if PEM format
84 * -aes256      - encrypt output if PEM format
85 * -text        - print a text version
86 * -modulus     - print the DSA public key
87 */
88
89int MAIN(int, char **);
90
91int MAIN(int argc, char **argv)
92        {
93        ENGINE *e = NULL;
94        int ret=1;
95        DSA *dsa=NULL;
96        int i,badops=0;
97        const EVP_CIPHER *enc=NULL;
98        BIO *in=NULL,*out=NULL;
99        int informat,outformat,text=0,noout=0;
100        int pubin = 0, pubout = 0;
101        char *infile,*outfile,*prog,*engine;
102        char *passargin = NULL, *passargout = NULL;
103        char *passin = NULL, *passout = NULL;
104        int modulus=0;
105
106        apps_startup();
107
108        if (bio_err == NULL)
109                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
110                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
111
112        if (!load_config(bio_err, NULL))
113                goto end;
114
115        engine=NULL;
116        infile=NULL;
117        outfile=NULL;
118        informat=FORMAT_PEM;
119        outformat=FORMAT_PEM;
120
121        prog=argv[0];
122        argc--;
123        argv++;
124        while (argc >= 1)
125                {
126                if      (strcmp(*argv,"-inform") == 0)
127                        {
128                        if (--argc < 1) goto bad;
129                        informat=str2fmt(*(++argv));
130                        }
131                else if (strcmp(*argv,"-outform") == 0)
132                        {
133                        if (--argc < 1) goto bad;
134                        outformat=str2fmt(*(++argv));
135                        }
136                else if (strcmp(*argv,"-in") == 0)
137                        {
138                        if (--argc < 1) goto bad;
139                        infile= *(++argv);
140                        }
141                else if (strcmp(*argv,"-out") == 0)
142                        {
143                        if (--argc < 1) goto bad;
144                        outfile= *(++argv);
145                        }
146                else if (strcmp(*argv,"-passin") == 0)
147                        {
148                        if (--argc < 1) goto bad;
149                        passargin= *(++argv);
150                        }
151                else if (strcmp(*argv,"-passout") == 0)
152                        {
153                        if (--argc < 1) goto bad;
154                        passargout= *(++argv);
155                        }
156                else if (strcmp(*argv,"-engine") == 0)
157                        {
158                        if (--argc < 1) goto bad;
159                        engine= *(++argv);
160                        }
161                else if (strcmp(*argv,"-noout") == 0)
162                        noout=1;
163                else if (strcmp(*argv,"-text") == 0)
164                        text=1;
165                else if (strcmp(*argv,"-modulus") == 0)
166                        modulus=1;
167                else if (strcmp(*argv,"-pubin") == 0)
168                        pubin=1;
169                else if (strcmp(*argv,"-pubout") == 0)
170                        pubout=1;
171                else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)
172                        {
173                        BIO_printf(bio_err,"unknown option %s\n",*argv);
174                        badops=1;
175                        break;
176                        }
177                argc--;
178                argv++;
179                }
180
181        if (badops)
182                {
183bad:
184                BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
185                BIO_printf(bio_err,"where options are\n");
186                BIO_printf(bio_err," -inform arg     input format - DER or PEM\n");
187                BIO_printf(bio_err," -outform arg    output format - DER or PEM\n");
188                BIO_printf(bio_err," -in arg         input file\n");
189                BIO_printf(bio_err," -passin arg     input file pass phrase source\n");
190                BIO_printf(bio_err," -out arg        output file\n");
191                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
192                BIO_printf(bio_err," -engine e       use engine e, possibly a hardware device.\n");
193                BIO_printf(bio_err," -des            encrypt PEM output with cbc des\n");
194                BIO_printf(bio_err," -des3           encrypt PEM output with ede cbc des using 168 bit key\n");
195#ifndef OPENSSL_NO_IDEA
196                BIO_printf(bio_err," -idea           encrypt PEM output with cbc idea\n");
197#endif
198#ifndef OPENSSL_NO_AES
199                BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
200                BIO_printf(bio_err,"                 encrypt PEM output with cbc aes\n");
201#endif
202                BIO_printf(bio_err," -text           print the key in text\n");
203                BIO_printf(bio_err," -noout          don't print key out\n");
204                BIO_printf(bio_err," -modulus        print the DSA public value\n");
205                goto end;
206                }
207
208        ERR_load_crypto_strings();
209
210        e = setup_engine(bio_err, engine, 0);
211
212        if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
213                BIO_printf(bio_err, "Error getting passwords\n");
214                goto end;
215        }
216
217        in=BIO_new(BIO_s_file());
218        out=BIO_new(BIO_s_file());
219        if ((in == NULL) || (out == NULL))
220                {
221                ERR_print_errors(bio_err);
222                goto end;
223                }
224
225        if (infile == NULL)
226                BIO_set_fp(in,stdin,BIO_NOCLOSE);
227        else
228                {
229                if (BIO_read_filename(in,infile) <= 0)
230                        {
231                        perror(infile);
232                        goto end;
233                        }
234                }
235
236        BIO_printf(bio_err,"read DSA key\n");
237        if      (informat == FORMAT_ASN1) {
238                if(pubin) dsa=d2i_DSA_PUBKEY_bio(in,NULL);
239                else dsa=d2i_DSAPrivateKey_bio(in,NULL);
240        } else if (informat == FORMAT_PEM) {
241                if(pubin) dsa=PEM_read_bio_DSA_PUBKEY(in,NULL, NULL, NULL);
242                else dsa=PEM_read_bio_DSAPrivateKey(in,NULL,NULL,passin);
243        } else
244                {
245                BIO_printf(bio_err,"bad input format specified for key\n");
246                goto end;
247                }
248        if (dsa == NULL)
249                {
250                BIO_printf(bio_err,"unable to load Key\n");
251                ERR_print_errors(bio_err);
252                goto end;
253                }
254
255        if (outfile == NULL)
256                {
257                BIO_set_fp(out,stdout,BIO_NOCLOSE);
258#ifdef OPENSSL_SYS_VMS
259                {
260                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
261                out = BIO_push(tmpbio, out);
262                }
263#endif
264                }
265        else
266                {
267                if (BIO_write_filename(out,outfile) <= 0)
268                        {
269                        perror(outfile);
270                        goto end;
271                        }
272                }
273
274        if (text)
275                if (!DSA_print(out,dsa,0))
276                        {
277                        perror(outfile);
278                        ERR_print_errors(bio_err);
279                        goto end;
280                        }
281
282        if (modulus)
283                {
284                fprintf(stdout,"Public Key=");
285                BN_print(out,dsa->pub_key);
286                fprintf(stdout,"\n");
287                }
288
289        if (noout) goto end;
290        BIO_printf(bio_err,"writing DSA key\n");
291        if      (outformat == FORMAT_ASN1) {
292                if(pubin || pubout) i=i2d_DSA_PUBKEY_bio(out,dsa);
293                else i=i2d_DSAPrivateKey_bio(out,dsa);
294        } else if (outformat == FORMAT_PEM) {
295                if(pubin || pubout)
296                        i=PEM_write_bio_DSA_PUBKEY(out,dsa);
297                else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc,
298                                                        NULL,0,NULL, passout);
299        } else {
300                BIO_printf(bio_err,"bad output format specified for outfile\n");
301                goto end;
302                }
303        if (!i)
304                {
305                BIO_printf(bio_err,"unable to write private key\n");
306                ERR_print_errors(bio_err);
307                }
308        else
309                ret=0;
310end:
311        if(in != NULL) BIO_free(in);
312        if(out != NULL) BIO_free_all(out);
313        if(dsa != NULL) DSA_free(dsa);
314        if(passin) OPENSSL_free(passin);
315        if(passout) OPENSSL_free(passout);
316        apps_shutdown();
317        OPENSSL_EXIT(ret);
318        }
319#endif
Note: See TracBrowser for help on using the repository browser.