bug fix in the new des code.
authorAndrew Tridgell <tridge@samba.org>
Tue, 16 Sep 1997 03:53:54 +0000 (03:53 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 16 Sep 1997 03:53:54 +0000 (03:53 +0000)
I had one of the sbox[] constants wrong, which interestingly gave a
20% chance of the whole algorithm failing.
(This used to be commit 9a42f88a0963d006e8bf091775a3f55f6c6b4f77)

source3/libsmb/smbdes.c

index e207e58c24561c557763f39fc245b8dc14d479d7..135df7fbb4428465110064c71b23b42332310241 100644 (file)
@@ -85,44 +85,43 @@ static int sbox[8][4][16] = {
        {{14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7},
         {0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8},
         {4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0},
-        {15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 1}},
-       
+        {15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13}},
+
        {{15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10},
         {3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5},
         {0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15},
         {13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9}},
-       
+
        {{10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8},
         {13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1},
         {13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7},
         {1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12}},
-       
+
        {{7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15},
         {13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9},
         {10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4},
         {3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14}},
-       
+
        {{2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9},
         {14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6},
         {4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14},
         {11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3}},
-       
+
        {{12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11},
         {10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8},
         {9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6},
         {4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13}},
-       
+
        {{4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1},
         {13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6},
         {1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2},
         {6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12}},
-       
+
        {{13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7},
         {1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2},
         {7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8},
         {2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11}}};
 
-
 static void permute(char *out, char *in, int *p, int n)
 {
        int i;
@@ -230,6 +229,7 @@ static void dodes(char *out, char *in, char *key)
        }
 
        concat(rl, r, l, 32, 32);
+
        permute(out, rl, perm6, 64);
 }
 
@@ -254,7 +254,7 @@ static void str_to_key(unsigned char *str,unsigned char *key)
 /* this is the entry point to the DES routine. The key is 56 bits (no parity) */
 void smbdes(unsigned char *out, unsigned char *in, unsigned char *key)
 {
-       int i, j;
+       int i;
        char outb[64];
        char inb[64];
        char keyb[64];
@@ -268,23 +268,15 @@ void smbdes(unsigned char *out, unsigned char *in, unsigned char *key)
                outb[i] = 0;
        }
 
+       dodes(outb, inb, keyb);
+
        for (i=0;i<8;i++) {
-               int count = 0;
-               for (j=0;j<7;j++)
-                       count += keyb[i*8 + j];
-               if ((count&1) == 0)
-                       keyb[i*8 + 7] = 1;
-               else
-                       keyb[i*8 + 7] = 0;                      
+               out[i] = 0;
        }
 
-       dodes(outb, inb, keyb);
-
        for (i=0;i<64;i++) {
                if (outb[i])
                        out[i/8] |= (1<<(7-(i%8)));
-               else
-                       out[i/8] &= ~(1<<(7-(i%8)));
        }
 }