des-fix-20041016
[openafs.git] / src / des / des.c
index e8e4438..51291a2 100644 (file)
  *
  * originally written by Steve Miller, MIT Project Athena
  */
-
 #include <mit-cpyright.h>
 
-#include <stdio.h>
+#include <afsconfig.h>
 #include <afs/param.h>
+
+RCSID
+    ("$Header$");
+
+#ifndef KERNEL
+#include <stdio.h>
+#endif
 #ifdef AFS_PTHREAD_ENV
 #include <pthread.h>
 #endif /* AFS_PTHREAD_ENV */
@@ -47,6 +53,8 @@
 #endif
 #include "stats.h"
 
+#include "des_prototypes.h"
+
 #define XPRT_DES
 
 #ifdef DEBUG
 #define DBG_PRINT(s)
 #endif
 
-extern int des_debug;
-extern des_cblock_print_file ();
-extern des_debug_print ();
-
 #ifdef AFS_PTHREAD_ENV
 pthread_mutex_t rxkad_stats_mutex;
 #endif /* AFS_PTHREAD_ENV */
-    
+
+/* encrypt == 0  ==> decrypt, else encrypt */
+
 afs_int32
-des_ecb_encrypt(clear, cipher, schedule, encrypt)
-    afs_uint32 *clear;
-    afs_uint32 *cipher;
-    int encrypt;               /* 0 ==> decrypt, else encrypt */
-    register des_key_schedule schedule; /* r11 */
+des_ecb_encrypt(void * clear, void * cipher,
+               register des_key_schedule schedule, int encrypt)
 {
-
     /* better pass 8 bytes, length not checked here */
 
-    register afs_uint32 R1, L1; /* R1 = r10, L1 = r9 */
-    register afs_uint32 R2, L2; /* R2 = r8, L2 = r7 */
+    register afs_uint32 R1 = 0;
+    register afs_uint32 L1 = 0;        /* R1 = r10, L1 = r9 */
+    register afs_uint32 R2 = 0, L2 = 0;        /* R2 = r8, L2 = r7 */
     afs_int32 i;
     /* one more registers left on VAX, see below P_temp_p */
 #ifdef BITS16
     sbox_in_16_a S_in_16_a;
     sbox_in_16_b S_in_16_b;
     sbox_in_16_c S_in_16_c;
-    unsigned int *S_in_a_16_p = (unsigned int *) &S_in_16_a;
-    unsigned int *S_in_b_16_p = (unsigned int *) &S_in_16_b;
-    unsigned int *S_in_c_16_p = (unsigned int *) &S_in_16_c;
+    unsigned int *S_in_a_16_p = (unsigned int *)&S_in_16_a;
+    unsigned int *S_in_b_16_p = (unsigned int *)&S_in_16_b;
+    unsigned int *S_in_c_16_p = (unsigned int *)&S_in_16_c;
 #endif
 #ifndef BITS32
 #ifndef BITS16
-    dunno how to do this machine type, you lose;
+#error dunno how to do this machine type, you lose;
 #endif
 #endif
     afs_uint32 P_temp;
-    register unsigned char *P_temp_p = (unsigned char *) & P_temp;
+    register unsigned char *P_temp_p = (unsigned char *)&P_temp;
 #ifdef BITS16
     sbox_out S_out;
-    afs_uint32 *S_out_p = (afs_uint32 *) &S_out;
+    afs_uint32 *S_out_p = (afs_uint32 *) & S_out;
 #endif
     afs_uint32 R_save, L_save;
 #ifdef DEBUG
     afs_uint32 dbg_tmp[2];
 #endif
-    LOCK_RXKAD_STATS
-    if (encrypt) rxkad_stats.des_encrypts[DES_ENCRYPT]++;
-    else rxkad_stats.des_encrypts[DES_DECRYPT]++;
-    UNLOCK_RXKAD_STATS
-
+    LOCK_RXKAD_STATS;
+    if (encrypt)
+       rxkad_stats.des_encrypts[DES_ENCRYPT]++;
+    else
+       rxkad_stats.des_encrypts[DES_DECRYPT]++;
+    UNLOCK_RXKAD_STATS;
     /*
      * Use L1,R1 and L2,R2 as two sets of "64-bit" registers always
      * work from L1,R1 input to L2,R2 output; initialize the cleartext
@@ -121,23 +125,28 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
      */
     /* Make sure schedule is ok */
     if ((afs_int32) schedule & 3) {
-       fprintf(stderr,"des.c schedule arg pointer not aligned\n");
+       fprintf(stderr, "des.c schedule arg pointer not aligned\n");
        abort();
     }
 #endif
-    if ((afs_int32) clear & 3) {
-       bcopy((char *)clear++,(char *)&L_save,sizeof(L_save));
-       bcopy((char *)clear,(char *)&R_save,sizeof(R_save));
+    if ((afs_uint32) clear & 3) {
+       memcpy((char *)(&L_save), (char *)clear, sizeof(L_save));
+       clear=((afs_uint32*)clear)+1;
+       memcpy((char *)(&R_save), (char *)clear, sizeof(R_save));
        L1 = L_save;
        R1 = R_save;
-    }
-    else
+    } else
 #endif
     {
-       if (clear) L1 = *clear++;
-       else L1 = 0;
-       if (clear) R1 = *clear;
-       else R1 = 0;
+       if (clear) {
+           L1 = *((afs_uint32 *)clear);
+            clear=((afs_uint32*)clear)+1;
+       } else
+           L1 = 0;
+       if (clear)
+           R1 = *((afs_uint32 *)clear);
+       else
+           R1 = 0;
     }
 
 #ifdef DEBUG
@@ -147,8 +156,8 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
        i = 0;
        dbg_tmp[0] = L1;
        dbg_tmp[1] = R1;
-       printf("iter = %2d  before IP\n\t\tL1 R1 = ",i);
-       des_cblock_print_file (dbg_tmp, stdout);
+       printf("iter = %2d  before IP\n\t\tL1 R1 = ", i);
+       des_cblock_print_file(dbg_tmp, stdout);
     }
 
     DBG_PRINT("before IP");
@@ -163,17 +172,16 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
     R1 = R2;
 
     /* iterate through the inner loop */
-    for (i = 0; i <= (AUTH_DES_ITER-1); i++) {
+    for (i = 0; i <= (AUTH_DES_ITER - 1); i++) {
 
 #ifdef DEBUG
        if (des_debug & 2) {
            dbg_tmp[0] = L1;
            dbg_tmp[1] = R1;
-           printf("iter = %2d  start loop\n\t\tL1 R1 = ",i);
-           des_cblock_print_file (dbg_tmp, stdout);
+           printf("iter = %2d  start loop\n\t\tL1 R1 = ", i);
+           des_cblock_print_file(dbg_tmp, stdout);
            DBG_PRINT("start loop");
        }
-
 #endif
 
        R_save = R1;
@@ -186,19 +194,20 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
 #include "e.c"
 #else /* Bill's fast E */
        L2 = (R1 << 1);
-       if (R1 & (1<<31))
-           L2 |= 1<<0;
+       if (R1 & (1 << 31))
+           L2 |= 1 << 0;
        L2 &= 077;
-       L2 |= (R1 <<3) & 07700;
-       L2 |= (R1 <<5) & 0770000;
-       L2 |= (R1 <<7) & 077000000;
-       L2 |= (R1 <<9) & 07700000000;
-       L2 |= (R1 <<11) & 030000000000;
+       L2 |= (R1 << 3) & 07700;
+       L2 |= (R1 << 5) & 0770000;
+       L2 |= (R1 << 7) & 077000000;
+       L2 |= (R1 << 9) & 07700000000;
+       L2 |= (R1 << 11) & 030000000000;
 
        /* now from right to right */
 
        R2 = ((R1 >> 17) & 0176000);
-       if (R1 & (1<<0)) R2 |= 1<<15;
+       if (R1 & (1 << 0))
+           R2 |= 1 << 15;
 
        R2 |= ((R1 >> 21) & 017);
        R2 |= ((R1 >> 19) & 01760);
@@ -208,11 +217,11 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
        /* right to left */
        asm("   rotl    $1,r10,r7");
        L2 &= 077;
-       L2 |= (R1 <<3) & 07700;
-       L2 |= (R1 <<5) & 0770000;
-       L2 |= (R1 <<7) & 077000000;
-       L2 |= (R1 <<9) & 07700000000;
-       L2 |= (R1 <<11) & 030000000000;
+       L2 |= (R1 << 3) & 07700;
+       L2 |= (R1 << 5) & 0770000;
+       L2 |= (R1 << 7) & 077000000;
+       L2 |= (R1 << 9) & 07700000000;
+       L2 |= (R1 << 11) & 030000000000;
 
        asm("   rotl    $-17,r10,r8");
        R2 &= 0176000;
@@ -234,8 +243,8 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
            dbg_tmp[0] = L1;
            dbg_tmp[1] = R1;
            DBG_PRINT("after e");
-           printf("iter = %2d  after e\n\t\tL1 R1 = ",i);
-           des_cblock_print_file (dbg_tmp, stdout);
+           printf("iter = %2d  after e\n\t\tL1 R1 = ", i);
+           des_cblock_print_file(dbg_tmp, stdout);
        }
 #endif
 
@@ -249,14 +258,13 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
         * First XOR left half.
         */
        if (encrypt) {
-           L1 ^= *(((afs_uint32 *) &schedule[i] )+0);
+           L1 ^= *(((afs_uint32 *) & schedule[i]) + 0);
            /* now right half */
-           R1 ^= *(((afs_uint32 *) &schedule[i] )+1);
-       }
-       else {
-           L1 ^= *(((afs_uint32 *) &schedule[AUTH_DES_ITER-i-1] )+0);
+           R1 ^= *(((afs_uint32 *) & schedule[i]) + 1);
+       } else {
+           L1 ^= *(((afs_uint32 *) & schedule[AUTH_DES_ITER - i - 1]) + 0);
            /* now right half */
-           R1 ^= *(((afs_uint32 *) &schedule[AUTH_DES_ITER-i-1] )+1);
+           R1 ^= *(((afs_uint32 *) & schedule[AUTH_DES_ITER - i - 1]) + 1);
        }
 
        /* dont have to reset input to L1, R1 */
@@ -266,8 +274,8 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
            dbg_tmp[0] = L1;
            dbg_tmp[1] = R1;
            DBG_PRINT("after xor");
-           printf("iter = %2d  after xor\n\t\tL1 R1 =",i);
-           des_cblock_print_file (dbg_tmp, stdout);
+           printf("iter = %2d  after xor\n\t\tL1 R1 =", i);
+           des_cblock_print_file(dbg_tmp, stdout);
        }
 #endif
 
@@ -282,45 +290,44 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
        /* from S_in to S_out */
 
 #ifdef BITS16
-       *S_in_a_16_p = L1&0xffff;
-       *S_in_b_16_p = (L1>>16)&0xffff;
-       *S_in_c_16_p = R1&0xffff;
-       (*(afs_uint32 *) &S_out) =
-           (unsigned) S_adj[0][S_in_16_a.b0];
-       S_out.b1 = (unsigned) S_adj[1][S_in_16_a.b1];
+       *S_in_a_16_p = L1 & 0xffff;
+       *S_in_b_16_p = (L1 >> 16) & 0xffff;
+       *S_in_c_16_p = R1 & 0xffff;
+       (*(afs_uint32 *) & S_out) = (unsigned)S_adj[0][S_in_16_a.b0];
+       S_out.b1 = (unsigned)S_adj[1][S_in_16_a.b1];
        /* b2 spans two words */
        S_out.b2 = (unsigned)
-           S_adj[2][(unsigned) S_in_16_a.b2
-                    + (((unsigned) S_in_16_b.b2) << 4)];
-       S_out.b3 = (unsigned) S_adj[3][S_in_16_b.b3];
-       S_out.b4 = (unsigned) S_adj[4][S_in_16_b.b4];
+           S_adj[2][(unsigned)S_in_16_a.b2 +
+                    (((unsigned)S_in_16_b.b2) << 4)];
+       S_out.b3 = (unsigned)S_adj[3][S_in_16_b.b3];
+       S_out.b4 = (unsigned)S_adj[4][S_in_16_b.b4];
        /* b5 spans both parts */
        S_out.b5 = (unsigned)
-           S_adj[5][(unsigned) S_in_16_b.b5
-                    + (((unsigned) S_in_16_c.b5) << 2)];
-       S_out.b6 = (unsigned) S_adj[6][S_in_16_c.b6];
-       S_out.b7 = (unsigned) S_adj[7][S_in_16_c.b7];
+           S_adj[5][(unsigned)S_in_16_b.b5 +
+                    (((unsigned)S_in_16_c.b5) << 2)];
+       S_out.b6 = (unsigned)S_adj[6][S_in_16_c.b6];
+       S_out.b7 = (unsigned)S_adj[7][S_in_16_c.b7];
        R1 = *S_out_p;
 #else
        /* is a 32 bit sys */
 #ifndef VAXASM
-       R2 =  (unsigned) S_adj[0][L1 & 077];
-       L2 = (unsigned) S_adj[1][(L1 >> 6) & 077];
-       R2 |= (L2 <<4 );
-       L2 = (unsigned) S_adj[2][(L1 >> 12) & 077];
-       R2 |= (L2 <<8);
-       L2 = (unsigned) S_adj[3][(L1 >> 18) & 077];
-       R2 |= (L2 <<12);
-       L2 = (unsigned) S_adj[4][(L1 >> 24) & 077];
-       R2 |= (L2 <<16);
+       R2 = (unsigned)S_adj[0][L1 & 077];
+       L2 = (unsigned)S_adj[1][(L1 >> 6) & 077];
+       R2 |= (L2 << 4);
+       L2 = (unsigned)S_adj[2][(L1 >> 12) & 077];
+       R2 |= (L2 << 8);
+       L2 = (unsigned)S_adj[3][(L1 >> 18) & 077];
+       R2 |= (L2 << 12);
+       L2 = (unsigned)S_adj[4][(L1 >> 24) & 077];
+       R2 |= (L2 << 16);
        /* b5 spans both parts */
        L2 = (unsigned)
-           S_adj[5][(unsigned) ((L1 >>30) & 03) + ((R1 & 017) << 2)];
+           S_adj[5][(unsigned)((L1 >> 30) & 03) + ((R1 & 017) << 2)];
        R2 |= (L2 << 20);
-       L2 = (unsigned) S_adj[6][(R1 >> 4) & 077];
-       R2 |= (L2 <<24);
-       L2 = (unsigned) S_adj[7][(R1 >> 10) & 077];
-       R1 = R2 | (L2 <<28);
+       L2 = (unsigned)S_adj[6][(R1 >> 4) & 077];
+       R2 |= (L2 << 24);
+       L2 = (unsigned)S_adj[7][(R1 >> 10) & 077];
+       R1 = R2 | (L2 << 28);
        /* reset input to L1, R1 */
 #else /* vaxasm */
        /*
@@ -377,8 +384,8 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
            dbg_tmp[0] = L1;
            dbg_tmp[1] = R1;
            DBG_PRINT("after s");
-           printf("iter = %2d  after s\n\t\tL1 R1 = ",i);
-           des_cblock_print_file (dbg_tmp, stdout);
+           printf("iter = %2d  after s\n\t\tL1 R1 = ", i);
+           des_cblock_print_file(dbg_tmp, stdout);
        }
 #endif
 
@@ -393,8 +400,8 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
            dbg_tmp[0] = L1;
            dbg_tmp[1] = R1;
            DBG_PRINT("after p");
-           printf("iter = %2d  after p\n\t\tL1 R1 = ",i);
-           des_cblock_print_file (dbg_tmp, stdout);
+           printf("iter = %2d  after p\n\t\tL1 R1 = ", i);
+           des_cblock_print_file(dbg_tmp, stdout);
        }
 #endif
 
@@ -419,10 +426,9 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
        dbg_tmp[0] = L1;
        dbg_tmp[1] = R1;
        DBG_PRINT("before FP");
-       printf("iter = %2d  before FP\n\t\tL1 R1 = ",i);
-       des_cblock_print_file (dbg_tmp, stdout);
+       printf("iter = %2d  before FP\n\t\tL1 R1 = ", i);
+       des_cblock_print_file(dbg_tmp, stdout);
     }
-
 #endif
 
 /*FP_start:*/
@@ -436,16 +442,17 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
 
 #ifdef MUSTALIGN
     if ((afs_int32) cipher & 3) {
-       L_save = L2;    /* cant bcopy a reg */
+       L_save = L2;            /* cant bcopy a reg */
        R_save = R2;
-       bcopy((char *)&L_save,(char *)cipher++,sizeof(L_save));
-       bcopy((char *)&R_save,(char *)cipher,sizeof(R_save));
-    }
-    else
+       cipher=((afs_uint32*)cipher)+1;
+       memcpy((char *)cipher, (char *)&L_save, sizeof(L_save));
+       memcpy((char *)cipher, (char *)&R_save, sizeof(R_save));
+    } else
 #endif
     {
-       *cipher++ = L2;
-       *cipher = R2;
+        *((afs_uint32*)cipher)= L2;    
+       cipher = ((afs_int32 *)cipher)+1;
+       *((afs_uint32 *)cipher) = R2;
     }
 
 #ifdef DEBUG
@@ -455,12 +462,11 @@ des_ecb_encrypt(clear, cipher, schedule, encrypt)
        dbg_tmp[0] = L1;
        dbg_tmp[1] = R1;
        DBG_PRINT("done");
-       printf("iter = %2d  done\n\t\tL1 R1 = ",i);
-       des_cblock_print_file (dbg_tmp, stdout);
+       printf("iter = %2d  done\n\t\tL1 R1 = ", i);
+       des_cblock_print_file(dbg_tmp, stdout);
     }
 #endif
 
     /* that's it, no errors can be returned */
     return 0;
 }
-