Fix typos in wp-mmx.pl.
[openssl.git] / apps / enc.c
index bae7f21d79047530792c9ded85f31c9e845f2d30..ea948f8d101b3d958861584c5bb65106fe779b58 100644 (file)
@@ -100,7 +100,9 @@ int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
        {
+#ifndef OPENSSL_NO_ENGINE
        ENGINE *e = NULL;
+#endif
        static const char magic[]="Salted__";
        char mbuf[sizeof magic-1];
        char *strbuf=NULL;
@@ -112,14 +114,19 @@ int MAIN(int argc, char **argv)
        unsigned char salt[PKCS5_SALT_LEN];
        char *str=NULL, *passarg = NULL, *pass = NULL;
        char *hkey=NULL,*hiv=NULL,*hsalt = NULL;
+       char *md=NULL;
        int enc=1,printkey=0,i,base64=0;
        int debug=0,olb64=0,nosalt=0;
        const EVP_CIPHER *cipher=NULL,*c;
+       EVP_CIPHER_CTX *ctx = NULL;
        char *inf=NULL,*outf=NULL;
        BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL;
 #define PROG_NAME_SIZE  39
        char pname[PROG_NAME_SIZE+1];
+#ifndef OPENSSL_NO_ENGINE
        char *engine = NULL;
+#endif
+       const EVP_MD *dgst=NULL;
 
        apps_startup();
 
@@ -163,11 +170,13 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        passarg= *(++argv);
                        }
+#ifndef OPENSSL_NO_ENGINE
                else if (strcmp(*argv,"-engine") == 0)
                        {
                        if (--argc < 1) goto bad;
                        engine= *(++argv);
                        }
+#endif
                else if (strcmp(*argv,"-d") == 0)
                        enc=0;
                else if (strcmp(*argv,"-p") == 0)
@@ -247,6 +256,11 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        hiv= *(++argv);
                        }
+               else if (strcmp(*argv,"-md") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       md= *(++argv);
+                       }
                else if ((argv[0][0] == '-') &&
                        ((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL))
                        {
@@ -265,12 +279,16 @@ bad:
                        BIO_printf(bio_err,"%-14s encrypt\n","-e");
                        BIO_printf(bio_err,"%-14s decrypt\n","-d");
                        BIO_printf(bio_err,"%-14s base64 encode/decode, depending on encryption flag\n","-a/-base64");
-                       BIO_printf(bio_err,"%-14s key is the next argument\n","-k");
-                       BIO_printf(bio_err,"%-14s key is the first line of the file argument\n","-kfile");
+                       BIO_printf(bio_err,"%-14s passphrase is the next argument\n","-k");
+                       BIO_printf(bio_err,"%-14s passphrase is the first line of the file argument\n","-kfile");
+                       BIO_printf(bio_err,"%-14s the next argument is the md to use to create a key\n","-md");
+                       BIO_printf(bio_err,"%-14s   from a passphrase.  One of md2, md5, sha or sha1\n","");
                        BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv");
                        BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]");
                        BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>");
+#ifndef OPENSSL_NO_ENGINE
                        BIO_printf(bio_err,"%-14s use engine e, possibly a hardware device.\n","-engine e");
+#endif
 
                        BIO_printf(bio_err,"Cipher Types\n");
                        OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH,
@@ -284,7 +302,20 @@ bad:
                argv++;
                }
 
+#ifndef OPENSSL_NO_ENGINE
         e = setup_engine(bio_err, engine, 0);
+#endif
+
+       if (md && (dgst=EVP_get_digestbyname(md)) == NULL)
+               {
+               BIO_printf(bio_err,"%s is an unsupported message digest type\n",md);
+               goto end;
+               }
+
+       if (dgst == NULL)
+               {
+               dgst = EVP_md5();
+               }
 
        if (bufsize != NULL)
                {
@@ -363,9 +394,9 @@ bad:
                        {
                        char buf[200];
 
-                       sprintf(buf,"enter %s %s password:",
-                               OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
-                               (enc)?"encryption":"decryption");
+                       BIO_snprintf(buf,sizeof buf,"enter %s %s password:",
+                                    OBJ_nid2ln(EVP_CIPHER_nid(cipher)),
+                                    (enc)?"encryption":"decryption");
                        strbuf[0]='\0';
                        i=EVP_read_pw_string((char *)strbuf,SIZE,buf,enc);
                        if (i == 0)
@@ -473,7 +504,7 @@ bad:
                                sptr = salt;
                        }
 
-                       EVP_BytesToKey(cipher,EVP_md5(),sptr,
+                       EVP_BytesToKey(cipher,dgst,sptr,
                                (unsigned char *)str,
                                strlen(str),1,key,iv);
                        /* zero the complete buffer or the string
@@ -506,13 +537,31 @@ bad:
 
                if ((benc=BIO_new(BIO_f_cipher())) == NULL)
                        goto end;
-               BIO_set_cipher(benc,cipher,key,iv,enc);
-               if (nopad)
+
+               /* Since we may be changing parameters work on the encryption
+                * context rather than calling BIO_set_cipher().
+                */
+
+               BIO_get_cipher_ctx(benc, &ctx);
+               if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc))
                        {
-                       EVP_CIPHER_CTX *ctx;
-                       BIO_get_cipher_ctx(benc, &ctx);
+                       BIO_printf(bio_err, "Error setting cipher %s\n",
+                               EVP_CIPHER_name(cipher));
+                       ERR_print_errors(bio_err);
+                       goto end;
+                       }
+
+               if (nopad)
                        EVP_CIPHER_CTX_set_padding(ctx, 0);
+
+               if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
+                       {
+                       BIO_printf(bio_err, "Error setting cipher %s\n",
+                               EVP_CIPHER_name(cipher));
+                       ERR_print_errors(bio_err);
+                       goto end;
                        }
+
                if (debug)
                        {
                        BIO_set_callback(benc,BIO_debug_callback);
@@ -524,7 +573,7 @@ bad:
                        if (!nosalt)
                                {
                                printf("salt=");
-                               for (i=0; i<sizeof salt; i++)
+                               for (i=0; i<(int)sizeof(salt); i++)
                                        printf("%02X",salt[i]);
                                printf("\n");
                                }
@@ -586,7 +635,7 @@ end:
        if (b64 != NULL) BIO_free(b64);
        if(pass) OPENSSL_free(pass);
        apps_shutdown();
-       EXIT(ret);
+       OPENSSL_EXIT(ret);
        }
 
 int set_hex(char *in, unsigned char *out, int size)