source: trunk/third/xntp/authstuff/makeSP.c @ 10832

Revision 10832, 4.4 KB checked in by brlewis, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10831, which included commits to RCS files with non-trunk default branches.
RevLine 
[10831]1/*
2 * makeSP - build combination S and P tables for quick DES computation
3 */
4
5#include <stdio.h>
6#include <sys/types.h>
7
8#include "ntp_stdlib.h"
9
10#define STREQ(a, b)     (*(a) == *(b) && strcmp((a), (b)) == 0)
11
12char *progname;
13int debug;
14
15static  void    selperm P((int, int, u_int32 *));
16static  void    doit    P((void));
17
18/*
19 * main - parse arguments and handle options
20 */
21void
22main(argc, argv)
23int argc;
24char *argv[];
25{
26        int c;
27        int errflg = 0;
28        extern int ntp_optind;
29        extern char *ntp_optarg;
30
31        progname = argv[0];
32        while ((c = ntp_getopt(argc, argv, "d")) != EOF)
33                switch (c) {
34                case 'd':
35                        ++debug;
36                        break;
37                default:
38                        errflg++;
39                        break;
40                }
41        if (errflg) {
42                (void) fprintf(stderr, "usage: %s [-d]\n", progname);
43                exit(2);
44        }
45        doit();
46        exit(0);
47}
48
49
50/*
51 * The cipher selection function tables.  These turn 6 bit data back
52 * into 4 bit data.
53 */
54u_char S[8][64] = {
55        14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
56         0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
57         4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
58        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
59
60        15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
61         3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
62         0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
63        13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
64 
65        10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
66        13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
67        13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
68         1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
69
70         7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
71        13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
72        10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
73         3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
74
75         2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
76        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
77         4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
78        11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
79
80        12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
81        10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
82         9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
83         4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
84
85         4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
86        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
87         1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
88         6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
89
90        13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
91         1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
92         7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
93         2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
94};
95
96/*
97 * Cipher function permutation table
98 */
99u_char PT[32] = {
100        16,  7, 20, 21,
101        29, 12, 28, 17,
102         1, 15, 23, 26,
103         5, 18, 31, 10,
104         2,  8, 24, 14,
105        32, 27,  3,  9,
106        19, 13, 30,  6,
107        22, 11,  4, 25
108};
109
110
111/*
112 * Bits array.  We keep this zeroed.
113 */
114u_char bits[32];
115
116
117/*
118 * selperm - run six bit data through the given selection table, then
119 *           through the PT table to produce a long output.
120 */
121static void
122selperm(selnumber, sixbits, resp)
123        int selnumber;
124        int sixbits;
125        u_int32 *resp;
126{
127        register u_int32 res;
128        register int selno;
129        register int i;
130        register int ind;
131
132        selno = selnumber;
133        i = sixbits;
134        ind = (i & 0x20) | ((i >> 1) & 0xf) | ((i & 0x1) << 4);
135        i = S[selno][ind];
136
137        for (ind = 0; ind < 4; ind++) {
138                if (i & 0x8)
139                        bits[4*selno + ind] = 1;
140                i <<= 1;
141        }
142
143        res = 0;
144        for (i = 0; i < 32; i++) {
145                res <<= 1;
146                if (bits[PT[i]-1])
147                        res |= 1;
148        }
149
150        *resp = res;
151        bits[4*selno] = 0;
152        bits[4*selno + 1] = 0;
153        bits[4*selno + 2] = 0;
154        bits[4*selno + 3] = 0;
155}
156
157
158/*
159 * doit - compute and print the 8 SP tables
160 */
161static void
162doit()
163{
164        int selno;
165        u_int32 result;
166        int sixbits;
167
168        memset((char *)bits, 0, sizeof bits);
169        printf("static u_int32 SP[8][64] = {");
170        for (selno = 0; selno < 8; selno++) {
171                for (sixbits = 0; sixbits < 64; sixbits++) {
172                        selperm(selno, sixbits, &result);
173                        if ((sixbits & 0x3) == 0)
174                                printf("\n\t0x%08x,", result);
175                        else if (sixbits == 63 && selno == 7)
176                                printf(" 0x%08x\n};\n", result);
177                        else if (sixbits == 63)
178                                printf(" 0x%08x,\n", result);
179                        else
180                                printf(" 0x%08x,", result);
181                }
182        }
183}
Note: See TracBrowser for help on using the repository browser.