blob: e85f3057e822928f3d009cebb4ca1d47b98426c7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ssh;
public class Blowfish extends Cipher {
private int[] P = new int[18];
private int[][] S = new int[4][256];
private int lastEncipherXL = 0;
private int lastEncipherXR = 0;
private int lastDecipherXL = 0;
private int lastDecipherXR = 0;
private final static int[] INIT_DATA =
{
0x243f6a88,
0x85a308d3,
0x13198a2e,
0x03707344,
0xa4093822,
0x299f31d0,
0x082efa98,
0xec4e6c89,
0x452821e6,
0x38d01377,
0xbe5466cf,
0x34e90c6c,
0xc0ac29b7,
0xc97c50dd,
0x3f84d5b5,
0xb5470917,
0x9216d5d9,
0x8979fb1b,
0xd1310ba6,
0x98dfb5ac,
0x2ffd72db,
0xd01adfb7,
0xb8e1afed,
0x6a267e96,
0xba7c9045,
0xf12c7f99,
0x24a19947,
0xb3916cf7,
0x0801f2e2,
0x858efc16,
0x636920d8,
0x71574e69,
0xa458fea3,
0xf4933d7e,
0x0d95748f,
0x728eb658,
0x718bcd58,
0x82154aee,
0x7b54a41d,
0xc25a59b5,
0x9c30d539,
0x2af26013,
0xc5d1b023,
0x286085f0,
0xca417918,
0xb8db38ef,
0x8e79dcb0,
0x603a180e,
0x6c9e0e8b,
0xb01e8a3e,
0xd71577c1,
0xbd314b27,
0x78af2fda,
0x55605c60,
0xe65525f3,
0xaa55ab94,
0x57489862,
0x63e81440,
0x55ca396a,
0x2aab10b6,
0xb4cc5c34,
0x1141e8ce,
0xa15486af,
0x7c72e993,
0xb3ee1411,
0x636fbc2a,
0x2ba9c55d,
0x741831f6,
0xce5c3e16,
0x9b87931e,
0xafd6ba33,
0x6c24cf5c,
0x7a325381,
0x28958677,
0x3b8f4898,
0x6b4bb9af,
0xc4bfe81b,
0x66282193,
0x61d809cc,
0xfb21a991,
0x487cac60,
0x5dec8032,
0xef845d5d,
0xe98575b1,
0xdc262302,
0xeb651b88,
0x23893e81,
0xd396acc5,
0x0f6d6ff3,
0x83f44239,
0x2e0b4482,
0xa4842004,
0x69c8f04a,
0x9e1f9b5e,
0x21c66842,
0xf6e96c9a,
0x670c9c61,
0xabd388f0,
0x6a51a0d2,
0xd8542f68,
0x960fa728,
0xab5133a3,
0x6eef0b6c,
0x137a3be4,
0xba3bf050,
0x7efb2a98,
0xa1f1651d,
0x39af0176,
0x66ca593e,
0x82430e88,
0x8cee8619,
0x456f9fb4,
0x7d84a5c3,
0x3b8b5ebe,
0xe06f75d8,
0x85c12073,
0x401a449f,
0x56c16aa6,
0x4ed3aa62,
0x363f7706,
0x1bfedf72,
0x429b023d,
0x37d0d724,
0xd00a1248,
0xdb0fead3,
0x49f1c09b,
0x075372c9,
0x80991b7b,
0x25d479d8,
0xf6e8def7,
0xe3fe501a,
0xb6794c3b,
0x976ce0bd,
0x04c006ba,
0xc1a94fb6,
0x409f60c4,
0x5e5c9ec2,
0x196a2463,
0x68fb6faf,
0x3e6c53b5,
0x1339b2eb,
0x3b52ec6f,
0x6dfc511f,
0x9b30952c,
0xcc814544,
0xaf5ebd09,
0xbee3d004,
0xde334afd,
0x660f2807,
0x192e4bb3,
0xc0cba857,
0x45c8740f,
0xd20b5f39,
0xb9d3fbdb,
0x5579c0bd,
0x1a60320a,
0xd6a100c6,
0x402c7279,
0x679f25fe,
0xfb1fa3cc,
0x8ea5e9f8,
0xdb3222f8,
0x3c7516df,
0xfd616b15,
0x2f501ec8,
0xad0552ab,
0x323db5fa,
0xfd238760,
0x53317b48,
0x3e00df82,
0x9e5c57bb,
0xca6f8ca0,
0x1a87562e,
0xdf1769db,
0xd542a8f6,
0x287effc3,
0xac6732c6,
0x8c4f5573,
0x695b27b0,
0xbbca58c8,
0xe1ffa35d,
0xb8f011a0,
0x10fa3d98,
0xfd2183b8,
0x4afcb56c,
0x2dd1d35b,
0x9a53e479,
0xb6f84565,
0xd28e49bc,
0x4bfb9790,
0xe1ddf2da,
0xa4cb7e33,
0x62fb1341,
0xcee4c6e8,
0xef20cada,
0x36774c01,
0xd07e9efe,
0x2bf11fb4,
0x95dbda4d,
0xae909198,
0xeaad8e71,
0x6b93d5a0,
0xd08ed1d0,
0xafc725e0,
0x8e3c5b2f,
0x8e7594b7,
0x8ff6e2fb,
0xf2122b64,
0x8888b812,
0x900df01c,
0x4fad5ea0,
0x688fc31c,
0xd1cff191,
0xb3a8c1ad,
0x2f2f2218,
0xbe0e1777,
0xea752dfe,
0x8b021fa1,
0xe5a0cc0f,
0xb56f74e8,
0x18acf3d6,
0xce89e299,
0xb4a84fe0,
0xfd13e0b7,
0x7cc43b81,
0xd2ada8d9,
0x165fa266,
0x80957705,
0x93cc7314,
0x211a1477,
0xe6ad2065,
0x77b5fa86,
0xc75442f5,
0xfb9d35cf,
0xebcdaf0c,
0x7b3e89a0,
0xd6411bd3,
0xae1e7e49,
0x00250e2d,
0x2071b35e,
0x226800bb,
0x57b8e0af,
0x2464369b,
0xf009b91e,
0x5563911d,
0x59dfa6aa,
0x78c14389,
0xd95a537f,
0x207d5ba2,
0x02e5b9c5,
0x83260376,
0x6295cfa9,
0x11c81968,
0x4e734a41,
0xb3472dca,
0x7b14a94a,
0x1b510052,
0x9a532915,
0xd60f573f,
0xbc9bc6e4,
0x2b60a476,
0x81e67400,
0x08ba6fb5,
0x571be91f,
0xf296ec6b,
0x2a0dd915,
0xb6636521,
0xe7b9f9b6,
0xff34052e,
0xc5855664,
0x53b02d5d,
0xa99f8fa1,
0x08ba4799,
0x6e85076a,
0x4b7a70e9,
0xb5b32944,
0xdb75092e,
0xc4192623,
0xad6ea6b0,
0x49a7df7d,
0x9cee60b8,
0x8fedb266,
0xecaa8c71,
0x699a17ff,
0x5664526c,
0xc2b19ee1,
0x193602a5,
0x75094c29,
0xa0591340,
0xe4183a3e,
0x3f54989a,
0x5b429d65,
0x6b8fe4d6,
0x99f73fd6,
0xa1d29c07,
0xefe830f5,
0x4d2d38e6,
0xf0255dc1,
0x4cdd2086,
0x8470eb26,
0x6382e9c6,
0x021ecc5e,
0x09686b3f,
0x3ebaefc9,
0x3c971814,
0x6b6a70a1,
0x687f3584,
0x52a0e286,
0xb79c5305,
0xaa500737,
0x3e07841c,
0x7fdeae5c,
0x8e7d44ec,
0x5716f2b8,
0xb03ada37,
0xf0500c0d,
0xf01c1f04,
0x0200b3ff,
0xae0cf51a,
0x3cb574b2,
0x25837a58,
0xdc0921bd,
0xd19113f9,
0x7ca92ff6,
0x94324773,
0x22f54701,
0x3ae5e581,
0x37c2dadc,
0xc8b57634,
0x9af3dda7,
0xa9446146,
0x0fd0030e,
0xecc8c73e,
0xa4751e41,
0xe238cd99,
0x3bea0e2f,
0x3280bba1,
0x183eb331,
0x4e548b38,
0x4f6db908,
0x6f420d03,
0xf60a04bf,
0x2cb81290,
0x24977c79,
0x5679b072,
0xbcaf89af,
0xde9a771f,
0xd9930810,
0xb38bae12,
0xdccf3f2e,
0x5512721f,
0x2e6b7124,
0x501adde6,
0x9f84cd87,
0x7a584718,
0x7408da17,
0xbc9f9abc,
0xe94b7d8c,
0xec7aec3a,
0xdb851dfa,
0x63094366,
0xc464c3d2,
0xef1c1847,
0x3215d908,
0xdd433b37,
0x24c2ba16,
0x12a14d43,
0x2a65c451,
0x50940002,
0x133ae4dd,
0x71dff89e,
0x10314e55,
0x81ac77d6,
0x5f11199b,
0x043556f1,
0xd7a3c76b,
0x3c11183b,
0x5924a509,
0xf28fe6ed,
0x97f1fbfa,
0x9ebabf2c,
0x1e153c6e,
0x86e34570,
0xeae96fb1,
0x860e5e0a,
0x5a3e2ab3,
0x771fe71c,
0x4e3d06fa,
0x2965dcb9,
0x99e71d0f,
0x803e89d6,
0x5266c825,
0x2e4cc978,
0x9c10b36a,
0xc6150eba,
0x94e2ea78,
0xa5fc3c53,
0x1e0a2df4,
0xf2f74ea7,
0x361d2b3d,
0x1939260f,
0x19c27960,
0x5223a708,
0xf71312b6,
0xebadfe6e,
0xeac31f66,
0xe3bc4595,
0xa67bc883,
0xb17f37d1,
0x018cff28,
0xc332ddef,
0xbe6c5aa5,
0x65582185,
0x68ab9802,
0xeecea50f,
0xdb2f953b,
0x2aef7dad,
0x5b6e2f84,
0x1521b628,
0x29076170,
0xecdd4775,
0x619f1510,
0x13cca830,
0xeb61bd96,
0x0334fe1e,
0xaa0363cf,
0xb5735c90,
0x4c70a239,
0xd59e9e0b,
0xcbaade14,
0xeecc86bc,
0x60622ca7,
0x9cab5cab,
0xb2f3846e,
0x648b1eaf,
0x19bdf0ca,
0xa02369b9,
0x655abb50,
0x40685a32,
0x3c2ab4b3,
0x319ee9d5,
0xc021b8f7,
0x9b540b19,
0x875fa099,
0x95f7997e,
0x623d7da8,
0xf837889a,
0x97e32d77,
0x11ed935f,
0x16681281,
0x0e358829,
0xc7e61fd6,
0x96dedfa1,
0x7858ba99,
0x57f584a5,
0x1b227263,
0x9b83c3ff,
0x1ac24696,
0xcdb30aeb,
0x532e3054,
0x8fd948e4,
0x6dbc3128,
0x58ebf2ef,
0x34c6ffea,
0xfe28ed61,
0xee7c3c73,
0x5d4a14d9,
0xe864b7e3,
0x42105d14,
0x203e13e0,
0x45eee2b6,
0xa3aaabea,
0xdb6c4f15,
0xfacb4fd0,
0xc742f442,
0xef6abbb5,
0x654f3b1d,
0x41cd2105,
0xd81e799e,
0x86854dc7,
0xe44b476a,
0x3d816250,
0xcf62a1f2,
0x5b8d2646,
0xfc8883a0,
0xc1c7b6a3,
0x7f1524c3,
0x69cb7492,
0x47848a0b,
0x5692b285,
0x095bbf00,
0xad19489d,
0x1462b174,
0x23820e00,
0x58428d2a,
0x0c55f5ea,
0x1dadf43e,
0x233f7061,
0x3372f092,
0x8d937e41,
0xd65fecf1,
0x6c223bdb,
0x7cde3759,
0xcbee7460,
0x4085f2a7,
0xce77326e,
0xa6078084,
0x19f8509e,
0xe8efd855,
0x61d99735,
0xa969a7aa,
0xc50c06c2,
0x5a04abfc,
0x800bcadc,
0x9e447a2e,
0xc3453484,
0xfdd56705,
0x0e1e9ec9,
0xdb73dbd3,
0x105588cd,
0x675fda79,
0xe3674340,
0xc5c43465,
0x713e38d8,
0x3d28f89e,
0xf16dff20,
0x153e21e7,
0x8fb03d4a,
0xe6e39f2b,
0xdb83adf7,
0xe93d5a68,
0x948140f7,
0xf64c261c,
0x94692934,
0x411520f7,
0x7602d4f7,
0xbcf46b2e,
0xd4a20068,
0xd4082471,
0x3320f46a,
0x43b7d4b7,
0x500061af,
0x1e39f62e,
0x97244546,
0x14214f74,
0xbf8b8840,
0x4d95fc1d,
0x96b591af,
0x70f4ddd3,
0x66a02f45,
0xbfbc09ec,
0x03bd9785,
0x7fac6dd0,
0x31cb8504,
0x96eb27b3,
0x55fd3941,
0xda2547e6,
0xabca0a9a,
0x28507825,
0x530429f4,
0x0a2c86da,
0xe9b66dfb,
0x68dc1462,
0xd7486900,
0x680ec0a4,
0x27a18dee,
0x4f3ffea2,
0xe887ad8c,
0xb58ce006,
0x7af4d6b6,
0xaace1e7c,
0xd3375fec,
0xce78a399,
0x406b2a42,
0x20fe9e35,
0xd9f385b9,
0xee39d7ab,
0x3b124e8b,
0x1dc9faf7,
0x4b6d1856,
0x26a36631,
0xeae397b2,
0x3a6efa74,
0xdd5b4332,
0x6841e7f7,
0xca7820fb,
0xfb0af54e,
0xd8feb397,
0x454056ac,
0xba489527,
0x55533a3a,
0x20838d87,
0xfe6ba9b7,
0xd096954b,
0x55a867bc,
0xa1159a58,
0xcca92963,
0x99e1db33,
0xa62a4a56,
0x3f3125f9,
0x5ef47e1c,
0x9029317c,
0xfdf8e802,
0x04272f70,
0x80bb155c,
0x05282ce3,
0x95c11548,
0xe4c66d22,
0x48c1133f,
0xc70f86dc,
0x07f9c9ee,
0x41041f0f,
0x404779a4,
0x5d886e17,
0x325f51eb,
0xd59bc0d1,
0xf2bcc18f,
0x41113564,
0x257b7834,
0x602a9c60,
0xdff8e8a3,
0x1f636c1b,
0x0e12b4c2,
0x02e1329e,
0xaf664fd1,
0xcad18115,
0x6b2395e0,
0x333e92e1,
0x3b240b62,
0xeebeb922,
0x85b2a20e,
0xe6ba0d99,
0xde720c8c,
0x2da2f728,
0xd0127845,
0x95b794fd,
0x647d0862,
0xe7ccf5f0,
0x5449a36f,
0x877d48fa,
0xc39dfd27,
0xf33e8d1e,
0x0a476341,
0x992eff74,
0x3a6f6eab,
0xf4f8fd37,
0xa812dc60,
0xa1ebddf8,
0x991be14c,
0xdb6e6b0d,
0xc67b5510,
0x6d672c37,
0x2765d43b,
0xdcd0e804,
0xf1290dc7,
0xcc00ffa3,
0xb5390f92,
0x690fed0b,
0x667b9ffb,
0xcedb7d9c,
0xa091cf0b,
0xd9155ea3,
0xbb132f88,
0x515bad24,
0x7b9479bf,
0x763bd6eb,
0x37392eb3,
0xcc115979,
0x8026e297,
0xf42e312d,
0x6842ada7,
0xc66a2b3b,
0x12754ccc,
0x782ef11c,
0x6a124237,
0xb79251e7,
0x06a1bbe6,
0x4bfb6350,
0x1a6b1018,
0x11caedfa,
0x3d25bdd8,
0xe2e1c3c9,
0x44421659,
0x0a121386,
0xd90cec6e,
0xd5abea2a,
0x64af674e,
0xda86a85f,
0xbebfe988,
0x64e4c3fe,
0x9dbc8057,
0xf0f7c086,
0x60787bf8,
0x6003604d,
0xd1fd8346,
0xf6381fb0,
0x7745ae04,
0xd736fccc,
0x83426b33,
0xf01eab71,
0xb0804187,
0x3c005e5f,
0x77a057be,
0xbde8ae24,
0x55464299,
0xbf582e61,
0x4e58f48f,
0xf2ddfda2,
0xf474ef38,
0x8789bdc2,
0x5366f9c3,
0xc8b38e74,
0xb475f255,
0x46fcd9b9,
0x7aeb2661,
0x8b1ddf84,
0x846a0e79,
0x915f95e2,
0x466e598e,
0x20b45770,
0x8cd55591,
0xc902de4c,
0xb90bace1,
0xbb8205d0,
0x11a86248,
0x7574a99e,
0xb77f19b6,
0xe0a9dc09,
0x662d09a1,
0xc4324633,
0xe85a1f02,
0x09f0be8c,
0x4a99a025,
0x1d6efe10,
0x1ab93d1d,
0x0ba5a4df,
0xa186f20f,
0x2868f169,
0xdcb7da83,
0x573906fe,
0xa1e2ce9b,
0x4fcd7f52,
0x50115e01,
0xa70683fa,
0xa002b5c4,
0x0de6d027,
0x9af88c27,
0x773f8641,
0xc3604c06,
0x61a806b5,
0xf0177a28,
0xc0f586e0,
0x006058aa,
0x30dc7d62,
0x11e69ed7,
0x2338ea63,
0x53c2dd94,
0xc2c21634,
0xbbcbee56,
0x90bcb6de,
0xebfc7da1,
0xce591d76,
0x6f05e409,
0x4b7c0188,
0x39720a3d,
0x7c927c24,
0x86e3725f,
0x724d9db9,
0x1ac15bb4,
0xd39eb8fc,
0xed545578,
0x08fca5b5,
0xd83d7cd3,
0x4dad0fc4,
0x1e50ef5e,
0xb161e6f8,
0xa28514d9,
0x6c51133c,
0x6fd5c7e7,
0x56e14ec4,
0x362abfce,
0xddc6c837,
0xd79a3234,
0x92638212,
0x670efa8e,
0x406000e0,
0x3a39ce37,
0xd3faf5cf,
0xabc27737,
0x5ac52d1b,
0x5cb0679e,
0x4fa33742,
0xd3822740,
0x99bc9bbe,
0xd5118e9d,
0xbf0f7315,
0xd62d1c7e,
0xc700c47b,
0xb78c1b6b,
0x21a19045,
0xb26eb1be,
0x6a366eb4,
0x5748ab2f,
0xbc946e79,
0xc6a376d2,
0x6549c2c8,
0x530ff8ee,
0x468dde7d,
0xd5730a1d,
0x4cd04dc6,
0x2939bbdb,
0xa9ba4650,
0xac9526e8,
0xbe5ee304,
0xa1fad5f0,
0x6a2d519a,
0x63ef8ce2,
0x9a86ee22,
0xc089c2b8,
0x43242ef6,
0xa51e03aa,
0x9cf2d0a4,
0x83c061ba,
0x9be96a4d,
0x8fe51550,
0xba645bd6,
0x2826a2f9,
0xa73a3ae1,
0x4ba99586,
0xef5562e9,
0xc72fefd3,
0xf752f7da,
0x3f046f69,
0x77fa0a59,
0x80e4a915,
0x87b08601,
0x9b09e6ad,
0x3b3ee593,
0xe990fd5a,
0x9e34d797,
0x2cf0b7d9,
0x022b8b51,
0x96d5ac3a,
0x017da67d,
0xd1cf3ed6,
0x7c7d2d28,
0x1f9f25cf,
0xadf2b89b,
0x5ad6b472,
0x5a88f54c,
0xe029ac71,
0xe019a5e6,
0x47b0acfd,
0xed93fa9b,
0xe8d3c48d,
0x283b57cc,
0xf8d56629,
0x79132e28,
0x785f0191,
0xed756055,
0xf7960e44,
0xe3d35e8c,
0x15056dd4,
0x88f46dba,
0x03a16125,
0x0564f0bd,
0xc3eb9e15,
0x3c9057a2,
0x97271aec,
0xa93a072a,
0x1b3f6d9b,
0x1e6321f5,
0xf59c66fb,
0x26dcf319,
0x7533d928,
0xb155fdf5,
0x03563482,
0x8aba3cbb,
0x28517711,
0xc20ad9f8,
0xabcc5167,
0xccad925f,
0x4de81751,
0x3830dc8e,
0x379d5862,
0x9320f991,
0xea7a90c2,
0xfb3e7bce,
0x5121ce64,
0x774fbe32,
0xa8b6e37e,
0xc3293d46,
0x48de5369,
0x6413e680,
0xa2ae0810,
0xdd6db224,
0x69852dfd,
0x09072166,
0xb39a460a,
0x6445c0dd,
0x586cdecf,
0x1c20c8ae,
0x5bbef7dd,
0x1b588d40,
0xccd2017f,
0x6bb4e3bb,
0xdda26a7e,
0x3a59ff45,
0x3e350a44,
0xbcb4cdd5,
0x72eacea8,
0xfa6484bb,
0x8d6612ae,
0xbf3c6f47,
0xd29be463,
0x542f5d9e,
0xaec2771b,
0xf64e6370,
0x740e0d8d,
0xe75b1357,
0xf8721671,
0xaf537d5d,
0x4040cb08,
0x4eb4e2cc,
0x34d2466a,
0x0115af84,
0xe1b00428,
0x95983a1d,
0x06b89fb4,
0xce6ea048,
0x6f3f3b82,
0x3520ab82,
0x011a1d4b,
0x277227f8,
0x611560b1,
0xe7933fdc,
0xbb3a792b,
0x344525bd,
0xa08839e1,
0x51ce794b,
0x2f32c9b7,
0xa01fbac9,
0xe01cc87e,
0xbcc7d1f6,
0xcf0111c3,
0xa1e8aac7,
0x1a908749,
0xd44fbd9a,
0xd0dadecb,
0xd50ada38,
0x0339c32a,
0xc6913667,
0x8df9317c,
0xe0b12b4f,
0xf79e59b7,
0x43f5bb3a,
0xf2d519ff,
0x27d9459c,
0xbf97222c,
0x15e6fc2a,
0x0f91fc71,
0x9b941525,
0xfae59361,
0xceb69ceb,
0xc2a86459,
0x12baa8d1,
0xb6c1075e,
0xe3056a0c,
0x10d25065,
0xcb03a442,
0xe0ec6e0e,
0x1698db3b,
0x4c98a0be,
0x3278e964,
0x9f1f9532,
0xe0d392df,
0xd3a0342b,
0x8971f21e,
0x1b0a7441,
0x4ba3348c,
0xc5be7120,
0xc37632d8,
0xdf359f8d,
0x9b992f2e,
0xe60b6f47,
0x0fe3f11d,
0xe54cda54,
0x1edad891,
0xce6279cf,
0xcd3e7e6f,
0x1618b166,
0xfd2c1d05,
0x848fd2c5,
0xf6fb2299,
0xf523f357,
0xa6327623,
0x93a83531,
0x56cccd02,
0xacf08162,
0x5a75ebb5,
0x6e163697,
0x88d273cc,
0xde966292,
0x81b949d0,
0x4c50901b,
0x71c65614,
0xe6c6c7bd,
0x327a140a,
0x45e1d006,
0xc3f27b9a,
0xc9aa53fd,
0x62a80f00,
0xbb25bfe2,
0x35bdd2f6,
0x71126905,
0xb2040222,
0xb6cbcf7c,
0xcd769c2b,
0x53113ec0,
0x1640e3d3,
0x38abbd60,
0x2547adf0,
0xba38209c,
0xf746ce76,
0x77afa1c5,
0x20756060,
0x85cbfe4e,
0x8ae88dd8,
0x7aaaf9b0,
0x4cf9aa7e,
0x1948c25c,
0x02fb8a8c,
0x01c36ae4,
0xd6ebe1f9,
0x90d4f869,
0xa65cdea0,
0x3f09252d,
0xc208e69f,
0xb74e6132,
0xce77e25b,
0x578fdfe3,
0x3ac372e6 };
public void decipher(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
int xL = lastDecipherXL;
int xR = lastDecipherXR;
int dataXL;
int dataXR;
int[] xLxR = new int[2];
for (int i = 0; i < len; i = i + 8) {
dataXL = (src[srcOff + i] & 0xff) | ((src[srcOff + i + 1] & 0xff) << 8) | ((src[srcOff + i + 2] & 0xff) << 16) | ((src[srcOff + i + 3] & 0xff) << 24);
dataXR = (src[srcOff + i + 4] & 0xff) | ((src[srcOff + i + 5] & 0xff) << 8) | ((src[srcOff + i + 6] & 0xff) << 16) | ((src[srcOff + i + 7] & 0xff) << 24);
decipher(dataXL, dataXR, xLxR);
xL ^= xLxR[0];
xR ^= xLxR[1];
dst[dstOff + i] = (byte) (xL & 0xff);
dst[dstOff + i + 1] = (byte) ((xL >> 8) & 0xff);
dst[dstOff + i + 2] = (byte) ((xL >> 16) & 0xff);
dst[dstOff + i + 3] = (byte) ((xL >> 24) & 0xff);
dst[dstOff + i + 4] = (byte) (xR & 0xff);
dst[dstOff + i + 5] = (byte) ((xR >> 8) & 0xff);
dst[dstOff + i + 6] = (byte) ((xR >> 16) & 0xff);
dst[dstOff + i + 7] = (byte) ((xR >> 24) & 0xff);
xL = dataXL;
xR = dataXR;
}
lastDecipherXL = xL;
lastDecipherXR = xR;
}
private void decipher(int xL, int xR, int[] xLxR) {
xL ^= P[17];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[16];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[15];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[14];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[13];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[12];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[11];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[10];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[9];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[8];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[7];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[6];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[5];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[4];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[3];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[2];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[1];
xR ^= P[0];
xLxR[0] = xR;
xLxR[1] = xL;
}
public void encipher(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
int xL = lastEncipherXL;
int xR = lastEncipherXR;
int[] xLxR = new int[2];
for (int i = 0; i < len; i = i + 8) {
xL ^= (src[srcOff + i] & 0xff) | ((src[srcOff + i + 1] & 0xff) << 8) | ((src[srcOff + i + 2] & 0xff) << 16) | ((src[srcOff + i + 3] & 0xff) << 24);
xR ^= (src[srcOff + i + 4] & 0xff) | ((src[srcOff + i + 5] & 0xff) << 8) | ((src[srcOff + i + 6] & 0xff) << 16) | ((src[srcOff + i + 7] & 0xff) << 24);
encipher(xL, xR, xLxR);
xL = xLxR[0];
xR = xLxR[1];
dst[dstOff + i] = (byte) (xL & 0xff);
dst[dstOff + i + 1] = (byte) ((xL >> 8) & 0xff);
dst[dstOff + i + 2] = (byte) ((xL >> 16) & 0xff);
dst[dstOff + i + 3] = (byte) ((xL >> 24) & 0xff);
dst[dstOff + i + 4] = (byte) (xR & 0xff);
dst[dstOff + i + 5] = (byte) ((xR >> 8) & 0xff);
dst[dstOff + i + 6] = (byte) ((xR >> 16) & 0xff);
dst[dstOff + i + 7] = (byte) ((xR >> 24) & 0xff);
}
lastEncipherXL = xL;
lastEncipherXR = xR;
}
private void encipher(int xL, int xR, int[] xLxR) {
xL ^= P[0];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[1];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[2];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[3];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[4];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[5];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[6];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[7];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[8];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[9];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[10];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[11];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[12];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[13];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[14];
xR ^= (((S[0][(xL >> 24) & 0xff] + S[1][(xL >> 16) & 0xff]) ^ (S[2][(xL >> 8) & 0xff])) + (S[3][xL & 0xff])) ^ P[15];
xL ^= (((S[0][(xR >> 24) & 0xff] + S[1][(xR >> 16) & 0xff]) ^ (S[2][(xR >> 8) & 0xff])) + (S[3][xR & 0xff])) ^ P[16];
xR ^= P[17];
xLxR[0] = xR;
xLxR[1] = xL;
}
public void setKey(byte key[]) {
int data = 0;
int offset = 0;
for (int i = 0; i < P.length; ++i) {
P[i] = INIT_DATA[offset++];
}
for (int i = 0; i < S.length; ++i) {
for (int j = 0; j < S[i].length; ++j) {
S[i][j] = INIT_DATA[offset++];
}
}
offset = 0;
for (int i = 0; i < P.length; ++i) {
data = 0;
for (int k = 0; k < 4; ++k) {
data = (data << 8) | (key[offset++] & 0xff);
if (offset >= key.length) {
offset = 0;
}
}
P[i] = P[i] ^ data;
}
int[] lr = new int[] { 0, 0 };
for (int i = 0; i < P.length; i += 2) {
encipher(lr[0], lr[1], lr);
P[i] = lr[0];
P[i + 1] = lr[1];
}
for (int i = 0; i < S.length; ++i) {
for (int j = 0; j < S[i].length; j += 2) {
encipher(lr[0], lr[1], lr);
S[i][j] = lr[0];
S[i][j + 1] = lr[1];
}
}
lastEncipherXL = 0;
lastEncipherXR = 0;
lastDecipherXL = 0;
lastDecipherXR = 0;
}
}