Index: openssl/apps/dsa.c |
=================================================================== |
--- openssl/apps/dsa.c (revision 105093) |
+++ openssl/apps/dsa.c (working copy) |
@@ -65,11 +65,11 @@ |
#include "apps.h" |
#include <openssl/bio.h> |
#include <openssl/err.h> |
+#include <openssl/dsa.h> |
#include <openssl/evp.h> |
#include <openssl/x509.h> |
#include <openssl/pem.h> |
#include <openssl/bn.h> |
-#include <openssl/dsa.h> |
#undef PROG |
#define PROG dsa_main |
@@ -112,6 +112,8 @@ |
char *passin = NULL, *passout = NULL; |
int modulus=0; |
+ int pvk_encr = 2; |
+ |
apps_startup(); |
if (bio_err == NULL) |
@@ -171,6 +173,12 @@ |
engine= *(++argv); |
} |
#endif |
+ 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) |
@@ -238,16 +246,30 @@ |
goto end; |
} |
+ in=BIO_new(BIO_s_file()); |
out=BIO_new(BIO_s_file()); |
- if (out == NULL) |
+ if ((in == NULL) || (out == NULL)) |
{ |
ERR_print_errors(bio_err); |
goto end; |
} |
+ if (infile == NULL) |
+ BIO_set_fp(in,stdin,BIO_NOCLOSE); |
+ else |
+ { |
+ if (BIO_read_filename(in,infile) <= 0) |
+ { |
+ perror(infile); |
+ goto end; |
+ } |
+ } |
+ |
BIO_printf(bio_err,"read DSA key\n"); |
- { |
+ |
+ { |
EVP_PKEY *pkey; |
+ |
if (pubin) |
pkey = load_pubkey(bio_err, infile, informat, 1, |
passin, e, "Public Key"); |
@@ -255,10 +277,12 @@ |
pkey = load_key(bio_err, infile, informat, 1, |
passin, e, "Private Key"); |
- if (pkey != NULL) |
- dsa = pkey == NULL ? NULL : EVP_PKEY_get1_DSA(pkey); |
- EVP_PKEY_free(pkey); |
- } |
+ if (pkey) |
+ { |
+ dsa = EVP_PKEY_get1_DSA(pkey); |
+ EVP_PKEY_free(pkey); |
+ } |
+ } |
if (dsa == NULL) |
{ |
BIO_printf(bio_err,"unable to load Key\n"); |
@@ -310,11 +334,24 @@ |
i=PEM_write_bio_DSA_PUBKEY(out,dsa); |
else i=PEM_write_bio_DSAPrivateKey(out,dsa,enc, |
NULL,0,NULL, passout); |
+#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_RC4) |
+ } else if (outformat == FORMAT_MSBLOB || outformat == FORMAT_PVK) { |
+ EVP_PKEY *pk; |
+ pk = EVP_PKEY_new(); |
+ EVP_PKEY_set1_DSA(pk, dsa); |
+ 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 private key\n"); |
ERR_print_errors(bio_err); |
@@ -330,4 +367,10 @@ |
apps_shutdown(); |
OPENSSL_EXIT(ret); |
} |
+#else /* !OPENSSL_NO_DSA */ |
+ |
+# if PEDANTIC |
+static void *dummy=&dummy; |
+# endif |
+ |
#endif |