#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/pkcs12.h>
+#include <openssl/engine.h>
#include "apps.h"
#define PROG pkcs8_main
int MAIN(int argc, char **argv)
{
+ ENGINE *e = NULL;
char **args, *infile = NULL, *outfile = NULL;
char *passargin = NULL, *passargout = NULL;
BIO *in = NULL, *out = NULL;
EVP_PKEY *pkey;
char pass[50], *passin = NULL, *passout = NULL, *p8pass = NULL;
int badarg = 0;
+ char *engine=NULL;
+
if (bio_err == NULL) bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
+
informat=FORMAT_PEM;
outformat=FORMAT_PEM;
+
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
args = argv + 1;
if (!args[1]) goto bad;
passargout= *(++args);
}
+ else if (strcmp(*args,"-engine") == 0)
+ {
+ if (!args[1]) goto bad;
+ engine= *(++args);
+ }
else if (!strcmp (*args, "-in")) {
if (args[1]) {
args++;
BIO_printf(bio_err, "-nocrypt use or expect unencrypted private key\n");
BIO_printf(bio_err, "-v2 alg use PKCS#5 v2.0 and cipher \"alg\"\n");
BIO_printf(bio_err, "-v1 obj use PKCS#5 v1.5 and cipher \"alg\"\n");
+ BIO_printf(bio_err," -engine e use engine e, possibly a hardware device.\n");
return (1);
}
+ if (engine != NULL)
+ {
+ if((e = ENGINE_by_id(engine)) == NULL)
+ {
+ BIO_printf(bio_err,"invalid engine \"%s\"\n",
+ engine);
+ return (1);
+ }
+ if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
+ {
+ BIO_printf(bio_err,"can't use that engine\n");
+ return (1);
+ }
+ BIO_printf(bio_err,"engine \"%s\" set.\n", engine);
+ /* Free our "structural" reference. */
+ ENGINE_free(e);
+ }
+
if(!app_passwd(bio_err, passargin, passargout, &passin, &passout)) {
BIO_printf(bio_err, "Error getting passwords\n");
return (1);
"Can't open output file %s\n", outfile);
return (1);
}
- } else out = BIO_new_fp (stdout, BIO_NOCLOSE);
-
+ } else {
+ out = BIO_new_fp (stdout, BIO_NOCLOSE);
+#ifdef VMS
+ {
+ BIO *tmpbio = BIO_new(BIO_f_linebuffer());
+ out = BIO_push(tmpbio, out);
+ }
+#endif
+ }
if (topk8) {
if(informat == FORMAT_PEM)
pkey = PEM_read_bio_PrivateKey(in, NULL, NULL, passin);
}
PKCS8_PRIV_KEY_INFO_free (p8inf);
EVP_PKEY_free(pkey);
- BIO_free(out);
+ BIO_free_all(out);
if(passin) OPENSSL_free(passin);
if(passout) OPENSSL_free(passout);
return (0);
}
EVP_PKEY_free(pkey);
- BIO_free(out);
+ BIO_free_all(out);
BIO_free(in);
if(passin) OPENSSL_free(passin);
if(passout) OPENSSL_free(passout);