33 #if defined(LIBC_SCCS) && !defined(lint)
34 static char sccsid[] =
"@(#)crypt.c 8.1 (Berkeley) 6/4/93";
46 #ifndef _PASSWORD_EFMT1
47 #define _PASSWORD_EFMT1 '_'
79 #error C_block structure assumes 8 bit characters
88 #define LONG_IS_32_BITS
115 #define STATIC static
241 #if defined(LONG_IS_32_BITS)
259 #define TO_SIX_BIT(rslt, src) { \
261 cvt.b[0] = (unsigned char)(src); (src) >>= 6; \
262 cvt.b[1] = (unsigned char)(src); (src) >>= 6; \
263 cvt.b[2] = (unsigned char)(src); (src) >>= 6; \
264 cvt.b[3] = (unsigned char)(src); \
265 (rslt) = (cvt.b32.i0 & 0x3f3f3f3fL) << 2; \
271 #define ZERO(d,d0,d1) ((d0) = 0, (d1) = 0)
272 #define LOAD(d,d0,d1,bl) ((d0) = (bl).b32.i0, (d1) = (bl).b32.i1)
273 #define LOADREG(d,d0,d1,s,s0,s1) ((d0) = (s0), (d1) = (s1))
274 #define OR(d,d0,d1,bl) ((d0) |= (bl).b32.i0, (d1) |= (bl).b32.i1)
275 #define STORE(s,s0,s1,bl) ((bl).b32.i0 = (s0), (bl).b32.i1 = (s1))
276 #define DCL_BLOCK(d,d0,d1) long d0, d1
278 #if defined(LARGEDATA)
280 #define LGCHUNKBITS 3
281 #define CHUNKBITS (1<<LGCHUNKBITS)
282 #define PERM6464(d,d0,d1,cpp,p) \
283 LOAD((d),(d0),(d1),(p)[(0<<CHUNKBITS)+(cpp)[0]]); \
284 OR ((d),(d0),(d1),(p)[(1<<CHUNKBITS)+(cpp)[1]]); \
285 OR ((d),(d0),(d1),(p)[(2<<CHUNKBITS)+(cpp)[2]]); \
286 OR ((d),(d0),(d1),(p)[(3<<CHUNKBITS)+(cpp)[3]]); \
287 OR (d),(d0),(d1),(p)[(4<<CHUNKBITS)+(cpp)[4]]); \
288 OR (d),(d0),(d1),(p)[(5<<CHUNKBITS)+(cpp)[5]]); \
289 OR (d),(d0),(d1),(p)[(6<<CHUNKBITS)+(cpp)[6]]); \
290 OR (d),(d0),(d1),(p)[(7<<CHUNKBITS)+(cpp)[7]]);
291 #define PERM3264(d,d0,d1,cpp,p) \
292 LOAD((d),(d0),(d1),(p)[(0<<CHUNKBITS)+(cpp)[0]]); \
293 OR ((d),(d0),(d1),(p)[(1<<CHUNKBITS)+(cpp)[1]]); \
294 OR ((d),(d0),(d1),(p)[(2<<CHUNKBITS)+(cpp)[2]]); \
295 OR ((d),(d0),(d1),(p)[(3<<CHUNKBITS)+(cpp)[3]]);
298 #define LGCHUNKBITS 2
299 #define CHUNKBITS (1<<LGCHUNKBITS)
300 #define PERM6464(d,d0,d1,cpp,p) \
301 { C_block tblk; permute((cpp),&tblk,(p),8); LOAD ((d),(d0),(d1),tblk); }
302 #define PERM3264(d,d0,d1,cpp,p) \
303 { C_block tblk; permute((cpp),&tblk,(p),4); LOAD ((d),(d0),(d1),tblk); }
321 }
while (--chars_in > 0);
329 static unsigned char IP[] = {
330 58, 50, 42, 34, 26, 18, 10, 2,
331 60, 52, 44, 36, 28, 20, 12, 4,
332 62, 54, 46, 38, 30, 22, 14, 6,
333 64, 56, 48, 40, 32, 24, 16, 8,
334 57, 49, 41, 33, 25, 17, 9, 1,
335 59, 51, 43, 35, 27, 19, 11, 3,
336 61, 53, 45, 37, 29, 21, 13, 5,
337 63, 55, 47, 39, 31, 23, 15, 7,
345 8, 9, 10, 11, 12, 13,
346 12, 13, 14, 15, 16, 17,
347 16, 17, 18, 19, 20, 21,
348 20, 21, 22, 23, 24, 25,
349 24, 25, 26, 27, 28, 29,
350 28, 29, 30, 31, 32, 1,
353 static unsigned char PC1[] = {
354 57, 49, 41, 33, 25, 17, 9,
355 1, 58, 50, 42, 34, 26, 18,
356 10, 2, 59, 51, 43, 35, 27,
357 19, 11, 3, 60, 52, 44, 36,
359 63, 55, 47, 39, 31, 23, 15,
360 7, 62, 54, 46, 38, 30, 22,
361 14, 6, 61, 53, 45, 37, 29,
362 21, 13, 5, 28, 20, 12, 4,
366 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
370 static unsigned char PC2[] = {
371 9, 18, 14, 17, 11, 24, 1, 5,
372 22, 25, 3, 28, 15, 6, 21, 10,
373 35, 38, 23, 19, 12, 4, 26, 8,
374 43, 54, 16, 7, 27, 20, 13, 2,
376 0, 0, 41, 52, 31, 37, 47, 55,
377 0, 0, 30, 40, 51, 45, 33, 48,
378 0, 0, 44, 49, 39, 56, 34, 53,
379 0, 0, 46, 42, 50, 36, 29, 32,
382 static unsigned char S[8][64] = {
385 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
386 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
387 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
388 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
392 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
393 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
394 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
395 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
399 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
400 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
401 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
402 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
406 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
407 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
408 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
409 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
413 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
414 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
415 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
416 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
420 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
421 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
422 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
423 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
427 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
428 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
429 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
430 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
434 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
435 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
436 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
437 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
452 static unsigned char CIFP[] = {
453 1, 2, 3, 4, 17, 18, 19, 20,
454 5, 6, 7, 8, 21, 22, 23, 24,
455 9, 10, 11, 12, 25, 26, 27, 28,
456 13, 14, 15, 16, 29, 30, 31, 32,
458 33, 34, 35, 36, 49, 50, 51, 52,
459 37, 38, 39, 40, 53, 54, 55, 56,
460 41, 42, 43, 44, 57, 58, 59, 60,
461 45, 46, 47, 48, 61, 62, 63, 64,
465 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
483 static long SPE[2][8][64];
502 register
const char *setting;
508 int num_iter, salt_size;
511 for (i = 0; i < 8; i++) {
512 if ((t = 2*(
unsigned char)(*key)) != 0)
527 (
char *)&keyblock, 0L, 1))
529 for (i = 0; i < 8; i++) {
530 if ((t = 2*(
unsigned char)(*key)) != 0)
538 *encp++ = *setting++;
542 for (i = 4; --i >= 0; ) {
543 if ((t = (
unsigned char)setting[i]) ==
'\0')
546 num_iter = (num_iter<<6) |
a64toi[t];
558 for (i = salt_size; --i >= 0; ) {
559 if ((t = (
unsigned char)setting[i]) ==
'\0')
562 salt = (salt<<6) |
a64toi[t];
572 i = ((long)((rsltblock.b[0]<<8) | rsltblock.b[1])<<8) | rsltblock.b[2];
573 encp[3] =
itoa64[i&0x3f]; i >>= 6;
574 encp[2] =
itoa64[i&0x3f]; i >>= 6;
575 encp[1] =
itoa64[i&0x3f]; i >>= 6;
576 encp[0] =
itoa64[
i]; encp += 4;
577 i = ((long)((rsltblock.b[3]<<8) | rsltblock.b[4])<<8) | rsltblock.b[5];
578 encp[3] =
itoa64[i&0x3f]; i >>= 6;
579 encp[2] =
itoa64[i&0x3f]; i >>= 6;
580 encp[1] =
itoa64[i&0x3f]; i >>= 6;
581 encp[0] =
itoa64[
i]; encp += 4;
582 i = ((long)((rsltblock.b[6])<<8) | rsltblock.b[7])<<2;
583 encp[2] =
itoa64[i&0x3f]; i >>= 6;
584 encp[1] =
itoa64[i&0x3f]; i >>= 6;
609 static int des_ready = 0;
617 key = (
char *)&KS[0];
618 STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(
C_block *)key);
619 for (i = 1; i < 16; i++) {
623 PERM6464(K,K0,K1,(
unsigned char *)key,ptabp);
624 STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(
C_block *)key);
648 register long L0, L1,
R0,
R1, k;
650 register int ks_inc, loop_count;
656 #if defined(vax) || defined(pdp11)
663 #if defined(MUST_ALIGN)
664 B.
b[0] = in[0]; B.
b[1] = in[1]; B.
b[2] = in[2]; B.
b[3] = in[3];
665 B.
b[4] = in[4]; B.
b[5] = in[5]; B.
b[6] = in[6]; B.
b[7] = in[7];
675 R1 = (R1 >> 1) & 0x55555555L;
684 ks_inc = (int)
sizeof(*kp);
688 num_iter = -num_iter;
690 ks_inc = -(int)
sizeof(*kp);
693 while (--num_iter >= 0) {
697 #define SPTAB(t, i) (*(long *)((unsigned char *)(t) + (i)*(sizeof(long)/4)))
700 #define DOXOR(x,y,i) (x)^=SPTAB(SPE[0][(i)],B.b[(i)]); (y)^=SPTAB(SPE[1][(i)],B.b[(i)]);
704 #define DOXOR(x,y,i) j=B.b[(i)]; (x)^=SPTAB(SPE[0][(i)],j); (y)^=SPTAB(SPE[1][(i)],j);
707 #define DOXOR(x,y,i) k=B.b[(i)]; (x)^=SPTAB(SPE[0][(i)],k); (y)^=SPTAB(SPE[1][(i)],k);
711 #define CRUNCH(p0, p1, q0, q1) \
712 k = ((q0) ^ (q1)) & SALT; \
713 B.b32.i0 = k ^ (q0) ^ kp->b32.i0; \
714 B.b32.i1 = k ^ (q1) ^ kp->b32.i1; \
715 kp = (C_block *)((char *)kp+ks_inc); \
717 DOXOR((p0), (p1), 0); \
718 DOXOR((p0), (p1), 1); \
719 DOXOR((p0), (p1), 2); \
720 DOXOR((p0), (p1), 3); \
721 DOXOR((p0), (p1), 4); \
722 DOXOR((p0), (p1), 5); \
723 DOXOR((p0), (p1), 6); \
724 DOXOR((p0), (p1), 7);
728 }
while (--loop_count != 0);
739 L0 = ((L0 >> 3) & 0x0f0f0f0fL) | ((L1 << 1) & 0xf0f0f0f0L);
740 L1 = ((R0 >> 3) & 0x0f0f0f0fL) | ((R1 << 1) & 0xf0f0f0f0L);
743 #if defined(MUST_ALIGN)
745 out[0] = B.
b[0]; out[1] = B.
b[1]; out[2] = B.
b[2]; out[3] = B.
b[3];
746 out[4] = B.
b[4]; out[5] = B.
b[5]; out[6] = B.
b[6]; out[7] = B.
b[7];
763 register int tableno;
764 static unsigned char perm[64], tmp32[32];
769 for (i = 0; i < 64; i++)
775 for (i = 0; i < 64; i++)
777 for (i = 0; i < 64; i++) {
778 if ((k =
PC2[i]) == 0)
781 if ((k%28) <
Rotates[0]) k -= 28;
788 perm[
i] = (
unsigned char)k;
791 prtab(
"pc1tab", perm, 8);
798 for (j = 0; j < 2; j++) {
799 unsigned char pc2inv[64];
800 for (i = 0; i < 64; i++)
801 perm[i] = pc2inv[i] = 0;
802 for (i = 0; i < 64; i++) {
803 if ((k =
PC2[i]) == 0)
807 for (i = 0; i < 64; i++) {
808 if ((k =
PC2[i]) == 0)
811 if ((k%28) <= j) k -= 28;
815 prtab(
"pc2tab", perm, 8);
823 for (i = 0; i < 8; i++) {
824 for (j = 0; j < 8; j++) {
835 perm[i*8+j] = (
unsigned char)k;
839 prtab(
"ietab", perm, 8);
846 for (i = 0; i < 64; i++) {
856 prtab(
"cftab", perm, 8);
863 for (i = 0; i < 48; i++)
865 for (tableno = 0; tableno < 8; tableno++) {
866 for (j = 0; j < 64; j++) {
867 k = (((j >> 0) &01) << 5)|
868 (((j >> 1) &01) << 3)|
869 (((j >> 2) &01) << 2)|
870 (((j >> 3) &01) << 1)|
871 (((j >> 4) &01) << 0)|
872 (((j >> 5) &01) << 4);
874 k = (((k >> 3)&01) << 0)|
875 (((k >> 2)&01) << 1)|
876 (((k >> 1)&01) << 2)|
877 (((k >> 0)&01) << 3);
878 for (i = 0; i < 32; i++)
880 for (i = 0; i < 4; i++)
881 tmp32[4 * tableno + i] = (
unsigned char)(k >>
i) & 01;
883 for (i = 24; --i >= 0; )
884 k = (k<<1) | tmp32[perm[
i]-1];
887 for (i = 24; --i >= 0; )
888 k = (k<<1) | tmp32[perm[i+24]-1];
906 int chars_in, chars_out;
908 register int i, j, k, l;
910 for (k = 0; k < chars_out*8; k++) {
915 l = 1<<(l&(CHUNKBITS-1));
918 perm[i][j].b[k>>3] |= 1<<(k&07);
930 register int i, j, k;
933 for (i = 0; i < 8; i++) {
935 for (j = 0; j < 8; j++) {
937 k |= (
unsigned char)*key++;
949 register
char *block;
952 register int i, j, k;
955 for (i = 0; i < 8; i++) {
957 for (j = 0; j < 8; j++) {
959 k |= (
unsigned char)*block++;
963 if (
des_cipher((
char *)&cblock, (
char *)&cblock, 0L, (flag ? -1: 1)))
965 for (i = 7; i >= 0; i--) {
967 for (j = 7; j >= 0; j--) {
977 prtab(s, t, num_rows)
984 (void)printf(
"%s:\n", s);
985 for (i = 0; i < num_rows; i++) {
986 for (j = 0; j < 8; j++) {
987 (void)printf(
"%3d", t[i*8+j]);
#define TO_SIX_BIT(rslt, src)
static C_block IE3264[32/CHUNKBITS][1<< CHUNKBITS]
#define CRUNCH(p0, p1, q0, q1)
#define LOAD(d, d0, d1, bl)
static unsigned char S[8][64]
#define PERM3264(d, d0, d1, cpp, p)
static unsigned char P32Tr[]
static long SPE[2][8][64]
int encrypt(char *block, int flag)
static C_block constdatablock
static C_block PC1ROT[64/CHUNKBITS][1<< CHUNKBITS]
static unsigned char PC2[]
static unsigned char CIFP[]
static unsigned char Rotates[]
#define PERM6464(d, d0, d1, cpp, p)
#define LOADREG(d, d0, d1, s, s0, s1)
int setkey(const char *key)
char * crypt(const char *key, const char *setting)
static unsigned char ExpandTr[]
#define STORE(s, s0, s1, bl)
static C_block KS[KS_SIZE]
static unsigned char a64toi[128]
static unsigned char PC1[]
#define R1(v, w, x, y, z, i)
static C_block CF6464[64/CHUNKBITS][1<< CHUNKBITS]
#define DCL_BLOCK(d, d0, d1)
static char cryptresult[1+4+4+11+1]
static unsigned char IP[]
static C_block PC2ROT[2][64/CHUNKBITS][1<< CHUNKBITS]
#define OR(d, d0, d1, bl)
static unsigned char itoa64[]
#define R0(v, w, x, y, z, i)