4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984,1988 AT&T */
28 /* All Rights Reserved */
30 #pragma ident "%Z%%M% %I% %E% SMI"
34 * This program implements the
35 * Proposed Federal Information Processing
36 * Data Encryption Standard.
37 * See Federal Register, March 17, 1975 (40FR12134)
41 * Initial permutation,
44 58,50,42,34,26,18,10, 2,
45 60,52,44,36,28,20,12, 4,
46 62,54,46,38,30,22,14, 6,
47 64,56,48,40,32,24,16, 8,
48 57,49,41,33,25,17, 9, 1,
49 59,51,43,35,27,19,11, 3,
50 61,53,45,37,29,21,13, 5,
51 63,55,47,39,31,23,15, 7,
55 * Final permutation, FP = IP^(-1)
58 40, 8,48,16,56,24,64,32,
59 39, 7,47,15,55,23,63,31,
60 38, 6,46,14,54,22,62,30,
61 37, 5,45,13,53,21,61,29,
62 36, 4,44,12,52,20,60,28,
63 35, 3,43,11,51,19,59,27,
64 34, 2,42,10,50,18,58,26,
65 33, 1,41, 9,49,17,57,25,
69 * Permuted-choice 1 from the key bits
71 * Note that bits 8,16... are left out:
72 * They are intended for a parity check.
74 static char PC1_C
[] = {
81 static char PC1_D
[] = {
89 * Sequence of shifts used for the key schedule.
91 static char shifts
[] = {
92 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
96 * Permuted-choice 2, to pick out the bits from
97 * the CD array that generate the key schedule.
99 static char PC2_C
[] = {
106 static char PC2_D
[] = {
113 static struct _crypt
{
115 * The C and D arrays used to calculate the key schedule.
121 * Generated from the key.
125 * The E bit-selection table.
129 * The current block, divided into 2 halves.
135 * The combination of the key and the input, before selection.
141 char _ablock
[66], _iobuf
[16];
149 #define tempL (_c->_tempL)
151 #define preS (_c->_preS)
152 #define ablock (_c->_ablock)
153 #define iobuf (_c->_iobuf)
155 static void _cryptinit(void);
158 * Set up the key schedule from the key.
169 struct _crypt
*_c
= __crypt
;
176 * First, generate C and D by permuting
177 * the key. The low order bit of each
178 * 8-bit char is not used, so C and D are only 28
181 for (i
=0; i
<28; i
++) {
182 C
[i
] = key
[PC1_C
[i
]-1];
183 D
[i
] = key
[PC1_D
[i
]-1];
186 * To generate Ki, rotate C and D according
187 * to schedule and pick up a permutation
190 for (i
=0; i
<16; i
++) {
194 for (k
=0; k
<shifts
[i
]; k
++) {
196 for (j
=0; j
<28-1; j
++)
200 for (j
=0; j
<28-1; j
++)
205 * get Ki. Note C and D are concatenated.
207 for (j
=0; j
<24; j
++) {
208 KS
[i
][j
] = C
[PC2_C
[j
]-1];
209 KS
[i
][j
+24] = D
[PC2_D
[j
]-28-1];
215 * The E bit-selection table.
229 * The 8 selection functions.
230 * For some reason, they give a 0-origin
231 * index, unlike everything else.
233 static char S
[8][64] = {
234 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
235 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
236 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
237 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
239 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
240 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
241 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
242 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
244 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
245 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
246 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
247 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
249 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
250 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
251 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
252 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
254 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
255 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
256 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
257 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
259 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
260 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
261 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
262 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
264 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
265 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
266 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
267 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
269 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
270 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
271 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
272 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
276 * P is a permutation on the selected combination
277 * of the current L and key.
292 * The payoff: encrypt a block.
296 encrypt(char *block
, int edflag
)
300 struct _crypt
*_c
= __crypt
;
307 * First, permute the bits in the input
310 L
[j
] = block
[IP
[j
]-1];
312 * Perform an encryption operation 16 times.
314 for (ii
=0; ii
<16; ii
++) {
326 * which will be the new L.
331 * Expand R to 48 bits using the E selector;
332 * exclusive-or with the current key bits.
335 preS
[j
] = R
[E
[j
]-1] ^ KS
[i
][j
];
337 * The pre-select bits are now considered
338 * in 8 groups of 6 bits each.
339 * The 8 selection functions map these
340 * 6-bit quantities into 4-bit quantities
341 * and the results permuted
342 * to make an f(R, K).
343 * The indexing into the selection functions
344 * is peculiar; it could be simplified by
345 * rewriting the tables.
347 for (j
=0; j
<8; j
++) {
349 k
= S
[j
][(preS
[t
+0]<<5)+
362 * The new R is L ^ f(R, K).
363 * The f here has to be permuted first, though.
366 R
[j
] = L
[j
] ^ f
[P
[j
]-1];
368 * Finally, the new L (the original R)
375 * The output L and R are reversed.
377 for (j
=0; j
<32; j
++) {
384 * gets the inverse permutation of the very original.
387 block
[j
] = L
[FP
[j
]-1];
391 _crypt(char *pw
, char *salt
)
395 struct _crypt
*_c
= __crypt
;
403 for(i
=0; (c
= *pw
) && i
<64; pw
++){
404 for(j
=0; j
<7; j
++, i
++)
405 ablock
[i
] = (c
>>(6-j
)) & 01;
428 E
[6*i
+j
] = E
[6*i
+j
+24];
437 for(i
=0; i
< 11; i
++) {
459 struct _crypt
*_c
= __crypt
;
464 _c
= __crypt
= (struct _crypt
*)calloc(1, sizeof (struct _crypt
));