Make it possible to test SSL compression
[openssl.git] / apps / rsa.c
index 9d4c2e6564050916bd11e3296d52e73ace47aa3a..825d925c662bec272dcd2b32d5ba04a3abd78638 100644 (file)
@@ -68,6 +68,7 @@
 #include <openssl/evp.h>
 #include <openssl/x509.h>
 #include <openssl/pem.h>
+#include <openssl/engine.h>
 
 #undef PROG
 #define PROG   rsa_main
@@ -90,9 +91,10 @@ int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
        {
+       ENGINE *e = NULL;
        int ret=1;
        RSA *rsa=NULL;
-       int i,badops=0;
+       int i,badops=0, sgckey=0;
        const EVP_CIPHER *enc=NULL;
        BIO *in=NULL,*out=NULL;
        int informat,outformat,text=0,check=0,noout=0;
@@ -100,6 +102,7 @@ int MAIN(int argc, char **argv)
        char *infile,*outfile,*prog;
        char *passargin = NULL, *passargout = NULL;
        char *passin = NULL, *passout = NULL;
+       char *engine=NULL;
        int modulus=0;
 
        apps_startup();
@@ -148,6 +151,13 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        passargout= *(++argv);
                        }
+               else if (strcmp(*argv,"-engine") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       engine= *(++argv);
+                       }
+               else if (strcmp(*argv,"-sgckey") == 0)
+                       sgckey=1;
                else if (strcmp(*argv,"-pubin") == 0)
                        pubin=1;
                else if (strcmp(*argv,"-pubout") == 0)
@@ -178,6 +188,7 @@ bad:
                BIO_printf(bio_err," -inform arg     input format - one of DER NET PEM\n");
                BIO_printf(bio_err," -outform arg    output format - one of DER NET PEM\n");
                BIO_printf(bio_err," -in arg         input file\n");
+               BIO_printf(bio_err," -sgckey         Use IIS SGC key format\n");
                BIO_printf(bio_err," -passin arg     input file pass phrase source\n");
                BIO_printf(bio_err," -out arg        output file\n");
                BIO_printf(bio_err," -passout arg    output file pass phrase source\n");
@@ -192,11 +203,30 @@ bad:
                BIO_printf(bio_err," -check          verify key consistency\n");
                BIO_printf(bio_err," -pubin          expect a public key in input file\n");
                BIO_printf(bio_err," -pubout         output a public key\n");
+               BIO_printf(bio_err," -engine e       use engine e, possibly a hardware device.\n");
                goto end;
                }
 
        ERR_load_crypto_strings();
 
+       if (engine != NULL)
+               {
+               if((e = ENGINE_by_id(engine)) == NULL)
+                       {
+                       BIO_printf(bio_err,"invalid engine \"%s\"\n",
+                               engine);
+                       goto end;
+                       }
+               if(!ENGINE_set_default(e, ENGINE_METHOD_ALL))
+                       {
+                       BIO_printf(bio_err,"can't use that engine\n");
+                       goto end;
+                       }
+               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");
                goto end;
@@ -235,7 +265,7 @@ bad:
        else if (informat == FORMAT_NETSCAPE)
                {
                BUF_MEM *buf=NULL;
-               unsigned char *p;
+               const unsigned char *p;
                int size=0;
 
                buf=BUF_MEM_new();
@@ -254,7 +284,7 @@ bad:
                                }
                        }
                p=(unsigned char *)buf->data;
-               rsa=d2i_Netscape_RSA(NULL,&p,(long)size,NULL);
+               rsa=d2i_RSA_NET(NULL,&p,(long)size,NULL, sgckey);
                BUF_MEM_free(buf);
                }
 #endif
@@ -275,7 +305,15 @@ bad:
                }
 
        if (outfile == NULL)
+               {
                BIO_set_fp(out,stdout,BIO_NOCLOSE);
+#ifdef VMS
+               {
+               BIO *tmpbio = BIO_new(BIO_f_linebuffer());
+               out = BIO_push(tmpbio, out);
+               }
+#endif
+               }
        else
                {
                if (BIO_write_filename(out,outfile) <= 0)
@@ -308,14 +346,14 @@ bad:
                        BIO_printf(out,"RSA key ok\n");
                else if (r == 0)
                        {
-                       long e;
+                       long err;
 
-                       while ((e = ERR_peek_error()) != 0 &&
-                               ERR_GET_LIB(e) == ERR_LIB_RSA &&
-                               ERR_GET_FUNC(e) == RSA_F_RSA_CHECK_KEY &&
-                               ERR_GET_REASON(e) != ERR_R_MALLOC_FAILURE)
+                       while ((err = ERR_peek_error()) != 0 &&
+                               ERR_GET_LIB(err) == ERR_LIB_RSA &&
+                               ERR_GET_FUNC(err) == RSA_F_RSA_CHECK_KEY &&
+                               ERR_GET_REASON(err) != ERR_R_MALLOC_FAILURE)
                                {
-                               BIO_printf(out, "RSA key error: %s\n", ERR_reason_error_string(e));
+                               BIO_printf(out, "RSA key error: %s\n", ERR_reason_error_string(err));
                                ERR_get_error(); /* remove e from error stack */
                                }
                        }
@@ -344,16 +382,16 @@ bad:
                int size;
 
                i=1;
-               size=i2d_Netscape_RSA(rsa,NULL,NULL);
-               if ((p=(unsigned char *)Malloc(size)) == NULL)
+               size=i2d_RSA_NET(rsa,NULL,NULL, sgckey);
+               if ((p=(unsigned char *)OPENSSL_malloc(size)) == NULL)
                        {
-                       BIO_printf(bio_err,"Malloc failure\n");
+                       BIO_printf(bio_err,"Memory allocation failure\n");
                        goto end;
                        }
                pp=p;
-               i2d_Netscape_RSA(rsa,&p,NULL);
+               i2d_RSA_NET(rsa,&p,NULL, sgckey);
                BIO_write(out,(char *)pp,size);
-               Free(pp);
+               OPENSSL_free(pp);
                }
 #endif
        else if (outformat == FORMAT_PEM) {
@@ -374,10 +412,10 @@ bad:
                ret=0;
 end:
        if(in != NULL) BIO_free(in);
-       if(out != NULL) BIO_free(out);
+       if(out != NULL) BIO_free_all(out);
        if(rsa != NULL) RSA_free(rsa);
-       if(passin) Free(passin);
-       if(passout) Free(passout);
+       if(passin) OPENSSL_free(passin);
+       if(passout) OPENSSL_free(passout);
        EXIT(ret);
        }
 #else /* !NO_RSA */