Index: openssl/apps/rsa.c |
=================================================================== |
--- openssl/apps/rsa.c (revision 105093) |
+++ openssl/apps/rsa.c (working copy) |
@@ -115,6 +115,8 @@ |
#endif |
int modulus=0; |
+ int pvk_encr = 2; |
+ |
apps_startup(); |
if (bio_err == NULL) |
@@ -177,6 +179,16 @@ |
pubin=1; |
else if (strcmp(*argv,"-pubout") == 0) |
pubout=1; |
+ else if (strcmp(*argv,"-RSAPublicKey_in") == 0) |
+ pubin = 2; |
+ else if (strcmp(*argv,"-RSAPublicKey_out") == 0) |
+ pubout = 2; |
+ else if (strcmp(*argv,"-pvk-strong") == 0) |
+ pvk_encr=2; |
+ else if (strcmp(*argv,"-pvk-weak") == 0) |
+ pvk_encr=1; |
+ else if (strcmp(*argv,"-pvk-none") == 0) |
+ pvk_encr=0; |
else if (strcmp(*argv,"-noout") == 0) |
noout=1; |
else if (strcmp(*argv,"-text") == 0) |
@@ -257,10 +269,23 @@ |
EVP_PKEY *pkey; |
if (pubin) |
- pkey = load_pubkey(bio_err, infile, |
- (informat == FORMAT_NETSCAPE && sgckey ? |
- FORMAT_IISSGC : informat), 1, |
+ { |
+ int tmpformat=-1; |
+ if (pubin == 2) |
+ { |
+ if (informat == FORMAT_PEM) |
+ tmpformat = FORMAT_PEMRSA; |
+ else if (informat == FORMAT_ASN1) |
+ tmpformat = FORMAT_ASN1RSA; |
+ } |
+ else if (informat == FORMAT_NETSCAPE && sgckey) |
+ tmpformat = FORMAT_IISSGC; |
+ else |
+ tmpformat = informat; |
+ |
+ pkey = load_pubkey(bio_err, infile, tmpformat, 1, |
passin, e, "Public Key"); |
+ } |
else |
pkey = load_key(bio_err, infile, |
(informat == FORMAT_NETSCAPE && sgckey ? |
@@ -268,7 +293,7 @@ |
passin, e, "Private Key"); |
if (pkey != NULL) |
- rsa = pkey == NULL ? NULL : EVP_PKEY_get1_RSA(pkey); |
+ rsa = EVP_PKEY_get1_RSA(pkey); |
EVP_PKEY_free(pkey); |
} |
@@ -346,7 +371,13 @@ |
} |
BIO_printf(bio_err,"writing RSA key\n"); |
if (outformat == FORMAT_ASN1) { |
- if(pubout || pubin) i=i2d_RSA_PUBKEY_bio(out,rsa); |
+ if(pubout || pubin) |
+ { |
+ if (pubout == 2) |
+ i=i2d_RSAPublicKey_bio(out,rsa); |
+ else |
+ i=i2d_RSA_PUBKEY_bio(out,rsa); |
+ } |
else i=i2d_RSAPrivateKey_bio(out,rsa); |
} |
#ifndef OPENSSL_NO_RC4 |
@@ -370,14 +401,32 @@ |
#endif |
else if (outformat == FORMAT_PEM) { |
if(pubout || pubin) |
- i=PEM_write_bio_RSA_PUBKEY(out,rsa); |
+ { |
+ if (pubout == 2) |
+ i=PEM_write_bio_RSAPublicKey(out,rsa); |
+ else |
+ i=PEM_write_bio_RSA_PUBKEY(out,rsa); |
+ } |
else i=PEM_write_bio_RSAPrivateKey(out,rsa, |
enc,NULL,0,NULL,passout); |
+#if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4) |
+ } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { |
+ EVP_PKEY *pk; |
+ pk = EVP_PKEY_new(); |
+ EVP_PKEY_set1_RSA(pk, rsa); |
+ if (outformat == FORMAT_PVK) |
+ i = i2b_PVK_bio(out, pk, pvk_encr, 0, passout); |
+ else if (pubin || pubout) |
+ i = i2b_PublicKey_bio(out, pk); |
+ else |
+ i = i2b_PrivateKey_bio(out, pk); |
+ EVP_PKEY_free(pk); |
+#endif |
} else { |
BIO_printf(bio_err,"bad output format specified for outfile\n"); |
goto end; |
} |
- if (!i) |
+ if (i <= 0) |
{ |
BIO_printf(bio_err,"unable to write key\n"); |
ERR_print_errors(bio_err); |