OLD | NEW |
1 /* apps/rsa.c */ | 1 /* apps/rsa.c */ |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
8 * | 8 * |
9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 int informat,outformat,text=0,check=0,noout=0; | 108 int informat,outformat,text=0,check=0,noout=0; |
109 int pubin = 0, pubout = 0; | 109 int pubin = 0, pubout = 0; |
110 char *infile,*outfile,*prog; | 110 char *infile,*outfile,*prog; |
111 char *passargin = NULL, *passargout = NULL; | 111 char *passargin = NULL, *passargout = NULL; |
112 char *passin = NULL, *passout = NULL; | 112 char *passin = NULL, *passout = NULL; |
113 #ifndef OPENSSL_NO_ENGINE | 113 #ifndef OPENSSL_NO_ENGINE |
114 char *engine=NULL; | 114 char *engine=NULL; |
115 #endif | 115 #endif |
116 int modulus=0; | 116 int modulus=0; |
117 | 117 |
| 118 int pvk_encr = 2; |
| 119 |
118 apps_startup(); | 120 apps_startup(); |
119 | 121 |
120 if (bio_err == NULL) | 122 if (bio_err == NULL) |
121 if ((bio_err=BIO_new(BIO_s_file())) != NULL) | 123 if ((bio_err=BIO_new(BIO_s_file())) != NULL) |
122 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); | 124 BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); |
123 | 125 |
124 if (!load_config(bio_err, NULL)) | 126 if (!load_config(bio_err, NULL)) |
125 goto end; | 127 goto end; |
126 | 128 |
127 infile=NULL; | 129 infile=NULL; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 if (--argc < 1) goto bad; | 172 if (--argc < 1) goto bad; |
171 engine= *(++argv); | 173 engine= *(++argv); |
172 } | 174 } |
173 #endif | 175 #endif |
174 else if (strcmp(*argv,"-sgckey") == 0) | 176 else if (strcmp(*argv,"-sgckey") == 0) |
175 sgckey=1; | 177 sgckey=1; |
176 else if (strcmp(*argv,"-pubin") == 0) | 178 else if (strcmp(*argv,"-pubin") == 0) |
177 pubin=1; | 179 pubin=1; |
178 else if (strcmp(*argv,"-pubout") == 0) | 180 else if (strcmp(*argv,"-pubout") == 0) |
179 pubout=1; | 181 pubout=1; |
| 182 else if (strcmp(*argv,"-RSAPublicKey_in") == 0) |
| 183 pubin = 2; |
| 184 else if (strcmp(*argv,"-RSAPublicKey_out") == 0) |
| 185 pubout = 2; |
| 186 else if (strcmp(*argv,"-pvk-strong") == 0) |
| 187 pvk_encr=2; |
| 188 else if (strcmp(*argv,"-pvk-weak") == 0) |
| 189 pvk_encr=1; |
| 190 else if (strcmp(*argv,"-pvk-none") == 0) |
| 191 pvk_encr=0; |
180 else if (strcmp(*argv,"-noout") == 0) | 192 else if (strcmp(*argv,"-noout") == 0) |
181 noout=1; | 193 noout=1; |
182 else if (strcmp(*argv,"-text") == 0) | 194 else if (strcmp(*argv,"-text") == 0) |
183 text=1; | 195 text=1; |
184 else if (strcmp(*argv,"-modulus") == 0) | 196 else if (strcmp(*argv,"-modulus") == 0) |
185 modulus=1; | 197 modulus=1; |
186 else if (strcmp(*argv,"-check") == 0) | 198 else if (strcmp(*argv,"-check") == 0) |
187 check=1; | 199 check=1; |
188 else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL) | 200 else if ((enc=EVP_get_cipherbyname(&(argv[0][1]))) == NULL) |
189 { | 201 { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 BIO_printf(bio_err, "Only private keys can be checked\n"); | 262 BIO_printf(bio_err, "Only private keys can be checked\n"); |
251 goto end; | 263 goto end; |
252 } | 264 } |
253 | 265 |
254 out=BIO_new(BIO_s_file()); | 266 out=BIO_new(BIO_s_file()); |
255 | 267 |
256 { | 268 { |
257 EVP_PKEY *pkey; | 269 EVP_PKEY *pkey; |
258 | 270 |
259 if (pubin) | 271 if (pubin) |
260 » » » pkey = load_pubkey(bio_err, infile, | 272 » » » { |
261 » » » » (informat == FORMAT_NETSCAPE && sgckey ? | 273 » » » int tmpformat=-1; |
262 » » » » » FORMAT_IISSGC : informat), 1, | 274 » » » if (pubin == 2) |
| 275 » » » » { |
| 276 » » » » if (informat == FORMAT_PEM) |
| 277 » » » » » tmpformat = FORMAT_PEMRSA; |
| 278 » » » » else if (informat == FORMAT_ASN1) |
| 279 » » » » » tmpformat = FORMAT_ASN1RSA; |
| 280 » » » » } |
| 281 » » » else if (informat == FORMAT_NETSCAPE && sgckey) |
| 282 » » » » tmpformat = FORMAT_IISSGC; |
| 283 » » » else |
| 284 » » » » tmpformat = informat; |
| 285 » » » » » |
| 286 » » » pkey = load_pubkey(bio_err, infile, tmpformat, 1, |
263 passin, e, "Public Key"); | 287 passin, e, "Public Key"); |
| 288 } |
264 else | 289 else |
265 pkey = load_key(bio_err, infile, | 290 pkey = load_key(bio_err, infile, |
266 (informat == FORMAT_NETSCAPE && sgckey ? | 291 (informat == FORMAT_NETSCAPE && sgckey ? |
267 FORMAT_IISSGC : informat), 1, | 292 FORMAT_IISSGC : informat), 1, |
268 passin, e, "Private Key"); | 293 passin, e, "Private Key"); |
269 | 294 |
270 if (pkey != NULL) | 295 if (pkey != NULL) |
271 » » rsa = pkey == NULL ? NULL : EVP_PKEY_get1_RSA(pkey); | 296 » » » rsa = EVP_PKEY_get1_RSA(pkey); |
272 EVP_PKEY_free(pkey); | 297 EVP_PKEY_free(pkey); |
273 } | 298 } |
274 | 299 |
275 if (rsa == NULL) | 300 if (rsa == NULL) |
276 { | 301 { |
277 ERR_print_errors(bio_err); | 302 ERR_print_errors(bio_err); |
278 goto end; | 303 goto end; |
279 } | 304 } |
280 | 305 |
281 if (outfile == NULL) | 306 if (outfile == NULL) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 } | 364 } |
340 } | 365 } |
341 | 366 |
342 if (noout) | 367 if (noout) |
343 { | 368 { |
344 ret = 0; | 369 ret = 0; |
345 goto end; | 370 goto end; |
346 } | 371 } |
347 BIO_printf(bio_err,"writing RSA key\n"); | 372 BIO_printf(bio_err,"writing RSA key\n"); |
348 if (outformat == FORMAT_ASN1) { | 373 if (outformat == FORMAT_ASN1) { |
349 » » if(pubout || pubin) i=i2d_RSA_PUBKEY_bio(out,rsa); | 374 » » if(pubout || pubin) |
| 375 » » » { |
| 376 » » » if (pubout == 2) |
| 377 » » » » i=i2d_RSAPublicKey_bio(out,rsa); |
| 378 » » » else |
| 379 » » » » i=i2d_RSA_PUBKEY_bio(out,rsa); |
| 380 » » » } |
350 else i=i2d_RSAPrivateKey_bio(out,rsa); | 381 else i=i2d_RSAPrivateKey_bio(out,rsa); |
351 } | 382 } |
352 #ifndef OPENSSL_NO_RC4 | 383 #ifndef OPENSSL_NO_RC4 |
353 else if (outformat == FORMAT_NETSCAPE) | 384 else if (outformat == FORMAT_NETSCAPE) |
354 { | 385 { |
355 unsigned char *p,*pp; | 386 unsigned char *p,*pp; |
356 int size; | 387 int size; |
357 | 388 |
358 i=1; | 389 i=1; |
359 size=i2d_RSA_NET(rsa,NULL,NULL, sgckey); | 390 size=i2d_RSA_NET(rsa,NULL,NULL, sgckey); |
360 if ((p=(unsigned char *)OPENSSL_malloc(size)) == NULL) | 391 if ((p=(unsigned char *)OPENSSL_malloc(size)) == NULL) |
361 { | 392 { |
362 BIO_printf(bio_err,"Memory allocation failure\n"); | 393 BIO_printf(bio_err,"Memory allocation failure\n"); |
363 goto end; | 394 goto end; |
364 } | 395 } |
365 pp=p; | 396 pp=p; |
366 i2d_RSA_NET(rsa,&p,NULL, sgckey); | 397 i2d_RSA_NET(rsa,&p,NULL, sgckey); |
367 BIO_write(out,(char *)pp,size); | 398 BIO_write(out,(char *)pp,size); |
368 OPENSSL_free(pp); | 399 OPENSSL_free(pp); |
369 } | 400 } |
370 #endif | 401 #endif |
371 else if (outformat == FORMAT_PEM) { | 402 else if (outformat == FORMAT_PEM) { |
372 if(pubout || pubin) | 403 if(pubout || pubin) |
373 » » i=PEM_write_bio_RSA_PUBKEY(out,rsa); | 404 » » » { |
| 405 » » » if (pubout == 2) |
| 406 » » » » i=PEM_write_bio_RSAPublicKey(out,rsa); |
| 407 » » » else |
| 408 » » » » i=PEM_write_bio_RSA_PUBKEY(out,rsa); |
| 409 » » » } |
374 else i=PEM_write_bio_RSAPrivateKey(out,rsa, | 410 else i=PEM_write_bio_RSAPrivateKey(out,rsa, |
375 enc,NULL,0,NULL,passout); | 411 enc,NULL,0,NULL,passout); |
| 412 #if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4) |
| 413 } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { |
| 414 EVP_PKEY *pk; |
| 415 pk = EVP_PKEY_new(); |
| 416 EVP_PKEY_set1_RSA(pk, rsa); |
| 417 if (outformat == FORMAT_PVK) |
| 418 i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); |
| 419 else if (pubin || pubout) |
| 420 i = i2b_PublicKey_bio(out, pk); |
| 421 else |
| 422 i = i2b_PrivateKey_bio(out, pk); |
| 423 EVP_PKEY_free(pk); |
| 424 #endif |
376 } else { | 425 } else { |
377 BIO_printf(bio_err,"bad output format specified for outfile\n"); | 426 BIO_printf(bio_err,"bad output format specified for outfile\n"); |
378 goto end; | 427 goto end; |
379 } | 428 } |
380 » if (!i) | 429 » if (i <= 0) |
381 { | 430 { |
382 BIO_printf(bio_err,"unable to write key\n"); | 431 BIO_printf(bio_err,"unable to write key\n"); |
383 ERR_print_errors(bio_err); | 432 ERR_print_errors(bio_err); |
384 } | 433 } |
385 else | 434 else |
386 ret=0; | 435 ret=0; |
387 end: | 436 end: |
388 if(out != NULL) BIO_free_all(out); | 437 if(out != NULL) BIO_free_all(out); |
389 if(rsa != NULL) RSA_free(rsa); | 438 if(rsa != NULL) RSA_free(rsa); |
390 if(passin) OPENSSL_free(passin); | 439 if(passin) OPENSSL_free(passin); |
391 if(passout) OPENSSL_free(passout); | 440 if(passout) OPENSSL_free(passout); |
392 apps_shutdown(); | 441 apps_shutdown(); |
393 OPENSSL_EXIT(ret); | 442 OPENSSL_EXIT(ret); |
394 } | 443 } |
395 #else /* !OPENSSL_NO_RSA */ | 444 #else /* !OPENSSL_NO_RSA */ |
396 | 445 |
397 # if PEDANTIC | 446 # if PEDANTIC |
398 static void *dummy=&dummy; | 447 static void *dummy=&dummy; |
399 # endif | 448 # endif |
400 | 449 |
401 #endif | 450 #endif |
OLD | NEW |