Blame sunrpc/des_impl.c

Packit Service 82fcde
/* Copyright (C) 1992 Eric Young */
Packit Service 82fcde
/* Collected from libdes and modified for SECURE RPC by Martin Kuck 1994 */
Packit Service 82fcde
/* This file is distributed under the terms of the GNU Lesser General */
Packit Service 82fcde
/* Public License, version 2.1 or later - see the file COPYING.LIB for details.*/
Packit Service 82fcde
/* If you did not receive a copy of the license with this program, please*/
Packit Service 82fcde
/* see <http://www.gnu.org/licenses/> to obtain a copy.  */
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include "des.h"
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static const uint32_t des_SPtrans[8][64] =
Packit Service 82fcde
{
Packit Service 82fcde
  {				/* nibble 0 */
Packit Service 82fcde
    0x00820200, 0x00020000, 0x80800000, 0x80820200,
Packit Service 82fcde
    0x00800000, 0x80020200, 0x80020000, 0x80800000,
Packit Service 82fcde
    0x80020200, 0x00820200, 0x00820000, 0x80000200,
Packit Service 82fcde
    0x80800200, 0x00800000, 0x00000000, 0x80020000,
Packit Service 82fcde
    0x00020000, 0x80000000, 0x00800200, 0x00020200,
Packit Service 82fcde
    0x80820200, 0x00820000, 0x80000200, 0x00800200,
Packit Service 82fcde
    0x80000000, 0x00000200, 0x00020200, 0x80820000,
Packit Service 82fcde
    0x00000200, 0x80800200, 0x80820000, 0x00000000,
Packit Service 82fcde
    0x00000000, 0x80820200, 0x00800200, 0x80020000,
Packit Service 82fcde
    0x00820200, 0x00020000, 0x80000200, 0x00800200,
Packit Service 82fcde
    0x80820000, 0x00000200, 0x00020200, 0x80800000,
Packit Service 82fcde
    0x80020200, 0x80000000, 0x80800000, 0x00820000,
Packit Service 82fcde
    0x80820200, 0x00020200, 0x00820000, 0x80800200,
Packit Service 82fcde
    0x00800000, 0x80000200, 0x80020000, 0x00000000,
Packit Service 82fcde
    0x00020000, 0x00800000, 0x80800200, 0x00820200,
Packit Service 82fcde
    0x80000000, 0x80820000, 0x00000200, 0x80020200},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 1 */
Packit Service 82fcde
    0x10042004, 0x00000000, 0x00042000, 0x10040000,
Packit Service 82fcde
    0x10000004, 0x00002004, 0x10002000, 0x00042000,
Packit Service 82fcde
    0x00002000, 0x10040004, 0x00000004, 0x10002000,
Packit Service 82fcde
    0x00040004, 0x10042000, 0x10040000, 0x00000004,
Packit Service 82fcde
    0x00040000, 0x10002004, 0x10040004, 0x00002000,
Packit Service 82fcde
    0x00042004, 0x10000000, 0x00000000, 0x00040004,
Packit Service 82fcde
    0x10002004, 0x00042004, 0x10042000, 0x10000004,
Packit Service 82fcde
    0x10000000, 0x00040000, 0x00002004, 0x10042004,
Packit Service 82fcde
    0x00040004, 0x10042000, 0x10002000, 0x00042004,
Packit Service 82fcde
    0x10042004, 0x00040004, 0x10000004, 0x00000000,
Packit Service 82fcde
    0x10000000, 0x00002004, 0x00040000, 0x10040004,
Packit Service 82fcde
    0x00002000, 0x10000000, 0x00042004, 0x10002004,
Packit Service 82fcde
    0x10042000, 0x00002000, 0x00000000, 0x10000004,
Packit Service 82fcde
    0x00000004, 0x10042004, 0x00042000, 0x10040000,
Packit Service 82fcde
    0x10040004, 0x00040000, 0x00002004, 0x10002000,
Packit Service 82fcde
    0x10002004, 0x00000004, 0x10040000, 0x00042000},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 2 */
Packit Service 82fcde
    0x41000000, 0x01010040, 0x00000040, 0x41000040,
Packit Service 82fcde
    0x40010000, 0x01000000, 0x41000040, 0x00010040,
Packit Service 82fcde
    0x01000040, 0x00010000, 0x01010000, 0x40000000,
Packit Service 82fcde
    0x41010040, 0x40000040, 0x40000000, 0x41010000,
Packit Service 82fcde
    0x00000000, 0x40010000, 0x01010040, 0x00000040,
Packit Service 82fcde
    0x40000040, 0x41010040, 0x00010000, 0x41000000,
Packit Service 82fcde
    0x41010000, 0x01000040, 0x40010040, 0x01010000,
Packit Service 82fcde
    0x00010040, 0x00000000, 0x01000000, 0x40010040,
Packit Service 82fcde
    0x01010040, 0x00000040, 0x40000000, 0x00010000,
Packit Service 82fcde
    0x40000040, 0x40010000, 0x01010000, 0x41000040,
Packit Service 82fcde
    0x00000000, 0x01010040, 0x00010040, 0x41010000,
Packit Service 82fcde
    0x40010000, 0x01000000, 0x41010040, 0x40000000,
Packit Service 82fcde
    0x40010040, 0x41000000, 0x01000000, 0x41010040,
Packit Service 82fcde
    0x00010000, 0x01000040, 0x41000040, 0x00010040,
Packit Service 82fcde
    0x01000040, 0x00000000, 0x41010000, 0x40000040,
Packit Service 82fcde
    0x41000000, 0x40010040, 0x00000040, 0x01010000},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 3 */
Packit Service 82fcde
    0x00100402, 0x04000400, 0x00000002, 0x04100402,
Packit Service 82fcde
    0x00000000, 0x04100000, 0x04000402, 0x00100002,
Packit Service 82fcde
    0x04100400, 0x04000002, 0x04000000, 0x00000402,
Packit Service 82fcde
    0x04000002, 0x00100402, 0x00100000, 0x04000000,
Packit Service 82fcde
    0x04100002, 0x00100400, 0x00000400, 0x00000002,
Packit Service 82fcde
    0x00100400, 0x04000402, 0x04100000, 0x00000400,
Packit Service 82fcde
    0x00000402, 0x00000000, 0x00100002, 0x04100400,
Packit Service 82fcde
    0x04000400, 0x04100002, 0x04100402, 0x00100000,
Packit Service 82fcde
    0x04100002, 0x00000402, 0x00100000, 0x04000002,
Packit Service 82fcde
    0x00100400, 0x04000400, 0x00000002, 0x04100000,
Packit Service 82fcde
    0x04000402, 0x00000000, 0x00000400, 0x00100002,
Packit Service 82fcde
    0x00000000, 0x04100002, 0x04100400, 0x00000400,
Packit Service 82fcde
    0x04000000, 0x04100402, 0x00100402, 0x00100000,
Packit Service 82fcde
    0x04100402, 0x00000002, 0x04000400, 0x00100402,
Packit Service 82fcde
    0x00100002, 0x00100400, 0x04100000, 0x04000402,
Packit Service 82fcde
    0x00000402, 0x04000000, 0x04000002, 0x04100400},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 4 */
Packit Service 82fcde
    0x02000000, 0x00004000, 0x00000100, 0x02004108,
Packit Service 82fcde
    0x02004008, 0x02000100, 0x00004108, 0x02004000,
Packit Service 82fcde
    0x00004000, 0x00000008, 0x02000008, 0x00004100,
Packit Service 82fcde
    0x02000108, 0x02004008, 0x02004100, 0x00000000,
Packit Service 82fcde
    0x00004100, 0x02000000, 0x00004008, 0x00000108,
Packit Service 82fcde
    0x02000100, 0x00004108, 0x00000000, 0x02000008,
Packit Service 82fcde
    0x00000008, 0x02000108, 0x02004108, 0x00004008,
Packit Service 82fcde
    0x02004000, 0x00000100, 0x00000108, 0x02004100,
Packit Service 82fcde
    0x02004100, 0x02000108, 0x00004008, 0x02004000,
Packit Service 82fcde
    0x00004000, 0x00000008, 0x02000008, 0x02000100,
Packit Service 82fcde
    0x02000000, 0x00004100, 0x02004108, 0x00000000,
Packit Service 82fcde
    0x00004108, 0x02000000, 0x00000100, 0x00004008,
Packit Service 82fcde
    0x02000108, 0x00000100, 0x00000000, 0x02004108,
Packit Service 82fcde
    0x02004008, 0x02004100, 0x00000108, 0x00004000,
Packit Service 82fcde
    0x00004100, 0x02004008, 0x02000100, 0x00000108,
Packit Service 82fcde
    0x00000008, 0x00004108, 0x02004000, 0x02000008},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 5 */
Packit Service 82fcde
    0x20000010, 0x00080010, 0x00000000, 0x20080800,
Packit Service 82fcde
    0x00080010, 0x00000800, 0x20000810, 0x00080000,
Packit Service 82fcde
    0x00000810, 0x20080810, 0x00080800, 0x20000000,
Packit Service 82fcde
    0x20000800, 0x20000010, 0x20080000, 0x00080810,
Packit Service 82fcde
    0x00080000, 0x20000810, 0x20080010, 0x00000000,
Packit Service 82fcde
    0x00000800, 0x00000010, 0x20080800, 0x20080010,
Packit Service 82fcde
    0x20080810, 0x20080000, 0x20000000, 0x00000810,
Packit Service 82fcde
    0x00000010, 0x00080800, 0x00080810, 0x20000800,
Packit Service 82fcde
    0x00000810, 0x20000000, 0x20000800, 0x00080810,
Packit Service 82fcde
    0x20080800, 0x00080010, 0x00000000, 0x20000800,
Packit Service 82fcde
    0x20000000, 0x00000800, 0x20080010, 0x00080000,
Packit Service 82fcde
    0x00080010, 0x20080810, 0x00080800, 0x00000010,
Packit Service 82fcde
    0x20080810, 0x00080800, 0x00080000, 0x20000810,
Packit Service 82fcde
    0x20000010, 0x20080000, 0x00080810, 0x00000000,
Packit Service 82fcde
    0x00000800, 0x20000010, 0x20000810, 0x20080800,
Packit Service 82fcde
    0x20080000, 0x00000810, 0x00000010, 0x20080010},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 6 */
Packit Service 82fcde
    0x00001000, 0x00000080, 0x00400080, 0x00400001,
Packit Service 82fcde
    0x00401081, 0x00001001, 0x00001080, 0x00000000,
Packit Service 82fcde
    0x00400000, 0x00400081, 0x00000081, 0x00401000,
Packit Service 82fcde
    0x00000001, 0x00401080, 0x00401000, 0x00000081,
Packit Service 82fcde
    0x00400081, 0x00001000, 0x00001001, 0x00401081,
Packit Service 82fcde
    0x00000000, 0x00400080, 0x00400001, 0x00001080,
Packit Service 82fcde
    0x00401001, 0x00001081, 0x00401080, 0x00000001,
Packit Service 82fcde
    0x00001081, 0x00401001, 0x00000080, 0x00400000,
Packit Service 82fcde
    0x00001081, 0x00401000, 0x00401001, 0x00000081,
Packit Service 82fcde
    0x00001000, 0x00000080, 0x00400000, 0x00401001,
Packit Service 82fcde
    0x00400081, 0x00001081, 0x00001080, 0x00000000,
Packit Service 82fcde
    0x00000080, 0x00400001, 0x00000001, 0x00400080,
Packit Service 82fcde
    0x00000000, 0x00400081, 0x00400080, 0x00001080,
Packit Service 82fcde
    0x00000081, 0x00001000, 0x00401081, 0x00400000,
Packit Service 82fcde
    0x00401080, 0x00000001, 0x00001001, 0x00401081,
Packit Service 82fcde
    0x00400001, 0x00401080, 0x00401000, 0x00001001},
Packit Service 82fcde
Packit Service 82fcde
  {				/* nibble 7 */
Packit Service 82fcde
    0x08200020, 0x08208000, 0x00008020, 0x00000000,
Packit Service 82fcde
    0x08008000, 0x00200020, 0x08200000, 0x08208020,
Packit Service 82fcde
    0x00000020, 0x08000000, 0x00208000, 0x00008020,
Packit Service 82fcde
    0x00208020, 0x08008020, 0x08000020, 0x08200000,
Packit Service 82fcde
    0x00008000, 0x00208020, 0x00200020, 0x08008000,
Packit Service 82fcde
    0x08208020, 0x08000020, 0x00000000, 0x00208000,
Packit Service 82fcde
    0x08000000, 0x00200000, 0x08008020, 0x08200020,
Packit Service 82fcde
    0x00200000, 0x00008000, 0x08208000, 0x00000020,
Packit Service 82fcde
    0x00200000, 0x00008000, 0x08000020, 0x08208020,
Packit Service 82fcde
    0x00008020, 0x08000000, 0x00000000, 0x00208000,
Packit Service 82fcde
    0x08200020, 0x08008020, 0x08008000, 0x00200020,
Packit Service 82fcde
    0x08208000, 0x00000020, 0x00200020, 0x08008000,
Packit Service 82fcde
    0x08208020, 0x00200000, 0x08200000, 0x08000020,
Packit Service 82fcde
    0x00208000, 0x00008020, 0x08008020, 0x08200000,
Packit Service 82fcde
    0x00000020, 0x08208000, 0x00208020, 0x00000000,
Packit Service 82fcde
    0x08000000, 0x08200020, 0x00008000, 0x00208020}};
Packit Service 82fcde
Packit Service 82fcde
static const uint32_t des_skb[8][64] =
Packit Service 82fcde
{
Packit Service 82fcde
  {				/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
Packit Service 82fcde
    0x00000000, 0x00000010, 0x20000000, 0x20000010,
Packit Service 82fcde
    0x00010000, 0x00010010, 0x20010000, 0x20010010,
Packit Service 82fcde
    0x00000800, 0x00000810, 0x20000800, 0x20000810,
Packit Service 82fcde
    0x00010800, 0x00010810, 0x20010800, 0x20010810,
Packit Service 82fcde
    0x00000020, 0x00000030, 0x20000020, 0x20000030,
Packit Service 82fcde
    0x00010020, 0x00010030, 0x20010020, 0x20010030,
Packit Service 82fcde
    0x00000820, 0x00000830, 0x20000820, 0x20000830,
Packit Service 82fcde
    0x00010820, 0x00010830, 0x20010820, 0x20010830,
Packit Service 82fcde
    0x00080000, 0x00080010, 0x20080000, 0x20080010,
Packit Service 82fcde
    0x00090000, 0x00090010, 0x20090000, 0x20090010,
Packit Service 82fcde
    0x00080800, 0x00080810, 0x20080800, 0x20080810,
Packit Service 82fcde
    0x00090800, 0x00090810, 0x20090800, 0x20090810,
Packit Service 82fcde
    0x00080020, 0x00080030, 0x20080020, 0x20080030,
Packit Service 82fcde
    0x00090020, 0x00090030, 0x20090020, 0x20090030,
Packit Service 82fcde
    0x00080820, 0x00080830, 0x20080820, 0x20080830,
Packit Service 82fcde
    0x00090820, 0x00090830, 0x20090820, 0x20090830},
Packit Service 82fcde
  {				/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
Packit Service 82fcde
    0x00000000, 0x02000000, 0x00002000, 0x02002000,
Packit Service 82fcde
    0x00200000, 0x02200000, 0x00202000, 0x02202000,
Packit Service 82fcde
    0x00000004, 0x02000004, 0x00002004, 0x02002004,
Packit Service 82fcde
    0x00200004, 0x02200004, 0x00202004, 0x02202004,
Packit Service 82fcde
    0x00000400, 0x02000400, 0x00002400, 0x02002400,
Packit Service 82fcde
    0x00200400, 0x02200400, 0x00202400, 0x02202400,
Packit Service 82fcde
    0x00000404, 0x02000404, 0x00002404, 0x02002404,
Packit Service 82fcde
    0x00200404, 0x02200404, 0x00202404, 0x02202404,
Packit Service 82fcde
    0x10000000, 0x12000000, 0x10002000, 0x12002000,
Packit Service 82fcde
    0x10200000, 0x12200000, 0x10202000, 0x12202000,
Packit Service 82fcde
    0x10000004, 0x12000004, 0x10002004, 0x12002004,
Packit Service 82fcde
    0x10200004, 0x12200004, 0x10202004, 0x12202004,
Packit Service 82fcde
    0x10000400, 0x12000400, 0x10002400, 0x12002400,
Packit Service 82fcde
    0x10200400, 0x12200400, 0x10202400, 0x12202400,
Packit Service 82fcde
    0x10000404, 0x12000404, 0x10002404, 0x12002404,
Packit Service 82fcde
    0x10200404, 0x12200404, 0x10202404, 0x12202404},
Packit Service 82fcde
  {				/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
Packit Service 82fcde
    0x00000000, 0x00000001, 0x00040000, 0x00040001,
Packit Service 82fcde
    0x01000000, 0x01000001, 0x01040000, 0x01040001,
Packit Service 82fcde
    0x00000002, 0x00000003, 0x00040002, 0x00040003,
Packit Service 82fcde
    0x01000002, 0x01000003, 0x01040002, 0x01040003,
Packit Service 82fcde
    0x00000200, 0x00000201, 0x00040200, 0x00040201,
Packit Service 82fcde
    0x01000200, 0x01000201, 0x01040200, 0x01040201,
Packit Service 82fcde
    0x00000202, 0x00000203, 0x00040202, 0x00040203,
Packit Service 82fcde
    0x01000202, 0x01000203, 0x01040202, 0x01040203,
Packit Service 82fcde
    0x08000000, 0x08000001, 0x08040000, 0x08040001,
Packit Service 82fcde
    0x09000000, 0x09000001, 0x09040000, 0x09040001,
Packit Service 82fcde
    0x08000002, 0x08000003, 0x08040002, 0x08040003,
Packit Service 82fcde
    0x09000002, 0x09000003, 0x09040002, 0x09040003,
Packit Service 82fcde
    0x08000200, 0x08000201, 0x08040200, 0x08040201,
Packit Service 82fcde
    0x09000200, 0x09000201, 0x09040200, 0x09040201,
Packit Service 82fcde
    0x08000202, 0x08000203, 0x08040202, 0x08040203,
Packit Service 82fcde
    0x09000202, 0x09000203, 0x09040202, 0x09040203},
Packit Service 82fcde
  {				/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
Packit Service 82fcde
    0x00000000, 0x00100000, 0x00000100, 0x00100100,
Packit Service 82fcde
    0x00000008, 0x00100008, 0x00000108, 0x00100108,
Packit Service 82fcde
    0x00001000, 0x00101000, 0x00001100, 0x00101100,
Packit Service 82fcde
    0x00001008, 0x00101008, 0x00001108, 0x00101108,
Packit Service 82fcde
    0x04000000, 0x04100000, 0x04000100, 0x04100100,
Packit Service 82fcde
    0x04000008, 0x04100008, 0x04000108, 0x04100108,
Packit Service 82fcde
    0x04001000, 0x04101000, 0x04001100, 0x04101100,
Packit Service 82fcde
    0x04001008, 0x04101008, 0x04001108, 0x04101108,
Packit Service 82fcde
    0x00020000, 0x00120000, 0x00020100, 0x00120100,
Packit Service 82fcde
    0x00020008, 0x00120008, 0x00020108, 0x00120108,
Packit Service 82fcde
    0x00021000, 0x00121000, 0x00021100, 0x00121100,
Packit Service 82fcde
    0x00021008, 0x00121008, 0x00021108, 0x00121108,
Packit Service 82fcde
    0x04020000, 0x04120000, 0x04020100, 0x04120100,
Packit Service 82fcde
    0x04020008, 0x04120008, 0x04020108, 0x04120108,
Packit Service 82fcde
    0x04021000, 0x04121000, 0x04021100, 0x04121100,
Packit Service 82fcde
    0x04021008, 0x04121008, 0x04021108, 0x04121108},
Packit Service 82fcde
  {				/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
Packit Service 82fcde
    0x00000000, 0x10000000, 0x00010000, 0x10010000,
Packit Service 82fcde
    0x00000004, 0x10000004, 0x00010004, 0x10010004,
Packit Service 82fcde
    0x20000000, 0x30000000, 0x20010000, 0x30010000,
Packit Service 82fcde
    0x20000004, 0x30000004, 0x20010004, 0x30010004,
Packit Service 82fcde
    0x00100000, 0x10100000, 0x00110000, 0x10110000,
Packit Service 82fcde
    0x00100004, 0x10100004, 0x00110004, 0x10110004,
Packit Service 82fcde
    0x20100000, 0x30100000, 0x20110000, 0x30110000,
Packit Service 82fcde
    0x20100004, 0x30100004, 0x20110004, 0x30110004,
Packit Service 82fcde
    0x00001000, 0x10001000, 0x00011000, 0x10011000,
Packit Service 82fcde
    0x00001004, 0x10001004, 0x00011004, 0x10011004,
Packit Service 82fcde
    0x20001000, 0x30001000, 0x20011000, 0x30011000,
Packit Service 82fcde
    0x20001004, 0x30001004, 0x20011004, 0x30011004,
Packit Service 82fcde
    0x00101000, 0x10101000, 0x00111000, 0x10111000,
Packit Service 82fcde
    0x00101004, 0x10101004, 0x00111004, 0x10111004,
Packit Service 82fcde
    0x20101000, 0x30101000, 0x20111000, 0x30111000,
Packit Service 82fcde
    0x20101004, 0x30101004, 0x20111004, 0x30111004},
Packit Service 82fcde
  {				/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
Packit Service 82fcde
    0x00000000, 0x08000000, 0x00000008, 0x08000008,
Packit Service 82fcde
    0x00000400, 0x08000400, 0x00000408, 0x08000408,
Packit Service 82fcde
    0x00020000, 0x08020000, 0x00020008, 0x08020008,
Packit Service 82fcde
    0x00020400, 0x08020400, 0x00020408, 0x08020408,
Packit Service 82fcde
    0x00000001, 0x08000001, 0x00000009, 0x08000009,
Packit Service 82fcde
    0x00000401, 0x08000401, 0x00000409, 0x08000409,
Packit Service 82fcde
    0x00020001, 0x08020001, 0x00020009, 0x08020009,
Packit Service 82fcde
    0x00020401, 0x08020401, 0x00020409, 0x08020409,
Packit Service 82fcde
    0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
Packit Service 82fcde
    0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
Packit Service 82fcde
    0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
Packit Service 82fcde
    0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
Packit Service 82fcde
    0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
Packit Service 82fcde
    0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
Packit Service 82fcde
    0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
Packit Service 82fcde
    0x02020401, 0x0A020401, 0x02020409, 0x0A020409},
Packit Service 82fcde
  {				/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
Packit Service 82fcde
    0x00000000, 0x00000100, 0x00080000, 0x00080100,
Packit Service 82fcde
    0x01000000, 0x01000100, 0x01080000, 0x01080100,
Packit Service 82fcde
    0x00000010, 0x00000110, 0x00080010, 0x00080110,
Packit Service 82fcde
    0x01000010, 0x01000110, 0x01080010, 0x01080110,
Packit Service 82fcde
    0x00200000, 0x00200100, 0x00280000, 0x00280100,
Packit Service 82fcde
    0x01200000, 0x01200100, 0x01280000, 0x01280100,
Packit Service 82fcde
    0x00200010, 0x00200110, 0x00280010, 0x00280110,
Packit Service 82fcde
    0x01200010, 0x01200110, 0x01280010, 0x01280110,
Packit Service 82fcde
    0x00000200, 0x00000300, 0x00080200, 0x00080300,
Packit Service 82fcde
    0x01000200, 0x01000300, 0x01080200, 0x01080300,
Packit Service 82fcde
    0x00000210, 0x00000310, 0x00080210, 0x00080310,
Packit Service 82fcde
    0x01000210, 0x01000310, 0x01080210, 0x01080310,
Packit Service 82fcde
    0x00200200, 0x00200300, 0x00280200, 0x00280300,
Packit Service 82fcde
    0x01200200, 0x01200300, 0x01280200, 0x01280300,
Packit Service 82fcde
    0x00200210, 0x00200310, 0x00280210, 0x00280310,
Packit Service 82fcde
    0x01200210, 0x01200310, 0x01280210, 0x01280310},
Packit Service 82fcde
  {				/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
Packit Service 82fcde
    0x00000000, 0x04000000, 0x00040000, 0x04040000,
Packit Service 82fcde
    0x00000002, 0x04000002, 0x00040002, 0x04040002,
Packit Service 82fcde
    0x00002000, 0x04002000, 0x00042000, 0x04042000,
Packit Service 82fcde
    0x00002002, 0x04002002, 0x00042002, 0x04042002,
Packit Service 82fcde
    0x00000020, 0x04000020, 0x00040020, 0x04040020,
Packit Service 82fcde
    0x00000022, 0x04000022, 0x00040022, 0x04040022,
Packit Service 82fcde
    0x00002020, 0x04002020, 0x00042020, 0x04042020,
Packit Service 82fcde
    0x00002022, 0x04002022, 0x00042022, 0x04042022,
Packit Service 82fcde
    0x00000800, 0x04000800, 0x00040800, 0x04040800,
Packit Service 82fcde
    0x00000802, 0x04000802, 0x00040802, 0x04040802,
Packit Service 82fcde
    0x00002800, 0x04002800, 0x00042800, 0x04042800,
Packit Service 82fcde
    0x00002802, 0x04002802, 0x00042802, 0x04042802,
Packit Service 82fcde
    0x00000820, 0x04000820, 0x00040820, 0x04040820,
Packit Service 82fcde
    0x00000822, 0x04000822, 0x00040822, 0x04040822,
Packit Service 82fcde
    0x00002820, 0x04002820, 0x00042820, 0x04042820,
Packit Service 82fcde
    0x00002822, 0x04002822, 0x00042822, 0x04042822},
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
#define c2l(c,l)	(l =((unsigned long)(*((c)++)))    , \
Packit Service 82fcde
			 l|=((unsigned long)(*((c)++)))<< 8, \
Packit Service 82fcde
			 l|=((unsigned long)(*((c)++)))<<16, \
Packit Service 82fcde
			 l|=((unsigned long)(*((c)++)))<<24)
Packit Service 82fcde
Packit Service 82fcde
#define l2c(l,c)	(*((c)++)=(unsigned char)(((l)    )&0xff), \
Packit Service 82fcde
			 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
Packit Service 82fcde
			 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
Packit Service 82fcde
			 *((c)++)=(unsigned char)(((l)>>24)&0xff))
Packit Service 82fcde
Packit Service 82fcde
/*
Packit Service 82fcde
 * IP and FP
Packit Service 82fcde
 * The problem is more of a geometric problem that random bit fiddling.
Packit Service 82fcde
 *  0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
Packit Service 82fcde
 *  8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
Packit Service 82fcde
 * 16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
Packit Service 82fcde
 * 24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
Packit Service 82fcde
 *
Packit Service 82fcde
 * 32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
Packit Service 82fcde
 * 40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
Packit Service 82fcde
 * 48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
Packit Service 82fcde
 * 56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
Packit Service 82fcde
 *
Packit Service 82fcde
 * The output has been subject to swaps of the form
Packit Service 82fcde
 * 0 1 -> 3 1 but the odd and even bits have been put into
Packit Service 82fcde
 * 2 3    2 0
Packit Service 82fcde
 * different words.  The main trick is to remember that
Packit Service 82fcde
 * t=((l>>size)^r)&(mask);
Packit Service 82fcde
 * r^=t;
Packit Service 82fcde
 * l^=(t<
Packit Service 82fcde
 * can be used to swap and move bits between words.
Packit Service 82fcde
 *
Packit Service 82fcde
 * So l =  0  1  2  3  r = 16 17 18 19
Packit Service 82fcde
 *         4  5  6  7      20 21 22 23
Packit Service 82fcde
 *         8  9 10 11      24 25 26 27
Packit Service 82fcde
 *        12 13 14 15      28 29 30 31
Packit Service 82fcde
 * becomes (for size == 2 and mask == 0x3333)
Packit Service 82fcde
 * t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
Packit Service 82fcde
 *       6^20  7^21 -- --        4  5 20 21       6  7 22 23
Packit Service 82fcde
 *      10^24 11^25 -- --        8  9 24 25      10 11 24 25
Packit Service 82fcde
 *      14^28 15^29 -- --       12 13 28 29      14 15 28 29
Packit Service 82fcde
 *
Packit Service 82fcde
 * Thanks for hints from Richard Outerbridge - he told me IP&FP
Packit Service 82fcde
 * could be done in 15 xor, 10 shifts and 5 ands.
Packit Service 82fcde
 * When I finally started to think of the problem in 2D
Packit Service 82fcde
 * I first got ~42 operations without xors.  When I remembered
Packit Service 82fcde
 * how to use xors :-) I got it to its final state.
Packit Service 82fcde
 */
Packit Service 82fcde
Packit Service 82fcde
#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
Packit Service 82fcde
	(b)^=(t),\
Packit Service 82fcde
	(a)^=((t)<<(n)))
Packit Service 82fcde
Packit Service 82fcde
#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
Packit Service 82fcde
	(a)=(a)^(t)^(t>>(16-(n))))
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
#define D_ENCRYPT(L,R,S)	\
Packit Service 82fcde
	u=(R^s[S  ]); \
Packit Service 82fcde
	t=R^s[S+1]; \
Packit Service 82fcde
	t=((t>>4)+(t<<28)); \
Packit Service 82fcde
	L^=	des_SPtrans[1][(t    )&0x3f]| \
Packit Service 82fcde
		des_SPtrans[3][(t>> 8)&0x3f]| \
Packit Service 82fcde
		des_SPtrans[5][(t>>16)&0x3f]| \
Packit Service 82fcde
		des_SPtrans[7][(t>>24)&0x3f]| \
Packit Service 82fcde
		des_SPtrans[0][(u    )&0x3f]| \
Packit Service 82fcde
		des_SPtrans[2][(u>> 8)&0x3f]| \
Packit Service 82fcde
		des_SPtrans[4][(u>>16)&0x3f]| \
Packit Service 82fcde
		des_SPtrans[6][(u>>24)&0x3f];
Packit Service 82fcde
Packit Service 82fcde
#define ITERATIONS 16
Packit Service 82fcde
Packit Service 82fcde
static const char shifts2[16] =
Packit Service 82fcde
{0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0};
Packit Service 82fcde
Packit Service 82fcde
static void des_set_key (unsigned char *, unsigned long *);
Packit Service 82fcde
static void des_encrypt (unsigned long *, unsigned long *, int);
Packit Service 82fcde
int _des_crypt (char *, unsigned, struct desparams *);
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
des_set_key (unsigned char *key, unsigned long *schedule)
Packit Service 82fcde
{
Packit Service 82fcde
  register unsigned long c, d, t, s;
Packit Service 82fcde
  register unsigned char *in;
Packit Service 82fcde
  register unsigned long *k;
Packit Service 82fcde
  register int i;
Packit Service 82fcde
Packit Service 82fcde
  k = (unsigned long *) schedule;
Packit Service 82fcde
  in = key;
Packit Service 82fcde
Packit Service 82fcde
  c2l (in, c);
Packit Service 82fcde
  c2l (in, d);
Packit Service 82fcde
Packit Service 82fcde
  /* I now do it in 47 simple operations :-)
Packit Service 82fcde
   * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
Packit Service 82fcde
   * for the inspiration. :-) */
Packit Service 82fcde
  PERM_OP (d, c, t, 4, 0x0f0f0f0f);
Packit Service 82fcde
  HPERM_OP (c, t, -2, 0xcccc0000);
Packit Service 82fcde
  HPERM_OP (d, t, -2, 0xcccc0000);
Packit Service 82fcde
  PERM_OP (d, c, t, 1, 0x55555555);
Packit Service 82fcde
  PERM_OP (c, d, t, 8, 0x00ff00ff);
Packit Service 82fcde
  PERM_OP (d, c, t, 1, 0x55555555);
Packit Service 82fcde
  d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
Packit Service 82fcde
       ((d & 0x00ff0000) >> 16) | ((c & 0xf0000000) >> 4));
Packit Service 82fcde
  c &= 0x0fffffff;
Packit Service 82fcde
Packit Service 82fcde
  for (i = 0; i < ITERATIONS; i++)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (shifts2[i])
Packit Service 82fcde
	{
Packit Service 82fcde
	  c = ((c >> 2) | (c << 26));
Packit Service 82fcde
	  d = ((d >> 2) | (d << 26));
Packit Service 82fcde
	}
Packit Service 82fcde
      else
Packit Service 82fcde
	{
Packit Service 82fcde
	  c = ((c >> 1) | (c << 27));
Packit Service 82fcde
	  d = ((d >> 1) | (d << 27));
Packit Service 82fcde
	}
Packit Service 82fcde
      c &= 0x0fffffff;
Packit Service 82fcde
      d &= 0x0fffffff;
Packit Service 82fcde
      /* could be a few less shifts but I am to lazy at this
Packit Service 82fcde
       * point in time to investigate */
Packit Service 82fcde
      s = des_skb[0][(c) & 0x3f] |
Packit Service 82fcde
	des_skb[1][((c >> 6) & 0x03) | ((c >> 7) & 0x3c)] |
Packit Service 82fcde
	des_skb[2][((c >> 13) & 0x0f) | ((c >> 14) & 0x30)] |
Packit Service 82fcde
	des_skb[3][((c >> 20) & 0x01) | ((c >> 21) & 0x06) | ((c >> 22) & 0x38)];
Packit Service 82fcde
      t = des_skb[4][(d) & 0x3f] |
Packit Service 82fcde
	des_skb[5][((d >> 7) & 0x03) | ((d >> 8) & 0x3c)] |
Packit Service 82fcde
	des_skb[6][(d >> 15) & 0x3f] |
Packit Service 82fcde
	des_skb[7][((d >> 21) & 0x0f) | ((d >> 22) & 0x30)];
Packit Service 82fcde
Packit Service 82fcde
      /* table contained 0213 4657 */
Packit Service 82fcde
      *(k++) = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff;
Packit Service 82fcde
      s = ((s >> 16) | (t & 0xffff0000));
Packit Service 82fcde
Packit Service 82fcde
      s = (s << 4) | (s >> 28);
Packit Service 82fcde
      *(k++) = s & 0xffffffff;
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
des_encrypt (unsigned long *buf, unsigned long *schedule, int encrypt)
Packit Service 82fcde
{
Packit Service 82fcde
  register unsigned long l, r, t, u;
Packit Service 82fcde
  register int i;
Packit Service 82fcde
  register unsigned long *s;
Packit Service 82fcde
Packit Service 82fcde
  l = buf[0];
Packit Service 82fcde
  r = buf[1];
Packit Service 82fcde
Packit Service 82fcde
  /* do IP */
Packit Service 82fcde
  PERM_OP (r, l, t, 4, 0x0f0f0f0f);
Packit Service 82fcde
  PERM_OP (l, r, t, 16, 0x0000ffff);
Packit Service 82fcde
  PERM_OP (r, l, t, 2, 0x33333333);
Packit Service 82fcde
  PERM_OP (l, r, t, 8, 0x00ff00ff);
Packit Service 82fcde
  PERM_OP (r, l, t, 1, 0x55555555);
Packit Service 82fcde
  /* r and l are reversed - remember that :-) - fix
Packit Service 82fcde
   * it in the next step */
Packit Service 82fcde
Packit Service 82fcde
  /* Things have been modified so that the initial rotate is
Packit Service 82fcde
   * done outside the loop.  This required the
Packit Service 82fcde
   * des_SPtrans values in sp.h to be rotated 1 bit to the right.
Packit Service 82fcde
   * One perl script later and things have a 5% speed up on a sparc2.
Packit Service 82fcde
   * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
Packit Service 82fcde
   * for pointing this out. */
Packit Service 82fcde
  t = (r << 1) | (r >> 31);
Packit Service 82fcde
  r = (l << 1) | (l >> 31);
Packit Service 82fcde
  l = t;
Packit Service 82fcde
Packit Service 82fcde
  /* clear the top bits on machines with 8byte longs */
Packit Service 82fcde
  l &= 0xffffffff;
Packit Service 82fcde
  r &= 0xffffffff;
Packit Service 82fcde
Packit Service 82fcde
  s = (unsigned long *) schedule;
Packit Service 82fcde
  /* I don't know if it is worth the effort of loop unrolling the
Packit Service 82fcde
   * inner loop */
Packit Service 82fcde
  if (encrypt)
Packit Service 82fcde
    {
Packit Service 82fcde
      for (i = 0; i < 32; i += 4)
Packit Service 82fcde
	{
Packit Service 82fcde
	  D_ENCRYPT (l, r, i + 0);	/*  1 */
Packit Service 82fcde
	  D_ENCRYPT (r, l, i + 2);	/*  2 */
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      for (i = 30; i > 0; i -= 4)
Packit Service 82fcde
	{
Packit Service 82fcde
	  D_ENCRYPT (l, r, i - 0);	/* 16 */
Packit Service 82fcde
	  D_ENCRYPT (r, l, i - 2);	/* 15 */
Packit Service 82fcde
	}
Packit Service 82fcde
    }
Packit Service 82fcde
  l = (l >> 1) | (l << 31);
Packit Service 82fcde
  r = (r >> 1) | (r << 31);
Packit Service 82fcde
  /* clear the top bits on machines with 8byte longs */
Packit Service 82fcde
  l &= 0xffffffff;
Packit Service 82fcde
  r &= 0xffffffff;
Packit Service 82fcde
Packit Service 82fcde
  /* swap l and r
Packit Service 82fcde
   * we will not do the swap so just remember they are
Packit Service 82fcde
   * reversed for the rest of the subroutine
Packit Service 82fcde
   * luckily FP fixes this problem :-) */
Packit Service 82fcde
Packit Service 82fcde
  PERM_OP (r, l, t, 1, 0x55555555);
Packit Service 82fcde
  PERM_OP (l, r, t, 8, 0x00ff00ff);
Packit Service 82fcde
  PERM_OP (r, l, t, 2, 0x33333333);
Packit Service 82fcde
  PERM_OP (l, r, t, 16, 0x0000ffff);
Packit Service 82fcde
  PERM_OP (r, l, t, 4, 0x0f0f0f0f);
Packit Service 82fcde
Packit Service 82fcde
  buf[0] = l;
Packit Service 82fcde
  buf[1] = r;
Packit Service 82fcde
Packit Service 82fcde
  l = r = t = u = 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
_des_crypt (char *buf, unsigned len, struct desparams *desp)
Packit Service 82fcde
{
Packit Service 82fcde
  unsigned long schedule[32];
Packit Service 82fcde
  register unsigned long tin0, tin1;
Packit Service 82fcde
  register unsigned long tout0, tout1, xor0, xor1;
Packit Service 82fcde
  register unsigned char *in, *out;
Packit Service 82fcde
  unsigned long tbuf[2];
Packit Service 82fcde
  unsigned char *iv, *oiv;
Packit Service 82fcde
  int cbc_mode;
Packit Service 82fcde
Packit Service 82fcde
  cbc_mode = (desp->des_mode == CBC) ? 1 : 0;
Packit Service 82fcde
Packit Service 82fcde
  in = (unsigned char *) buf;
Packit Service 82fcde
  out = (unsigned char *) buf;
Packit Service 82fcde
  oiv = iv = (unsigned char *) desp->des_ivec;
Packit Service 82fcde
Packit Service 82fcde
  des_set_key (desp->des_key, schedule);
Packit Service 82fcde
Packit Service 82fcde
  tin0 = tin1 = 0;		/* For GCC */
Packit Service 82fcde
  if (desp->des_dir == ENCRYPT)
Packit Service 82fcde
    {
Packit Service 82fcde
      c2l (iv, tout0);
Packit Service 82fcde
      c2l (iv, tout1);
Packit Service 82fcde
      for (; len > 0; len -= 8)
Packit Service 82fcde
	{
Packit Service 82fcde
	  c2l (in, tin0);
Packit Service 82fcde
	  c2l (in, tin1);
Packit Service 82fcde
	  if (cbc_mode)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      tin0 ^= tout0;
Packit Service 82fcde
	      tin1 ^= tout1;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  tbuf[0] = tin0;
Packit Service 82fcde
	  tbuf[1] = tin1;
Packit Service 82fcde
	  des_encrypt (tbuf, schedule, 1);
Packit Service 82fcde
	  tout0 = tbuf[0];
Packit Service 82fcde
	  tout1 = tbuf[1];
Packit Service 82fcde
	  l2c (tout0, out);
Packit Service 82fcde
	  l2c (tout1, out);
Packit Service 82fcde
	}
Packit Service 82fcde
      l2c (tout0, oiv);
Packit Service 82fcde
      l2c (tout1, oiv);
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      c2l (iv, xor0);
Packit Service 82fcde
      c2l (iv, xor1);
Packit Service 82fcde
      for (; len > 0; len -= 8)
Packit Service 82fcde
	{
Packit Service 82fcde
	  c2l (in, tin0);
Packit Service 82fcde
	  c2l (in, tin1);
Packit Service 82fcde
	  tbuf[0] = tin0;
Packit Service 82fcde
	  tbuf[1] = tin1;
Packit Service 82fcde
	  des_encrypt (tbuf, schedule, 0);
Packit Service 82fcde
	  if (cbc_mode)
Packit Service 82fcde
	    {
Packit Service 82fcde
	      tout0 = tbuf[0] ^ xor0;
Packit Service 82fcde
	      tout1 = tbuf[1] ^ xor1;
Packit Service 82fcde
	      xor0 = tin0;
Packit Service 82fcde
	      xor1 = tin1;
Packit Service 82fcde
	    }
Packit Service 82fcde
	  else
Packit Service 82fcde
	    {
Packit Service 82fcde
	      tout0 = tbuf[0];
Packit Service 82fcde
	      tout1 = tbuf[1];
Packit Service 82fcde
	    }
Packit Service 82fcde
	  l2c (tout0, out);
Packit Service 82fcde
	  l2c (tout1, out);
Packit Service 82fcde
	}
Packit Service 82fcde
      l2c (tin0, oiv);
Packit Service 82fcde
      l2c (tin1, oiv);
Packit Service 82fcde
    }
Packit Service 82fcde
  tin0 = tin1 = tout0 = tout1 = xor0 = xor1 = 0;
Packit Service 82fcde
  tbuf[0] = tbuf[1] = 0;
Packit Service 82fcde
  memset (schedule, 0, sizeof (schedule));
Packit Service 82fcde
Packit Service 82fcde
  return (1);
Packit Service 82fcde
}