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

Revision 15530, 8.7 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15529, 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 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 * -text        - print a text version
83 * -modulus     - print the DSA public key
84 */
85
86int MAIN(int, char **);
87
88int MAIN(int argc, char **argv)
89        {
90        int ret=1;
91        DSA *dsa=NULL;
92        int i,badops=0;
93        const EVP_CIPHER *enc=NULL;
94        BIO *in=NULL,*out=NULL;
95        int informat,outformat,text=0,noout=0;
96        int pubin = 0, pubout = 0;
97        char *infile,*outfile,*prog;
98        char *passargin = NULL, *passargout = NULL;
99        char *passin = NULL, *passout = NULL;
100        int modulus=0;
101
102        apps_startup();
103
104        if (bio_err == NULL)
105                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
106                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
107
108        infile=NULL;
109        outfile=NULL;
110        informat=FORMAT_PEM;
111        outformat=FORMAT_PEM;
112
113        prog=argv[0];
114        argc--;
115        argv++;
116        while (argc >= 1)
117                {
118                if      (strcmp(*argv,"-inform") == 0)
119                        {
120                        if (--argc < 1) goto bad;
121                        informat=str2fmt(*(++argv));
122                        }
123                else if (strcmp(*argv,"-outform") == 0)
124                        {
125                        if (--argc < 1) goto bad;
126                        outformat=str2fmt(*(++argv));
127                        }
128                else if (strcmp(*argv,"-in") == 0)
129                        {
130                        if (--argc < 1) goto bad;
131                        infile= *(++argv);
132                        }
133                else if (strcmp(*argv,"-out") == 0)
134                        {
135                        if (--argc < 1) goto bad;
136                        outfile= *(++argv);
137                        }
138                else if (strcmp(*argv,"-passin") == 0)
139                        {
140                        if (--argc < 1) goto bad;
141                        passargin= *(++argv);
142                        }
143                else if (strcmp(*argv,"-passout") == 0)
144                        {
145                        if (--argc < 1) goto bad;
146                        passargout= *(++argv);
147                        }
148                else if (strcmp(*argv,"-noout") == 0)
149                        noout=1;
150                else if (strcmp(*argv,"-text") == 0)
151                        text=1;
152                else if (strcmp(*argv,"-modulus") == 0)
153                        modulus=1;
154                else if (strcmp(*argv,"-pubin") == 0)
155                        pubin=1;
156                else if (strcmp(*argv,"-pubout") == 0)
157                        pubout=1;
158                else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL)
159                        {
160                        BIO_printf(bio_err,"unknown option %s\n",*argv);
161                        badops=1;
162                        break;
163                        }
164                argc--;
165                argv++;
166                }
167
168        if (badops)
169                {
170bad:
171                BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
172                BIO_printf(bio_err,"where options are\n");
173                BIO_printf(bio_err," -inform arg     input format - DER or PEM\n");
174                BIO_printf(bio_err," -outform arg    output format - DER or PEM\n");
175                BIO_printf(bio_err," -in arg         input file\n");
176                BIO_printf(bio_err," -passin arg     input file pass phrase source\n");
177                BIO_printf(bio_err," -out arg        output file\n");
178                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
179                BIO_printf(bio_err," -des            encrypt PEM output with cbc des\n");
180                BIO_printf(bio_err," -des3           encrypt PEM output with ede cbc des using 168 bit key\n");
181#ifndef NO_IDEA
182                BIO_printf(bio_err," -idea           encrypt PEM output with cbc idea\n");
183#endif
184                BIO_printf(bio_err," -text           print the key in text\n");
185                BIO_printf(bio_err," -noout          don't print key out\n");
186                BIO_printf(bio_err," -modulus        print the DSA public value\n");
187                goto end;
188                }
189
190        ERR_load_crypto_strings();
191
192        if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
193                BIO_printf(bio_err, "Error getting passwords\n");
194                goto end;
195        }
196
197        in=BIO_new(BIO_s_file());
198        out=BIO_new(BIO_s_file());
199        if ((in == NULL) || (out == NULL))
200                {
201                ERR_print_errors(bio_err);
202                goto end;
203                }
204
205        if (infile == NULL)
206                BIO_set_fp(in,stdin,BIO_NOCLOSE);
207        else
208                {
209                if (BIO_read_filename(in,infile) <= 0)
210                        {
211                        perror(infile);
212                        goto end;
213                        }
214                }
215
216        BIO_printf(bio_err,"read DSA key\n");
217        if      (informat == FORMAT_ASN1) {
218                if(pubin) dsa=d2i_DSA_PUBKEY_bio(in,NULL);
219                else dsa=d2i_DSAPrivateKey_bio(in,NULL);
220        } else if (informat == FORMAT_PEM) {
221                if(pubin) dsa=PEM_read_bio_DSA_PUBKEY(in,NULL, NULL, NULL);
222                else dsa=PEM_read_bio_DSAPrivateKey(in,NULL,NULL,passin);
223        } else
224                {
225                BIO_printf(bio_err,"bad input format specified for key\n");
226                goto end;
227                }
228        if (dsa == NULL)
229                {
230                BIO_printf(bio_err,"unable to load Key\n");
231                ERR_print_errors(bio_err);
232                goto end;
233                }
234
235        if (outfile == NULL)
236                {
237                BIO_set_fp(out,stdout,BIO_NOCLOSE);
238#ifdef VMS
239                {
240                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
241                out = BIO_push(tmpbio, out);
242                }
243#endif
244                }
245        else
246                {
247                if (BIO_write_filename(out,outfile) <= 0)
248                        {
249                        perror(outfile);
250                        goto end;
251                        }
252                }
253
254        if (text)
255                if (!DSA_print(out,dsa,0))
256                        {
257                        perror(outfile);
258                        ERR_print_errors(bio_err);
259                        goto end;
260                        }
261
262        if (modulus)
263                {
264                fprintf(stdout,"Public Key=");
265                BN_print(out,dsa->pub_key);
266                fprintf(stdout,"\n");
267                }
268
269        if (noout) goto end;
270        BIO_printf(bio_err,"writing DSA key\n");
271        if      (outformat == FORMAT_ASN1) {
272                if(pubin || pubout) i=i2d_DSA_PUBKEY_bio(out,dsa);
273                else i=i2d_DSAPrivateKey_bio(out,dsa);
274        } else if (outformat == FORMAT_PEM) {
275                if(pubin || pubout)
276                        i=PEM_write_bio_DSA_PUBKEY(out,dsa);
277                else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc,
278                                                        NULL,0,NULL, passout);
279        } else {
280                BIO_printf(bio_err,"bad output format specified for outfile\n");
281                goto end;
282                }
283        if (!i)
284                {
285                BIO_printf(bio_err,"unable to write private key\n");
286                ERR_print_errors(bio_err);
287                }
288        else
289                ret=0;
290end:
291        if(in != NULL) BIO_free(in);
292        if(out != NULL) BIO_free_all(out);
293        if(dsa != NULL) DSA_free(dsa);
294        if(passin) OPENSSL_free(passin);
295        if(passout) OPENSSL_free(passout);
296        EXIT(ret);
297        }
298#endif
Note: See TracBrowser for help on using the repository browser.