| /* Serpent.java -- |
| Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc. |
| |
| This file is a part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or (at |
| your option) any later version. |
| |
| GNU Classpath is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 |
| USA |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| |
| package gnu.javax.crypto.cipher; |
| |
| import gnu.java.security.Registry; |
| import gnu.java.security.util.Util; |
| |
| import java.security.InvalidKeyException; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| |
| /** |
| * Serpent is a 32-round substitution-permutation network block cipher, |
| * operating on 128-bit blocks and accepting keys of 128, 192, and 256 bits in |
| * length. At each round the plaintext is XORed with a 128 bit portion of the |
| * session key -- a 4224 bit key computed from the input key -- then one of |
| * eight S-boxes are applied, and finally a simple linear transformation is |
| * done. Decryption does the exact same thing in reverse order, and using the |
| * eight inverses of the S-boxes. |
| * <p> |
| * Serpent was designed by Ross Anderson, Eli Biham, and Lars Knudsen as a |
| * proposed cipher for the Advanced Encryption Standard. |
| * <p> |
| * Serpent can be sped up greatly by replacing S-box substitution with a |
| * sequence of binary operations, and the optimal implementation depends upon |
| * finding the fastest sequence of binary operations that reproduce this |
| * substitution. This implementation uses the S-boxes discovered by <a |
| * href="http://www.ii.uib.no/~osvik/">Dag Arne Osvik</a>, which are optimized |
| * for the Pentium family of processors. |
| * <p> |
| * References: |
| * <ol> |
| * <li><a href="http://www.cl.cam.ac.uk/~rja14/serpent.html">Serpent: A |
| * Candidate Block Cipher for the Advanced Encryption Standard.</a></li> |
| * </ol> |
| */ |
| public class Serpent |
| extends BaseCipher |
| { |
| private static final int DEFAULT_KEY_SIZE = 16; |
| private static final int DEFAULT_BLOCK_SIZE = 16; |
| private static final int ROUNDS = 32; |
| /** The fractional part of the golden ratio, (sqrt(5)+1)/2. */ |
| private static final int PHI = 0x9e3779b9; |
| /** |
| * KAT vector (from ecb_vk): I=9 |
| * KEY=008000000000000000000000000000000000000000000000 |
| * CT=5587B5BCB9EE5A28BA2BACC418005240 |
| */ |
| private static final byte[] KAT_KEY = Util.toReversedBytesFromString( |
| "008000000000000000000000000000000000000000000000"); |
| private static final byte[] KAT_CT = |
| Util.toReversedBytesFromString("5587B5BCB9EE5A28BA2BACC418005240"); |
| /** caches the result of the correctness test, once executed. */ |
| private static Boolean valid; |
| private int x0, x1, x2, x3, x4; |
| |
| /** Trivial zero-argument constructor. */ |
| public Serpent() |
| { |
| super(Registry.SERPENT_CIPHER, DEFAULT_BLOCK_SIZE, DEFAULT_KEY_SIZE); |
| } |
| |
| public Object clone() |
| { |
| Serpent result = new Serpent(); |
| result.currentBlockSize = this.currentBlockSize; |
| return result; |
| } |
| |
| public Iterator blockSizes() |
| { |
| return Collections.singleton(Integer.valueOf(DEFAULT_BLOCK_SIZE)).iterator(); |
| } |
| |
| public Iterator keySizes() |
| { |
| ArrayList keySizes = new ArrayList(); |
| keySizes.add(Integer.valueOf(16)); |
| keySizes.add(Integer.valueOf(24)); |
| keySizes.add(Integer.valueOf(32)); |
| return Collections.unmodifiableList(keySizes).iterator(); |
| } |
| |
| public Object makeKey(byte[] kb, int blockSize) throws InvalidKeyException |
| { |
| // Not strictly true, but here to conform with the AES proposal. |
| // This restriction can be removed if deemed necessary. |
| if (kb.length != 16 && kb.length != 24 && kb.length != 32) |
| throw new InvalidKeyException("Key length is not 16, 24, or 32 bytes"); |
| Key key = new Key(); |
| // Here w is our "pre-key". |
| int[] w = new int[4 * (ROUNDS + 1)]; |
| int i, j; |
| for (i = 0, j = 0; i < 8 && j < kb.length; i++) |
| w[i] = (kb[j++] & 0xff) |
| | (kb[j++] & 0xff) << 8 |
| | (kb[j++] & 0xff) << 16 |
| | (kb[j++] & 0xff) << 24; |
| // Pad key if < 256 bits. |
| if (i != 8) |
| w[i] = 1; |
| // Transform using w_i-8 ... w_i-1 |
| for (i = 8, j = 0; i < 16; i++) |
| { |
| int t = w[j] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ j++; |
| w[i] = t << 11 | t >>> 21; |
| } |
| // Translate by 8. |
| for (i = 0; i < 8; i++) |
| w[i] = w[i + 8]; |
| // Transform the rest of the key. |
| for (; i < w.length; i++) |
| { |
| int t = w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i; |
| w[i] = t << 11 | t >>> 21; |
| } |
| // After these s-boxes the pre-key (w, above) will become the |
| // session key (key, below). |
| sbox3(w[0], w[1], w[2], w[3]); |
| key.k0 = x0; |
| key.k1 = x1; |
| key.k2 = x2; |
| key.k3 = x3; |
| sbox2(w[4], w[5], w[6], w[7]); |
| key.k4 = x0; |
| key.k5 = x1; |
| key.k6 = x2; |
| key.k7 = x3; |
| sbox1(w[8], w[9], w[10], w[11]); |
| key.k8 = x0; |
| key.k9 = x1; |
| key.k10 = x2; |
| key.k11 = x3; |
| sbox0(w[12], w[13], w[14], w[15]); |
| key.k12 = x0; |
| key.k13 = x1; |
| key.k14 = x2; |
| key.k15 = x3; |
| sbox7(w[16], w[17], w[18], w[19]); |
| key.k16 = x0; |
| key.k17 = x1; |
| key.k18 = x2; |
| key.k19 = x3; |
| sbox6(w[20], w[21], w[22], w[23]); |
| key.k20 = x0; |
| key.k21 = x1; |
| key.k22 = x2; |
| key.k23 = x3; |
| sbox5(w[24], w[25], w[26], w[27]); |
| key.k24 = x0; |
| key.k25 = x1; |
| key.k26 = x2; |
| key.k27 = x3; |
| sbox4(w[28], w[29], w[30], w[31]); |
| key.k28 = x0; |
| key.k29 = x1; |
| key.k30 = x2; |
| key.k31 = x3; |
| sbox3(w[32], w[33], w[34], w[35]); |
| key.k32 = x0; |
| key.k33 = x1; |
| key.k34 = x2; |
| key.k35 = x3; |
| sbox2(w[36], w[37], w[38], w[39]); |
| key.k36 = x0; |
| key.k37 = x1; |
| key.k38 = x2; |
| key.k39 = x3; |
| sbox1(w[40], w[41], w[42], w[43]); |
| key.k40 = x0; |
| key.k41 = x1; |
| key.k42 = x2; |
| key.k43 = x3; |
| sbox0(w[44], w[45], w[46], w[47]); |
| key.k44 = x0; |
| key.k45 = x1; |
| key.k46 = x2; |
| key.k47 = x3; |
| sbox7(w[48], w[49], w[50], w[51]); |
| key.k48 = x0; |
| key.k49 = x1; |
| key.k50 = x2; |
| key.k51 = x3; |
| sbox6(w[52], w[53], w[54], w[55]); |
| key.k52 = x0; |
| key.k53 = x1; |
| key.k54 = x2; |
| key.k55 = x3; |
| sbox5(w[56], w[57], w[58], w[59]); |
| key.k56 = x0; |
| key.k57 = x1; |
| key.k58 = x2; |
| key.k59 = x3; |
| sbox4(w[60], w[61], w[62], w[63]); |
| key.k60 = x0; |
| key.k61 = x1; |
| key.k62 = x2; |
| key.k63 = x3; |
| sbox3(w[64], w[65], w[66], w[67]); |
| key.k64 = x0; |
| key.k65 = x1; |
| key.k66 = x2; |
| key.k67 = x3; |
| sbox2(w[68], w[69], w[70], w[71]); |
| key.k68 = x0; |
| key.k69 = x1; |
| key.k70 = x2; |
| key.k71 = x3; |
| sbox1(w[72], w[73], w[74], w[75]); |
| key.k72 = x0; |
| key.k73 = x1; |
| key.k74 = x2; |
| key.k75 = x3; |
| sbox0(w[76], w[77], w[78], w[79]); |
| key.k76 = x0; |
| key.k77 = x1; |
| key.k78 = x2; |
| key.k79 = x3; |
| sbox7(w[80], w[81], w[82], w[83]); |
| key.k80 = x0; |
| key.k81 = x1; |
| key.k82 = x2; |
| key.k83 = x3; |
| sbox6(w[84], w[85], w[86], w[87]); |
| key.k84 = x0; |
| key.k85 = x1; |
| key.k86 = x2; |
| key.k87 = x3; |
| sbox5(w[88], w[89], w[90], w[91]); |
| key.k88 = x0; |
| key.k89 = x1; |
| key.k90 = x2; |
| key.k91 = x3; |
| sbox4(w[92], w[93], w[94], w[95]); |
| key.k92 = x0; |
| key.k93 = x1; |
| key.k94 = x2; |
| key.k95 = x3; |
| sbox3(w[96], w[97], w[98], w[99]); |
| key.k96 = x0; |
| key.k97 = x1; |
| key.k98 = x2; |
| key.k99 = x3; |
| sbox2(w[100], w[101], w[102], w[103]); |
| key.k100 = x0; |
| key.k101 = x1; |
| key.k102 = x2; |
| key.k103 = x3; |
| sbox1(w[104], w[105], w[106], w[107]); |
| key.k104 = x0; |
| key.k105 = x1; |
| key.k106 = x2; |
| key.k107 = x3; |
| sbox0(w[108], w[109], w[110], w[111]); |
| key.k108 = x0; |
| key.k109 = x1; |
| key.k110 = x2; |
| key.k111 = x3; |
| sbox7(w[112], w[113], w[114], w[115]); |
| key.k112 = x0; |
| key.k113 = x1; |
| key.k114 = x2; |
| key.k115 = x3; |
| sbox6(w[116], w[117], w[118], w[119]); |
| key.k116 = x0; |
| key.k117 = x1; |
| key.k118 = x2; |
| key.k119 = x3; |
| sbox5(w[120], w[121], w[122], w[123]); |
| key.k120 = x0; |
| key.k121 = x1; |
| key.k122 = x2; |
| key.k123 = x3; |
| sbox4(w[124], w[125], w[126], w[127]); |
| key.k124 = x0; |
| key.k125 = x1; |
| key.k126 = x2; |
| key.k127 = x3; |
| sbox3(w[128], w[129], w[130], w[131]); |
| key.k128 = x0; |
| key.k129 = x1; |
| key.k130 = x2; |
| key.k131 = x3; |
| return key; |
| } |
| |
| public synchronized void encrypt(byte[] in, int i, byte[] out, int o, |
| Object K, int bs) |
| { |
| Key key = (Key) K; |
| x0 = (in[i ] & 0xff) |
| | (in[i + 1] & 0xff) << 8 |
| | (in[i + 2] & 0xff) << 16 |
| | (in[i + 3] & 0xff) << 24; |
| x1 = (in[i + 4] & 0xff) |
| | (in[i + 5] & 0xff) << 8 |
| | (in[i + 6] & 0xff) << 16 |
| | (in[i + 7] & 0xff) << 24; |
| x2 = (in[i + 8] & 0xff) |
| | (in[i + 9] & 0xff) << 8 |
| | (in[i + 10] & 0xff) << 16 |
| | (in[i + 11] & 0xff) << 24; |
| x3 = (in[i + 12] & 0xff) |
| | (in[i + 13] & 0xff) << 8 |
| | (in[i + 14] & 0xff) << 16 |
| | (in[i + 15] & 0xff) << 24; |
| x0 ^= key.k0; |
| x1 ^= key.k1; |
| x2 ^= key.k2; |
| x3 ^= key.k3; |
| sbox0(); |
| x1 ^= key.k4; |
| x4 ^= key.k5; |
| x2 ^= key.k6; |
| x0 ^= key.k7; |
| sbox1(); |
| x0 ^= key.k8; |
| x4 ^= key.k9; |
| x2 ^= key.k10; |
| x1 ^= key.k11; |
| sbox2(); |
| x2 ^= key.k12; |
| x1 ^= key.k13; |
| x4 ^= key.k14; |
| x3 ^= key.k15; |
| sbox3(); |
| x1 ^= key.k16; |
| x4 ^= key.k17; |
| x3 ^= key.k18; |
| x0 ^= key.k19; |
| sbox4(); |
| x4 ^= key.k20; |
| x2 ^= key.k21; |
| x1 ^= key.k22; |
| x0 ^= key.k23; |
| sbox5(); |
| x2 ^= key.k24; |
| x0 ^= key.k25; |
| x4 ^= key.k26; |
| x1 ^= key.k27; |
| sbox6(); |
| x2 ^= key.k28; |
| x0 ^= key.k29; |
| x3 ^= key.k30; |
| x4 ^= key.k31; |
| sbox7(); |
| x0 = x3; |
| x3 = x2; |
| x2 = x4; |
| x0 ^= key.k32; |
| x1 ^= key.k33; |
| x2 ^= key.k34; |
| x3 ^= key.k35; |
| sbox0(); |
| x1 ^= key.k36; |
| x4 ^= key.k37; |
| x2 ^= key.k38; |
| x0 ^= key.k39; |
| sbox1(); |
| x0 ^= key.k40; |
| x4 ^= key.k41; |
| x2 ^= key.k42; |
| x1 ^= key.k43; |
| sbox2(); |
| x2 ^= key.k44; |
| x1 ^= key.k45; |
| x4 ^= key.k46; |
| x3 ^= key.k47; |
| sbox3(); |
| x1 ^= key.k48; |
| x4 ^= key.k49; |
| x3 ^= key.k50; |
| x0 ^= key.k51; |
| sbox4(); |
| x4 ^= key.k52; |
| x2 ^= key.k53; |
| x1 ^= key.k54; |
| x0 ^= key.k55; |
| sbox5(); |
| x2 ^= key.k56; |
| x0 ^= key.k57; |
| x4 ^= key.k58; |
| x1 ^= key.k59; |
| sbox6(); |
| x2 ^= key.k60; |
| x0 ^= key.k61; |
| x3 ^= key.k62; |
| x4 ^= key.k63; |
| sbox7(); |
| x0 = x3; |
| x3 = x2; |
| x2 = x4; |
| x0 ^= key.k64; |
| x1 ^= key.k65; |
| x2 ^= key.k66; |
| x3 ^= key.k67; |
| sbox0(); |
| x1 ^= key.k68; |
| x4 ^= key.k69; |
| x2 ^= key.k70; |
| x0 ^= key.k71; |
| sbox1(); |
| x0 ^= key.k72; |
| x4 ^= key.k73; |
| x2 ^= key.k74; |
| x1 ^= key.k75; |
| sbox2(); |
| x2 ^= key.k76; |
| x1 ^= key.k77; |
| x4 ^= key.k78; |
| x3 ^= key.k79; |
| sbox3(); |
| x1 ^= key.k80; |
| x4 ^= key.k81; |
| x3 ^= key.k82; |
| x0 ^= key.k83; |
| sbox4(); |
| x4 ^= key.k84; |
| x2 ^= key.k85; |
| x1 ^= key.k86; |
| x0 ^= key.k87; |
| sbox5(); |
| x2 ^= key.k88; |
| x0 ^= key.k89; |
| x4 ^= key.k90; |
| x1 ^= key.k91; |
| sbox6(); |
| x2 ^= key.k92; |
| x0 ^= key.k93; |
| x3 ^= key.k94; |
| x4 ^= key.k95; |
| sbox7(); |
| x0 = x3; |
| x3 = x2; |
| x2 = x4; |
| x0 ^= key.k96; |
| x1 ^= key.k97; |
| x2 ^= key.k98; |
| x3 ^= key.k99; |
| sbox0(); |
| x1 ^= key.k100; |
| x4 ^= key.k101; |
| x2 ^= key.k102; |
| x0 ^= key.k103; |
| sbox1(); |
| x0 ^= key.k104; |
| x4 ^= key.k105; |
| x2 ^= key.k106; |
| x1 ^= key.k107; |
| sbox2(); |
| x2 ^= key.k108; |
| x1 ^= key.k109; |
| x4 ^= key.k110; |
| x3 ^= key.k111; |
| sbox3(); |
| x1 ^= key.k112; |
| x4 ^= key.k113; |
| x3 ^= key.k114; |
| x0 ^= key.k115; |
| sbox4(); |
| x4 ^= key.k116; |
| x2 ^= key.k117; |
| x1 ^= key.k118; |
| x0 ^= key.k119; |
| sbox5(); |
| x2 ^= key.k120; |
| x0 ^= key.k121; |
| x4 ^= key.k122; |
| x1 ^= key.k123; |
| sbox6(); |
| x2 ^= key.k124; |
| x0 ^= key.k125; |
| x3 ^= key.k126; |
| x4 ^= key.k127; |
| sbox7noLT(); |
| x0 = x3; |
| x3 = x2; |
| x2 = x4; |
| x0 ^= key.k128; |
| x1 ^= key.k129; |
| x2 ^= key.k130; |
| x3 ^= key.k131; |
| out[o ] = (byte) x0; |
| out[o + 1] = (byte)(x0 >>> 8); |
| out[o + 2] = (byte)(x0 >>> 16); |
| out[o + 3] = (byte)(x0 >>> 24); |
| out[o + 4] = (byte) x1; |
| out[o + 5] = (byte)(x1 >>> 8); |
| out[o + 6] = (byte)(x1 >>> 16); |
| out[o + 7] = (byte)(x1 >>> 24); |
| out[o + 8] = (byte) x2; |
| out[o + 9] = (byte)(x2 >>> 8); |
| out[o + 10] = (byte)(x2 >>> 16); |
| out[o + 11] = (byte)(x2 >>> 24); |
| out[o + 12] = (byte) x3; |
| out[o + 13] = (byte)(x3 >>> 8); |
| out[o + 14] = (byte)(x3 >>> 16); |
| out[o + 15] = (byte)(x3 >>> 24); |
| } |
| |
| public synchronized void decrypt(byte[] in, int i, byte[] out, int o, |
| Object K, int bs) |
| { |
| Key key = (Key) K; |
| x0 = (in[i ] & 0xff) |
| | (in[i + 1] & 0xff) << 8 |
| | (in[i + 2] & 0xff) << 16 |
| | (in[i + 3] & 0xff) << 24; |
| x1 = (in[i + 4] & 0xff) |
| | (in[i + 5] & 0xff) << 8 |
| | (in[i + 6] & 0xff) << 16 |
| | (in[i + 7] & 0xff) << 24; |
| x2 = (in[i + 8] & 0xff) |
| | (in[i + 9] & 0xff) << 8 |
| | (in[i + 10] & 0xff) << 16 |
| | (in[i + 11] & 0xff) << 24; |
| x3 = (in[i + 12] & 0xff) |
| | (in[i + 13] & 0xff) << 8 |
| | (in[i + 14] & 0xff) << 16 |
| | (in[i + 15] & 0xff) << 24; |
| x0 ^= key.k128; |
| x1 ^= key.k129; |
| x2 ^= key.k130; |
| x3 ^= key.k131; |
| sboxI7noLT(); |
| x3 ^= key.k124; |
| x0 ^= key.k125; |
| x1 ^= key.k126; |
| x4 ^= key.k127; |
| sboxI6(); |
| x0 ^= key.k120; |
| x1 ^= key.k121; |
| x2 ^= key.k122; |
| x4 ^= key.k123; |
| sboxI5(); |
| x1 ^= key.k116; |
| x3 ^= key.k117; |
| x4 ^= key.k118; |
| x2 ^= key.k119; |
| sboxI4(); |
| x1 ^= key.k112; |
| x2 ^= key.k113; |
| x4 ^= key.k114; |
| x0 ^= key.k115; |
| sboxI3(); |
| x0 ^= key.k108; |
| x1 ^= key.k109; |
| x4 ^= key.k110; |
| x2 ^= key.k111; |
| sboxI2(); |
| x1 ^= key.k104; |
| x3 ^= key.k105; |
| x4 ^= key.k106; |
| x2 ^= key.k107; |
| sboxI1(); |
| x0 ^= key.k100; |
| x1 ^= key.k101; |
| x2 ^= key.k102; |
| x4 ^= key.k103; |
| sboxI0(); |
| x0 ^= key.k96; |
| x3 ^= key.k97; |
| x1 ^= key.k98; |
| x4 ^= key.k99; |
| sboxI7(); |
| x1 = x3; |
| x3 = x4; |
| x4 = x2; |
| x3 ^= key.k92; |
| x0 ^= key.k93; |
| x1 ^= key.k94; |
| x4 ^= key.k95; |
| sboxI6(); |
| x0 ^= key.k88; |
| x1 ^= key.k89; |
| x2 ^= key.k90; |
| x4 ^= key.k91; |
| sboxI5(); |
| x1 ^= key.k84; |
| x3 ^= key.k85; |
| x4 ^= key.k86; |
| x2 ^= key.k87; |
| sboxI4(); |
| x1 ^= key.k80; |
| x2 ^= key.k81; |
| x4 ^= key.k82; |
| x0 ^= key.k83; |
| sboxI3(); |
| x0 ^= key.k76; |
| x1 ^= key.k77; |
| x4 ^= key.k78; |
| x2 ^= key.k79; |
| sboxI2(); |
| x1 ^= key.k72; |
| x3 ^= key.k73; |
| x4 ^= key.k74; |
| x2 ^= key.k75; |
| sboxI1(); |
| x0 ^= key.k68; |
| x1 ^= key.k69; |
| x2 ^= key.k70; |
| x4 ^= key.k71; |
| sboxI0(); |
| x0 ^= key.k64; |
| x3 ^= key.k65; |
| x1 ^= key.k66; |
| x4 ^= key.k67; |
| sboxI7(); |
| x1 = x3; |
| x3 = x4; |
| x4 = x2; |
| x3 ^= key.k60; |
| x0 ^= key.k61; |
| x1 ^= key.k62; |
| x4 ^= key.k63; |
| sboxI6(); |
| x0 ^= key.k56; |
| x1 ^= key.k57; |
| x2 ^= key.k58; |
| x4 ^= key.k59; |
| sboxI5(); |
| x1 ^= key.k52; |
| x3 ^= key.k53; |
| x4 ^= key.k54; |
| x2 ^= key.k55; |
| sboxI4(); |
| x1 ^= key.k48; |
| x2 ^= key.k49; |
| x4 ^= key.k50; |
| x0 ^= key.k51; |
| sboxI3(); |
| x0 ^= key.k44; |
| x1 ^= key.k45; |
| x4 ^= key.k46; |
| x2 ^= key.k47; |
| sboxI2(); |
| x1 ^= key.k40; |
| x3 ^= key.k41; |
| x4 ^= key.k42; |
| x2 ^= key.k43; |
| sboxI1(); |
| x0 ^= key.k36; |
| x1 ^= key.k37; |
| x2 ^= key.k38; |
| x4 ^= key.k39; |
| sboxI0(); |
| x0 ^= key.k32; |
| x3 ^= key.k33; |
| x1 ^= key.k34; |
| x4 ^= key.k35; |
| sboxI7(); |
| x1 = x3; |
| x3 = x4; |
| x4 = x2; |
| x3 ^= key.k28; |
| x0 ^= key.k29; |
| x1 ^= key.k30; |
| x4 ^= key.k31; |
| sboxI6(); |
| x0 ^= key.k24; |
| x1 ^= key.k25; |
| x2 ^= key.k26; |
| x4 ^= key.k27; |
| sboxI5(); |
| x1 ^= key.k20; |
| x3 ^= key.k21; |
| x4 ^= key.k22; |
| x2 ^= key.k23; |
| sboxI4(); |
| x1 ^= key.k16; |
| x2 ^= key.k17; |
| x4 ^= key.k18; |
| x0 ^= key.k19; |
| sboxI3(); |
| x0 ^= key.k12; |
| x1 ^= key.k13; |
| x4 ^= key.k14; |
| x2 ^= key.k15; |
| sboxI2(); |
| x1 ^= key.k8; |
| x3 ^= key.k9; |
| x4 ^= key.k10; |
| x2 ^= key.k11; |
| sboxI1(); |
| x0 ^= key.k4; |
| x1 ^= key.k5; |
| x2 ^= key.k6; |
| x4 ^= key.k7; |
| sboxI0(); |
| x2 = x1; |
| x1 = x3; |
| x3 = x4; |
| x0 ^= key.k0; |
| x1 ^= key.k1; |
| x2 ^= key.k2; |
| x3 ^= key.k3; |
| out[o ] = (byte) x0; |
| out[o + 1] = (byte)(x0 >>> 8); |
| out[o + 2] = (byte)(x0 >>> 16); |
| out[o + 3] = (byte)(x0 >>> 24); |
| out[o + 4] = (byte) x1; |
| out[o + 5] = (byte)(x1 >>> 8); |
| out[o + 6] = (byte)(x1 >>> 16); |
| out[o + 7] = (byte)(x1 >>> 24); |
| out[o + 8] = (byte) x2; |
| out[o + 9] = (byte)(x2 >>> 8); |
| out[o + 10] = (byte)(x2 >>> 16); |
| out[o + 11] = (byte)(x2 >>> 24); |
| out[o + 12] = (byte) x3; |
| out[o + 13] = (byte)(x3 >>> 8); |
| out[o + 14] = (byte)(x3 >>> 16); |
| out[o + 15] = (byte)(x3 >>> 24); |
| } |
| |
| public boolean selfTest() |
| { |
| if (valid == null) |
| { |
| boolean result = super.selfTest(); // do symmetry tests |
| if (result) |
| result = testKat(KAT_KEY, KAT_CT); |
| valid = Boolean.valueOf(result); |
| } |
| return valid.booleanValue(); |
| } |
| |
| // These first few S-boxes operate directly on the "registers", |
| // x0..x4, and perform the linear transform. |
| private void sbox0() |
| { |
| x3 ^= x0; |
| x4 = x1; |
| x1 &= x3; |
| x4 ^= x2; |
| x1 ^= x0; |
| x0 |= x3; |
| x0 ^= x4; |
| x4 ^= x3; |
| x3 ^= x2; |
| x2 |= x1; |
| x2 ^= x4; |
| x4 ^= -1; |
| x4 |= x1; |
| x1 ^= x3; |
| x1 ^= x4; |
| x3 |= x0; |
| x1 ^= x3; |
| x4 ^= x3; |
| |
| x1 = (x1 << 13) | (x1 >>> 19); |
| x4 ^= x1; |
| x3 = x1 << 3; |
| x2 = (x2 << 3) | (x2 >>> 29); |
| x4 ^= x2; |
| x0 ^= x2; |
| x4 = (x4 << 1) | (x4 >>> 31); |
| x0 ^= x3; |
| x0 = (x0 << 7) | (x0 >>> 25); |
| x3 = x4; |
| x1 ^= x4; |
| x3 <<= 7; |
| x1 ^= x0; |
| x2 ^= x0; |
| x2 ^= x3; |
| x1 = (x1 << 5) | (x1 >>> 27); |
| x2 = (x2 << 22) | (x2 >>> 10); |
| } |
| |
| private void sbox1() |
| { |
| x4 = ~x4; |
| x3 = x1; |
| x1 ^= x4; |
| x3 |= x4; |
| x3 ^= x0; |
| x0 &= x1; |
| x2 ^= x3; |
| x0 ^= x4; |
| x0 |= x2; |
| x1 ^= x3; |
| x0 ^= x1; |
| x4 &= x2; |
| x1 |= x4; |
| x4 ^= x3; |
| x1 ^= x2; |
| x3 |= x0; |
| x1 ^= x3; |
| x3 = ~x3; |
| x4 ^= x0; |
| x3 &= x2; |
| x4 = ~x4; |
| x3 ^= x1; |
| x4 ^= x3; |
| |
| x0 = (x0 << 13) | (x0 >>> 19); |
| x4 ^= x0; |
| x3 = x0 << 3; |
| x2 = (x2 << 3) | (x2 >>> 29); |
| x4 ^= x2; |
| x1 ^= x2; |
| x4 = (x4 << 1) | (x4 >>> 31); |
| x1 ^= x3; |
| x1 = (x1 << 7) | (x1 >>> 25); |
| x3 = x4; |
| x0 ^= x4; |
| x3 <<= 7; |
| x0 ^= x1; |
| x2 ^= x1; |
| x2 ^= x3; |
| x0 = (x0 << 5) | (x0 >>> 27); |
| x2 = (x2 << 22) | (x2 >>> 10); |
| } |
| |
| private void sbox2() |
| { |
| x3 = x0; |
| x0 = x0 & x2; |
| x0 = x0 ^ x1; |
| x2 = x2 ^ x4; |
| x2 = x2 ^ x0; |
| x1 = x1 | x3; |
| x1 = x1 ^ x4; |
| x3 = x3 ^ x2; |
| x4 = x1; |
| x1 = x1 | x3; |
| x1 = x1 ^ x0; |
| x0 = x0 & x4; |
| x3 = x3 ^ x0; |
| x4 = x4 ^ x1; |
| x4 = x4 ^ x3; |
| x3 = ~x3; |
| |
| x2 = (x2 << 13) | (x2 >>> 19); |
| x1 ^= x2; |
| x0 = x2 << 3; |
| x4 = (x4 << 3) | (x4 >>> 29); |
| x1 ^= x4; |
| x3 ^= x4; |
| x1 = (x1 << 1) | (x1 >>> 31); |
| x3 ^= x0; |
| x3 = (x3 << 7) | (x3 >>> 25); |
| x0 = x1; |
| x2 ^= x1; |
| x0 <<= 7; |
| x2 ^= x3; |
| x4 ^= x3; |
| x4 ^= x0; |
| x2 = (x2 << 5) | (x2 >>> 27); |
| x4 = (x4 << 22) | (x4 >>> 10); |
| } |
| |
| private void sbox3() |
| { |
| x0 = x2; |
| x2 = x2 | x3; |
| x3 = x3 ^ x1; |
| x1 = x1 & x0; |
| x0 = x0 ^ x4; |
| x4 = x4 ^ x3; |
| x3 = x3 & x2; |
| x0 = x0 | x1; |
| x3 = x3 ^ x0; |
| x2 = x2 ^ x1; |
| x0 = x0 & x2; |
| x1 = x1 ^ x3; |
| x0 = x0 ^ x4; |
| x1 = x1 | x2; |
| x1 = x1 ^ x4; |
| x2 = x2 ^ x3; |
| x4 = x1; |
| x1 = x1 | x3; |
| x1 = x1 ^ x2; |
| |
| x1 = (x1 << 13) | (x1 >>> 19); |
| x4 ^= x1; |
| x2 = x1 << 3; |
| x3 = (x3 << 3) | (x3 >>> 29); |
| x4 ^= x3; |
| x0 ^= x3; |
| x4 = (x4 << 1) | (x4 >>> 31); |
| x0 ^= x2; |
| x0 = (x0 << 7) | (x0 >>> 25); |
| x2 = x4; |
| x1 ^= x4; |
| x2 <<= 7; |
| x1 ^= x0; |
| x3 ^= x0; |
| x3 ^= x2; |
| x1 = (x1 << 5) | (x1 >>> 27); |
| x3 = (x3 << 22) | (x3 >>> 10); |
| } |
| |
| private void sbox4() |
| { |
| x4 = x4 ^ x0; |
| x0 = ~x0; |
| x3 = x3 ^ x0; |
| x0 = x0 ^ x1; |
| x2 = x4; |
| x4 = x4 & x0; |
| x4 = x4 ^ x3; |
| x2 = x2 ^ x0; |
| x1 = x1 ^ x2; |
| x3 = x3 & x2; |
| x3 = x3 ^ x1; |
| x1 = x1 & x4; |
| x0 = x0 ^ x1; |
| x2 = x2 | x4; |
| x2 = x2 ^ x1; |
| x1 = x1 | x0; |
| x1 = x1 ^ x3; |
| x3 = x3 & x0; |
| x1 = ~x1; |
| x2 = x2 ^ x3; |
| |
| x4 = (x4 << 13) | (x4 >>> 19); |
| x2 ^= x4; |
| x3 = x4 << 3; |
| x1 = (x1 << 3) | (x1 >>> 29); |
| x2 ^= x1; |
| x0 ^= x1; |
| x2 = (x2 << 1) | (x2 >>> 31); |
| x0 ^= x3; |
| x0 = (x0 << 7) | (x0 >>> 25); |
| x3 = x2; |
| x4 ^= x2; |
| x3 <<= 7; |
| x4 ^= x0; |
| x1 ^= x0; |
| x1 ^= x3; |
| x4 = (x4 << 5) | (x4 >>> 27); |
| x1 = (x1 << 22) | (x1 >>> 10); |
| } |
| |
| private void sbox5() |
| { |
| x4 = x4 ^ x2; |
| x2 = x2 ^ x0; |
| x0 = ~x0; |
| x3 = x2; |
| x2 = x2 & x4; |
| x1 = x1 ^ x0; |
| x2 = x2 ^ x1; |
| x1 = x1 | x3; |
| x3 = x3 ^ x0; |
| x0 = x0 & x2; |
| x0 = x0 ^ x4; |
| x3 = x3 ^ x2; |
| x3 = x3 ^ x1; |
| x1 = x1 ^ x4; |
| x4 = x4 & x0; |
| x1 = ~x1; |
| x4 = x4 ^ x3; |
| x3 = x3 | x0; |
| x1 = x1 ^ x3; |
| |
| x2 = (x2 << 13) | (x2 >>> 19); |
| x0 ^= x2; |
| x3 = x2 << 3; |
| x4 = (x4 << 3) | (x4 >>> 29); |
| x0 ^= x4; |
| x1 ^= x4; |
| x0 = (x0 << 1) | (x0 >>> 31); |
| x1 ^= x3; |
| x1 = (x1 << 7) | (x1 >>> 25); |
| x3 = x0; |
| x2 ^= x0; |
| x3 <<= 7; |
| x2 ^= x1; |
| x4 ^= x1; |
| x4 ^= x3; |
| x2 = (x2 << 5) | (x2 >>> 27); |
| x4 = (x4 << 22) | (x4 >>> 10); |
| } |
| |
| private void sbox6() |
| { |
| x4 = ~x4; |
| x3 = x1; |
| x1 = x1 & x2; |
| x2 = x2 ^ x3; |
| x1 = x1 ^ x4; |
| x4 = x4 | x3; |
| x0 = x0 ^ x1; |
| x4 = x4 ^ x2; |
| x2 = x2 | x0; |
| x4 = x4 ^ x0; |
| x3 = x3 ^ x2; |
| x2 = x2 | x1; |
| x2 = x2 ^ x4; |
| x3 = x3 ^ x1; |
| x3 = x3 ^ x2; |
| x1 = ~x1; |
| x4 = x4 & x3; |
| x4 = x4 ^ x1; |
| x2 = (x2 << 13) | (x2 >>> 19); |
| x0 ^= x2; |
| x1 = x2 << 3; |
| x3 = (x3 << 3) | (x3 >>> 29); |
| x0 ^= x3; |
| x4 ^= x3; |
| x0 = (x0 << 1) | (x0 >>> 31); |
| x4 ^= x1; |
| x4 = (x4 << 7) | (x4 >>> 25); |
| x1 = x0; |
| x2 ^= x0; |
| x1 <<= 7; |
| x2 ^= x4; |
| x3 ^= x4; |
| x3 ^= x1; |
| x2 = (x2 << 5) | (x2 >>> 27); |
| x3 = (x3 << 22) | (x3 >>> 10); |
| } |
| |
| private void sbox7() |
| { |
| x1 = x3; |
| x3 = x3 & x0; |
| x3 = x3 ^ x4; |
| x4 = x4 & x0; |
| x1 = x1 ^ x3; |
| x3 = x3 ^ x0; |
| x0 = x0 ^ x2; |
| x2 = x2 | x1; |
| x2 = x2 ^ x3; |
| x4 = x4 ^ x0; |
| x3 = x3 ^ x4; |
| x4 = x4 & x2; |
| x4 = x4 ^ x1; |
| x1 = x1 ^ x3; |
| x3 = x3 & x2; |
| x1 = ~x1; |
| x3 = x3 ^ x1; |
| x1 = x1 & x2; |
| x0 = x0 ^ x4; |
| x1 = x1 ^ x0; |
| x3 = (x3 << 13) | (x3 >>> 19); |
| x1 ^= x3; |
| x0 = x3 << 3; |
| x4 = (x4 << 3) | (x4 >>> 29); |
| x1 ^= x4; |
| x2 ^= x4; |
| x1 = (x1 << 1) | (x1 >>> 31); |
| x2 ^= x0; |
| x2 = (x2 << 7) | (x2 >>> 25); |
| x0 = x1; |
| x3 ^= x1; |
| x0 <<= 7; |
| x3 ^= x2; |
| x4 ^= x2; |
| x4 ^= x0; |
| x3 = (x3 << 5) | (x3 >>> 27); |
| x4 = (x4 << 22) | (x4 >>> 10); |
| } |
| |
| /** The final S-box, with no transform. */ |
| private void sbox7noLT() |
| { |
| x1 = x3; |
| x3 = x3 & x0; |
| x3 = x3 ^ x4; |
| x4 = x4 & x0; |
| x1 = x1 ^ x3; |
| x3 = x3 ^ x0; |
| x0 = x0 ^ x2; |
| x2 = x2 | x1; |
| x2 = x2 ^ x3; |
| x4 = x4 ^ x0; |
| x3 = x3 ^ x4; |
| x4 = x4 & x2; |
| x4 = x4 ^ x1; |
| x1 = x1 ^ x3; |
| x3 = x3 & x2; |
| x1 = ~x1; |
| x3 = x3 ^ x1; |
| x1 = x1 & x2; |
| x0 = x0 ^ x4; |
| x1 = x1 ^ x0; |
| } |
| |
| private void sboxI7noLT() |
| { |
| x4 = x2; |
| x2 ^= x0; |
| x0 &= x3; |
| x2 = ~x2; |
| x4 |= x3; |
| x3 ^= x1; |
| x1 |= x0; |
| x0 ^= x2; |
| x2 &= x4; |
| x1 ^= x2; |
| x2 ^= x0; |
| x0 |= x2; |
| x3 &= x4; |
| x0 ^= x3; |
| x4 ^= x1; |
| x3 ^= x4; |
| x4 |= x0; |
| x3 ^= x2; |
| x4 ^= x2; |
| } |
| |
| private void sboxI6() |
| { |
| x1 = (x1 >>> 22) | (x1 << 10); |
| x3 = (x3 >>> 5) | (x3 << 27); |
| x2 = x0; |
| x1 ^= x4; |
| x2 <<= 7; |
| x3 ^= x4; |
| x1 ^= x2; |
| x3 ^= x0; |
| x4 = (x4 >>> 7) | (x4 << 25); |
| x0 = (x0 >>> 1) | (x0 << 31); |
| x0 ^= x3; |
| x2 = x3 << 3; |
| x4 ^= x2; |
| x3 = (x3 >>> 13) | (x3 << 19); |
| x0 ^= x1; |
| x4 ^= x1; |
| x1 = (x1 >>> 3) | (x1 << 29); |
| x3 ^= x1; |
| x2 = x1; |
| x1 &= x3; |
| x2 ^= x4; |
| x1 = ~x1; |
| x4 ^= x0; |
| x1 ^= x4; |
| x2 |= x3; |
| x3 ^= x1; |
| x4 ^= x2; |
| x2 ^= x0; |
| x0 &= x4; |
| x0 ^= x3; |
| x3 ^= x4; |
| x3 |= x1; |
| x4 ^= x0; |
| x2 ^= x3; |
| } |
| |
| private void sboxI5() |
| { |
| x2 = (x2 >>> 22) | (x2 << 10); |
| x0 = (x0 >>> 5) | (x0 << 27); |
| x3 = x1; |
| x2 ^= x4; |
| x3 <<= 7; |
| x0 ^= x4; |
| x2 ^= x3; |
| x0 ^= x1; |
| x4 = (x4 >>> 7) | (x4 << 25); |
| x1 = (x1 >>> 1) | (x1 << 31); |
| x1 ^= x0; |
| x3 = x0 << 3; |
| x4 ^= x3; |
| x0 = (x0 >>> 13) | (x0 << 19); |
| x1 ^= x2; |
| x4 ^= x2; |
| x2 = (x2 >>> 3) | (x2 << 29); |
| x1 = ~x1; |
| x3 = x4; |
| x2 ^= x1; |
| x4 |= x0; |
| x4 ^= x2; |
| x2 |= x1; |
| x2 &= x0; |
| x3 ^= x4; |
| x2 ^= x3; |
| x3 |= x0; |
| x3 ^= x1; |
| x1 &= x2; |
| x1 ^= x4; |
| x3 ^= x2; |
| x4 &= x3; |
| x3 ^= x1; |
| x4 ^= x0; |
| x4 ^= x3; |
| x3 = ~x3; |
| } |
| |
| private void sboxI4() |
| { |
| x4 = (x4 >>> 22) | (x4 << 10); |
| x1 = (x1 >>> 5) | (x1 << 27); |
| x0 = x3; |
| x4 ^= x2; |
| x0 <<= 7; |
| x1 ^= x2; |
| x4 ^= x0; |
| x1 ^= x3; |
| x2 = (x2 >>> 7) | (x2 << 25); |
| x3 = (x3 >>> 1) | (x3 << 31); |
| x3 ^= x1; |
| x0 = x1 << 3; |
| x2 ^= x0; |
| x1 = (x1 >>> 13) | (x1 << 19); |
| x3 ^= x4; |
| x2 ^= x4; |
| x4 = (x4 >>> 3) | (x4 << 29); |
| x0 = x4; |
| x4 &= x2; |
| x4 ^= x3; |
| x3 |= x2; |
| x3 &= x1; |
| x0 ^= x4; |
| x0 ^= x3; |
| x3 &= x4; |
| x1 = ~x1; |
| x2 ^= x0; |
| x3 ^= x2; |
| x2 &= x1; |
| x2 ^= x4; |
| x1 ^= x3; |
| x4 &= x1; |
| x2 ^= x1; |
| x4 ^= x0; |
| x4 |= x2; |
| x2 ^= x1; |
| x4 ^= x3; |
| } |
| |
| private void sboxI3() |
| { |
| x4 = (x4 >>> 22) | (x4 << 10); |
| x1 = (x1 >>> 5) | (x1 << 27); |
| x3 = x2; |
| x4 ^= x0; |
| x3 <<= 7; |
| x1 ^= x0; |
| x4 ^= x3; |
| x1 ^= x2; |
| x0 = (x0 >>> 7) | (x0 << 25); |
| x2 = (x2 >>> 1) | (x2 << 31); |
| x2 ^= x1; |
| x3 = x1 << 3; |
| x0 ^= x3; |
| x1 = (x1 >>> 13) | (x1 << 19); |
| x2 ^= x4; |
| x0 ^= x4; |
| x4 = (x4 >>> 3) | (x4 << 29); |
| x3 = x4; |
| x4 ^= x2; |
| x2 &= x4; |
| x2 ^= x1; |
| x1 &= x3; |
| x3 ^= x0; |
| x0 |= x2; |
| x0 ^= x4; |
| x1 ^= x3; |
| x4 ^= x1; |
| x1 |= x0; |
| x1 ^= x2; |
| x3 ^= x4; |
| x4 &= x0; |
| x2 |= x0; |
| x2 ^= x4; |
| x3 ^= x1; |
| x4 ^= x3; |
| } |
| |
| private void sboxI2() |
| { |
| x4 = (x4 >>> 22) | (x4 << 10); |
| x0 = (x0 >>> 5) | (x0 << 27); |
| x3 = x1; |
| x4 ^= x2; |
| x3 <<= 7; |
| x0 ^= x2; |
| x4 ^= x3; |
| x0 ^= x1; |
| x2 = (x2 >>> 7) | (x2 << 25); |
| x1 = (x1 >>> 1) | (x1 << 31); |
| x1 ^= x0; |
| x3 = x0 << 3; |
| x2 ^= x3; |
| x0 = (x0 >>> 13) | (x0 << 19); |
| x1 ^= x4; |
| x2 ^= x4; |
| x4 = (x4 >>> 3) | (x4 << 29); |
| x4 ^= x2; |
| x2 ^= x0; |
| x3 = x2; |
| x2 &= x4; |
| x2 ^= x1; |
| x1 |= x4; |
| x1 ^= x3; |
| x3 &= x2; |
| x4 ^= x2; |
| x3 &= x0; |
| x3 ^= x4; |
| x4 &= x1; |
| x4 |= x0; |
| x2 = ~x2; |
| x4 ^= x2; |
| x0 ^= x2; |
| x0 &= x1; |
| x2 ^= x3; |
| x2 ^= x0; |
| } |
| |
| private void sboxI1() |
| { |
| x4 = (x4 >>> 22) | (x4 << 10); |
| x1 = (x1 >>> 5) | (x1 << 27); |
| x0 = x3; |
| x4 ^= x2; |
| x0 <<= 7; |
| x1 ^= x2; |
| x4 ^= x0; |
| x1 ^= x3; |
| x2 = (x2 >>> 7) | (x2 << 25); |
| x3 = (x3 >>> 1) | (x3 << 31); |
| x3 ^= x1; |
| x0 = x1 << 3; |
| x2 ^= x0; |
| x1 = (x1 >>> 13) | (x1 << 19); |
| x3 ^= x4; |
| x2 ^= x4; |
| x4 = (x4 >>> 3) | (x4 << 29); |
| x0 = x3; |
| x3 ^= x2; |
| x2 &= x3; |
| x0 ^= x4; |
| x2 ^= x1; |
| x1 |= x3; |
| x4 ^= x2; |
| x1 ^= x0; |
| x1 |= x4; |
| x3 ^= x2; |
| x1 ^= x3; |
| x3 |= x2; |
| x3 ^= x1; |
| x0 = ~x0; |
| x0 ^= x3; |
| x3 |= x1; |
| x3 ^= x1; |
| x3 |= x0; |
| x2 ^= x3; |
| } |
| |
| private void sboxI0() |
| { |
| x2 = (x2 >>> 22) | (x2 << 10); |
| x0 = (x0 >>> 5) | (x0 << 27); |
| x3 = x1; |
| x2 ^= x4; |
| x3 <<= 7; |
| x0 ^= x4; |
| x2 ^= x3; |
| x0 ^= x1; |
| x4 = (x4 >>> 7) | (x4 << 25); |
| x1 = (x1 >>> 1) | (x1 << 31); |
| x1 ^= x0; |
| x3 = x0 << 3; |
| x4 ^= x3; |
| x0 = (x0 >>> 13) | (x0 << 19); |
| x1 ^= x2; |
| x4 ^= x2; |
| x2 = (x2 >>> 3) | (x2 << 29); |
| x2 = ~x2; |
| x3 = x1; |
| x1 |= x0; |
| x3 = ~x3; |
| x1 ^= x2; |
| x2 |= x3; |
| x1 ^= x4; |
| x0 ^= x3; |
| x2 ^= x0; |
| x0 &= x4; |
| x3 ^= x0; |
| x0 |= x1; |
| x0 ^= x2; |
| x4 ^= x3; |
| x2 ^= x1; |
| x4 ^= x0; |
| x4 ^= x1; |
| x2 &= x4; |
| x3 ^= x2; |
| } |
| |
| private void sboxI7() |
| { |
| x1 = (x1 >>> 22) | (x1 << 10); |
| x0 = (x0 >>> 5) | (x0 << 27); |
| x2 = x3; |
| x1 ^= x4; |
| x2 <<= 7; |
| x0 ^= x4; |
| x1 ^= x2; |
| x0 ^= x3; |
| x4 = (x4 >>> 7) | (x4 << 25); |
| x3 = (x3 >>> 1) | (x3 << 31); |
| x3 ^= x0; |
| x2 = x0 << 3; |
| x4 ^= x2; |
| x0 = (x0 >>> 13) | (x0 << 19); |
| x3 ^= x1; |
| x4 ^= x1; |
| x1 = (x1 >>> 3) | (x1 << 29); |
| x2 = x1; |
| x1 ^= x0; |
| x0 &= x4; |
| x1 = ~x1; |
| x2 |= x4; |
| x4 ^= x3; |
| x3 |= x0; |
| x0 ^= x1; |
| x1 &= x2; |
| x3 ^= x1; |
| x1 ^= x0; |
| x0 |= x1; |
| x4 &= x2; |
| x0 ^= x4; |
| x2 ^= x3; |
| x4 ^= x2; |
| x2 |= x0; |
| x4 ^= x1; |
| x2 ^= x1; |
| } |
| |
| /** S-Box 0. */ |
| private void sbox0(int r0, int r1, int r2, int r3) |
| { |
| int r4 = r1 ^ r2; |
| r3 ^= r0; |
| r1 = r1 & r3 ^ r0; |
| r0 = (r0 | r3) ^ r4; |
| r4 ^= r3; |
| r3 ^= r2; |
| r2 = (r2 | r1) ^ r4; |
| r4 = ~r4 | r1; |
| r1 ^= r3 ^ r4; |
| r3 |= r0; |
| x0 = r1 ^ r3; |
| x1 = r4 ^ r3; |
| x2 = r2; |
| x3 = r0; |
| } |
| |
| /** S-Box 1. */ |
| private void sbox1(int r0, int r1, int r2, int r3) |
| { |
| r0 = ~r0; |
| int r4 = r0; |
| r2 = ~r2; |
| r0 &= r1; |
| r2 ^= r0; |
| r0 |= r3; |
| r3 ^= r2; |
| r1 ^= r0; |
| r0 ^= r4; |
| r4 |= r1; |
| r1 ^= r3; |
| r2 = (r2 | r0) & r4; |
| r0 ^= r1; |
| x0 = r2; |
| x1 = r0 & r2 ^ r4; |
| x2 = r3; |
| x3 = r1 & r2 ^ r0; |
| } |
| |
| /** S-Box 2. */ |
| private void sbox2(int r0, int r1, int r2, int r3) |
| { |
| int r4 = r0; |
| r0 = r0 & r2 ^ r3; |
| r2 = r2 ^ r1 ^ r0; |
| r3 = (r3 | r4) ^ r1; |
| r4 ^= r2; |
| r1 = r3; |
| r3 = (r3 | r4) ^ r0; |
| r0 &= r1; |
| r4 ^= r0; |
| x0 = r2; |
| x1 = r3; |
| x2 = r1 ^ r3 ^ r4; |
| x3 = ~r4; |
| } |
| |
| /** S-Box 3. */ |
| private void sbox3(int r0, int r1, int r2, int r3) |
| { |
| int r4 = r0; |
| r0 |= r3; |
| r3 ^= r1; |
| r1 &= r4; |
| r4 = r4 ^ r2 | r1; |
| r2 ^= r3; |
| r3 = r3 & r0 ^ r4; |
| r0 ^= r1; |
| r4 = r4 & r0 ^ r2; |
| r1 = (r1 ^ r3 | r0) ^ r2; |
| r0 ^= r3; |
| x0 = (r1 | r3) ^ r0; |
| x1 = r1; |
| x2 = r3; |
| x3 = r4; |
| } |
| |
| /** S-Box 4. */ |
| private void sbox4(int r0, int r1, int r2, int r3) |
| { |
| r1 ^= r3; |
| int r4 = r1; |
| r3 = ~r3; |
| r2 ^= r3; |
| r3 ^= r0; |
| r1 = r1 & r3 ^ r2; |
| r4 ^= r3; |
| r0 ^= r4; |
| r2 = r2 & r4 ^ r0; |
| r0 &= r1; |
| r3 ^= r0; |
| r4 = (r4 | r1) ^ r0; |
| x0 = r1; |
| x1 = r4 ^ (r2 & r3); |
| x2 = ~((r0 | r3) ^ r2); |
| x3 = r3; |
| } |
| |
| /** S-Box 5. */ |
| private void sbox5(int r0, int r1, int r2, int r3) |
| { |
| r0 ^= r1; |
| r1 ^= r3; |
| int r4 = r1; |
| r3 = ~r3; |
| r1 &= r0; |
| r2 ^= r3; |
| r1 ^= r2; |
| r2 |= r4; |
| r4 ^= r3; |
| r3 = r3 & r1 ^ r0; |
| r4 = r4 ^ r1 ^ r2; |
| x0 = r1; |
| x1 = r3; |
| x2 = r0 & r3 ^ r4; |
| x3 = ~(r2 ^ r0) ^ (r4 | r3); |
| } |
| |
| /** S-Box 6. */ |
| private void sbox6(int r0, int r1, int r2, int r3) |
| { |
| int r4 = r3; |
| r2 = ~r2; |
| r3 = r3 & r0 ^ r2; |
| r0 ^= r4; |
| r2 = (r2 | r4) ^ r0; |
| r1 ^= r3; |
| r0 |= r1; |
| r2 ^= r1; |
| r4 ^= r0; |
| r0 = (r0 | r3) ^ r2; |
| r4 = r4 ^ r3 ^ r0; |
| x0 = r0; |
| x1 = r1; |
| x2 = r4; |
| x3 = r2 & r4 ^ ~r3; |
| } |
| |
| /** S-Box 7. */ |
| private void sbox7(int r0, int r1, int r2, int r3) |
| { |
| int r4 = r1; |
| r1 = (r1 | r2) ^ r3; |
| r4 ^= r2; |
| r2 ^= r1; |
| r3 = (r3 | r4) & r0; |
| r4 ^= r2; |
| r3 ^= r1; |
| r1 = (r1 | r4) ^ r0; |
| r0 = (r0 | r4) ^ r2; |
| r1 ^= r4; |
| r2 ^= r1; |
| x0 = r4 ^ (~r2 | r0); |
| x1 = r3; |
| x2 = r1 & r0 ^ r4; |
| x3 = r0; |
| } |
| |
| private class Key |
| implements Cloneable |
| { |
| int k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, |
| k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, |
| k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, |
| k44, k45, k46, k47, k48, k49, k50, k51, k52, k53, k54, k55, k56, k57, |
| k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k70, k71, |
| k72, k73, k74, k75, k76, k77, k78, k79, k80, k81, k82, k83, k84, k85, |
| k86, k87, k88, k89, k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, |
| k100, k101, k102, k103, k104, k105, k106, k107, k108, k109, k110, k111, |
| k112, k113, k114, k115, k116, k117, k118, k119, k120, k121, k122, k123, |
| k124, k125, k126, k127, k128, k129, k130, k131; |
| |
| /** Trivial 0-arguments constructor. */ |
| Key() |
| { |
| } |
| |
| /** Cloning constructor. */ |
| private Key(Key that) |
| { |
| this.k0 = that.k0; |
| this.k1 = that.k1; |
| this.k2 = that.k2; |
| this.k3 = that.k3; |
| this.k4 = that.k4; |
| this.k5 = that.k5; |
| this.k6 = that.k6; |
| this.k7 = that.k7; |
| this.k8 = that.k8; |
| this.k9 = that.k9; |
| this.k10 = that.k10; |
| this.k11 = that.k11; |
| this.k12 = that.k12; |
| this.k13 = that.k13; |
| this.k14 = that.k14; |
| this.k15 = that.k15; |
| this.k16 = that.k16; |
| this.k17 = that.k17; |
| this.k18 = that.k18; |
| this.k19 = that.k19; |
| this.k20 = that.k20; |
| this.k21 = that.k21; |
| this.k22 = that.k22; |
| this.k23 = that.k23; |
| this.k24 = that.k24; |
| this.k25 = that.k25; |
| this.k26 = that.k26; |
| this.k27 = that.k27; |
| this.k28 = that.k28; |
| this.k29 = that.k29; |
| this.k30 = that.k30; |
| this.k31 = that.k31; |
| this.k32 = that.k32; |
| this.k33 = that.k33; |
| this.k34 = that.k34; |
| this.k35 = that.k35; |
| this.k36 = that.k36; |
| this.k37 = that.k37; |
| this.k38 = that.k38; |
| this.k39 = that.k39; |
| this.k40 = that.k40; |
| this.k41 = that.k41; |
| this.k42 = that.k42; |
| this.k43 = that.k43; |
| this.k44 = that.k44; |
| this.k45 = that.k45; |
| this.k46 = that.k46; |
| this.k47 = that.k47; |
| this.k48 = that.k48; |
| this.k49 = that.k49; |
| this.k50 = that.k50; |
| this.k51 = that.k51; |
| this.k52 = that.k52; |
| this.k53 = that.k53; |
| this.k54 = that.k54; |
| this.k55 = that.k55; |
| this.k56 = that.k56; |
| this.k57 = that.k57; |
| this.k58 = that.k58; |
| this.k59 = that.k59; |
| this.k60 = that.k60; |
| this.k61 = that.k61; |
| this.k62 = that.k62; |
| this.k63 = that.k63; |
| this.k64 = that.k64; |
| this.k65 = that.k65; |
| this.k66 = that.k66; |
| this.k67 = that.k67; |
| this.k68 = that.k68; |
| this.k69 = that.k69; |
| this.k70 = that.k70; |
| this.k71 = that.k71; |
| this.k72 = that.k72; |
| this.k73 = that.k73; |
| this.k74 = that.k74; |
| this.k75 = that.k75; |
| this.k76 = that.k76; |
| this.k77 = that.k77; |
| this.k78 = that.k78; |
| this.k79 = that.k79; |
| this.k80 = that.k80; |
| this.k81 = that.k81; |
| this.k82 = that.k82; |
| this.k83 = that.k83; |
| this.k84 = that.k84; |
| this.k85 = that.k85; |
| this.k86 = that.k86; |
| this.k87 = that.k87; |
| this.k88 = that.k88; |
| this.k89 = that.k89; |
| this.k90 = that.k90; |
| this.k91 = that.k91; |
| this.k92 = that.k92; |
| this.k93 = that.k93; |
| this.k94 = that.k94; |
| this.k95 = that.k95; |
| this.k96 = that.k96; |
| this.k97 = that.k97; |
| this.k98 = that.k98; |
| this.k99 = that.k99; |
| this.k100 = that.k100; |
| this.k101 = that.k101; |
| this.k102 = that.k102; |
| this.k103 = that.k103; |
| this.k104 = that.k104; |
| this.k105 = that.k105; |
| this.k106 = that.k106; |
| this.k107 = that.k107; |
| this.k108 = that.k108; |
| this.k109 = that.k109; |
| this.k110 = that.k110; |
| this.k111 = that.k111; |
| this.k112 = that.k112; |
| this.k113 = that.k113; |
| this.k114 = that.k114; |
| this.k115 = that.k115; |
| this.k116 = that.k116; |
| this.k117 = that.k117; |
| this.k118 = that.k118; |
| this.k119 = that.k119; |
| this.k120 = that.k120; |
| this.k121 = that.k121; |
| this.k122 = that.k122; |
| this.k123 = that.k123; |
| this.k124 = that.k124; |
| this.k125 = that.k125; |
| this.k126 = that.k126; |
| this.k127 = that.k127; |
| this.k128 = that.k128; |
| this.k129 = that.k129; |
| this.k130 = that.k130; |
| this.k131 = that.k131; |
| } |
| |
| public Object clone() |
| { |
| return new Key(this); |
| } |
| } |
| } |