On Sun, Oct 22, 2006 at 10:17:59PM +0100, Martin Michlmayr wrote:
> Package: openssl
> Version: 0.9.8c-3
> Severity: wishlist
> 
> The openssl source code includes the file crypto/des/des.c.  Do you
> think you could include the binary from this file in the openssl
> package?  I'd need this binary to encrypt something for
> debian-installer so the firmware of a specific device will accept it
> and apparently I cannot do this with the openssl binary itself.

So, there are a few changed between the way that old des binary works,
and the new:
- padding is different.
- Converting the key to the real key and IV happens with a different
  algorithm.  You need to use DES_string_to_key() to convert the key
  and set iv to 0.
- It doesn't use a salt, so you need the -nosalt option.

I've attached a patch that works for me for the padding problem, but I'm
not really sure if upstream is going to accept the patch as is.

For both encryption and decryption you need to use the -padolddes
option, you shouldn't use the -nopad option.

For the second problem it would be nice if there was an option in
openssl to convert the string using DES_string_to_key(), but I guess
this is easier to work around.


Kurt

--- openssl-0.9.8c/apps/enc.c   2005-04-30 15:17:05.000000000 +0000
+++ openssl-0.9.8c/apps/enc.c   2006-10-29 16:27:54.000000000 +0000
@@ -110,6 +110,7 @@
        int bsize=BSIZE,verbose=0;
        int ret=1,inl;
        int nopad = 0;
+       int padolddes = 0;
        unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH];
        unsigned char salt[PKCS5_SALT_LEN];
        char *str=NULL, *passarg = NULL, *pass = NULL;
@@ -185,6 +186,11 @@
                        verbose=1;
                else if (strcmp(*argv,"-nopad") == 0)
                        nopad=1;
+               else if (strcmp(*argv,"-padolddes") == 0)
+               {
+                       padolddes=1;
+                       nopad=0;
+               }
                else if (strcmp(*argv,"-salt") == 0)
                        nosalt=0;
                else if (strcmp(*argv,"-nosalt") == 0)
@@ -550,6 +556,8 @@
                        ERR_print_errors(bio_err);
                        goto end;
                        }
+               if (padolddes)
+                       EVP_CIPHER_CTX_set_padding(ctx, 2);
 
                if (nopad)
                        EVP_CIPHER_CTX_set_padding(ctx, 0);
--- openssl-0.9.8c/crypto/evp/evp.h     2006-06-09 15:42:13.000000000 +0000
+++ openssl-0.9.8c/crypto/evp/evp.h     2006-10-29 16:12:43.000000000 +0000
@@ -347,6 +347,8 @@
 #define        EVP_CIPH_NO_PADDING             0x100
 /* cipher handles random key generation */
 #define        EVP_CIPH_RAND_KEY               0x200
+/* Make padding compatible with the old des utility */
+#define                EVP_CIPH_PADDING_OLD_DES        0x400
 
 /* ctrl() values */
 
--- openssl-0.9.8c/crypto/evp/evp_enc.c 2005-12-02 13:47:02.000000000 +0000
+++ openssl-0.9.8c/crypto/evp/evp_enc.c 2006-10-29 16:24:31.000000000 +0000
@@ -363,7 +363,14 @@
                return 1;
                }
 
-       n=b-bl;
+       if (ctx->flags & EVP_CIPH_PADDING_OLD_DES)
+       {
+               n=bl;
+       }
+       else
+       {
+               n=b-bl;
+       }
        for (i=bl; i<b; i++)
                ctx->buf[i]=n;
        ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b);
@@ -461,15 +468,18 @@
                        EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
                        return(0);
                        }
-               for (i=0; i<n; i++)
-                       {
-                       if (ctx->final[--b] != n)
+               if (!(ctx->flags & EVP_CIPH_PADDING_OLD_DES))
+               {
+                       for (i=0; i<n; i++)
                                {
-                               
EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
-                               return(0);
+                               if (ctx->final[--b] != n)
+                                       {
+                                       
EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
+                                       return(0);
+                                       }
                                }
-                       }
-               n=ctx->cipher->block_size-n;
+                       n=ctx->cipher->block_size-n;
+               }
                for (i=0; i<n; i++)
                        out[i]=ctx->final[i];
                *outl=n;
@@ -526,6 +536,7 @@
 
 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
        {
+       if (pad == 2) ctx->flags |= EVP_CIPH_PADDING_OLD_DES;
        if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
        else ctx->flags |= EVP_CIPH_NO_PADDING;
        return 1;
--- openssl-0.9.8c/include/openssl/evp.h        2006-06-09 15:42:13.000000000 
+0000
+++ openssl-0.9.8c/include/openssl/evp.h        2006-10-29 16:12:43.000000000 
+0000
@@ -347,6 +347,8 @@
 #define        EVP_CIPH_NO_PADDING             0x100
 /* cipher handles random key generation */
 #define        EVP_CIPH_RAND_KEY               0x200
+/* Make padding compatible with the old des utility */
+#define                EVP_CIPH_PADDING_OLD_DES        0x400
 
 /* ctrl() values */
 

Reply via email to