123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782 |
- /* 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);
- }
- }
- }
|