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

Revision 18442, 8.4 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/genrsa.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_RSA
60#include <stdio.h>
61#include <string.h>
62#include <sys/types.h>
63#include <sys/stat.h>
64#include "apps.h"
65#include <openssl/bio.h>
66#include <openssl/err.h>
67#include <openssl/bn.h>
68#include <openssl/rsa.h>
69#include <openssl/evp.h>
70#include <openssl/x509.h>
71#include <openssl/pem.h>
72#include <openssl/rand.h>
73
74#define DEFBITS 512
75#undef PROG
76#define PROG genrsa_main
77
78static void MS_CALLBACK genrsa_cb(int p, int n, void *arg);
79
80int MAIN(int, char **);
81
82int MAIN(int argc, char **argv)
83        {
84        ENGINE *e = NULL;
85        int ret=1;
86        RSA *rsa=NULL;
87        int i,num=DEFBITS;
88        long l;
89        const EVP_CIPHER *enc=NULL;
90        unsigned long f4=RSA_F4;
91        char *outfile=NULL;
92        char *passargout = NULL, *passout = NULL;
93        char *engine=NULL;
94        char *inrand=NULL;
95        BIO *out=NULL;
96
97        apps_startup();
98
99        if (bio_err == NULL)
100                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
101                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
102
103        if (!load_config(bio_err, NULL))
104                goto err;
105        if ((out=BIO_new(BIO_s_file())) == NULL)
106                {
107                BIO_printf(bio_err,"unable to create BIO for output\n");
108                goto err;
109                }
110
111        argv++;
112        argc--;
113        for (;;)
114                {
115                if (argc <= 0) break;
116                if (strcmp(*argv,"-out") == 0)
117                        {
118                        if (--argc < 1) goto bad;
119                        outfile= *(++argv);
120                        }
121                else if (strcmp(*argv,"-3") == 0)
122                        f4=3;
123                else if (strcmp(*argv,"-F4") == 0 || strcmp(*argv,"-f4") == 0)
124                        f4=RSA_F4;
125                else if (strcmp(*argv,"-engine") == 0)
126                        {
127                        if (--argc < 1) goto bad;
128                        engine= *(++argv);
129                        }
130                else if (strcmp(*argv,"-rand") == 0)
131                        {
132                        if (--argc < 1) goto bad;
133                        inrand= *(++argv);
134                        }
135#ifndef OPENSSL_NO_DES
136                else if (strcmp(*argv,"-des") == 0)
137                        enc=EVP_des_cbc();
138                else if (strcmp(*argv,"-des3") == 0)
139                        enc=EVP_des_ede3_cbc();
140#endif
141#ifndef OPENSSL_NO_IDEA
142                else if (strcmp(*argv,"-idea") == 0)
143                        enc=EVP_idea_cbc();
144#endif
145#ifndef OPENSSL_NO_AES
146                else if (strcmp(*argv,"-aes128") == 0)
147                        enc=EVP_aes_128_cbc();
148                else if (strcmp(*argv,"-aes192") == 0)
149                        enc=EVP_aes_192_cbc();
150                else if (strcmp(*argv,"-aes256") == 0)
151                        enc=EVP_aes_256_cbc();
152#endif
153                else if (strcmp(*argv,"-passout") == 0)
154                        {
155                        if (--argc < 1) goto bad;
156                        passargout= *(++argv);
157                        }
158                else
159                        break;
160                argv++;
161                argc--;
162                }
163        if ((argc >= 1) && ((sscanf(*argv,"%d",&num) == 0) || (num < 0)))
164                {
165bad:
166                BIO_printf(bio_err,"usage: genrsa [args] [numbits]\n");
167                BIO_printf(bio_err," -des            encrypt the generated key with DES in cbc mode\n");
168                BIO_printf(bio_err," -des3           encrypt the generated key with DES in ede cbc mode (168 bit key)\n");
169#ifndef OPENSSL_NO_IDEA
170                BIO_printf(bio_err," -idea           encrypt the generated key with IDEA in cbc mode\n");
171#endif
172#ifndef OPENSSL_NO_AES
173                BIO_printf(bio_err," -aes128, -aes192, -aes256\n");
174                BIO_printf(bio_err,"                 encrypt PEM output with cbc aes\n");
175#endif
176                BIO_printf(bio_err," -out file       output the key to 'file\n");
177                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
178                BIO_printf(bio_err," -f4             use F4 (0x10001) for the E value\n");
179                BIO_printf(bio_err," -3              use 3 for the E value\n");
180                BIO_printf(bio_err," -engine e       use engine e, possibly a hardware device.\n");
181                BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
182                BIO_printf(bio_err,"                 load the file (or the files in the directory) into\n");
183                BIO_printf(bio_err,"                 the random number generator\n");
184                goto err;
185                }
186               
187        ERR_load_crypto_strings();
188
189        if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) {
190                BIO_printf(bio_err, "Error getting password\n");
191                goto err;
192        }
193
194        e = setup_engine(bio_err, engine, 0);
195
196        if (outfile == NULL)
197                {
198                BIO_set_fp(out,stdout,BIO_NOCLOSE);
199#ifdef OPENSSL_SYS_VMS
200                {
201                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
202                out = BIO_push(tmpbio, out);
203                }
204#endif
205                }
206        else
207                {
208                if (BIO_write_filename(out,outfile) <= 0)
209                        {
210                        perror(outfile);
211                        goto err;
212                        }
213                }
214
215        if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
216                && !RAND_status())
217                {
218                BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
219                }
220        if (inrand != NULL)
221                BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
222                        app_RAND_load_files(inrand));
223
224        BIO_printf(bio_err,"Generating RSA private key, %d bit long modulus\n",
225                num);
226        rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err);
227               
228        app_RAND_write_file(NULL, bio_err);
229
230        if (rsa == NULL) goto err;
231       
232        /* We need to do the following for when the base number size is <
233         * long, esp windows 3.1 :-(. */
234        l=0L;
235        for (i=0; i<rsa->e->top; i++)
236                {
237#ifndef SIXTY_FOUR_BIT
238                l<<=BN_BITS4;
239                l<<=BN_BITS4;
240#endif
241                l+=rsa->e->d[i];
242                }
243        BIO_printf(bio_err,"e is %ld (0x%lX)\n",l,l);
244        {
245        PW_CB_DATA cb_data;
246        cb_data.password = passout;
247        cb_data.prompt_info = outfile;
248        if (!PEM_write_bio_RSAPrivateKey(out,rsa,enc,NULL,0,
249                (pem_password_cb *)password_callback,&cb_data))
250                goto err;
251        }
252
253        ret=0;
254err:
255        if (rsa != NULL) RSA_free(rsa);
256        if (out != NULL) BIO_free_all(out);
257        if(passout) OPENSSL_free(passout);
258        if (ret != 0)
259                ERR_print_errors(bio_err);
260        apps_shutdown();
261        OPENSSL_EXIT(ret);
262        }
263
264static void MS_CALLBACK genrsa_cb(int p, int n, void *arg)
265        {
266        char c='*';
267
268        if (p == 0) c='.';
269        if (p == 1) c='+';
270        if (p == 2) c='*';
271        if (p == 3) c='\n';
272        BIO_write((BIO *)arg,&c,1);
273        (void)BIO_flush((BIO *)arg);
274#ifdef LINT
275        p=n;
276#endif
277        }
278#else /* !OPENSSL_NO_RSA */
279
280# if PEDANTIC
281static void *dummy=&dummy;
282# endif
283
284#endif
Note: See TracBrowser for help on using the repository browser.