4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1988 AT&T */
28 /* All Rights Reserved */
30 #pragma weak _des_crypt = des_crypt
31 #pragma weak _des_encrypt = des_encrypt
32 #pragma weak _des_setkey = des_setkey
34 #include <sys/types.h>
41 #include <sys/types.h>
44 * This program implements the
45 * Proposed Federal Information Processing
46 * Data Encryption Standard.
47 * See Federal Register, March 17, 1975 (40FR12134)
51 * Initial permutation,
54 58, 50, 42, 34, 26, 18, 10, 2,
55 60, 52, 44, 36, 28, 20, 12, 4,
56 62, 54, 46, 38, 30, 22, 14, 6,
57 64, 56, 48, 40, 32, 24, 16, 8,
58 57, 49, 41, 33, 25, 17, 9, 1,
59 59, 51, 43, 35, 27, 19, 11, 3,
60 61, 53, 45, 37, 29, 21, 13, 5,
61 63, 55, 47, 39, 31, 23, 15, 7,
65 * Final permutation, FP = IP^(-1)
68 40, 8, 48, 16, 56, 24, 64, 32,
69 39, 7, 47, 15, 55, 23, 63, 31,
70 38, 6, 46, 14, 54, 22, 62, 30,
71 37, 5, 45, 13, 53, 21, 61, 29,
72 36, 4, 44, 12, 52, 20, 60, 28,
73 35, 3, 43, 11, 51, 19, 59, 27,
74 34, 2, 42, 10, 50, 18, 58, 26,
75 33, 1, 41, 9, 49, 17, 57, 25,
79 * Permuted-choice 1 from the key bits
81 * Note that bits 8, 16... are left out:
82 * They are intended for a parity check.
84 static char PC1_C
[] = {
85 57, 49, 41, 33, 25, 17, 9,
86 1, 58, 50, 42, 34, 26, 18,
87 10, 2, 59, 51, 43, 35, 27,
88 19, 11, 3, 60, 52, 44, 36,
91 static char PC1_D
[] = {
92 63, 55, 47, 39, 31, 23, 15,
93 7, 62, 54, 46, 38, 30, 22,
94 14, 6, 61, 53, 45, 37, 29,
95 21, 13, 5, 28, 20, 12, 4,
99 * Sequence of shifts used for the key schedule.
101 static char shifts
[] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, };
104 * Permuted-choice 2, to pick out the bits from
105 * the CD array that generate the key schedule.
107 static char PC2_C
[] = {
108 14, 17, 11, 24, 1, 5,
109 3, 28, 15, 6, 21, 10,
110 23, 19, 12, 4, 26, 8,
111 16, 7, 27, 20, 13, 2,
114 static char PC2_D
[] = {
115 41, 52, 31, 37, 47, 55,
116 30, 40, 51, 45, 33, 48,
117 44, 49, 39, 56, 34, 53,
118 46, 42, 50, 36, 29, 32,
122 * The C and D arrays used to calculate the key schedule.
129 * Generated from the key.
131 static char KS
[16][48];
134 * The E bit-selection table.
140 8, 9, 10, 11, 12, 13,
141 12, 13, 14, 15, 16, 17,
142 16, 17, 18, 19, 20, 21,
143 20, 21, 22, 23, 24, 25,
144 24, 25, 26, 27, 28, 29,
145 28, 29, 30, 31, 32, 1,
149 * Set up the key schedule from the key.
152 static mutex_t lock
= DEFAULTMUTEX
;
155 des_setkey_nolock(const char *key
)
161 * First, generate C and D by permuting
162 * the key. The low order bit of each
163 * 8-bit char is not used, so C and D are only 28
166 for (i
= 0; i
< 28; i
++) {
167 C
[i
] = key
[PC1_C
[i
]-1];
168 D
[i
] = key
[PC1_D
[i
]-1];
171 * To generate Ki, rotate C and D according
172 * to schedule and pick up a permutation
175 for (i
= 0; i
< 16; i
++) {
179 for (k
= 0; k
< shifts
[i
]; k
++) {
181 for (j
= 0; j
< 28-1; j
++)
185 for (j
= 0; j
< 28-1; j
++)
190 * get Ki. Note C and D are concatenated.
192 for (j
= 0; j
< 24; j
++) {
193 KS
[i
][j
] = C
[PC2_C
[j
]-1];
194 KS
[i
][j
+24] = D
[PC2_D
[j
]-28-1];
198 for (i
= 0; i
< 48; i
++)
203 des_setkey(const char *key
)
205 (void) mutex_lock(&lock
);
206 des_setkey_nolock(key
);
207 (void) mutex_unlock(&lock
);
211 * The 8 selection functions.
212 * For some reason, they give a 0-origin
213 * index, unlike everything else.
215 static char S
[8][64] = {
216 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
217 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
218 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
219 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
221 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
222 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
223 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
224 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
226 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
227 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
228 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
229 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
231 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
232 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
233 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
234 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
236 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
237 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
238 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
239 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
241 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
242 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
243 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
244 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
246 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
247 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
248 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
249 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
251 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
252 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
253 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
254 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
258 * P is a permutation on the selected combination
259 * of the current L and key.
273 * The current block, divided into 2 halves.
276 static char tempL
[32];
280 * The combination of the key and the input, before selection.
282 static char preS
[48];
285 * The payoff: encrypt a block.
289 des_encrypt_nolock(char *block
, int edflag
)
292 (void) _des_decrypt1(block
, L
, IP
, &L
[32],
293 preS
, E
, KS
, S
, f
, tempL
, P
, FP
);
295 (void) des_encrypt1(block
, L
, IP
, &L
[32],
296 preS
, E
, KS
, S
, f
, tempL
, P
, FP
);
300 des_encrypt(char *block
, int edflag
)
302 (void) mutex_lock(&lock
);
303 des_encrypt_nolock(block
, edflag
);
304 (void) mutex_unlock(&lock
);
309 #define IOBUF_SIZE 16
312 _get_iobuf(thread_key_t
*keyp
, unsigned size
)
316 if (thr_keycreate_once(keyp
, free
) != 0)
318 iobuf
= pthread_getspecific(*keyp
);
320 if (thr_setspecific(*keyp
, (iobuf
= malloc(size
))) != 0) {
330 des_crypt(const char *pw
, const char *salt
)
335 static thread_key_t key
= THR_ONCE_KEY
;
336 char *iobuf
= _get_iobuf(&key
, IOBUF_SIZE
);
338 (void) mutex_lock(&lock
);
339 for (i
= 0; i
< 66; i
++)
341 for (i
= 0; (c
= *pw
) && (i
< 64); pw
++) {
342 for (j
= 0; j
< 7; j
++, i
++)
343 block
[i
] = (c
>>(6-j
)) & 01;
347 des_setkey_nolock(block
);
349 for (i
= 0; i
< 66; i
++)
352 for (i
= 0; i
< 2; i
++) {
360 for (j
= 0; j
< 6; j
++) {
363 E
[6*i
+j
] = E
[6*i
+j
+24];
364 E
[6*i
+j
+24] = (char)temp
;
369 for (i
= 0; i
< 25; i
++)
370 (void) des_encrypt_nolock(block
, 0);
372 for (i
= 0; i
< 11; i
++) {
374 for (j
= 0; j
< 6; j
++) {
383 iobuf
[i
+2] = (char)c
;
388 (void) mutex_unlock(&lock
);