diff options
Diffstat (limited to 'src/lib/libssl/src/apps/genrsa.c')
| -rw-r--r-- | src/lib/libssl/src/apps/genrsa.c | 198 |
1 files changed, 102 insertions, 96 deletions
diff --git a/src/lib/libssl/src/apps/genrsa.c b/src/lib/libssl/src/apps/genrsa.c index cdba6189ad..515bd7c901 100644 --- a/src/lib/libssl/src/apps/genrsa.c +++ b/src/lib/libssl/src/apps/genrsa.c | |||
| @@ -56,45 +56,42 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef OPENSSL_NO_RSA | ||
| 59 | #include <stdio.h> | 60 | #include <stdio.h> |
| 60 | #include <string.h> | 61 | #include <string.h> |
| 61 | #include <sys/types.h> | 62 | #include <sys/types.h> |
| 62 | #include <sys/stat.h> | 63 | #include <sys/stat.h> |
| 63 | #include "apps.h" | 64 | #include "apps.h" |
| 64 | #include "bio.h" | 65 | #include <openssl/bio.h> |
| 65 | #include "rand.h" | 66 | #include <openssl/err.h> |
| 66 | #include "err.h" | 67 | #include <openssl/bn.h> |
| 67 | #include "bn.h" | 68 | #include <openssl/rsa.h> |
| 68 | #include "rsa.h" | 69 | #include <openssl/evp.h> |
| 69 | #include "evp.h" | 70 | #include <openssl/x509.h> |
| 70 | #include "x509.h" | 71 | #include <openssl/pem.h> |
| 71 | #include "pem.h" | 72 | #include <openssl/rand.h> |
| 72 | 73 | ||
| 73 | #define DEFBITS 512 | 74 | #define DEFBITS 512 |
| 74 | #undef PROG | 75 | #undef PROG |
| 75 | #define PROG genrsa_main | 76 | #define PROG genrsa_main |
| 76 | 77 | ||
| 77 | #ifndef NOPROTO | 78 | static void MS_CALLBACK genrsa_cb(int p, int n, void *arg); |
| 78 | static void MS_CALLBACK genrsa_cb(int p, int n, char *arg); | 79 | |
| 79 | static long gr_load_rand(char *names); | 80 | int MAIN(int, char **); |
| 80 | #else | ||
| 81 | static void MS_CALLBACK genrsa_cb(); | ||
| 82 | static long gr_load_rand(); | ||
| 83 | #endif | ||
| 84 | 81 | ||
| 85 | int MAIN(argc, argv) | 82 | int MAIN(int argc, char **argv) |
| 86 | int argc; | ||
| 87 | char **argv; | ||
| 88 | { | 83 | { |
| 84 | ENGINE *e = NULL; | ||
| 89 | int ret=1; | 85 | int ret=1; |
| 90 | char buffer[200]; | ||
| 91 | RSA *rsa=NULL; | 86 | RSA *rsa=NULL; |
| 92 | int i,num=DEFBITS; | 87 | int i,num=DEFBITS; |
| 93 | long rnum=0,l; | 88 | long l; |
| 94 | EVP_CIPHER *enc=NULL; | 89 | const EVP_CIPHER *enc=NULL; |
| 95 | unsigned long f4=RSA_F4; | 90 | unsigned long f4=RSA_F4; |
| 96 | char *outfile=NULL; | 91 | char *outfile=NULL; |
| 97 | char *inrand=NULL,*randfile; | 92 | char *passargout = NULL, *passout = NULL; |
| 93 | char *engine=NULL; | ||
| 94 | char *inrand=NULL; | ||
| 98 | BIO *out=NULL; | 95 | BIO *out=NULL; |
| 99 | 96 | ||
| 100 | apps_startup(); | 97 | apps_startup(); |
| @@ -102,9 +99,12 @@ char **argv; | |||
| 102 | if (bio_err == NULL) | 99 | if (bio_err == NULL) |
| 103 | if ((bio_err=BIO_new(BIO_s_file())) != NULL) | 100 | if ((bio_err=BIO_new(BIO_s_file())) != NULL) |
| 104 | BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); | 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) | 105 | if ((out=BIO_new(BIO_s_file())) == NULL) |
| 106 | { | 106 | { |
| 107 | BIO_printf(bio_err,"unable to creat BIO for output\n"); | 107 | BIO_printf(bio_err,"unable to create BIO for output\n"); |
| 108 | goto err; | 108 | goto err; |
| 109 | } | 109 | } |
| 110 | 110 | ||
| @@ -120,23 +120,41 @@ char **argv; | |||
| 120 | } | 120 | } |
| 121 | else if (strcmp(*argv,"-3") == 0) | 121 | else if (strcmp(*argv,"-3") == 0) |
| 122 | f4=3; | 122 | f4=3; |
| 123 | else if (strcmp(*argv,"-F4") == 0) | 123 | else if (strcmp(*argv,"-F4") == 0 || strcmp(*argv,"-f4") == 0) |
| 124 | f4=RSA_F4; | 124 | f4=RSA_F4; |
| 125 | else if (strcmp(*argv,"-engine") == 0) | ||
| 126 | { | ||
| 127 | if (--argc < 1) goto bad; | ||
| 128 | engine= *(++argv); | ||
| 129 | } | ||
| 125 | else if (strcmp(*argv,"-rand") == 0) | 130 | else if (strcmp(*argv,"-rand") == 0) |
| 126 | { | 131 | { |
| 127 | if (--argc < 1) goto bad; | 132 | if (--argc < 1) goto bad; |
| 128 | inrand= *(++argv); | 133 | inrand= *(++argv); |
| 129 | } | 134 | } |
| 130 | #ifndef NO_DES | 135 | #ifndef OPENSSL_NO_DES |
| 131 | else if (strcmp(*argv,"-des") == 0) | 136 | else if (strcmp(*argv,"-des") == 0) |
| 132 | enc=EVP_des_cbc(); | 137 | enc=EVP_des_cbc(); |
| 133 | else if (strcmp(*argv,"-des3") == 0) | 138 | else if (strcmp(*argv,"-des3") == 0) |
| 134 | enc=EVP_des_ede3_cbc(); | 139 | enc=EVP_des_ede3_cbc(); |
| 135 | #endif | 140 | #endif |
| 136 | #ifndef NO_IDEA | 141 | #ifndef OPENSSL_NO_IDEA |
| 137 | else if (strcmp(*argv,"-idea") == 0) | 142 | else if (strcmp(*argv,"-idea") == 0) |
| 138 | enc=EVP_idea_cbc(); | 143 | enc=EVP_idea_cbc(); |
| 139 | #endif | 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 | } | ||
| 140 | else | 158 | else |
| 141 | break; | 159 | break; |
| 142 | argv++; | 160 | argv++; |
| @@ -146,23 +164,45 @@ char **argv; | |||
| 146 | { | 164 | { |
| 147 | bad: | 165 | bad: |
| 148 | BIO_printf(bio_err,"usage: genrsa [args] [numbits]\n"); | 166 | BIO_printf(bio_err,"usage: genrsa [args] [numbits]\n"); |
| 149 | BIO_printf(bio_err," -des - encrypt the generated key with DES in cbc mode\n"); | 167 | BIO_printf(bio_err," -des encrypt the generated key with DES in cbc mode\n"); |
| 150 | BIO_printf(bio_err," -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)\n"); | 168 | BIO_printf(bio_err," -des3 encrypt the generated key with DES in ede cbc mode (168 bit key)\n"); |
| 151 | #ifndef NO_IDEA | 169 | #ifndef OPENSSL_NO_IDEA |
| 152 | BIO_printf(bio_err," -idea - encrypt the generated key with IDEA in cbc mode\n"); | 170 | BIO_printf(bio_err," -idea encrypt the generated key with IDEA in cbc mode\n"); |
| 153 | #endif | 171 | #endif |
| 154 | BIO_printf(bio_err," -out file - output the key to 'file\n"); | 172 | #ifndef OPENSSL_NO_AES |
| 155 | BIO_printf(bio_err," -f4 - use F4 (0x10001) for the E value\n"); | 173 | BIO_printf(bio_err," -aes128, -aes192, -aes256\n"); |
| 156 | BIO_printf(bio_err," -3 - use 3 for the E value\n"); | 174 | BIO_printf(bio_err," encrypt PEM output with cbc aes\n"); |
| 157 | BIO_printf(bio_err," -rand file:file:...\n"); | 175 | #endif |
| 158 | BIO_printf(bio_err," - load the file (or the files in the directory) into\n"); | 176 | BIO_printf(bio_err," -out file output the key to 'file\n"); |
| 159 | BIO_printf(bio_err," the random number generator\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"); | ||
| 160 | goto err; | 184 | goto err; |
| 161 | } | 185 | } |
| 162 | 186 | ||
| 163 | ERR_load_crypto_strings(); | 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 | |||
| 164 | if (outfile == NULL) | 196 | if (outfile == NULL) |
| 197 | { | ||
| 165 | BIO_set_fp(out,stdout,BIO_NOCLOSE); | 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 | } | ||
| 166 | else | 206 | else |
| 167 | { | 207 | { |
| 168 | if (BIO_write_filename(out,outfile) <= 0) | 208 | if (BIO_write_filename(out,outfile) <= 0) |
| @@ -172,45 +212,24 @@ bad: | |||
| 172 | } | 212 | } |
| 173 | } | 213 | } |
| 174 | 214 | ||
| 175 | #ifdef WINDOWS | 215 | if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL |
| 176 | BIO_printf(bio_err,"Loading 'screen' into random state -"); | 216 | && !RAND_status()) |
| 177 | BIO_flush(bio_err); | ||
| 178 | RAND_screen(); | ||
| 179 | BIO_printf(bio_err," done\n"); | ||
| 180 | #endif | ||
| 181 | randfile=RAND_file_name(buffer,200); | ||
| 182 | if ((randfile == NULL) || | ||
| 183 | !(rnum=(long)RAND_load_file(randfile,1024L*1024L))) | ||
| 184 | { | 217 | { |
| 185 | BIO_printf(bio_err,"unable to load 'random state'\n"); | 218 | BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n"); |
| 186 | } | 219 | } |
| 187 | 220 | if (inrand != NULL) | |
| 188 | if (inrand == NULL) | 221 | BIO_printf(bio_err,"%ld semi-random bytes loaded\n", |
| 189 | { | 222 | app_RAND_load_files(inrand)); |
| 190 | if (rnum == 0) | ||
| 191 | { | ||
| 192 | BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n"); | ||
| 193 | } | ||
| 194 | } | ||
| 195 | else | ||
| 196 | { | ||
| 197 | rnum+=gr_load_rand(inrand); | ||
| 198 | } | ||
| 199 | if (rnum != 0) | ||
| 200 | BIO_printf(bio_err,"%ld semi-random bytes loaded\n",rnum); | ||
| 201 | 223 | ||
| 202 | BIO_printf(bio_err,"Generating RSA private key, %d bit long modulus\n", | 224 | BIO_printf(bio_err,"Generating RSA private key, %d bit long modulus\n", |
| 203 | num); | 225 | num); |
| 204 | rsa=RSA_generate_key(num,f4,genrsa_cb,(char *)bio_err); | 226 | rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err); |
| 205 | 227 | ||
| 206 | if (randfile == NULL) | 228 | app_RAND_write_file(NULL, bio_err); |
| 207 | BIO_printf(bio_err,"unable to write 'random state'\n"); | ||
| 208 | else | ||
| 209 | RAND_write_file(randfile); | ||
| 210 | 229 | ||
| 211 | if (rsa == NULL) goto err; | 230 | if (rsa == NULL) goto err; |
| 212 | 231 | ||
| 213 | /* We need to do the folloing for when the base number size is < | 232 | /* We need to do the following for when the base number size is < |
| 214 | * long, esp windows 3.1 :-(. */ | 233 | * long, esp windows 3.1 :-(. */ |
| 215 | l=0L; | 234 | l=0L; |
| 216 | for (i=0; i<rsa->e->top; i++) | 235 | for (i=0; i<rsa->e->top; i++) |
| @@ -222,22 +241,27 @@ bad: | |||
| 222 | l+=rsa->e->d[i]; | 241 | l+=rsa->e->d[i]; |
| 223 | } | 242 | } |
| 224 | BIO_printf(bio_err,"e is %ld (0x%lX)\n",l,l); | 243 | BIO_printf(bio_err,"e is %ld (0x%lX)\n",l,l); |
| 225 | if (!PEM_write_bio_RSAPrivateKey(out,rsa,enc,NULL,0,NULL)) | 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)) | ||
| 226 | goto err; | 250 | goto err; |
| 251 | } | ||
| 227 | 252 | ||
| 228 | ret=0; | 253 | ret=0; |
| 229 | err: | 254 | err: |
| 230 | if (rsa != NULL) RSA_free(rsa); | 255 | if (rsa != NULL) RSA_free(rsa); |
| 231 | if (out != NULL) BIO_free(out); | 256 | if (out != NULL) BIO_free_all(out); |
| 257 | if(passout) OPENSSL_free(passout); | ||
| 232 | if (ret != 0) | 258 | if (ret != 0) |
| 233 | ERR_print_errors(bio_err); | 259 | ERR_print_errors(bio_err); |
| 260 | apps_shutdown(); | ||
| 234 | EXIT(ret); | 261 | EXIT(ret); |
| 235 | } | 262 | } |
| 236 | 263 | ||
| 237 | static void MS_CALLBACK genrsa_cb(p, n, arg) | 264 | static void MS_CALLBACK genrsa_cb(int p, int n, void *arg) |
| 238 | int p; | ||
| 239 | int n; | ||
| 240 | char *arg; | ||
| 241 | { | 265 | { |
| 242 | char c='*'; | 266 | char c='*'; |
| 243 | 267 | ||
| @@ -246,33 +270,15 @@ char *arg; | |||
| 246 | if (p == 2) c='*'; | 270 | if (p == 2) c='*'; |
| 247 | if (p == 3) c='\n'; | 271 | if (p == 3) c='\n'; |
| 248 | BIO_write((BIO *)arg,&c,1); | 272 | BIO_write((BIO *)arg,&c,1); |
| 249 | BIO_flush((BIO *)arg); | 273 | (void)BIO_flush((BIO *)arg); |
| 250 | #ifdef LINT | 274 | #ifdef LINT |
| 251 | p=n; | 275 | p=n; |
| 252 | #endif | 276 | #endif |
| 253 | } | 277 | } |
| 278 | #else /* !OPENSSL_NO_RSA */ | ||
| 254 | 279 | ||
| 255 | static long gr_load_rand(name) | 280 | # if PEDANTIC |
| 256 | char *name; | 281 | static void *dummy=&dummy; |
| 257 | { | 282 | # endif |
| 258 | char *p,*n; | ||
| 259 | int last; | ||
| 260 | long tot=0; | ||
| 261 | |||
| 262 | for (;;) | ||
| 263 | { | ||
| 264 | last=0; | ||
| 265 | for (p=name; ((*p != '\0') && (*p != LIST_SEPARATOR_CHAR)); p++); | ||
| 266 | if (*p == '\0') last=1; | ||
| 267 | *p='\0'; | ||
| 268 | n=name; | ||
| 269 | name=p+1; | ||
| 270 | if (*n == '\0') break; | ||
| 271 | |||
| 272 | tot+=RAND_load_file(n,1024L*1024L); | ||
| 273 | if (last) break; | ||
| 274 | } | ||
| 275 | return(tot); | ||
| 276 | } | ||
| 277 | |||
| 278 | 283 | ||
| 284 | #endif | ||
