Addapt seldom compiled code to new semantics of the key schedule (not
[openssl.git] / crypto / des / des.c
index 9b47cb346503aab765b1ced559fd9954a4ffdfde..16e5ab9eb22da995f9517c4f20404417bc5a1241 100644 (file)
 
 #include <stdio.h>
 #include <stdlib.h>
-#ifndef MSDOS
+#include <string.h>
+#include <openssl/opensslconf.h>
+#ifndef OPENSSL_SYS_MSDOS
+#ifndef OPENSSL_SYS_VMS
+#include OPENSSL_UNISTD
+#else /* OPENSSL_SYS_VMS */
+#ifdef __DECC
 #include <unistd.h>
-#else
+#else /* not __DECC */
+#include <math.h>
+#endif /* __DECC */
+#endif /* OPENSSL_SYS_VMS */
+#else /* OPENSSL_SYS_MSDOS */
 #include <io.h>
-#define RAND
 #endif
 
 #include <time.h>
 #include "des_ver.h"
 
-#ifdef VMS
+#ifdef OPENSSL_SYS_VMS
 #include <types.h>
 #include <stat.h>
 #else
 #endif
 #include <sys/stat.h>
 #endif
-#if defined(NOCONST)
-#define const
-#endif
-#include "des.h"
+#include <openssl/des.h>
+#include <openssl/rand.h>
+#include <openssl/ui_compat.h>
 
-#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
-#include <string.h>
-#endif
-
-#ifdef RAND
-#define random rand
-#define srandom(s) srand(s)
-#endif
-
-#ifndef NOPROTO
 void usage(void);
 void doencryption(void);
 int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp);
@@ -102,18 +100,7 @@ int uudecode(unsigned char *in,int num,unsigned char *out);
 void des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length,
        des_key_schedule sk1,des_key_schedule sk2,
        des_cblock *ivec1,des_cblock *ivec2,int enc);
-#else
-void usage();
-void doencryption();
-int uufwrite();
-void uufwriteEnd();
-int uufread();
-int uuencode();
-int uudecode();
-void des_3cbc_encrypt();
-#endif
-
-#ifdef VMS
+#ifdef OPENSSL_SYS_VMS
 #define EXIT(a) exit(a&0x10000000L)
 #else
 #define EXIT(a) exit(a)
@@ -138,9 +125,7 @@ char cksumname[200]="";
 
 int vflag,cflag,eflag,dflag,kflag,bflag,fflag,sflag,uflag,flag3,hflag,error;
 
-int main(argc, argv)
-int argc;
-char **argv;
+int main(int argc, char **argv)
        {
        int i;
        struct stat ins,outs;
@@ -274,12 +259,12 @@ char **argv;
 #endif                 
        if (    (in != NULL) &&
                (out != NULL) &&
-#ifndef MSDOS
+#ifndef OPENSSL_SYS_MSDOS
                (stat(in,&ins) != -1) &&
                (stat(out,&outs) != -1) &&
                (ins.st_dev == outs.st_dev) &&
                (ins.st_ino == outs.st_ino))
-#else /* MSDOS */
+#else /* OPENSSL_SYS_MSDOS */
                (strcmp(in,out) == 0))
 #endif
                        {
@@ -314,7 +299,7 @@ char **argv;
                EXIT(5);
                }
 
-#ifdef MSDOS
+#ifdef OPENSSL_SYS_MSDOS
        /* This should set the file to binary mode. */
        {
 #include <fcntl.h>
@@ -331,32 +316,32 @@ char **argv;
        EXIT(0);
        }
 
-void usage()
+void usage(void)
        {
        char **u;
        static const char *Usage[]={
 "des <options> [input-file [output-file]]",
 "options:",
 "-v         : des(1) version number",
-"-e         : encrypt using sunOS compatible user key to DES key conversion.",
+"-e         : encrypt using SunOS compatible user key to DES key conversion.",
 "-E         : encrypt ",
-"-d         : decrypt using sunOS compatible user key to DES key conversion.",
+"-d         : decrypt using SunOS compatible user key to DES key conversion.",
 "-D         : decrypt ",
-"-c[ckname] : generate a cbc_cksum using sunOS compatible user key to",
+"-c[ckname] : generate a cbc_cksum using SunOS compatible user key to",
 "             DES key conversion and output to ckname (stdout default,",
 "             stderr if data being output on stdout).  The checksum is",
 "             generated before encryption and after decryption if used",
 "             in conjunction with -[eEdD].",
 "-C[ckname] : generate a cbc_cksum as for -c but compatible with -[ED].",
 "-k key     : use key 'key'",
-"-h         : the key that is entered will be a hexidecimal number",
+"-h         : the key that is entered will be a hexadecimal number",
 "             that is used directly as the des key",
 "-u[uuname] : input file is uudecoded if -[dD] or output uuencoded data if -[eE]",
 "             (uuname is the filename to put in the uuencode header).",
-"-b         : encrypt using DES in ecb encryption mode, the defaut is cbc mode.",
-"-3         : encrypt using tripple DES encryption.  This uses 2 keys",
+"-b         : encrypt using DES in ecb encryption mode, the default is cbc mode.",
+"-3         : encrypt using triple DES encryption.  This uses 2 keys",
 "             generated from the input key.  If the input key is less",
-"             than 8 characters long, this is equivelent to normal",
+"             than 8 characters long, this is equivalent to normal",
 "             encryption.  Default is triple cbc, -b makes it triple ecb.",
 NULL
 };
@@ -369,31 +354,29 @@ NULL
        EXIT(1);
        }
 
-void doencryption()
+void doencryption(void)
        {
 #ifdef _LIBC
-       extern int srandom();
-       extern int random();
        extern unsigned long time();
 #endif
 
        register int i;
        des_key_schedule ks,ks2;
-       unsigned char iv[8],iv2[8];
+       des_cblock iv,iv2;
        char *p;
        int num=0,j,k,l,rem,ll,len,last,ex=0;
        des_cblock kk,k2;
        FILE *O;
        int Exit=0;
-#ifndef MSDOS
+#ifndef OPENSSL_SYS_MSDOS
        static unsigned char buf[BUFSIZE+8],obuf[BUFSIZE+8];
 #else
        static unsigned char *buf=NULL,*obuf=NULL;
 
        if (buf == NULL)
                {
-               if (    (( buf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL) ||
-                       ((obuf=(unsigned char *)Malloc(BUFSIZE+8)) == NULL))
+               if (    (( buf=OPENSSL_malloc(BUFSIZE+8)) == NULL) ||
+                       ((obuf=OPENSSL_malloc(BUFSIZE+8)) == NULL))
                        {
                        fputs("Not enough memory\n",stderr);
                        Exit=10;
@@ -440,19 +423,19 @@ void doencryption()
                        else
                                k2[i-8]=k;
                        }
-               des_set_key((C_Block *)k2,ks2);
+               des_set_key_unchecked(&k2,&ks2);
                memset(k2,0,sizeof(k2));
                }
        else if (longk || flag3)
                {
                if (flag3)
                        {
-                       des_string_to_2keys(key,(C_Block *)kk,(C_Block *)k2);
-                       des_set_key((C_Block *)k2,ks2);
+                       des_string_to_2keys(key,&kk,&k2);
+                       des_set_key_unchecked(&k2,&ks2);
                        memset(k2,0,sizeof(k2));
                        }
                else
-                       des_string_to_key(key,(C_Block *)kk);
+                       des_string_to_key(key,&kk);
                }
        else
                for (i=0; i<KEYSIZ; i++)
@@ -470,7 +453,7 @@ void doencryption()
                                kk[i]=key[i]|0x80;
                        }
 
-       des_set_key((C_Block *)kk,ks);
+       des_set_key_unchecked(&kk,&ks);
        memset(key,0,sizeof(key));
        memset(kk,0,sizeof(kk));
        /* woops - A bug that does not showup under unix :-( */
@@ -498,9 +481,8 @@ void doencryption()
                        len=l-rem;
                        if (feof(DES_IN))
                                {
-                               srandom((unsigned int)time(NULL));
                                for (i=7-rem; i>0; i--)
-                                       buf[l++]=random()&0xff;
+                                       RAND_pseudo_bytes(buf + l++, 1);
                                buf[l++]=rem;
                                ex=1;
                                len+=rem;
@@ -510,8 +492,8 @@ void doencryption()
 
                        if (cflag)
                                {
-                               des_cbc_cksum((C_Block *)buf,(C_Block *)cksum,
-                                       (long)len,ks,(C_Block *)cksum);
+                               des_cbc_cksum(buf,&cksum,
+                                       (long)len,&ks,&cksum);
                                if (!eflag)
                                        {
                                        if (feof(DES_IN)) break;
@@ -524,13 +506,13 @@ void doencryption()
                                        des_ecb_encrypt(
                                                (des_cblock *)&(buf[i]),
                                                (des_cblock *)&(obuf[i]),
-                                               ks,do_encrypt);
+                                               &ks,do_encrypt);
                        else if (flag3 && bflag)
                                for (i=0; i<l; i+=8)
                                        des_ecb2_encrypt(
                                                (des_cblock *)&(buf[i]),
                                                (des_cblock *)&(obuf[i]),
-                                               ks,ks2,do_encrypt);
+                                               &ks,&ks2,do_encrypt);
                        else if (flag3 && !bflag)
                                {
                                char tmpbuf[8];
@@ -539,16 +521,16 @@ void doencryption()
                                        (unsigned int)rem);
                                des_3cbc_encrypt(
                                        (des_cblock *)buf,(des_cblock *)obuf,
-                                       (long)l,ks,ks2,(des_cblock *)iv,
-                                       (des_cblock *)iv2,do_encrypt);
+                                       (long)l,ks,ks2,&iv,
+                                       &iv2,do_encrypt);
                                if (rem) memcpy(&(buf[l]),tmpbuf,
                                        (unsigned int)rem);
                                }
                        else
                                {
                                des_cbc_encrypt(
-                                       (des_cblock *)buf,(des_cblock *)obuf,
-                                       (long)l,ks,(des_cblock *)iv,do_encrypt);
+                                       buf,obuf,
+                                       (long)l,&ks,&iv,do_encrypt);
                                if (l >= 8) memcpy(iv,&(obuf[l-8]),8);
                                }
                        if (rem) memcpy(buf,&(buf[l]),(unsigned int)rem);
@@ -603,25 +585,25 @@ void doencryption()
                                        des_ecb_encrypt(
                                                (des_cblock *)&(buf[i]),
                                                (des_cblock *)&(obuf[i]),
-                                               ks,do_encrypt);
+                                               &ks,do_encrypt);
                        else if (flag3 && bflag)
                                for (i=0; i<l; i+=8)
                                        des_ecb2_encrypt(
                                                (des_cblock *)&(buf[i]),
                                                (des_cblock *)&(obuf[i]),
-                                               ks,ks2,do_encrypt);
+                                               &ks,&ks2,do_encrypt);
                        else if (flag3 && !bflag)
                                {
                                des_3cbc_encrypt(
                                        (des_cblock *)buf,(des_cblock *)obuf,
-                                       (long)l,ks,ks2,(des_cblock *)iv,
-                                       (des_cblock *)iv2,do_encrypt);
+                                       (long)l,ks,ks2,&iv,
+                                       &iv2,do_encrypt);
                                }
                        else
                                {
                                des_cbc_encrypt(
-                                       (des_cblock *)buf,(des_cblock *)obuf,
-                                       (long)l,ks,(des_cblock *)iv,do_encrypt);
+                                       buf,obuf,
+                                       (long)l,&ks,&iv,do_encrypt);
                                if (l >= 8) memcpy(iv,&(buf[l-8]),8);
                                }
 
@@ -646,9 +628,9 @@ void doencryption()
                                l=l-8+last;
                                }
                        i=0;
-                       if (cflag) des_cbc_cksum((C_Block *)obuf,
-                               (C_Block *)cksum,(long)l/8*8,ks,
-                               (C_Block *)cksum);
+                       if (cflag) des_cbc_cksum(obuf,
+                               (des_cblock *)cksum,(long)l/8*8,&ks,
+                               (des_cblock *)cksum);
                        while (i != l)
                                {
                                j=fwrite(obuf,1,(unsigned int)l-i,DES_OUT);
@@ -683,8 +665,8 @@ void doencryption()
 problems:
        memset(buf,0,sizeof(buf));
        memset(obuf,0,sizeof(obuf));
-       memset(ks,0,sizeof(ks));
-       memset(ks2,0,sizeof(ks2));
+       memset(&ks,0,sizeof(ks));
+       memset(&ks2,0,sizeof(ks2));
        memset(iv,0,sizeof(iv));
        memset(iv2,0,sizeof(iv2));
        memset(kk,0,sizeof(kk));
@@ -696,15 +678,8 @@ problems:
        if (Exit) EXIT(Exit);
        }
 
-int uufwrite(data, size, num, fp)
-unsigned char *data;
-int size;
-unsigned int num;
-FILE *fp;
-      
-     /* We ignore this parameter but it should be > ~50 I believe */
-   
-    
+/*    We ignore this parameter but it should be > ~50 I believe    */
+int uufwrite(unsigned char *data, int size, unsigned int num, FILE *fp)
        {
        int i,j,left,rem,ret=num;
        static int start=1;
@@ -757,8 +732,7 @@ FILE *fp;
        return(ret);
        }
 
-void uufwriteEnd(fp)
-FILE *fp;
+void uufwriteEnd(FILE *fp)
        {
        int j;
        static const char *end=" \nend\n";
@@ -774,11 +748,8 @@ FILE *fp;
        fwrite(end,1,strlen(end),fp);
        }
 
-int uufread(out, size, num, fp)
-unsigned char *out;
-int size; /* should always be > ~ 60; I actually ignore this parameter :-) */
-unsigned int num;
-FILE *fp;
+/* int size:  should always be > ~ 60; I actually ignore this parameter :-)    */
+int uufread(unsigned char *out, int size, unsigned int num, FILE *fp)
        {
        int i,j,tot;
        static int done=0;
@@ -850,10 +821,7 @@ FILE *fp;
                     *((c)++)=(unsigned char)(((l)    )&0xff))
 
 
-int uuencode(in, num, out)
-unsigned char *in;
-int num;
-unsigned char *out;
+int uuencode(unsigned char *in, int num, unsigned char *out)
        {
        int j,i,n,tot=0;
        DES_LONG l;
@@ -883,10 +851,7 @@ unsigned char *out;
        return(tot);
        }
 
-int uudecode(in, num, out)
-unsigned char *in;
-int num;
-unsigned char *out;
+int uudecode(unsigned char *in, int num, unsigned char *out)
        {
        int j,i,k;
        unsigned int n=0,space=0;