~clint-fewbar/ubuntu/precise/squid3/ignore-sighup-early

« back to all changes in this revision

Viewing changes to lib/encrypt.c

  • Committer: Bazaar Package Importer
  • Author(s): Luigi Gangitano
  • Date: 2010-05-04 11:15:49 UTC
  • mfrom: (1.3.1 upstream)
  • mto: (20.3.1 squeeze) (21.2.1 sid)
  • mto: This revision was merged to the branch mainline in revision 21.
  • Revision ID: james.westby@ubuntu.com-20100504111549-1apjh2g5sndki4te
Tags: upstream-3.1.3
ImportĀ upstreamĀ versionĀ 3.1.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* encrypt.c - providing 56 bit DES encryption
2
2
 * Copyright (C) 1991 Jochen Obalek
3
 
 * 
 
3
 *
4
4
 * This program is free software; you can redistribute it and/or modify
5
5
 * it under the terms of the GNU General Public License as published by
6
6
 * the Free Software Foundation; either version 2, or (at your option)
7
7
 * any later version.
8
 
 * 
 
8
 *
9
9
 * This program is distributed in the hope that it will be useful,
10
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
12
 * GNU General Public License for more details.
13
 
 * 
 
13
 *
14
14
 * You should have received a copy of the GNU General Public License
15
15
 * along with this program; if not, write to the Free Software
16
16
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
29
29
static char schluessel[16][KS];
30
30
 
31
31
 
32
 
static char PC1[] =
33
 
{
 
32
static char PC1[] = {
34
33
    56, 48, 40, 32, 24, 16, 8, 0,
35
34
    57, 49, 41, 33, 25, 17, 9, 1,
36
35
    58, 50, 42, 34, 26, 18, 10, 2,
42
41
};
43
42
 
44
43
 
45
 
static char PC2[] =
46
 
{
 
44
static char PC2[] = {
47
45
    13, 16, 10, 23, 0, 4, 2, 27,
48
46
    14, 5, 20, 9, 22, 18, 11, 3,
49
47
    25, 7, 15, 6, 26, 19, 12, 1,
53
51
};
54
52
 
55
53
 
56
 
static char IP[] =
57
 
{
 
54
static char IP[] = {
58
55
    57, 49, 41, 33, 25, 17, 9, 1,
59
56
    59, 51, 43, 35, 27, 19, 11, 3,
60
57
    61, 53, 45, 37, 29, 21, 13, 5,
66
63
};
67
64
 
68
65
 
69
 
static char EP[] =
70
 
{
 
66
static char EP[] = {
71
67
    7, 39, 15, 47, 23, 55, 31, 63,
72
68
    6, 38, 14, 46, 22, 54, 30, 62,
73
69
    5, 37, 13, 45, 21, 53, 29, 61,
79
75
};
80
76
 
81
77
 
82
 
static char E0[] =
83
 
{
 
78
static char E0[] = {
84
79
    31, 0, 1, 2, 3, 4, 3, 4,
85
80
    5, 6, 7, 8, 7, 8, 9, 10,
86
81
    11, 12, 11, 12, 13, 14, 15, 16,
93
88
static char E[KS];
94
89
 
95
90
 
96
 
static char PERM[] =
97
 
{
 
91
static char PERM[] = {
98
92
    15, 6, 19, 20, 28, 11, 27, 16,
99
93
    0, 14, 22, 25, 4, 17, 30, 9,
100
94
    1, 7, 23, 13, 31, 26, 2, 8,
102
96
};
103
97
 
104
98
 
105
 
static char S_BOX[][64] =
106
 
{
107
 
    {
108
 
        14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
109
 
        3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
110
 
        4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
111
 
        15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13
112
 
    },
113
 
    {
114
 
        15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
115
 
        9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
116
 
        0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
117
 
        5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9
118
 
    },
119
 
    {
120
 
        10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
121
 
        1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
122
 
        13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
123
 
        11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12
124
 
    },
125
 
    {
126
 
        7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
127
 
        1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
128
 
        10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
129
 
        15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14
130
 
    },
131
 
    {
132
 
        2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
133
 
        8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
134
 
        4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
135
 
        15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3
136
 
    },
137
 
    {
138
 
        12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
139
 
        0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
140
 
        9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
141
 
        7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13
142
 
    },
143
 
    {
144
 
        4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
145
 
        3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
146
 
        1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
147
 
        10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12
148
 
    },
149
 
    {
150
 
        13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
151
 
        10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
152
 
        7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
153
 
        0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
 
99
static char S_BOX[][64] = {
 
100
    {
 
101
        14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
 
102
        3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
 
103
        4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
 
104
        15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13
 
105
    },
 
106
    {
 
107
        15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
 
108
        9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
 
109
        0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
 
110
        5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9
 
111
    },
 
112
    {
 
113
        10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
 
114
        1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
 
115
        13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
 
116
        11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12
 
117
    },
 
118
    {
 
119
        7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
 
120
        1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
 
121
        10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
 
122
        15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14
 
123
    },
 
124
    {
 
125
        2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
 
126
        8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
 
127
        4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
 
128
        15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3
 
129
    },
 
130
    {
 
131
        12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
 
132
        0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
 
133
        9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
 
134
        7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13
 
135
    },
 
136
    {
 
137
        4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
 
138
        3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
 
139
        1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
 
140
        10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12
 
141
    },
 
142
    {
 
143
        13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
 
144
        10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
 
145
        7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
 
146
        0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
154
147
    }
155
148
};
156
149
 
157
150
static void
158
151
perm(a, e, pc, n)
159
 
     register char *a, *e;
160
 
     register char *pc;
161
 
     int n;
 
152
register char *a, *e;
 
153
register char *pc;
 
154
int n;
162
155
{
163
156
    for (; n--; pc++, a++)
164
 
        *a = e[*pc];
 
157
        *a = e[*pc];
165
158
}
166
159
 
167
160
static void
168
161
crypt_main(nachr_l, nachr_r, schl)
169
 
     register char *nachr_l, *nachr_r;
170
 
     register char *schl;
 
162
register char *nachr_l, *nachr_r;
 
163
register char *schl;
171
164
{
172
165
    char tmp[KS];
173
166
    register int sbval;
176
169
    register int i, j;
177
170
 
178
171
    for (i = 0; i < 8; i++) {
179
 
        for (j = 0, sbval = 0; j < 6; j++)
180
 
            sbval = (sbval << 1) | (nachr_r[*e++] ^ *schl++);
181
 
        sbval = S_BOX[i][sbval];
182
 
        for (tp += 4, j = 4; j--; sbval >>= 1)
183
 
            *--tp = sbval & 1;
184
 
        tp += 4;
 
172
        for (j = 0, sbval = 0; j < 6; j++)
 
173
            sbval = (sbval << 1) | (nachr_r[*e++] ^ *schl++);
 
174
        sbval = S_BOX[i][sbval];
 
175
        for (tp += 4, j = 4; j--; sbval >>= 1)
 
176
            *--tp = sbval & 1;
 
177
        tp += 4;
185
178
    }
186
179
 
187
180
    e = PERM;
188
181
    for (i = 0; i < BS2; i++)
189
 
        *nachr_l++ ^= tmp[*e++];
 
182
        *nachr_l++ ^= tmp[*e++];
190
183
}
191
184
 
192
185
void
199
192
    perm(tmp, nachr, IP, BS);
200
193
 
201
194
    for (i = 8; i--;) {
202
 
        crypt_main(tmp, tmp + BS2, *schl);
203
 
        if (decr)
204
 
            schl--;
205
 
        else
206
 
            schl++;
207
 
        crypt_main(tmp + BS2, tmp, *schl);
208
 
        if (decr)
209
 
            schl--;
210
 
        else
211
 
            schl++;
 
195
        crypt_main(tmp, tmp + BS2, *schl);
 
196
        if (decr)
 
197
            schl--;
 
198
        else
 
199
            schl++;
 
200
        crypt_main(tmp + BS2, tmp, *schl);
 
201
        if (decr)
 
202
            schl--;
 
203
        else
 
204
            schl++;
212
205
    }
213
206
 
214
207
    perm(nachr, tmp, EP, BS);
227
220
    perm(tmp1, schl, PC1, IS);
228
221
 
229
222
    for (i = 0; i < 16; i++) {
230
 
        shval += 1 + (ls & 1);
231
 
        akt_schl = schluessel[i];
232
 
        for (j = 0; j < KS; j++) {
233
 
            if ((k = PC2[j]) >= IS2) {
234
 
                if ((k += shval) >= IS)
235
 
                    k = (k - IS2) % IS2 + IS2;
236
 
            } else if ((k += shval) >= IS2)
237
 
                k %= IS2;
238
 
            *akt_schl++ = tmp1[k];
239
 
        }
240
 
        ls >>= 1;
 
223
        shval += 1 + (ls & 1);
 
224
        akt_schl = schluessel[i];
 
225
        for (j = 0; j < KS; j++) {
 
226
            if ((k = PC2[j]) >= IS2) {
 
227
                if ((k += shval) >= IS)
 
228
                    k = (k - IS2) % IS2 + IS2;
 
229
            } else if ((k += shval) >= IS2)
 
230
                k %= IS2;
 
231
            *akt_schl++ = tmp1[k];
 
232
        }
 
233
        ls >>= 1;
241
234
    }
242
235
}
243
236
 
253
246
    memset(key, 0, BS + 2);
254
247
 
255
248
    for (k = key, i = 0; i < BS; i++) {
256
 
        if (!(keybyte = *wort++))
257
 
            break;
258
 
        k += 7;
259
 
        for (j = 0; j < 7; j++, i++) {
260
 
            *--k = keybyte & 1;
261
 
            keybyte >>= 1;
262
 
        }
263
 
        k += 8;
 
249
        if (!(keybyte = *wort++))
 
250
            break;
 
251
        k += 7;
 
252
        for (j = 0; j < 7; j++, i++) {
 
253
            *--k = keybyte & 1;
 
254
            keybyte >>= 1;
 
255
        }
 
256
        k += 8;
264
257
    }
265
258
 
266
259
    setkey(key);
267
260
    memset(key, 0, BS + 2);
268
261
 
269
262
    for (k = E, i = 0; i < 2; i++) {
270
 
        retkey[i] = keybyte = *salt++;
271
 
        if (keybyte > 'Z')
272
 
            keybyte -= 'a' - 'Z' - 1;
273
 
        if (keybyte > '9')
274
 
            keybyte -= 'A' - '9' - 1;
275
 
        keybyte -= '.';
 
263
        retkey[i] = keybyte = *salt++;
 
264
        if (keybyte > 'Z')
 
265
            keybyte -= 'a' - 'Z' - 1;
 
266
        if (keybyte > '9')
 
267
            keybyte -= 'A' - '9' - 1;
 
268
        keybyte -= '.';
276
269
 
277
 
        for (j = 0; j < 6; j++, keybyte >>= 1, k++) {
278
 
            if (!(keybyte & 1))
279
 
                continue;
280
 
            tmp = *k;
281
 
            *k = k[24];
282
 
            k[24] = tmp;
283
 
        }
 
270
        for (j = 0; j < 6; j++, keybyte >>= 1, k++) {
 
271
            if (!(keybyte & 1))
 
272
                continue;
 
273
            tmp = *k;
 
274
            *k = k[24];
 
275
            k[24] = tmp;
 
276
        }
284
277
    }
285
278
 
286
279
    for (i = 0; i < 25; i++)
287
 
        encrypt(key, 0);
 
280
        encrypt(key, 0);
288
281
 
289
282
    for (k = key, i = 0; i < 11; i++) {
290
 
        for (j = keybyte = 0; j < 6; j++) {
291
 
            keybyte <<= 1;
292
 
            keybyte |= *k++;
293
 
        }
 
283
        for (j = keybyte = 0; j < 6; j++) {
 
284
            keybyte <<= 1;
 
285
            keybyte |= *k++;
 
286
        }
294
287
 
295
 
        keybyte += '.';
296
 
        if (keybyte > '9')
297
 
            keybyte += 'A' - '9' - 1;
298
 
        if (keybyte > 'Z')
299
 
            keybyte += 'a' - 'Z' - 1;
300
 
        retkey[i + 2] = keybyte;
 
288
        keybyte += '.';
 
289
        if (keybyte > '9')
 
290
            keybyte += 'A' - '9' - 1;
 
291
        if (keybyte > 'Z')
 
292
            keybyte += 'a' - 'Z' - 1;
 
293
        retkey[i + 2] = keybyte;
301
294
    }
302
295
 
303
296
    retkey[i + 2] = 0;
304
297
 
305
298
    if (!retkey[1])
306
 
        retkey[1] = *retkey;
 
299
        retkey[1] = *retkey;
307
300
 
308
301
    return retkey;
309
302
}