103928aee4356845252ac6b662d5c72c29903813eJake Slack/*
203928aee4356845252ac6b662d5c72c29903813eJake Slack * @(#)UnixCrypt.java	0.9 96/11/25
303928aee4356845252ac6b662d5c72c29903813eJake Slack *
403928aee4356845252ac6b662d5c72c29903813eJake Slack * Copyright (c) 1996 Aki Yoshida. All rights reserved.
503928aee4356845252ac6b662d5c72c29903813eJake Slack *
603928aee4356845252ac6b662d5c72c29903813eJake Slack * Permission to use, copy, modify and distribute this software
703928aee4356845252ac6b662d5c72c29903813eJake Slack * for non-commercial or commercial purposes and without fee is
803928aee4356845252ac6b662d5c72c29903813eJake Slack * hereby granted provided that this copyright notice appears in
903928aee4356845252ac6b662d5c72c29903813eJake Slack * all copies.
1003928aee4356845252ac6b662d5c72c29903813eJake Slack */
1103928aee4356845252ac6b662d5c72c29903813eJake Slack
1203928aee4356845252ac6b662d5c72c29903813eJake Slack/**
1303928aee4356845252ac6b662d5c72c29903813eJake Slack * Unix crypt(3C) utility
1403928aee4356845252ac6b662d5c72c29903813eJake Slack *
1503928aee4356845252ac6b662d5c72c29903813eJake Slack * @version 	0.9, 11/25/96
1603928aee4356845252ac6b662d5c72c29903813eJake Slack * @author 	Aki Yoshida
1703928aee4356845252ac6b662d5c72c29903813eJake Slack */
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slack/**
2003928aee4356845252ac6b662d5c72c29903813eJake Slack * modified April 2001
2103928aee4356845252ac6b662d5c72c29903813eJake Slack * by Iris Van den Broeke, Daniel Deville
2203928aee4356845252ac6b662d5c72c29903813eJake Slack */
2303928aee4356845252ac6b662d5c72c29903813eJake Slack
2403928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.util.security;
2503928aee4356845252ac6b662d5c72c29903813eJake Slack
2603928aee4356845252ac6b662d5c72c29903813eJake Slack
2703928aee4356845252ac6b662d5c72c29903813eJake Slack/* ------------------------------------------------------------ */
2803928aee4356845252ac6b662d5c72c29903813eJake Slack/**
2903928aee4356845252ac6b662d5c72c29903813eJake Slack * Unix Crypt. Implements the one way cryptography used by Unix systems for
3003928aee4356845252ac6b662d5c72c29903813eJake Slack * simple password protection.
3103928aee4356845252ac6b662d5c72c29903813eJake Slack *
3203928aee4356845252ac6b662d5c72c29903813eJake Slack * @version $Id: UnixCrypt.java,v 1.1 2005/10/05 14:09:14 janb Exp $
3303928aee4356845252ac6b662d5c72c29903813eJake Slack * @author Greg Wilkins (gregw)
3403928aee4356845252ac6b662d5c72c29903813eJake Slack */
3503928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class UnixCrypt
3603928aee4356845252ac6b662d5c72c29903813eJake Slack{
3703928aee4356845252ac6b662d5c72c29903813eJake Slack
3803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* (mostly) Standard DES Tables from Tom Truscott */
3903928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] IP = { /* initial permutation */
4003928aee4356845252ac6b662d5c72c29903813eJake Slack    58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1,
4103928aee4356845252ac6b662d5c72c29903813eJake Slack            59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 };
4203928aee4356845252ac6b662d5c72c29903813eJake Slack
4303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* The final permutation is the inverse of IP - no table is necessary */
4403928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] ExpandTr = { /* expansion operation */
4503928aee4356845252ac6b662d5c72c29903813eJake Slack    32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29,
4603928aee4356845252ac6b662d5c72c29903813eJake Slack            28, 29, 30, 31, 32, 1 };
4703928aee4356845252ac6b662d5c72c29903813eJake Slack
4803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] PC1 = { /* permuted choice table 1 */
4903928aee4356845252ac6b662d5c72c29903813eJake Slack    57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
5003928aee4356845252ac6b662d5c72c29903813eJake Slack
5103928aee4356845252ac6b662d5c72c29903813eJake Slack    63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 };
5203928aee4356845252ac6b662d5c72c29903813eJake Slack
5303928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] Rotates = { /* PC1 rotation schedule */
5403928aee4356845252ac6b662d5c72c29903813eJake Slack    1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
5503928aee4356845252ac6b662d5c72c29903813eJake Slack
5603928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] PC2 = { /* permuted choice table 2 */
5703928aee4356845252ac6b662d5c72c29903813eJake Slack    9, 18, 14, 17, 11, 24, 1, 5, 22, 25, 3, 28, 15, 6, 21, 10, 35, 38, 23, 19, 12, 4, 26, 8, 43, 54, 16, 7, 27, 20, 13, 2,
5803928aee4356845252ac6b662d5c72c29903813eJake Slack
5903928aee4356845252ac6b662d5c72c29903813eJake Slack    0, 0, 41, 52, 31, 37, 47, 55, 0, 0, 30, 40, 51, 45, 33, 48, 0, 0, 44, 49, 39, 56, 34, 53, 0, 0, 46, 42, 50, 36, 29, 32 };
6003928aee4356845252ac6b662d5c72c29903813eJake Slack
6103928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[][] S = { /* 48->32 bit substitution tables */
6203928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[1] */
6303928aee4356845252ac6b662d5c72c29903813eJake Slack            { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9,
6403928aee4356845252ac6b662d5c72c29903813eJake Slack             7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 },
6503928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[2] */
6603928aee4356845252ac6b662d5c72c29903813eJake Slack            { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12,
6703928aee4356845252ac6b662d5c72c29903813eJake Slack             6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 },
6803928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[3] */
6903928aee4356845252ac6b662d5c72c29903813eJake Slack            { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2,
7003928aee4356845252ac6b662d5c72c29903813eJake Slack             12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 },
7103928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[4] */
7203928aee4356845252ac6b662d5c72c29903813eJake Slack            { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3,
7303928aee4356845252ac6b662d5c72c29903813eJake Slack             14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 },
7403928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[5] */
7503928aee4356845252ac6b662d5c72c29903813eJake Slack            { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12,
7603928aee4356845252ac6b662d5c72c29903813eJake Slack             5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 },
7703928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[6] */
7803928aee4356845252ac6b662d5c72c29903813eJake Slack            { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4,
7903928aee4356845252ac6b662d5c72c29903813eJake Slack             10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 },
8003928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[7] */
8103928aee4356845252ac6b662d5c72c29903813eJake Slack            { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15,
8203928aee4356845252ac6b662d5c72c29903813eJake Slack             6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 },
8303928aee4356845252ac6b662d5c72c29903813eJake Slack            /* S[8] */
8403928aee4356845252ac6b662d5c72c29903813eJake Slack            { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10,
8503928aee4356845252ac6b662d5c72c29903813eJake Slack             13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } };
8603928aee4356845252ac6b662d5c72c29903813eJake Slack
8703928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] P32Tr = { /* 32-bit permutation function */
8803928aee4356845252ac6b662d5c72c29903813eJake Slack    16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 };
8903928aee4356845252ac6b662d5c72c29903813eJake Slack
9003928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] CIFP = { /*
9103928aee4356845252ac6b662d5c72c29903813eJake Slack                                             * compressed/interleaved
9203928aee4356845252ac6b662d5c72c29903813eJake Slack                                             * permutation
9303928aee4356845252ac6b662d5c72c29903813eJake Slack                                             */
9403928aee4356845252ac6b662d5c72c29903813eJake Slack    1, 2, 3, 4, 17, 18, 19, 20, 5, 6, 7, 8, 21, 22, 23, 24, 9, 10, 11, 12, 25, 26, 27, 28, 13, 14, 15, 16, 29, 30, 31, 32,
9503928aee4356845252ac6b662d5c72c29903813eJake Slack
9603928aee4356845252ac6b662d5c72c29903813eJake Slack    33, 34, 35, 36, 49, 50, 51, 52, 37, 38, 39, 40, 53, 54, 55, 56, 41, 42, 43, 44, 57, 58, 59, 60, 45, 46, 47, 48, 61, 62, 63, 64 };
9703928aee4356845252ac6b662d5c72c29903813eJake Slack
9803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] ITOA64 = { /* 0..63 => ascii-64 */
9903928aee4356845252ac6b662d5c72c29903813eJake Slack    (byte) '.', (byte) '/', (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'A',
10003928aee4356845252ac6b662d5c72c29903813eJake Slack            (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M',
10103928aee4356845252ac6b662d5c72c29903813eJake Slack            (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
10203928aee4356845252ac6b662d5c72c29903813eJake Slack            (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k',
10303928aee4356845252ac6b662d5c72c29903813eJake Slack            (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w',
10403928aee4356845252ac6b662d5c72c29903813eJake Slack            (byte) 'x', (byte) 'y', (byte) 'z' };
10503928aee4356845252ac6b662d5c72c29903813eJake Slack
10603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ===== Tables that are initialized at run time ==================== */
10703928aee4356845252ac6b662d5c72c29903813eJake Slack
10803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final byte[] A64TOI = new byte[128]; /* ascii-64 => 0..63 */
10903928aee4356845252ac6b662d5c72c29903813eJake Slack
11003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Initial key schedule permutation */
11103928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final long[][] PC1ROT = new long[16][16];
11203928aee4356845252ac6b662d5c72c29903813eJake Slack
11303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Subsequent key schedule rotation permutations */
11403928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final long[][][] PC2ROT = new long[2][16][16];
11503928aee4356845252ac6b662d5c72c29903813eJake Slack
11603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Initial permutation/expansion table */
11703928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final long[][] IE3264 = new long[8][16];
11803928aee4356845252ac6b662d5c72c29903813eJake Slack
11903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* Table that combines the S, P, and E operations. */
12003928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final long[][] SPE = new long[8][64];
12103928aee4356845252ac6b662d5c72c29903813eJake Slack
12203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* compressed/interleaved => final permutation table */
12303928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final long[][] CF6464 = new long[16][16];
12403928aee4356845252ac6b662d5c72c29903813eJake Slack
12503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ==================================== */
12603928aee4356845252ac6b662d5c72c29903813eJake Slack
12703928aee4356845252ac6b662d5c72c29903813eJake Slack    static
12803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
12903928aee4356845252ac6b662d5c72c29903813eJake Slack        byte[] perm = new byte[64];
13003928aee4356845252ac6b662d5c72c29903813eJake Slack        byte[] temp = new byte[64];
13103928aee4356845252ac6b662d5c72c29903813eJake Slack
13203928aee4356845252ac6b662d5c72c29903813eJake Slack        // inverse table.
13303928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 64; i++)
13403928aee4356845252ac6b662d5c72c29903813eJake Slack            A64TOI[ITOA64[i]] = (byte) i;
13503928aee4356845252ac6b662d5c72c29903813eJake Slack
13603928aee4356845252ac6b662d5c72c29903813eJake Slack        // PC1ROT - bit reverse, then PC1, then Rotate, then PC2
13703928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 64; i++)
13803928aee4356845252ac6b662d5c72c29903813eJake Slack            perm[i] = (byte) 0;
13903928aee4356845252ac6b662d5c72c29903813eJake Slack
14003928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 64; i++)
14103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
14203928aee4356845252ac6b662d5c72c29903813eJake Slack            int k;
14303928aee4356845252ac6b662d5c72c29903813eJake Slack            if ((k = PC2[i]) == 0) continue;
14403928aee4356845252ac6b662d5c72c29903813eJake Slack            k += Rotates[0] - 1;
14503928aee4356845252ac6b662d5c72c29903813eJake Slack            if ((k % 28) < Rotates[0]) k -= 28;
14603928aee4356845252ac6b662d5c72c29903813eJake Slack            k = PC1[k];
14703928aee4356845252ac6b662d5c72c29903813eJake Slack            if (k > 0)
14803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
14903928aee4356845252ac6b662d5c72c29903813eJake Slack                k--;
15003928aee4356845252ac6b662d5c72c29903813eJake Slack                k = (k | 0x07) - (k & 0x07);
15103928aee4356845252ac6b662d5c72c29903813eJake Slack                k++;
15203928aee4356845252ac6b662d5c72c29903813eJake Slack            }
15303928aee4356845252ac6b662d5c72c29903813eJake Slack            perm[i] = (byte) k;
15403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
15503928aee4356845252ac6b662d5c72c29903813eJake Slack        init_perm(PC1ROT, perm, 8);
15603928aee4356845252ac6b662d5c72c29903813eJake Slack
15703928aee4356845252ac6b662d5c72c29903813eJake Slack        // PC2ROT - PC2 inverse, then Rotate, then PC2
15803928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int j = 0; j < 2; j++)
15903928aee4356845252ac6b662d5c72c29903813eJake Slack        {
16003928aee4356845252ac6b662d5c72c29903813eJake Slack            int k;
16103928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i = 0; i < 64; i++)
16203928aee4356845252ac6b662d5c72c29903813eJake Slack                perm[i] = temp[i] = 0;
16303928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i = 0; i < 64; i++)
16403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
16503928aee4356845252ac6b662d5c72c29903813eJake Slack                if ((k = PC2[i]) == 0) continue;
16603928aee4356845252ac6b662d5c72c29903813eJake Slack                temp[k - 1] = (byte) (i + 1);
16703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
16803928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i = 0; i < 64; i++)
16903928aee4356845252ac6b662d5c72c29903813eJake Slack            {
17003928aee4356845252ac6b662d5c72c29903813eJake Slack                if ((k = PC2[i]) == 0) continue;
17103928aee4356845252ac6b662d5c72c29903813eJake Slack                k += j;
17203928aee4356845252ac6b662d5c72c29903813eJake Slack                if ((k % 28) <= j) k -= 28;
17303928aee4356845252ac6b662d5c72c29903813eJake Slack                perm[i] = temp[k];
17403928aee4356845252ac6b662d5c72c29903813eJake Slack            }
17503928aee4356845252ac6b662d5c72c29903813eJake Slack
17603928aee4356845252ac6b662d5c72c29903813eJake Slack            init_perm(PC2ROT[j], perm, 8);
17703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
17803928aee4356845252ac6b662d5c72c29903813eJake Slack
17903928aee4356845252ac6b662d5c72c29903813eJake Slack        // Bit reverse, intial permupation, expantion
18003928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 8; i++)
18103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
18203928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int j = 0; j < 8; j++)
18303928aee4356845252ac6b662d5c72c29903813eJake Slack            {
18403928aee4356845252ac6b662d5c72c29903813eJake Slack                int k = (j < 2) ? 0 : IP[ExpandTr[i * 6 + j - 2] - 1];
18503928aee4356845252ac6b662d5c72c29903813eJake Slack                if (k > 32)
18603928aee4356845252ac6b662d5c72c29903813eJake Slack                    k -= 32;
18703928aee4356845252ac6b662d5c72c29903813eJake Slack                else if (k > 0) k--;
18803928aee4356845252ac6b662d5c72c29903813eJake Slack                if (k > 0)
18903928aee4356845252ac6b662d5c72c29903813eJake Slack                {
19003928aee4356845252ac6b662d5c72c29903813eJake Slack                    k--;
19103928aee4356845252ac6b662d5c72c29903813eJake Slack                    k = (k | 0x07) - (k & 0x07);
19203928aee4356845252ac6b662d5c72c29903813eJake Slack                    k++;
19303928aee4356845252ac6b662d5c72c29903813eJake Slack                }
19403928aee4356845252ac6b662d5c72c29903813eJake Slack                perm[i * 8 + j] = (byte) k;
19503928aee4356845252ac6b662d5c72c29903813eJake Slack            }
19603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
19703928aee4356845252ac6b662d5c72c29903813eJake Slack
19803928aee4356845252ac6b662d5c72c29903813eJake Slack        init_perm(IE3264, perm, 8);
19903928aee4356845252ac6b662d5c72c29903813eJake Slack
20003928aee4356845252ac6b662d5c72c29903813eJake Slack        // Compression, final permutation, bit reverse
20103928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 64; i++)
20203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
20303928aee4356845252ac6b662d5c72c29903813eJake Slack            int k = IP[CIFP[i] - 1];
20403928aee4356845252ac6b662d5c72c29903813eJake Slack            if (k > 0)
20503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
20603928aee4356845252ac6b662d5c72c29903813eJake Slack                k--;
20703928aee4356845252ac6b662d5c72c29903813eJake Slack                k = (k | 0x07) - (k & 0x07);
20803928aee4356845252ac6b662d5c72c29903813eJake Slack                k++;
20903928aee4356845252ac6b662d5c72c29903813eJake Slack            }
21003928aee4356845252ac6b662d5c72c29903813eJake Slack            perm[k - 1] = (byte) (i + 1);
21103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
21203928aee4356845252ac6b662d5c72c29903813eJake Slack
21303928aee4356845252ac6b662d5c72c29903813eJake Slack        init_perm(CF6464, perm, 8);
21403928aee4356845252ac6b662d5c72c29903813eJake Slack
21503928aee4356845252ac6b662d5c72c29903813eJake Slack        // SPE table
21603928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 48; i++)
21703928aee4356845252ac6b662d5c72c29903813eJake Slack            perm[i] = P32Tr[ExpandTr[i] - 1];
21803928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int t = 0; t < 8; t++)
21903928aee4356845252ac6b662d5c72c29903813eJake Slack        {
22003928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int j = 0; j < 64; j++)
22103928aee4356845252ac6b662d5c72c29903813eJake Slack            {
22203928aee4356845252ac6b662d5c72c29903813eJake Slack                int k = (((j >> 0) & 0x01) << 5) | (((j >> 1) & 0x01) << 3)
22303928aee4356845252ac6b662d5c72c29903813eJake Slack                        | (((j >> 2) & 0x01) << 2)
22403928aee4356845252ac6b662d5c72c29903813eJake Slack                        | (((j >> 3) & 0x01) << 1)
22503928aee4356845252ac6b662d5c72c29903813eJake Slack                        | (((j >> 4) & 0x01) << 0)
22603928aee4356845252ac6b662d5c72c29903813eJake Slack                        | (((j >> 5) & 0x01) << 4);
22703928aee4356845252ac6b662d5c72c29903813eJake Slack                k = S[t][k];
22803928aee4356845252ac6b662d5c72c29903813eJake Slack                k = (((k >> 3) & 0x01) << 0) | (((k >> 2) & 0x01) << 1) | (((k >> 1) & 0x01) << 2) | (((k >> 0) & 0x01) << 3);
22903928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i = 0; i < 32; i++)
23003928aee4356845252ac6b662d5c72c29903813eJake Slack                    temp[i] = 0;
23103928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i = 0; i < 4; i++)
23203928aee4356845252ac6b662d5c72c29903813eJake Slack                    temp[4 * t + i] = (byte) ((k >> i) & 0x01);
23303928aee4356845252ac6b662d5c72c29903813eJake Slack                long kk = 0;
23403928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i = 24; --i >= 0;)
23503928aee4356845252ac6b662d5c72c29903813eJake Slack                    kk = ((kk << 1) | ((long) temp[perm[i] - 1]) << 32 | (temp[perm[i + 24] - 1]));
23603928aee4356845252ac6b662d5c72c29903813eJake Slack
23703928aee4356845252ac6b662d5c72c29903813eJake Slack                SPE[t][j] = to_six_bit(kk);
23803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
23903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
24003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
24103928aee4356845252ac6b662d5c72c29903813eJake Slack
24203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
24303928aee4356845252ac6b662d5c72c29903813eJake Slack     * You can't call the constructer.
24403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
24503928aee4356845252ac6b662d5c72c29903813eJake Slack    private UnixCrypt()
24603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
24803928aee4356845252ac6b662d5c72c29903813eJake Slack
24903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
25003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the transposed and split code of a 24-bit code into a 4-byte
25103928aee4356845252ac6b662d5c72c29903813eJake Slack     * code, each having 6 bits.
25203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
25303928aee4356845252ac6b662d5c72c29903813eJake Slack    private static int to_six_bit(int num)
25403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
25503928aee4356845252ac6b662d5c72c29903813eJake Slack        return (((num << 26) & 0xfc000000) | ((num << 12) & 0xfc0000) | ((num >> 2) & 0xfc00) | ((num >> 16) & 0xfc));
25603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
25703928aee4356845252ac6b662d5c72c29903813eJake Slack
25803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
25903928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the transposed and split code of two 24-bit code into two 4-byte
26003928aee4356845252ac6b662d5c72c29903813eJake Slack     * code, each having 6 bits.
26103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
26203928aee4356845252ac6b662d5c72c29903813eJake Slack    private static long to_six_bit(long num)
26303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
26403928aee4356845252ac6b662d5c72c29903813eJake Slack        return (((num << 26) & 0xfc000000fc000000L) | ((num << 12) & 0xfc000000fc0000L) | ((num >> 2) & 0xfc000000fc00L) | ((num >> 16) & 0xfc000000fcL));
26503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
26603928aee4356845252ac6b662d5c72c29903813eJake Slack
26703928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
26803928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the permutation of the given 64-bit code with the specified
26903928aee4356845252ac6b662d5c72c29903813eJake Slack     * permutataion table.
27003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
27103928aee4356845252ac6b662d5c72c29903813eJake Slack    private static long perm6464(long c, long[][] p)
27203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
27303928aee4356845252ac6b662d5c72c29903813eJake Slack        long out = 0L;
27403928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 8; --i >= 0;)
27503928aee4356845252ac6b662d5c72c29903813eJake Slack        {
27603928aee4356845252ac6b662d5c72c29903813eJake Slack            int t = (int) (0x00ff & c);
27703928aee4356845252ac6b662d5c72c29903813eJake Slack            c >>= 8;
27803928aee4356845252ac6b662d5c72c29903813eJake Slack            long tp = p[i << 1][t & 0x0f];
27903928aee4356845252ac6b662d5c72c29903813eJake Slack            out |= tp;
28003928aee4356845252ac6b662d5c72c29903813eJake Slack            tp = p[(i << 1) + 1][t >> 4];
28103928aee4356845252ac6b662d5c72c29903813eJake Slack            out |= tp;
28203928aee4356845252ac6b662d5c72c29903813eJake Slack        }
28303928aee4356845252ac6b662d5c72c29903813eJake Slack        return out;
28403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
28503928aee4356845252ac6b662d5c72c29903813eJake Slack
28603928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
28703928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the permutation of the given 32-bit code with the specified
28803928aee4356845252ac6b662d5c72c29903813eJake Slack     * permutataion table.
28903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
29003928aee4356845252ac6b662d5c72c29903813eJake Slack    private static long perm3264(int c, long[][] p)
29103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
29203928aee4356845252ac6b662d5c72c29903813eJake Slack        long out = 0L;
29303928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 4; --i >= 0;)
29403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
29503928aee4356845252ac6b662d5c72c29903813eJake Slack            int t = (0x00ff & c);
29603928aee4356845252ac6b662d5c72c29903813eJake Slack            c >>= 8;
29703928aee4356845252ac6b662d5c72c29903813eJake Slack            long tp = p[i << 1][t & 0x0f];
29803928aee4356845252ac6b662d5c72c29903813eJake Slack            out |= tp;
29903928aee4356845252ac6b662d5c72c29903813eJake Slack            tp = p[(i << 1) + 1][t >> 4];
30003928aee4356845252ac6b662d5c72c29903813eJake Slack            out |= tp;
30103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
30203928aee4356845252ac6b662d5c72c29903813eJake Slack        return out;
30303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
30403928aee4356845252ac6b662d5c72c29903813eJake Slack
30503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
30603928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the key schedule for the given key.
30703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
30803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static long[] des_setkey(long keyword)
30903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
31003928aee4356845252ac6b662d5c72c29903813eJake Slack        long K = perm6464(keyword, PC1ROT);
31103928aee4356845252ac6b662d5c72c29903813eJake Slack        long[] KS = new long[16];
31203928aee4356845252ac6b662d5c72c29903813eJake Slack        KS[0] = K & ~0x0303030300000000L;
31303928aee4356845252ac6b662d5c72c29903813eJake Slack
31403928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 1; i < 16; i++)
31503928aee4356845252ac6b662d5c72c29903813eJake Slack        {
31603928aee4356845252ac6b662d5c72c29903813eJake Slack            KS[i] = K;
31703928aee4356845252ac6b662d5c72c29903813eJake Slack            K = perm6464(K, PC2ROT[Rotates[i] - 1]);
31803928aee4356845252ac6b662d5c72c29903813eJake Slack
31903928aee4356845252ac6b662d5c72c29903813eJake Slack            KS[i] = K & ~0x0303030300000000L;
32003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
32103928aee4356845252ac6b662d5c72c29903813eJake Slack        return KS;
32203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
32303928aee4356845252ac6b662d5c72c29903813eJake Slack
32403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
32503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Returns the DES encrypted code of the given word with the specified
32603928aee4356845252ac6b662d5c72c29903813eJake Slack     * environment.
32703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
32803928aee4356845252ac6b662d5c72c29903813eJake Slack    private static long des_cipher(long in, int salt, int num_iter, long[] KS)
32903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
33003928aee4356845252ac6b662d5c72c29903813eJake Slack        salt = to_six_bit(salt);
33103928aee4356845252ac6b662d5c72c29903813eJake Slack        long L = in;
33203928aee4356845252ac6b662d5c72c29903813eJake Slack        long R = L;
33303928aee4356845252ac6b662d5c72c29903813eJake Slack        L &= 0x5555555555555555L;
33403928aee4356845252ac6b662d5c72c29903813eJake Slack        R = (R & 0xaaaaaaaa00000000L) | ((R >> 1) & 0x0000000055555555L);
33503928aee4356845252ac6b662d5c72c29903813eJake Slack        L = ((((L << 1) | (L << 32)) & 0xffffffff00000000L) | ((R | (R >> 32)) & 0x00000000ffffffffL));
33603928aee4356845252ac6b662d5c72c29903813eJake Slack
33703928aee4356845252ac6b662d5c72c29903813eJake Slack        L = perm3264((int) (L >> 32), IE3264);
33803928aee4356845252ac6b662d5c72c29903813eJake Slack        R = perm3264((int) (L & 0xffffffff), IE3264);
33903928aee4356845252ac6b662d5c72c29903813eJake Slack
34003928aee4356845252ac6b662d5c72c29903813eJake Slack        while (--num_iter >= 0)
34103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
34203928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int loop_count = 0; loop_count < 8; loop_count++)
34303928aee4356845252ac6b662d5c72c29903813eJake Slack            {
34403928aee4356845252ac6b662d5c72c29903813eJake Slack                long kp;
34503928aee4356845252ac6b662d5c72c29903813eJake Slack                long B;
34603928aee4356845252ac6b662d5c72c29903813eJake Slack                long k;
34703928aee4356845252ac6b662d5c72c29903813eJake Slack
34803928aee4356845252ac6b662d5c72c29903813eJake Slack                kp = KS[(loop_count << 1)];
34903928aee4356845252ac6b662d5c72c29903813eJake Slack                k = ((R >> 32) ^ R) & salt & 0xffffffffL;
35003928aee4356845252ac6b662d5c72c29903813eJake Slack                k |= (k << 32);
35103928aee4356845252ac6b662d5c72c29903813eJake Slack                B = (k ^ R ^ kp);
35203928aee4356845252ac6b662d5c72c29903813eJake Slack
35303928aee4356845252ac6b662d5c72c29903813eJake Slack                L ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)]
35403928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[2][(int) ((B >> 42) & 0x3f)]
35503928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[3][(int) ((B >> 34) & 0x3f)]
35603928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[4][(int) ((B >> 26) & 0x3f)]
35703928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[5][(int) ((B >> 18) & 0x3f)]
35803928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]);
35903928aee4356845252ac6b662d5c72c29903813eJake Slack
36003928aee4356845252ac6b662d5c72c29903813eJake Slack                kp = KS[(loop_count << 1) + 1];
36103928aee4356845252ac6b662d5c72c29903813eJake Slack                k = ((L >> 32) ^ L) & salt & 0xffffffffL;
36203928aee4356845252ac6b662d5c72c29903813eJake Slack                k |= (k << 32);
36303928aee4356845252ac6b662d5c72c29903813eJake Slack                B = (k ^ L ^ kp);
36403928aee4356845252ac6b662d5c72c29903813eJake Slack
36503928aee4356845252ac6b662d5c72c29903813eJake Slack                R ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)]
36603928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[2][(int) ((B >> 42) & 0x3f)]
36703928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[3][(int) ((B >> 34) & 0x3f)]
36803928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[4][(int) ((B >> 26) & 0x3f)]
36903928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[5][(int) ((B >> 18) & 0x3f)]
37003928aee4356845252ac6b662d5c72c29903813eJake Slack                      ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]);
37103928aee4356845252ac6b662d5c72c29903813eJake Slack            }
37203928aee4356845252ac6b662d5c72c29903813eJake Slack            // swap L and R
37303928aee4356845252ac6b662d5c72c29903813eJake Slack            L ^= R;
37403928aee4356845252ac6b662d5c72c29903813eJake Slack            R ^= L;
37503928aee4356845252ac6b662d5c72c29903813eJake Slack            L ^= R;
37603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
37703928aee4356845252ac6b662d5c72c29903813eJake Slack        L = ((((L >> 35) & 0x0f0f0f0fL) | (((L & 0xffffffff) << 1) & 0xf0f0f0f0L)) << 32 | (((R >> 35) & 0x0f0f0f0fL) | (((R & 0xffffffff) << 1) & 0xf0f0f0f0L)));
37803928aee4356845252ac6b662d5c72c29903813eJake Slack
37903928aee4356845252ac6b662d5c72c29903813eJake Slack        L = perm6464(L, CF6464);
38003928aee4356845252ac6b662d5c72c29903813eJake Slack
38103928aee4356845252ac6b662d5c72c29903813eJake Slack        return L;
38203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
38303928aee4356845252ac6b662d5c72c29903813eJake Slack
38403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
38503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Initializes the given permutation table with the mapping table.
38603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
38703928aee4356845252ac6b662d5c72c29903813eJake Slack    private static void init_perm(long[][] perm, byte[] p, int chars_out)
38803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
38903928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int k = 0; k < chars_out * 8; k++)
39003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
39103928aee4356845252ac6b662d5c72c29903813eJake Slack
39203928aee4356845252ac6b662d5c72c29903813eJake Slack            int l = p[k] - 1;
39303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (l < 0) continue;
39403928aee4356845252ac6b662d5c72c29903813eJake Slack            int i = l >> 2;
39503928aee4356845252ac6b662d5c72c29903813eJake Slack            l = 1 << (l & 0x03);
39603928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int j = 0; j < 16; j++)
39703928aee4356845252ac6b662d5c72c29903813eJake Slack            {
39803928aee4356845252ac6b662d5c72c29903813eJake Slack                int s = ((k & 0x07) + ((7 - (k >> 3)) << 3));
39903928aee4356845252ac6b662d5c72c29903813eJake Slack                if ((j & l) != 0x00) perm[i][j] |= (1L << s);
40003928aee4356845252ac6b662d5c72c29903813eJake Slack            }
40103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
40203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
40303928aee4356845252ac6b662d5c72c29903813eJake Slack
40403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
40503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Encrypts String into crypt (Unix) code.
40603928aee4356845252ac6b662d5c72c29903813eJake Slack     *
40703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param key the key to be encrypted
40803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param setting the salt to be used
40903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the encrypted String
41003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
41103928aee4356845252ac6b662d5c72c29903813eJake Slack    public static String crypt(String key, String setting)
41203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
41303928aee4356845252ac6b662d5c72c29903813eJake Slack        long constdatablock = 0L; /* encryption constant */
41403928aee4356845252ac6b662d5c72c29903813eJake Slack        byte[] cryptresult = new byte[13]; /* encrypted result */
41503928aee4356845252ac6b662d5c72c29903813eJake Slack        long keyword = 0L;
41603928aee4356845252ac6b662d5c72c29903813eJake Slack        /* invalid parameters! */
41703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (key == null || setting == null) return "*"; // will NOT match under
41803928aee4356845252ac6b662d5c72c29903813eJake Slack        // ANY circumstances!
41903928aee4356845252ac6b662d5c72c29903813eJake Slack
42003928aee4356845252ac6b662d5c72c29903813eJake Slack        int keylen = key.length();
42103928aee4356845252ac6b662d5c72c29903813eJake Slack
42203928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < 8; i++)
42303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
42403928aee4356845252ac6b662d5c72c29903813eJake Slack            keyword = (keyword << 8) | ((i < keylen) ? 2 * key.charAt(i) : 0);
42503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
42603928aee4356845252ac6b662d5c72c29903813eJake Slack
42703928aee4356845252ac6b662d5c72c29903813eJake Slack        long[] KS = des_setkey(keyword);
42803928aee4356845252ac6b662d5c72c29903813eJake Slack
42903928aee4356845252ac6b662d5c72c29903813eJake Slack        int salt = 0;
43003928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 2; --i >= 0;)
43103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
43203928aee4356845252ac6b662d5c72c29903813eJake Slack            char c = (i < setting.length()) ? setting.charAt(i) : '.';
43303928aee4356845252ac6b662d5c72c29903813eJake Slack            cryptresult[i] = (byte) c;
43403928aee4356845252ac6b662d5c72c29903813eJake Slack            salt = (salt << 6) | (0x00ff & A64TOI[c]);
43503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
43603928aee4356845252ac6b662d5c72c29903813eJake Slack
43703928aee4356845252ac6b662d5c72c29903813eJake Slack        long rsltblock = des_cipher(constdatablock, salt, 25, KS);
43803928aee4356845252ac6b662d5c72c29903813eJake Slack
43903928aee4356845252ac6b662d5c72c29903813eJake Slack        cryptresult[12] = ITOA64[(((int) rsltblock) << 2) & 0x3f];
44003928aee4356845252ac6b662d5c72c29903813eJake Slack        rsltblock >>= 4;
44103928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 12; --i >= 2;)
44203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
44303928aee4356845252ac6b662d5c72c29903813eJake Slack            cryptresult[i] = ITOA64[((int) rsltblock) & 0x3f];
44403928aee4356845252ac6b662d5c72c29903813eJake Slack            rsltblock >>= 6;
44503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
44603928aee4356845252ac6b662d5c72c29903813eJake Slack
44703928aee4356845252ac6b662d5c72c29903813eJake Slack        return new String(cryptresult, 0, 13);
44803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
44903928aee4356845252ac6b662d5c72c29903813eJake Slack
45003928aee4356845252ac6b662d5c72c29903813eJake Slack    public static void main(String[] arg)
45103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
45203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (arg.length != 2)
45303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
45403928aee4356845252ac6b662d5c72c29903813eJake Slack            System.err.println("Usage - java org.eclipse.util.UnixCrypt <key> <salt>");
45503928aee4356845252ac6b662d5c72c29903813eJake Slack            System.exit(1);
45603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
45703928aee4356845252ac6b662d5c72c29903813eJake Slack
45803928aee4356845252ac6b662d5c72c29903813eJake Slack        System.err.println("Crypt=" + crypt(arg[0], arg[1]));
45903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
46003928aee4356845252ac6b662d5c72c29903813eJake Slack
46103928aee4356845252ac6b662d5c72c29903813eJake Slack}
462