Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/com/sun/crypto/provider/DESCrypt.java
38922 views
/*1* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package com.sun.crypto.provider;2627import java.security.InvalidKeyException;2829/**30* This is the internal DES class responsible for encryption and31* decryption of a byte array of size <code>DES_BLOCK_SIZE</code>.32*33* @author Gigi Ankeny34* @author Jan Luehe35*36*37* @see DESConstants38* @see DESCipher39*/4041class DESCrypt extends SymmetricCipher implements DESConstants {42private static final int s0p[] = {430x00410100, 0x00010000, 0x40400000, 0x40410100, 0x00400000,440x40010100, 0x40010000, 0x40400000, 0x40010100, 0x00410100,450x00410000, 0x40000100, 0x40400100, 0x00400000, 0x00000000,460x40010000, 0x00010000, 0x40000000, 0x00400100, 0x00010100,470x40410100, 0x00410000, 0x40000100, 0x00400100, 0x40000000,480x00000100, 0x00010100, 0x40410000, 0x00000100, 0x40400100,490x40410000, 0x00000000, 0x00000000, 0x40410100, 0x00400100,500x40010000, 0x00410100, 0x00010000, 0x40000100, 0x00400100,510x40410000, 0x00000100, 0x00010100, 0x40400000, 0x40010100,520x40000000, 0x40400000, 0x00410000, 0x40410100, 0x00010100,530x00410000, 0x40400100, 0x00400000, 0x40000100, 0x40010000,540x00000000, 0x00010000, 0x00400000, 0x40400100, 0x00410100,550x40000000, 0x40410000, 0x00000100, 0x40010100,56};5758private static final int s1p[] = {590x08021002, 0x00000000, 0x00021000, 0x08020000, 0x08000002,600x00001002, 0x08001000, 0x00021000, 0x00001000, 0x08020002,610x00000002, 0x08001000, 0x00020002, 0x08021000, 0x08020000,620x00000002, 0x00020000, 0x08001002, 0x08020002, 0x00001000,630x00021002, 0x08000000, 0x00000000, 0x00020002, 0x08001002,640x00021002, 0x08021000, 0x08000002, 0x08000000, 0x00020000,650x00001002, 0x08021002, 0x00020002, 0x08021000, 0x08001000,660x00021002, 0x08021002, 0x00020002, 0x08000002, 0x00000000,670x08000000, 0x00001002, 0x00020000, 0x08020002, 0x00001000,680x08000000, 0x00021002, 0x08001002, 0x08021000, 0x00001000,690x00000000, 0x08000002, 0x00000002, 0x08021002, 0x00021000,700x08020000, 0x08020002, 0x00020000, 0x00001002, 0x08001000,710x08001002, 0x00000002, 0x08020000, 0x00021000,72};7374private static final int s2p[] = {750x20800000, 0x00808020, 0x00000020, 0x20800020, 0x20008000,760x00800000, 0x20800020, 0x00008020, 0x00800020, 0x00008000,770x00808000, 0x20000000, 0x20808020, 0x20000020, 0x20000000,780x20808000, 0x00000000, 0x20008000, 0x00808020, 0x00000020,790x20000020, 0x20808020, 0x00008000, 0x20800000, 0x20808000,800x00800020, 0x20008020, 0x00808000, 0x00008020, 0x00000000,810x00800000, 0x20008020, 0x00808020, 0x00000020, 0x20000000,820x00008000, 0x20000020, 0x20008000, 0x00808000, 0x20800020,830x00000000, 0x00808020, 0x00008020, 0x20808000, 0x20008000,840x00800000, 0x20808020, 0x20000000, 0x20008020, 0x20800000,850x00800000, 0x20808020, 0x00008000, 0x00800020, 0x20800020,860x00008020, 0x00800020, 0x00000000, 0x20808000, 0x20000020,870x20800000, 0x20008020, 0x00000020, 0x00808000,88};8990private static final int s3p[] = {910x00080201, 0x02000200, 0x00000001, 0x02080201, 0x00000000,920x02080000, 0x02000201, 0x00080001, 0x02080200, 0x02000001,930x02000000, 0x00000201, 0x02000001, 0x00080201, 0x00080000,940x02000000, 0x02080001, 0x00080200, 0x00000200, 0x00000001,950x00080200, 0x02000201, 0x02080000, 0x00000200, 0x00000201,960x00000000, 0x00080001, 0x02080200, 0x02000200, 0x02080001,970x02080201, 0x00080000, 0x02080001, 0x00000201, 0x00080000,980x02000001, 0x00080200, 0x02000200, 0x00000001, 0x02080000,990x02000201, 0x00000000, 0x00000200, 0x00080001, 0x00000000,1000x02080001, 0x02080200, 0x00000200, 0x02000000, 0x02080201,1010x00080201, 0x00080000, 0x02080201, 0x00000001, 0x02000200,1020x00080201, 0x00080001, 0x00080200, 0x02080000, 0x02000201,1030x00000201, 0x02000000, 0x02000001, 0x02080200,104};105106private static final int s4p[] = {1070x01000000, 0x00002000, 0x00000080, 0x01002084, 0x01002004,1080x01000080, 0x00002084, 0x01002000, 0x00002000, 0x00000004,1090x01000004, 0x00002080, 0x01000084, 0x01002004, 0x01002080,1100x00000000, 0x00002080, 0x01000000, 0x00002004, 0x00000084,1110x01000080, 0x00002084, 0x00000000, 0x01000004, 0x00000004,1120x01000084, 0x01002084, 0x00002004, 0x01002000, 0x00000080,1130x00000084, 0x01002080, 0x01002080, 0x01000084, 0x00002004,1140x01002000, 0x00002000, 0x00000004, 0x01000004, 0x01000080,1150x01000000, 0x00002080, 0x01002084, 0x00000000, 0x00002084,1160x01000000, 0x00000080, 0x00002004, 0x01000084, 0x00000080,1170x00000000, 0x01002084, 0x01002004, 0x01002080, 0x00000084,1180x00002000, 0x00002080, 0x01002004, 0x01000080, 0x00000084,1190x00000004, 0x00002084, 0x01002000, 0x01000004,120};121122private static final int s5p[] = {1230x10000008, 0x00040008, 0x00000000, 0x10040400, 0x00040008,1240x00000400, 0x10000408, 0x00040000, 0x00000408, 0x10040408,1250x00040400, 0x10000000, 0x10000400, 0x10000008, 0x10040000,1260x00040408, 0x00040000, 0x10000408, 0x10040008, 0x00000000,1270x00000400, 0x00000008, 0x10040400, 0x10040008, 0x10040408,1280x10040000, 0x10000000, 0x00000408, 0x00000008, 0x00040400,1290x00040408, 0x10000400, 0x00000408, 0x10000000, 0x10000400,1300x00040408, 0x10040400, 0x00040008, 0x00000000, 0x10000400,1310x10000000, 0x00000400, 0x10040008, 0x00040000, 0x00040008,1320x10040408, 0x00040400, 0x00000008, 0x10040408, 0x00040400,1330x00040000, 0x10000408, 0x10000008, 0x10040000, 0x00040408,1340x00000000, 0x00000400, 0x10000008, 0x10000408, 0x10040400,1350x10040000, 0x00000408, 0x00000008, 0x10040008,136};137138private static final int s6p[] = {1390x00000800, 0x00000040, 0x00200040, 0x80200000, 0x80200840,1400x80000800, 0x00000840, 0x00000000, 0x00200000, 0x80200040,1410x80000040, 0x00200800, 0x80000000, 0x00200840, 0x00200800,1420x80000040, 0x80200040, 0x00000800, 0x80000800, 0x80200840,1430x00000000, 0x00200040, 0x80200000, 0x00000840, 0x80200800,1440x80000840, 0x00200840, 0x80000000, 0x80000840, 0x80200800,1450x00000040, 0x00200000, 0x80000840, 0x00200800, 0x80200800,1460x80000040, 0x00000800, 0x00000040, 0x00200000, 0x80200800,1470x80200040, 0x80000840, 0x00000840, 0x00000000, 0x00000040,1480x80200000, 0x80000000, 0x00200040, 0x00000000, 0x80200040,1490x00200040, 0x00000840, 0x80000040, 0x00000800, 0x80200840,1500x00200000, 0x00200840, 0x80000000, 0x80000800, 0x80200840,1510x80200000, 0x00200840, 0x00200800, 0x80000800,152};153154private static final int s7p[] = {1550x04100010, 0x04104000, 0x00004010, 0x00000000, 0x04004000,1560x00100010, 0x04100000, 0x04104010, 0x00000010, 0x04000000,1570x00104000, 0x00004010, 0x00104010, 0x04004010, 0x04000010,1580x04100000, 0x00004000, 0x00104010, 0x00100010, 0x04004000,1590x04104010, 0x04000010, 0x00000000, 0x00104000, 0x04000000,1600x00100000, 0x04004010, 0x04100010, 0x00100000, 0x00004000,1610x04104000, 0x00000010, 0x00100000, 0x00004000, 0x04000010,1620x04104010, 0x00004010, 0x04000000, 0x00000000, 0x00104000,1630x04100010, 0x04004010, 0x04004000, 0x00100010, 0x04104000,1640x00000010, 0x00100010, 0x04004000, 0x04104010, 0x00100000,1650x04100000, 0x04000010, 0x00104000, 0x00004010, 0x04004010,1660x04100000, 0x00000010, 0x04104000, 0x00104010, 0x00000000,1670x04000000, 0x04100010, 0x00004000, 0x00104010,168};169170private static final int permRight0[] = {1710x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000,1720x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,1730x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040,1740x40404040,175};176177private static final int permLeft1[] = {1780x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000,1790x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040,1800x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040,1810x40404040,182};183184private static final int permRight2[] = {1850x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000,1860x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,1870x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010,1880x10101010,189};190191private static final int permLeft3[] = {1920x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000,1930x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010,1940x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010,1950x10101010,196};197198private static final int permRight4[] = {1990x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400,2000x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,2010x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404,2020x04040404,203};204205private static final int permLeft5[] = {2060x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400,2070x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004,2080x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404,2090x04040404,210};211212private static final int permRight6[] = {2130x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100,2140x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,2150x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101,2160x01010101,217};218219private static final int permLeft7[] = {2200x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100,2210x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001,2220x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101,2230x01010101,224};225226private static final int permRight8[] = {2270x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000,2280x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,2290x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080,2300x80808080,231};232233private static final int permLeft9[] = {2340x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000,2350x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080,2360x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080,2370x80808080,238};239240private static final int permRightA[] = {2410x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000,2420x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,2430x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020,2440x20202020,245};246247private static final int permLeftB[] = {2480x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000,2490x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020,2500x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020,2510x20202020,252};253254private static final int permRightC[] = {2550x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800,2560x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,2570x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808,2580x08080808,259};260261private static final int permLeftD[] = {2620x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800,2630x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008,2640x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808,2650x08080808,266};267268private static final int permRightE[] = {2690x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200,2700x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,2710x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202,2720x02020202,273};274275private static final int permLeftF[] = {2760x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200,2770x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002,2780x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202,2790x02020202,280};281282/*283* Initial Permutation284*/285private static final int initPermLeft0[] = {2860x00000000, 0x00008000, 0x00000000, 0x00008000, 0x00000080,2870x00008080, 0x00000080, 0x00008080, 0x00000000, 0x00008000,2880x00000000, 0x00008000, 0x00000080, 0x00008080, 0x00000080,2890x00008080,290};291292private static final int initPermRight0[] = {2930x00000000, 0x00000000, 0x00008000, 0x00008000, 0x00000000,2940x00000000, 0x00008000, 0x00008000, 0x00000080, 0x00000080,2950x00008080, 0x00008080, 0x00000080, 0x00000080, 0x00008080,2960x00008080,297};298299private static final int initPermLeft1[] = {3000x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00800000,3010x80800000, 0x00800000, 0x80800000, 0x00000000, 0x80000000,3020x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00800000,3030x80800000,304};305306private static final int initPermRight1[] = {3070x00000000, 0x00000000, 0x80000000, 0x80000000, 0x00000000,3080x00000000, 0x80000000, 0x80000000, 0x00800000, 0x00800000,3090x80800000, 0x80800000, 0x00800000, 0x00800000, 0x80800000,3100x80800000,311};312313private static final int initPermLeft2[] = {3140x00000000, 0x00004000, 0x00000000, 0x00004000, 0x00000040,3150x00004040, 0x00000040, 0x00004040, 0x00000000, 0x00004000,3160x00000000, 0x00004000, 0x00000040, 0x00004040, 0x00000040,3170x00004040,318};319320private static final int initPermRight2[] = {3210x00000000, 0x00000000, 0x00004000, 0x00004000, 0x00000000,3220x00000000, 0x00004000, 0x00004000, 0x00000040, 0x00000040,3230x00004040, 0x00004040, 0x00000040, 0x00000040, 0x00004040,3240x00004040,325};326327private static final int initPermLeft3[] = {3280x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00400000,3290x40400000, 0x00400000, 0x40400000, 0x00000000, 0x40000000,3300x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00400000,3310x40400000,332};333334private static final int initPermRight3[] = {3350x00000000, 0x00000000, 0x40000000, 0x40000000, 0x00000000,3360x00000000, 0x40000000, 0x40000000, 0x00400000, 0x00400000,3370x40400000, 0x40400000, 0x00400000, 0x00400000, 0x40400000,3380x40400000,339};340341private static final int initPermLeft4[] = {3420x00000000, 0x00002000, 0x00000000, 0x00002000, 0x00000020,3430x00002020, 0x00000020, 0x00002020, 0x00000000, 0x00002000,3440x00000000, 0x00002000, 0x00000020, 0x00002020, 0x00000020,3450x00002020,346};347348private static final int initPermRight4[] = {3490x00000000, 0x00000000, 0x00002000, 0x00002000, 0x00000000,3500x00000000, 0x00002000, 0x00002000, 0x00000020, 0x00000020,3510x00002020, 0x00002020, 0x00000020, 0x00000020, 0x00002020,3520x00002020,353};354355private static final int initPermLeft5[] = {3560x00000000, 0x20000000, 0x00000000, 0x20000000, 0x00200000,3570x20200000, 0x00200000, 0x20200000, 0x00000000, 0x20000000,3580x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00200000,3590x20200000,360};361362private static final int initPermRight5[] = {3630x00000000, 0x00000000, 0x20000000, 0x20000000, 0x00000000,3640x00000000, 0x20000000, 0x20000000, 0x00200000, 0x00200000,3650x20200000, 0x20200000, 0x00200000, 0x00200000, 0x20200000,3660x20200000,367};368369private static final int initPermLeft6[] = {3700x00000000, 0x00001000, 0x00000000, 0x00001000, 0x00000010,3710x00001010, 0x00000010, 0x00001010, 0x00000000, 0x00001000,3720x00000000, 0x00001000, 0x00000010, 0x00001010, 0x00000010,3730x00001010,374};375376private static final int initPermRight6[] = {3770x00000000, 0x00000000, 0x00001000, 0x00001000, 0x00000000,3780x00000000, 0x00001000, 0x00001000, 0x00000010, 0x00000010,3790x00001010, 0x00001010, 0x00000010, 0x00000010, 0x00001010,3800x00001010,381};382383private static final int initPermLeft7[] = {3840x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00100000,3850x10100000, 0x00100000, 0x10100000, 0x00000000, 0x10000000,3860x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00100000,3870x10100000,388};389390private static final int initPermRight7[] = {3910x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000,3920x00000000, 0x10000000, 0x10000000, 0x00100000, 0x00100000,3930x10100000, 0x10100000, 0x00100000, 0x00100000, 0x10100000,3940x10100000,395};396397private static final int initPermLeft8[] = {3980x00000000, 0x00000800, 0x00000000, 0x00000800, 0x00000008,3990x00000808, 0x00000008, 0x00000808, 0x00000000, 0x00000800,4000x00000000, 0x00000800, 0x00000008, 0x00000808, 0x00000008,4010x00000808,402};403404private static final int initPermRight8[] = {4050x00000000, 0x00000000, 0x00000800, 0x00000800, 0x00000000,4060x00000000, 0x00000800, 0x00000800, 0x00000008, 0x00000008,4070x00000808, 0x00000808, 0x00000008, 0x00000008, 0x00000808,4080x00000808,409};410411private static final int initPermLeft9[] = {4120x00000000, 0x08000000, 0x00000000, 0x08000000, 0x00080000,4130x08080000, 0x00080000, 0x08080000, 0x00000000, 0x08000000,4140x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00080000,4150x08080000,416};417418private static final int initPermRight9[] = {4190x00000000, 0x00000000, 0x08000000, 0x08000000, 0x00000000,4200x00000000, 0x08000000, 0x08000000, 0x00080000, 0x00080000,4210x08080000, 0x08080000, 0x00080000, 0x00080000, 0x08080000,4220x08080000,423};424425private static final int initPermLeftA[] = {4260x00000000, 0x00000400, 0x00000000, 0x00000400, 0x00000004,4270x00000404, 0x00000004, 0x00000404, 0x00000000, 0x00000400,4280x00000000, 0x00000400, 0x00000004, 0x00000404, 0x00000004,4290x00000404,430};431432private static final int initPermRightA[] = {4330x00000000, 0x00000000, 0x00000400, 0x00000400, 0x00000000,4340x00000000, 0x00000400, 0x00000400, 0x00000004, 0x00000004,4350x00000404, 0x00000404, 0x00000004, 0x00000004, 0x00000404,4360x00000404,437};438439private static final int initPermLeftB[] = {4400x00000000, 0x04000000, 0x00000000, 0x04000000, 0x00040000,4410x04040000, 0x00040000, 0x04040000, 0x00000000, 0x04000000,4420x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00040000,4430x04040000,444};445446private static final int initPermRightB[] = {4470x00000000, 0x00000000, 0x04000000, 0x04000000, 0x00000000,4480x00000000, 0x04000000, 0x04000000, 0x00040000, 0x00040000,4490x04040000, 0x04040000, 0x00040000, 0x00040000, 0x04040000,4500x04040000,451};452453private static final int initPermLeftC[] = {4540x00000000, 0x00000200, 0x00000000, 0x00000200, 0x00000002,4550x00000202, 0x00000002, 0x00000202, 0x00000000, 0x00000200,4560x00000000, 0x00000200, 0x00000002, 0x00000202, 0x00000002,4570x00000202,458};459460private static final int initPermRightC[] = {4610x00000000, 0x00000000, 0x00000200, 0x00000200, 0x00000000,4620x00000000, 0x00000200, 0x00000200, 0x00000002, 0x00000002,4630x00000202, 0x00000202, 0x00000002, 0x00000002, 0x00000202,4640x00000202,465};466467private static final int initPermLeftD[] = {4680x00000000, 0x02000000, 0x00000000, 0x02000000, 0x00020000,4690x02020000, 0x00020000, 0x02020000, 0x00000000, 0x02000000,4700x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00020000,4710x02020000,472};473474private static final int initPermRightD[] = {4750x00000000, 0x00000000, 0x02000000, 0x02000000, 0x00000000,4760x00000000, 0x02000000, 0x02000000, 0x00020000, 0x00020000,4770x02020000, 0x02020000, 0x00020000, 0x00020000, 0x02020000,4780x02020000,479};480481private static final int initPermLeftE[] = {4820x00000000, 0x00000100, 0x00000000, 0x00000100, 0x00000001,4830x00000101, 0x00000001, 0x00000101, 0x00000000, 0x00000100,4840x00000000, 0x00000100, 0x00000001, 0x00000101, 0x00000001,4850x00000101,486};487488private static final int initPermRightE[] = {4890x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000000,4900x00000000, 0x00000100, 0x00000100, 0x00000001, 0x00000001,4910x00000101, 0x00000101, 0x00000001, 0x00000001, 0x00000101,4920x00000101,493};494495private static final int initPermLeftF[] = {4960x00000000, 0x01000000, 0x00000000, 0x01000000, 0x00010000,4970x01010000, 0x00010000, 0x01010000, 0x00000000, 0x01000000,4980x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00010000,4990x01010000,500};501502private static final int initPermRightF[] = {5030x00000000, 0x00000000, 0x01000000, 0x01000000, 0x00000000,5040x00000000, 0x01000000, 0x01000000, 0x00010000, 0x00010000,5050x01010000, 0x01010000, 0x00010000, 0x00010000, 0x01010000,5060x01010000,507};508509/*510* the encryption key array after expansion and permutation511*/512byte[] expandedKey = null;513514/*515* Are we encrypting or decrypting?516*/517boolean decrypting = false;518519/**520* Returns this cipher's block size.521*522* @return this cipher's block size523*/524int getBlockSize() {525return DES_BLOCK_SIZE;526}527528void init(boolean decrypting, String algorithm, byte[] rawKey)529throws InvalidKeyException {530this.decrypting = decrypting;531if (!algorithm.equalsIgnoreCase("DES")) {532throw new InvalidKeyException("Wrong algorithm: DES required");533}534if (rawKey.length != DES_BLOCK_SIZE) {535throw new InvalidKeyException("Wrong key size");536}537expandKey(rawKey);538}539540/**541* Performs encryption operation.542*543* <p>The input plain text <code>plain</code>, starting at544* <code>plainOffset</code> and ending at545* <code>(plainOffset + len - 1)</code>, is encrypted.546* The result is stored in <code>cipher</code>, starting at547* <code>cipherOffset</code>.548*549* <p>The subclass that implements Cipher should ensure that550* <code>init</code> has been called before this method is called.551*552* @param plain the buffer with the input data to be encrypted553* @param plainOffset the offset in <code>plain</code>554* @param plainLen the length of the input data555* @param cipher the buffer for the result556* @param cipherOffset the offset in <code>cipher</code>557*558* @exception IllegalBlockSizeException if the input length is different559* from the cipher's block size560*/561void encryptBlock(byte[] plain, int plainOffset,562byte[] cipher, int cipherOffset)563{564cipherBlock(plain, plainOffset, cipher, cipherOffset);565}566567/**568* Performs decryption operation.569*570* <p>The input cipher text <code>cipher</code>, starting at571* <code>cipherOffset</code> and ending at572* <code>(cipherOffset + len - 1)</code>, is decrypted.573* The result is stored in <code>plain</code>, starting at574* <code>plainOffset</code>.575*576* <p>The subclass that implements Cipher should ensure that577* <code>init</code> has been called before this method is called.578*579* @param cipher the buffer with the input data to be decrypted580* @param cipherOffset the offset in <code>cipherOffset</code>581* @param cipherLen the length of the input data582* @param plain the buffer for the result583* @param plainOffset the offset in <code>plain</code>584*585* @exception IllegalBlockSizeException if the input length is different586* from the cipher's block size587*/588void decryptBlock(byte[] cipher, int cipherOffset,589byte[] plain, int plainOffset)590{591cipherBlock(cipher, cipherOffset, plain, plainOffset);592}593594595void cipherBlock(byte[] in, int inOffset, byte[] out, int outOffset) {596byte key[];597int temp;598int i, j;599int offset;600int left, right;601602left = initialPermutationLeft(in, inOffset);603right = initialPermutationRight(in, inOffset);604605key = expandedKey;606607if (decrypting) {608offset = 16 - DES_BLOCK_SIZE;609j = 128 - DES_BLOCK_SIZE;610611} else {612offset = 0 - DES_BLOCK_SIZE;613j = 0;614}615616for (i = 0; i < 16; i++) {617// make the first and last bit adjacent618// move the first bit to the last619temp = (right << 1) | ((right >> 31) & 1);620621// mangler function:622// every 6 bit is fed into the sbox, which623// produces 4-bit output624left ^= s0p[(temp & 0x3f) ^ key[j+0]]625^ s1p[((temp >> 4) & 0x3f) ^ key[j+1]]626^ s2p[((temp >> 8) & 0x3f) ^ key[j+2]]627^ s3p[((temp >> 12) & 0x3f) ^ key[j+3]]628^ s4p[((temp >> 16) & 0x3f) ^ key[j+4]]629^ s5p[((temp >> 20) & 0x3f) ^ key[j+5]]630^ s6p[((temp >> 24) & 0x3f) ^ key[j+6]];631632// make the last sbox input the last bit from right[0]633temp = ((right & 1) << 5) | ((right >> 27) & 0x1f);634left ^= s7p[temp ^ key[j+7]];635temp = left;636left = right;637right = temp;638j -= offset;639}640641temp = left;642left = right;643right = temp;644perm(left, right, out, outOffset);645}646647private static void perm(int left, int right,648byte out[], int offset) {649int low, high, temp;650651temp = left;652high = permRight0[temp & 0x0000000f];653temp >>= 4;654low = permLeft1[temp & 0x0000000f];655temp >>= 4;656high |= permRight2[temp & 0x0000000f];657temp >>= 4;658low |= permLeft3[temp & 0x0000000f];659temp >>= 4;660high |= permRight4[temp & 0x0000000f];661temp >>= 4;662low |= permLeft5[temp & 0x0000000f];663temp >>= 4;664high |= permRight6[temp & 0x0000000f];665temp >>= 4;666low |= permLeft7[temp & 0x0000000f];667668temp = right;669high |= permRight8[temp & 0x0000000f];670temp >>= 4;671low |= permLeft9[temp & 0x0000000f];672temp >>= 4;673high |= permRightA[temp & 0x0000000f];674temp >>= 4;675low |= permLeftB[temp & 0x0000000f];676temp >>= 4;677high |= permRightC[temp & 0x0000000f];678temp >>= 4;679low |= permLeftD[temp & 0x0000000f];680temp >>= 4;681high |= permRightE[temp & 0x0000000f];682temp >>= 4;683low |= permLeftF[temp & 0x0000000f];684685686out[offset + 0] = (byte)low;687out[offset + 1] = (byte)(low >> 8);688out[offset + 2] = (byte)(low >> 16);689out[offset + 3] = (byte)(low >> 24);690out[offset + 4] = (byte)high;691out[offset + 5] = (byte)(high >> 8);692out[offset + 6] = (byte)(high >> 16);693out[offset + 7] = (byte)(high >> 24);694695}696697private static int initialPermutationLeft(byte block[], int offset) {698int l;699700l = initPermLeft1[block[offset] & 0xf];701l |= initPermLeft0[(block[offset] >> 4) & 0xf];702l |= initPermLeft3[block[offset + 1] & 0xf];703l |= initPermLeft2[(block[offset + 1] >> 4) & 0xf];704l |= initPermLeft5[block[offset + 2] & 0xf];705l |= initPermLeft4[(block[offset + 2] >> 4) & 0xf];706l |= initPermLeft7[block[offset + 3] & 0xf];707l |= initPermLeft6[(block[offset + 3] >> 4) & 0xf];708l |= initPermLeft9[block[offset + 4] & 0xf];709l |= initPermLeft8[(block[offset + 4] >> 4) & 0xf];710l |= initPermLeftB[block[offset + 5] & 0xf];711l |= initPermLeftA[(block[offset + 5] >> 4) & 0xf];712l |= initPermLeftD[block[offset + 6] & 0xf];713l |= initPermLeftC[(block[offset + 6] >> 4) & 0xf];714l |= initPermLeftF[block[offset + 7] & 0xf];715l |= initPermLeftE[(block[offset + 7] >> 4) & 0xf];716return l;717}718719private static int initialPermutationRight(byte block[], int offset) {720int l;721722l = initPermRight1[block[offset] & 0xf];723l |= initPermRight0[(block[offset] >> 4) & 0xf];724l |= initPermRight3[block[offset + 1] & 0xf];725l |= initPermRight2[(block[offset + 1] >> 4) & 0xf];726l |= initPermRight5[block[offset + 2] & 0xf];727l |= initPermRight4[(block[offset + 2] >> 4) & 0xf];728l |= initPermRight7[block[offset + 3] & 0xf];729l |= initPermRight6[(block[offset + 3] >> 4) & 0xf];730l |= initPermRight9[block[offset + 4] & 0xf];731l |= initPermRight8[(block[offset + 4] >> 4) & 0xf];732l |= initPermRightB[block[offset + 5] & 0xf];733l |= initPermRightA[(block[offset + 5] >> 4) & 0xf];734l |= initPermRightD[block[offset + 6] & 0xf];735l |= initPermRightC[(block[offset + 6] >> 4) & 0xf];736l |= initPermRightF[block[offset + 7] & 0xf];737l |= initPermRightE[(block[offset + 7] >> 4) & 0xf];738return l;739}740741void expandKey(byte key[]) {742int octet;743byte ek[] = new byte[128];744745octet = key[0];746if ((octet & 0x80) != 0) {747ek[ 3] |= 2; ek[ 9] |= 8; ek[ 18] |= 8;748ek[ 27] |= 32; ek[ 33] |= 2; ek[ 42] |= 16;749ek[ 48] |= 8; ek[ 65] |= 16; ek[ 74] |= 2;750ek[ 80] |= 2; ek[ 89] |= 4; ek[ 99] |= 16;751ek[104] |= 4; ek[122] |= 32;752}753if ((octet & 0x40) != 0) {754ek[ 1] |= 4; ek[ 8] |= 1; ek[ 18] |= 4;755ek[ 25] |= 32; ek[ 34] |= 32; ek[ 41] |= 8;756ek[ 50] |= 8; ek[ 59] |= 32; ek[ 64] |= 16;757ek[ 75] |= 4; ek[ 90] |= 1; ek[ 97] |= 16;758ek[106] |= 2; ek[112] |= 2; ek[123] |= 1;759}760if ((octet & 0x20) != 0) {761ek[ 2] |= 1; ek[ 19] |= 8; ek[ 35] |= 1;762ek[ 40] |= 1; ek[ 50] |= 4; ek[ 57] |= 32;763ek[ 75] |= 2; ek[ 80] |= 32; ek[ 89] |= 1;764ek[ 96] |= 16; ek[107] |= 4; ek[120] |= 8;765}766if ((octet & 0x10) != 0) {767ek[ 4] |= 32; ek[ 20] |= 2; ek[ 31] |= 4;768ek[ 37] |= 32; ek[ 47] |= 1; ek[ 54] |= 1;769ek[ 63] |= 2; ek[ 68] |= 1; ek[ 78] |= 4;770ek[ 84] |= 8; ek[101] |= 16; ek[108] |= 4;771ek[119] |= 16; ek[126] |= 8;772}773if ((octet & 0x8) != 0) {774ek[ 5] |= 4; ek[ 15] |= 4; ek[ 21] |= 32;775ek[ 31] |= 1; ek[ 38] |= 1; ek[ 47] |= 2;776ek[ 53] |= 2; ek[ 68] |= 8; ek[ 85] |= 16;777ek[ 92] |= 4; ek[103] |= 16; ek[108] |= 32;778ek[118] |= 32; ek[124] |= 2;779}780if ((octet & 0x4) != 0) {781ek[ 15] |= 2; ek[ 21] |= 2; ek[ 39] |= 8;782ek[ 46] |= 16; ek[ 55] |= 32; ek[ 61] |= 1;783ek[ 71] |= 16; ek[ 76] |= 32; ek[ 86] |= 32;784ek[ 93] |= 4; ek[102] |= 2; ek[108] |= 16;785ek[117] |= 8; ek[126] |= 1;786}787if ((octet & 0x2) != 0) {788ek[ 14] |= 16; ek[ 23] |= 32; ek[ 29] |= 1;789ek[ 38] |= 8; ek[ 52] |= 2; ek[ 63] |= 4;790ek[ 70] |= 2; ek[ 76] |= 16; ek[ 85] |= 8;791ek[100] |= 1; ek[110] |= 4; ek[116] |= 8;792ek[127] |= 8;793}794octet = key[1];795if ((octet & 0x80) != 0) {796ek[ 1] |= 8; ek[ 8] |= 32; ek[ 17] |= 1;797ek[ 24] |= 16; ek[ 35] |= 4; ek[ 50] |= 1;798ek[ 57] |= 16; ek[ 67] |= 8; ek[ 83] |= 1;799ek[ 88] |= 1; ek[ 98] |= 4; ek[105] |= 32;800ek[114] |= 32; ek[123] |= 2;801}802if ((octet & 0x40) != 0) {803ek[ 0] |= 1; ek[ 11] |= 16; ek[ 16] |= 4;804ek[ 35] |= 2; ek[ 40] |= 32; ek[ 49] |= 1;805ek[ 56] |= 16; ek[ 65] |= 2; ek[ 74] |= 16;806ek[ 80] |= 8; ek[ 99] |= 8; ek[115] |= 1;807ek[121] |= 4;808}809if ((octet & 0x20) != 0) {810ek[ 9] |= 16; ek[ 18] |= 2; ek[ 24] |= 2;811ek[ 33] |= 4; ek[ 43] |= 16; ek[ 48] |= 4;812ek[ 66] |= 32; ek[ 73] |= 8; ek[ 82] |= 8;813ek[ 91] |= 32; ek[ 97] |= 2; ek[106] |= 16;814ek[112] |= 8; ek[122] |= 1;815}816if ((octet & 0x10) != 0) {817ek[ 14] |= 32; ek[ 21] |= 4; ek[ 30] |= 2;818ek[ 36] |= 16; ek[ 45] |= 8; ek[ 60] |= 1;819ek[ 69] |= 2; ek[ 87] |= 8; ek[ 94] |= 16;820ek[103] |= 32; ek[109] |= 1; ek[118] |= 8;821ek[124] |= 32;822}823if ((octet & 0x8) != 0) {824ek[ 7] |= 4; ek[ 14] |= 2; ek[ 20] |= 16;825ek[ 29] |= 8; ek[ 44] |= 1; ek[ 54] |= 4;826ek[ 60] |= 8; ek[ 71] |= 8; ek[ 78] |= 16;827ek[ 87] |= 32; ek[ 93] |= 1; ek[102] |= 8;828ek[116] |= 2; ek[125] |= 4;829}830if ((octet & 0x4) != 0) {831ek[ 7] |= 2; ek[ 12] |= 1; ek[ 22] |= 4;832ek[ 28] |= 8; ek[ 45] |= 16; ek[ 52] |= 4;833ek[ 63] |= 16; ek[ 70] |= 8; ek[ 84] |= 2;834ek[ 95] |= 4; ek[101] |= 32; ek[111] |= 1;835ek[118] |= 1;836}837if ((octet & 0x2) != 0) {838ek[ 6] |= 16; ek[ 13] |= 16; ek[ 20] |= 4;839ek[ 31] |= 16; ek[ 36] |= 32; ek[ 46] |= 32;840ek[ 53] |= 4; ek[ 62] |= 2; ek[ 69] |= 32;841ek[ 79] |= 1; ek[ 86] |= 1; ek[ 95] |= 2;842ek[101] |= 2; ek[119] |= 8;843}844octet = key[2];845if ((octet & 0x80) != 0) {846ek[ 0] |= 32; ek[ 10] |= 8; ek[ 19] |= 32;847ek[ 25] |= 2; ek[ 34] |= 16; ek[ 40] |= 8;848ek[ 59] |= 8; ek[ 66] |= 2; ek[ 72] |= 2;849ek[ 81] |= 4; ek[ 91] |= 16; ek[ 96] |= 4;850ek[115] |= 2; ek[121] |= 8;851}852if ((octet & 0x40) != 0) {853ek[ 3] |= 16; ek[ 10] |= 4; ek[ 17] |= 32;854ek[ 26] |= 32; ek[ 33] |= 8; ek[ 42] |= 8;855ek[ 51] |= 32; ek[ 57] |= 2; ek[ 67] |= 4;856ek[ 82] |= 1; ek[ 89] |= 16; ek[ 98] |= 2;857ek[104] |= 2; ek[113] |= 4; ek[120] |= 1;858}859if ((octet & 0x20) != 0) {860ek[ 1] |= 16; ek[ 11] |= 8; ek[ 27] |= 1;861ek[ 32] |= 1; ek[ 42] |= 4; ek[ 49] |= 32;862ek[ 58] |= 32; ek[ 67] |= 2; ek[ 72] |= 32;863ek[ 81] |= 1; ek[ 88] |= 16; ek[ 99] |= 4;864ek[114] |= 1;865}866if ((octet & 0x10) != 0) {867ek[ 6] |= 32; ek[ 12] |= 2; ek[ 23] |= 4;868ek[ 29] |= 32; ek[ 39] |= 1; ek[ 46] |= 1;869ek[ 55] |= 2; ek[ 61] |= 2; ek[ 70] |= 4;870ek[ 76] |= 8; ek[ 93] |= 16; ek[100] |= 4;871ek[111] |= 16; ek[116] |= 32;872}873if ((octet & 0x8) != 0) {874ek[ 6] |= 2; ek[ 13] |= 32; ek[ 23] |= 1;875ek[ 30] |= 1; ek[ 39] |= 2; ek[ 45] |= 2;876ek[ 63] |= 8; ek[ 77] |= 16; ek[ 84] |= 4;877ek[ 95] |= 16; ek[100] |= 32; ek[110] |= 32;878ek[117] |= 4; ek[127] |= 4;879}880if ((octet & 0x4) != 0) {881ek[ 4] |= 1; ek[ 13] |= 2; ek[ 31] |= 8;882ek[ 38] |= 16; ek[ 47] |= 32; ek[ 53] |= 1;883ek[ 62] |= 8; ek[ 68] |= 32; ek[ 78] |= 32;884ek[ 85] |= 4; ek[ 94] |= 2; ek[100] |= 16;885ek[109] |= 8; ek[127] |= 2;886}887if ((octet & 0x2) != 0) {888ek[ 5] |= 16; ek[ 15] |= 32; ek[ 21] |= 1;889ek[ 30] |= 8; ek[ 44] |= 2; ek[ 55] |= 4;890ek[ 61] |= 32; ek[ 68] |= 16; ek[ 77] |= 8;891ek[ 92] |= 1; ek[102] |= 4; ek[108] |= 8;892ek[126] |= 16;893}894octet = key[3];895if ((octet & 0x80) != 0) {896ek[ 2] |= 8; ek[ 9] |= 1; ek[ 16] |= 16;897ek[ 27] |= 4; ek[ 42] |= 1; ek[ 49] |= 16;898ek[ 58] |= 2; ek[ 75] |= 1; ek[ 80] |= 1;899ek[ 90] |= 4; ek[ 97] |= 32; ek[106] |= 32;900ek[113] |= 8; ek[120] |= 32;901}902if ((octet & 0x40) != 0) {903ek[ 2] |= 4; ek[ 8] |= 4; ek[ 27] |= 2;904ek[ 32] |= 32; ek[ 41] |= 1; ek[ 48] |= 16;905ek[ 59] |= 4; ek[ 66] |= 16; ek[ 72] |= 8;906ek[ 91] |= 8; ek[107] |= 1; ek[112] |= 1;907ek[123] |= 16;908}909if ((octet & 0x20) != 0) {910ek[ 3] |= 8; ek[ 10] |= 2; ek[ 16] |= 2;911ek[ 25] |= 4; ek[ 35] |= 16; ek[ 40] |= 4;912ek[ 59] |= 2; ek[ 65] |= 8; ek[ 74] |= 8;913ek[ 83] |= 32; ek[ 89] |= 2; ek[ 98] |= 16;914ek[104] |= 8; ek[121] |= 16;915}916if ((octet & 0x10) != 0) {917ek[ 4] |= 2; ek[ 13] |= 4; ek[ 22] |= 2;918ek[ 28] |= 16; ek[ 37] |= 8; ek[ 52] |= 1;919ek[ 62] |= 4; ek[ 79] |= 8; ek[ 86] |= 16;920ek[ 95] |= 32; ek[101] |= 1; ek[110] |= 8;921ek[126] |= 32;922}923if ((octet & 0x8) != 0) {924ek[ 5] |= 32; ek[ 12] |= 16; ek[ 21] |= 8;925ek[ 36] |= 1; ek[ 46] |= 4; ek[ 52] |= 8;926ek[ 70] |= 16; ek[ 79] |= 32; ek[ 85] |= 1;927ek[ 94] |= 8; ek[108] |= 2; ek[119] |= 4;928ek[126] |= 2;929}930if ((octet & 0x4) != 0) {931ek[ 5] |= 2; ek[ 14] |= 4; ek[ 20] |= 8;932ek[ 37] |= 16; ek[ 44] |= 4; ek[ 55] |= 16;933ek[ 60] |= 32; ek[ 76] |= 2; ek[ 87] |= 4;934ek[ 93] |= 32; ek[103] |= 1; ek[110] |= 1;935ek[119] |= 2; ek[124] |= 1;936}937if ((octet & 0x2) != 0) {938ek[ 7] |= 32; ek[ 12] |= 4; ek[ 23] |= 16;939ek[ 28] |= 32; ek[ 38] |= 32; ek[ 45] |= 4;940ek[ 54] |= 2; ek[ 60] |= 16; ek[ 71] |= 1;941ek[ 78] |= 1; ek[ 87] |= 2; ek[ 93] |= 2;942ek[111] |= 8; ek[118] |= 16; ek[125] |= 16;943}944octet = key[4];945if ((octet & 0x80) != 0) {946ek[ 1] |= 1; ek[ 11] |= 32; ek[ 17] |= 2;947ek[ 26] |= 16; ek[ 32] |= 8; ek[ 51] |= 8;948ek[ 64] |= 2; ek[ 73] |= 4; ek[ 83] |= 16;949ek[ 88] |= 4; ek[107] |= 2; ek[112] |= 32;950ek[122] |= 8;951}952if ((octet & 0x40) != 0) {953ek[ 0] |= 4; ek[ 9] |= 32; ek[ 18] |= 32;954ek[ 25] |= 8; ek[ 34] |= 8; ek[ 43] |= 32;955ek[ 49] |= 2; ek[ 58] |= 16; ek[ 74] |= 1;956ek[ 81] |= 16; ek[ 90] |= 2; ek[ 96] |= 2;957ek[105] |= 4; ek[115] |= 16; ek[122] |= 4;958}959if ((octet & 0x20) != 0) {960ek[ 2] |= 2; ek[ 19] |= 1; ek[ 24] |= 1;961ek[ 34] |= 4; ek[ 41] |= 32; ek[ 50] |= 32;962ek[ 57] |= 8; ek[ 64] |= 32; ek[ 73] |= 1;963ek[ 80] |= 16; ek[ 91] |= 4; ek[106] |= 1;964ek[113] |= 16; ek[123] |= 8;965}966if ((octet & 0x10) != 0) {967ek[ 3] |= 4; ek[ 10] |= 16; ek[ 16] |= 8;968ek[ 35] |= 8; ek[ 51] |= 1; ek[ 56] |= 1;969ek[ 67] |= 16; ek[ 72] |= 4; ek[ 91] |= 2;970ek[ 96] |= 32; ek[105] |= 1; ek[112] |= 16;971ek[121] |= 2;972}973if ((octet & 0x8) != 0) {974ek[ 4] |= 16; ek[ 15] |= 1; ek[ 22] |= 1;975ek[ 31] |= 2; ek[ 37] |= 2; ek[ 55] |= 8;976ek[ 62] |= 16; ek[ 69] |= 16; ek[ 76] |= 4;977ek[ 87] |= 16; ek[ 92] |= 32; ek[102] |= 32;978ek[109] |= 4; ek[118] |= 2; ek[125] |= 32;979}980if ((octet & 0x4) != 0) {981ek[ 6] |= 4; ek[ 23] |= 8; ek[ 30] |= 16;982ek[ 39] |= 32; ek[ 45] |= 1; ek[ 54] |= 8;983ek[ 70] |= 32; ek[ 77] |= 4; ek[ 86] |= 2;984ek[ 92] |= 16; ek[101] |= 8; ek[116] |= 1;985ek[125] |= 2;986}987if ((octet & 0x2) != 0) {988ek[ 4] |= 4; ek[ 13] |= 1; ek[ 22] |= 8;989ek[ 36] |= 2; ek[ 47] |= 4; ek[ 53] |= 32;990ek[ 63] |= 1; ek[ 69] |= 8; ek[ 84] |= 1;991ek[ 94] |= 4; ek[100] |= 8; ek[117] |= 16;992ek[127] |= 32;993}994octet = key[5];995if ((octet & 0x80) != 0) {996ek[ 3] |= 32; ek[ 8] |= 16; ek[ 19] |= 4;997ek[ 34] |= 1; ek[ 41] |= 16; ek[ 50] |= 2;998ek[ 56] |= 2; ek[ 67] |= 1; ek[ 72] |= 1;999ek[ 82] |= 4; ek[ 89] |= 32; ek[ 98] |= 32;1000ek[105] |= 8; ek[114] |= 8; ek[121] |= 1;1001}1002if ((octet & 0x40) != 0) {1003ek[ 1] |= 32; ek[ 19] |= 2; ek[ 24] |= 32;1004ek[ 33] |= 1; ek[ 40] |= 16; ek[ 51] |= 4;1005ek[ 64] |= 8; ek[ 83] |= 8; ek[ 99] |= 1;1006ek[104] |= 1; ek[114] |= 4; ek[120] |= 4;1007}1008if ((octet & 0x20) != 0) {1009ek[ 8] |= 2; ek[ 17] |= 4; ek[ 27] |= 16;1010ek[ 32] |= 4; ek[ 51] |= 2; ek[ 56] |= 32;1011ek[ 66] |= 8; ek[ 75] |= 32; ek[ 81] |= 2;1012ek[ 90] |= 16; ek[ 96] |= 8; ek[115] |= 8;1013ek[122] |= 2;1014}1015if ((octet & 0x10) != 0) {1016ek[ 2] |= 16; ek[ 18] |= 1; ek[ 25] |= 16;1017ek[ 34] |= 2; ek[ 40] |= 2; ek[ 49] |= 4;1018ek[ 59] |= 16; ek[ 66] |= 4; ek[ 73] |= 32;1019ek[ 82] |= 32; ek[ 89] |= 8; ek[ 98] |= 8;1020ek[107] |= 32; ek[113] |= 2; ek[123] |= 4;1021}1022if ((octet & 0x8) != 0) {1023ek[ 7] |= 1; ek[ 13] |= 8; ek[ 28] |= 1;1024ek[ 38] |= 4; ek[ 44] |= 8; ek[ 61] |= 16;1025ek[ 71] |= 32; ek[ 77] |= 1; ek[ 86] |= 8;1026ek[100] |= 2; ek[111] |= 4; ek[117] |= 32;1027ek[124] |= 16;1028}1029if ((octet & 0x4) != 0) {1030ek[ 12] |= 8; ek[ 29] |= 16; ek[ 36] |= 4;1031ek[ 47] |= 16; ek[ 52] |= 32; ek[ 62] |= 32;1032ek[ 68] |= 2; ek[ 79] |= 4; ek[ 85] |= 32;1033ek[ 95] |= 1; ek[102] |= 1; ek[111] |= 2;1034ek[117] |= 2; ek[126] |= 4;1035}1036if ((octet & 0x2) != 0) {1037ek[ 5] |= 1; ek[ 15] |= 16; ek[ 20] |= 32;1038ek[ 30] |= 32; ek[ 37] |= 4; ek[ 46] |= 2;1039ek[ 52] |= 16; ek[ 61] |= 8; ek[ 70] |= 1;1040ek[ 79] |= 2; ek[ 85] |= 2; ek[103] |= 8;1041ek[110] |= 16; ek[119] |= 32; ek[124] |= 4;1042}1043octet = key[6];1044if ((octet & 0x80) != 0) {1045ek[ 0] |= 16; ek[ 9] |= 2; ek[ 18] |= 16;1046ek[ 24] |= 8; ek[ 43] |= 8; ek[ 59] |= 1;1047ek[ 65] |= 4; ek[ 75] |= 16; ek[ 80] |= 4;1048ek[ 99] |= 2; ek[104] |= 32; ek[113] |= 1;1049ek[123] |= 32;1050}1051if ((octet & 0x40) != 0) {1052ek[ 10] |= 32; ek[ 17] |= 8; ek[ 26] |= 8;1053ek[ 35] |= 32; ek[ 41] |= 2; ek[ 50] |= 16;1054ek[ 56] |= 8; ek[ 66] |= 1; ek[ 73] |= 16;1055ek[ 82] |= 2; ek[ 88] |= 2; ek[ 97] |= 4;1056ek[107] |= 16; ek[112] |= 4; ek[121] |= 32;1057}1058if ((octet & 0x20) != 0) {1059ek[ 0] |= 2; ek[ 11] |= 1; ek[ 16] |= 1;1060ek[ 26] |= 4; ek[ 33] |= 32; ek[ 42] |= 32;1061ek[ 49] |= 8; ek[ 58] |= 8; ek[ 65] |= 1;1062ek[ 72] |= 16; ek[ 83] |= 4; ek[ 98] |= 1;1063ek[105] |= 16; ek[114] |= 2;1064}1065if ((octet & 0x10) != 0) {1066ek[ 8] |= 8; ek[ 27] |= 8; ek[ 43] |= 1;1067ek[ 48] |= 1; ek[ 58] |= 4; ek[ 64] |= 4;1068ek[ 83] |= 2; ek[ 88] |= 32; ek[ 97] |= 1;1069ek[104] |= 16; ek[115] |= 4; ek[122] |= 16;1070}1071if ((octet & 0x8) != 0) {1072ek[ 5] |= 8; ek[ 14] |= 1; ek[ 23] |= 2;1073ek[ 29] |= 2; ek[ 47] |= 8; ek[ 54] |= 16;1074ek[ 63] |= 32; ek[ 68] |= 4; ek[ 79] |= 16;1075ek[ 84] |= 32; ek[ 94] |= 32; ek[101] |= 4;1076ek[110] |= 2; ek[116] |= 16; ek[127] |= 1;1077}1078if ((octet & 0x4) != 0) {1079ek[ 4] |= 8; ek[ 15] |= 8; ek[ 22] |= 16;1080ek[ 31] |= 32; ek[ 37] |= 1; ek[ 46] |= 8;1081ek[ 60] |= 2; ek[ 69] |= 4; ek[ 78] |= 2;1082ek[ 84] |= 16; ek[ 93] |= 8; ek[108] |= 1;1083ek[118] |= 4;1084}1085if ((octet & 0x2) != 0) {1086ek[ 7] |= 16; ek[ 14] |= 8; ek[ 28] |= 2;1087ek[ 39] |= 4; ek[ 45] |= 32; ek[ 55] |= 1;1088ek[ 62] |= 1; ek[ 76] |= 1; ek[ 86] |= 4;1089ek[ 92] |= 8; ek[109] |= 16; ek[116] |= 4;1090ek[125] |= 1;1091}1092octet = key[7];1093if ((octet & 0x80) != 0) {1094ek[ 1] |= 2; ek[ 11] |= 4; ek[ 26] |= 1;1095ek[ 33] |= 16; ek[ 42] |= 2; ek[ 48] |= 2;1096ek[ 57] |= 4; ek[ 64] |= 1; ek[ 74] |= 4;1097ek[ 81] |= 32; ek[ 90] |= 32; ek[ 97] |= 8;1098ek[106] |= 8; ek[115] |= 32; ek[120] |= 16;1099}1100if ((octet & 0x40) != 0) {1101ek[ 2] |= 32; ek[ 11] |= 2; ek[ 16] |= 32;1102ek[ 25] |= 1; ek[ 32] |= 16; ek[ 43] |= 4;1103ek[ 58] |= 1; ek[ 75] |= 8; ek[ 91] |= 1;1104ek[ 96] |= 1; ek[106] |= 4; ek[113] |= 32;1105}1106if ((octet & 0x20) != 0) {1107ek[ 3] |= 1; ek[ 9] |= 4; ek[ 19] |= 16;1108ek[ 24] |= 4; ek[ 43] |= 2; ek[ 48] |= 32;1109ek[ 57] |= 1; ek[ 67] |= 32; ek[ 73] |= 2;1110ek[ 82] |= 16; ek[ 88] |= 8; ek[107] |= 8;1111ek[120] |= 2;1112}1113if ((octet & 0x10) != 0) {1114ek[ 0] |= 8; ek[ 10] |= 1; ek[ 17] |= 16;1115ek[ 26] |= 2; ek[ 32] |= 2; ek[ 41] |= 4;1116ek[ 51] |= 16; ek[ 56] |= 4; ek[ 65] |= 32;1117ek[ 74] |= 32; ek[ 81] |= 8; ek[ 90] |= 8;1118ek[ 99] |= 32; ek[105] |= 2; ek[114] |= 16;1119}1120if ((octet & 0x8) != 0) {1121ek[ 6] |= 1; ek[ 20] |= 1; ek[ 30] |= 4;1122ek[ 36] |= 8; ek[ 53] |= 16; ek[ 60] |= 4;1123ek[ 69] |= 1; ek[ 78] |= 8; ek[ 92] |= 2;1124ek[103] |= 4; ek[109] |= 32; ek[119] |= 1;1125ek[125] |= 8;1126}1127if ((octet & 0x4) != 0) {1128ek[ 7] |= 8; ek[ 21] |= 16; ek[ 28] |= 4;1129ek[ 39] |= 16; ek[ 44] |= 32; ek[ 54] |= 32;1130ek[ 61] |= 4; ek[ 71] |= 4; ek[ 77] |= 32;1131ek[ 87] |= 1; ek[ 94] |= 1; ek[103] |= 2;1132ek[109] |= 2; ek[124] |= 8;1133}1134if ((octet & 0x2) != 0) {1135ek[ 6] |= 8; ek[ 12] |= 32; ek[ 22] |= 32;1136ek[ 29] |= 4; ek[ 38] |= 2; ek[ 44] |= 16;1137ek[ 53] |= 8; ek[ 71] |= 2; ek[ 77] |= 2;1138ek[ 95] |= 8; ek[102] |= 16; ek[111] |= 32;1139ek[117] |= 1; ek[127] |= 16;1140}11411142expandedKey = ek;1143}1144}114511461147