1 /* Tiger.java --
2    Copyright (C) 2003, 2006 Free Software Foundation, Inc.
3 
4 This file is a part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
19 USA
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version.  */
37 
38 
39 package gnu.java.security.hash;
40 
41 import gnu.java.security.Registry;
42 import gnu.java.security.util.Util;
43 
44 /**
45  * The Tiger message digest. Tiger was designed by Ross Anderson and Eli
46  * Biham, with the goal of producing a secure, fast hash function that
47  * performs especially well on next-generation 64-bit architectures, but
48  * is still efficient on 32- and 16-bit architectures.
49  * <p>
50  * Tiger processes data in 512-bit blocks and produces a 192-bit
51  * digest.
52  * <p>
53  * References:
54  * <ol>
55  * <li><a
56  * href="http://www.cs.technion.ac.il/~biham/Reports/Tiger/">Tiger: A
57  * Fast New Hash Function</a>, Ross Anderson and Eli Biham.</a></li>
58  * </ol>
59  */
60 public class Tiger
61     extends BaseHash
62 {
63   private static final int HASH_SIZE = 24;
64 
65   private static final int BLOCK_SIZE = 64;
66 
67   /** Result when no data has been input. */
68   private static final String DIGEST0 =
69       "3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3";
70 
71   private static final long A = 0x0123456789ABCDEFL;
72 
73   private static final long B = 0xFEDCBA9876543210L;
74 
75   private static final long C = 0xF096A5B4C3B2E187L;
76 
77   /** S-Box T1. */
78   private static final long[] T1 = {
79       0x02AAB17CF7E90C5EL, 0xAC424B03E243A8ECL, 0x72CD5BE30DD5FCD3L,
80       0x6D019B93F6F97F3AL, 0xCD9978FFD21F9193L, 0x7573A1C9708029E2L,
81       0xB164326B922A83C3L, 0x46883EEE04915870L, 0xEAACE3057103ECE6L,
82       0xC54169B808A3535CL, 0x4CE754918DDEC47CL, 0x0AA2F4DFDC0DF40CL,
83       0x10B76F18A74DBEFAL, 0xC6CCB6235AD1AB6AL, 0x13726121572FE2FFL,
84       0x1A488C6F199D921EL, 0x4BC9F9F4DA0007CAL, 0x26F5E6F6E85241C7L,
85       0x859079DBEA5947B6L, 0x4F1885C5C99E8C92L, 0xD78E761EA96F864BL,
86       0x8E36428C52B5C17DL, 0x69CF6827373063C1L, 0xB607C93D9BB4C56EL,
87       0x7D820E760E76B5EAL, 0x645C9CC6F07FDC42L, 0xBF38A078243342E0L,
88       0x5F6B343C9D2E7D04L, 0xF2C28AEB600B0EC6L, 0x6C0ED85F7254BCACL,
89       0x71592281A4DB4FE5L, 0x1967FA69CE0FED9FL, 0xFD5293F8B96545DBL,
90       0xC879E9D7F2A7600BL, 0x860248920193194EL, 0xA4F9533B2D9CC0B3L,
91       0x9053836C15957613L, 0xDB6DCF8AFC357BF1L, 0x18BEEA7A7A370F57L,
92       0x037117CA50B99066L, 0x6AB30A9774424A35L, 0xF4E92F02E325249BL,
93       0x7739DB07061CCAE1L, 0xD8F3B49CECA42A05L, 0xBD56BE3F51382F73L,
94       0x45FAED5843B0BB28L, 0x1C813D5C11BF1F83L, 0x8AF0E4B6D75FA169L,
95       0x33EE18A487AD9999L, 0x3C26E8EAB1C94410L, 0xB510102BC0A822F9L,
96       0x141EEF310CE6123BL, 0xFC65B90059DDB154L, 0xE0158640C5E0E607L,
97       0x884E079826C3A3CFL, 0x930D0D9523C535FDL, 0x35638D754E9A2B00L,
98       0x4085FCCF40469DD5L, 0xC4B17AD28BE23A4CL, 0xCAB2F0FC6A3E6A2EL,
99       0x2860971A6B943FCDL, 0x3DDE6EE212E30446L, 0x6222F32AE01765AEL,
100       0x5D550BB5478308FEL, 0xA9EFA98DA0EDA22AL, 0xC351A71686C40DA7L,
101       0x1105586D9C867C84L, 0xDCFFEE85FDA22853L, 0xCCFBD0262C5EEF76L,
102       0xBAF294CB8990D201L, 0xE69464F52AFAD975L, 0x94B013AFDF133E14L,
103       0x06A7D1A32823C958L, 0x6F95FE5130F61119L, 0xD92AB34E462C06C0L,
104       0xED7BDE33887C71D2L, 0x79746D6E6518393EL, 0x5BA419385D713329L,
105       0x7C1BA6B948A97564L, 0x31987C197BFDAC67L, 0xDE6C23C44B053D02L,
106       0x581C49FED002D64DL, 0xDD474D6338261571L, 0xAA4546C3E473D062L,
107       0x928FCE349455F860L, 0x48161BBACAAB94D9L, 0x63912430770E6F68L,
108       0x6EC8A5E602C6641CL, 0x87282515337DDD2BL, 0x2CDA6B42034B701BL,
109       0xB03D37C181CB096DL, 0xE108438266C71C6FL, 0x2B3180C7EB51B255L,
110       0xDF92B82F96C08BBCL, 0x5C68C8C0A632F3BAL, 0x5504CC861C3D0556L,
111       0xABBFA4E55FB26B8FL, 0x41848B0AB3BACEB4L, 0xB334A273AA445D32L,
112       0xBCA696F0A85AD881L, 0x24F6EC65B528D56CL, 0x0CE1512E90F4524AL,
113       0x4E9DD79D5506D35AL, 0x258905FAC6CE9779L, 0x2019295B3E109B33L,
114       0xF8A9478B73A054CCL, 0x2924F2F934417EB0L, 0x3993357D536D1BC4L,
115       0x38A81AC21DB6FF8BL, 0x47C4FBF17D6016BFL, 0x1E0FAADD7667E3F5L,
116       0x7ABCFF62938BEB96L, 0xA78DAD948FC179C9L, 0x8F1F98B72911E50DL,
117       0x61E48EAE27121A91L, 0x4D62F7AD31859808L, 0xECEBA345EF5CEAEBL,
118       0xF5CEB25EBC9684CEL, 0xF633E20CB7F76221L, 0xA32CDF06AB8293E4L,
119       0x985A202CA5EE2CA4L, 0xCF0B8447CC8A8FB1L, 0x9F765244979859A3L,
120       0xA8D516B1A1240017L, 0x0BD7BA3EBB5DC726L, 0xE54BCA55B86ADB39L,
121       0x1D7A3AFD6C478063L, 0x519EC608E7669EDDL, 0x0E5715A2D149AA23L,
122       0x177D4571848FF194L, 0xEEB55F3241014C22L, 0x0F5E5CA13A6E2EC2L,
123       0x8029927B75F5C361L, 0xAD139FABC3D6E436L, 0x0D5DF1A94CCF402FL,
124       0x3E8BD948BEA5DFC8L, 0xA5A0D357BD3FF77EL, 0xA2D12E251F74F645L,
125       0x66FD9E525E81A082L, 0x2E0C90CE7F687A49L, 0xC2E8BCBEBA973BC5L,
126       0x000001BCE509745FL, 0x423777BBE6DAB3D6L, 0xD1661C7EAEF06EB5L,
127       0xA1781F354DAACFD8L, 0x2D11284A2B16AFFCL, 0xF1FC4F67FA891D1FL,
128       0x73ECC25DCB920ADAL, 0xAE610C22C2A12651L, 0x96E0A810D356B78AL,
129       0x5A9A381F2FE7870FL, 0xD5AD62EDE94E5530L, 0xD225E5E8368D1427L,
130       0x65977B70C7AF4631L, 0x99F889B2DE39D74FL, 0x233F30BF54E1D143L,
131       0x9A9675D3D9A63C97L, 0x5470554FF334F9A8L, 0x166ACB744A4F5688L,
132       0x70C74CAAB2E4AEADL, 0xF0D091646F294D12L, 0x57B82A89684031D1L,
133       0xEFD95A5A61BE0B6BL, 0x2FBD12E969F2F29AL, 0x9BD37013FEFF9FE8L,
134       0x3F9B0404D6085A06L, 0x4940C1F3166CFE15L, 0x09542C4DCDF3DEFBL,
135       0xB4C5218385CD5CE3L, 0xC935B7DC4462A641L, 0x3417F8A68ED3B63FL,
136       0xB80959295B215B40L, 0xF99CDAEF3B8C8572L, 0x018C0614F8FCB95DL,
137       0x1B14ACCD1A3ACDF3L, 0x84D471F200BB732DL, 0xC1A3110E95E8DA16L,
138       0x430A7220BF1A82B8L, 0xB77E090D39DF210EL, 0x5EF4BD9F3CD05E9DL,
139       0x9D4FF6DA7E57A444L, 0xDA1D60E183D4A5F8L, 0xB287C38417998E47L,
140       0xFE3EDC121BB31886L, 0xC7FE3CCC980CCBEFL, 0xE46FB590189BFD03L,
141       0x3732FD469A4C57DCL, 0x7EF700A07CF1AD65L, 0x59C64468A31D8859L,
142       0x762FB0B4D45B61F6L, 0x155BAED099047718L, 0x68755E4C3D50BAA6L,
143       0xE9214E7F22D8B4DFL, 0x2ADDBF532EAC95F4L, 0x32AE3909B4BD0109L,
144       0x834DF537B08E3450L, 0xFA209DA84220728DL, 0x9E691D9B9EFE23F7L,
145       0x0446D288C4AE8D7FL, 0x7B4CC524E169785BL, 0x21D87F0135CA1385L,
146       0xCEBB400F137B8AA5L, 0x272E2B66580796BEL, 0x3612264125C2B0DEL,
147       0x057702BDAD1EFBB2L, 0xD4BABB8EACF84BE9L, 0x91583139641BC67BL,
148       0x8BDC2DE08036E024L, 0x603C8156F49F68EDL, 0xF7D236F7DBEF5111L,
149       0x9727C4598AD21E80L, 0xA08A0896670A5FD7L, 0xCB4A8F4309EBA9CBL,
150       0x81AF564B0F7036A1L, 0xC0B99AA778199ABDL, 0x959F1EC83FC8E952L,
151       0x8C505077794A81B9L, 0x3ACAAF8F056338F0L, 0x07B43F50627A6778L,
152       0x4A44AB49F5ECCC77L, 0x3BC3D6E4B679EE98L, 0x9CC0D4D1CF14108CL,
153       0x4406C00B206BC8A0L, 0x82A18854C8D72D89L, 0x67E366B35C3C432CL,
154       0xB923DD61102B37F2L, 0x56AB2779D884271DL, 0xBE83E1B0FF1525AFL,
155       0xFB7C65D4217E49A9L, 0x6BDBE0E76D48E7D4L, 0x08DF828745D9179EL,
156       0x22EA6A9ADD53BD34L, 0xE36E141C5622200AL, 0x7F805D1B8CB750EEL,
157       0xAFE5C7A59F58E837L, 0xE27F996A4FB1C23CL, 0xD3867DFB0775F0D0L,
158       0xD0E673DE6E88891AL, 0x123AEB9EAFB86C25L, 0x30F1D5D5C145B895L,
159       0xBB434A2DEE7269E7L, 0x78CB67ECF931FA38L, 0xF33B0372323BBF9CL,
160       0x52D66336FB279C74L, 0x505F33AC0AFB4EAAL, 0xE8A5CD99A2CCE187L,
161       0x534974801E2D30BBL, 0x8D2D5711D5876D90L, 0x1F1A412891BC038EL,
162       0xD6E2E71D82E56648L, 0x74036C3A497732B7L, 0x89B67ED96361F5ABL,
163       0xFFED95D8F1EA02A2L, 0xE72B3BD61464D43DL, 0xA6300F170BDC4820L,
164       0xEBC18760ED78A77AL };
165 
166   /** S-Box T2. */
167   private static final long[] T2 = {
168       0xE6A6BE5A05A12138L, 0xB5A122A5B4F87C98L, 0x563C6089140B6990L,
169       0x4C46CB2E391F5DD5L, 0xD932ADDBC9B79434L, 0x08EA70E42015AFF5L,
170       0xD765A6673E478CF1L, 0xC4FB757EAB278D99L, 0xDF11C6862D6E0692L,
171       0xDDEB84F10D7F3B16L, 0x6F2EF604A665EA04L, 0x4A8E0F0FF0E0DFB3L,
172       0xA5EDEEF83DBCBA51L, 0xFC4F0A2A0EA4371EL, 0xE83E1DA85CB38429L,
173       0xDC8FF882BA1B1CE2L, 0xCD45505E8353E80DL, 0x18D19A00D4DB0717L,
174       0x34A0CFEDA5F38101L, 0x0BE77E518887CAF2L, 0x1E341438B3C45136L,
175       0xE05797F49089CCF9L, 0xFFD23F9DF2591D14L, 0x543DDA228595C5CDL,
176       0x661F81FD99052A33L, 0x8736E641DB0F7B76L, 0x15227725418E5307L,
177       0xE25F7F46162EB2FAL, 0x48A8B2126C13D9FEL, 0xAFDC541792E76EEAL,
178       0x03D912BFC6D1898FL, 0x31B1AAFA1B83F51BL, 0xF1AC2796E42AB7D9L,
179       0x40A3A7D7FCD2EBACL, 0x1056136D0AFBBCC5L, 0x7889E1DD9A6D0C85L,
180       0xD33525782A7974AAL, 0xA7E25D09078AC09BL, 0xBD4138B3EAC6EDD0L,
181       0x920ABFBE71EB9E70L, 0xA2A5D0F54FC2625CL, 0xC054E36B0B1290A3L,
182       0xF6DD59FF62FE932BL, 0x3537354511A8AC7DL, 0xCA845E9172FADCD4L,
183       0x84F82B60329D20DCL, 0x79C62CE1CD672F18L, 0x8B09A2ADD124642CL,
184       0xD0C1E96A19D9E726L, 0x5A786A9B4BA9500CL, 0x0E020336634C43F3L,
185       0xC17B474AEB66D822L, 0x6A731AE3EC9BAAC2L, 0x8226667AE0840258L,
186       0x67D4567691CAECA5L, 0x1D94155C4875ADB5L, 0x6D00FD985B813FDFL,
187       0x51286EFCB774CD06L, 0x5E8834471FA744AFL, 0xF72CA0AEE761AE2EL,
188       0xBE40E4CDAEE8E09AL, 0xE9970BBB5118F665L, 0x726E4BEB33DF1964L,
189       0x703B000729199762L, 0x4631D816F5EF30A7L, 0xB880B5B51504A6BEL,
190       0x641793C37ED84B6CL, 0x7B21ED77F6E97D96L, 0x776306312EF96B73L,
191       0xAE528948E86FF3F4L, 0x53DBD7F286A3F8F8L, 0x16CADCE74CFC1063L,
192       0x005C19BDFA52C6DDL, 0x68868F5D64D46AD3L, 0x3A9D512CCF1E186AL,
193       0x367E62C2385660AEL, 0xE359E7EA77DCB1D7L, 0x526C0773749ABE6EL,
194       0x735AE5F9D09F734BL, 0x493FC7CC8A558BA8L, 0xB0B9C1533041AB45L,
195       0x321958BA470A59BDL, 0x852DB00B5F46C393L, 0x91209B2BD336B0E5L,
196       0x6E604F7D659EF19FL, 0xB99A8AE2782CCB24L, 0xCCF52AB6C814C4C7L,
197       0x4727D9AFBE11727BL, 0x7E950D0C0121B34DL, 0x756F435670AD471FL,
198       0xF5ADD442615A6849L, 0x4E87E09980B9957AL, 0x2ACFA1DF50AEE355L,
199       0xD898263AFD2FD556L, 0xC8F4924DD80C8FD6L, 0xCF99CA3D754A173AL,
200       0xFE477BACAF91BF3CL, 0xED5371F6D690C12DL, 0x831A5C285E687094L,
201       0xC5D3C90A3708A0A4L, 0x0F7F903717D06580L, 0x19F9BB13B8FDF27FL,
202       0xB1BD6F1B4D502843L, 0x1C761BA38FFF4012L, 0x0D1530C4E2E21F3BL,
203       0x8943CE69A7372C8AL, 0xE5184E11FEB5CE66L, 0x618BDB80BD736621L,
204       0x7D29BAD68B574D0BL, 0x81BB613E25E6FE5BL, 0x071C9C10BC07913FL,
205       0xC7BEEB7909AC2D97L, 0xC3E58D353BC5D757L, 0xEB017892F38F61E8L,
206       0xD4EFFB9C9B1CC21AL, 0x99727D26F494F7ABL, 0xA3E063A2956B3E03L,
207       0x9D4A8B9A4AA09C30L, 0x3F6AB7D500090FB4L, 0x9CC0F2A057268AC0L,
208       0x3DEE9D2DEDBF42D1L, 0x330F49C87960A972L, 0xC6B2720287421B41L,
209       0x0AC59EC07C00369CL, 0xEF4EAC49CB353425L, 0xF450244EEF0129D8L,
210       0x8ACC46E5CAF4DEB6L, 0x2FFEAB63989263F7L, 0x8F7CB9FE5D7A4578L,
211       0x5BD8F7644E634635L, 0x427A7315BF2DC900L, 0x17D0C4AA2125261CL,
212       0x3992486C93518E50L, 0xB4CBFEE0A2D7D4C3L, 0x7C75D6202C5DDD8DL,
213       0xDBC295D8E35B6C61L, 0x60B369D302032B19L, 0xCE42685FDCE44132L,
214       0x06F3DDB9DDF65610L, 0x8EA4D21DB5E148F0L, 0x20B0FCE62FCD496FL,
215       0x2C1B912358B0EE31L, 0xB28317B818F5A308L, 0xA89C1E189CA6D2CFL,
216       0x0C6B18576AAADBC8L, 0xB65DEAA91299FAE3L, 0xFB2B794B7F1027E7L,
217       0x04E4317F443B5BEBL, 0x4B852D325939D0A6L, 0xD5AE6BEEFB207FFCL,
218       0x309682B281C7D374L, 0xBAE309A194C3B475L, 0x8CC3F97B13B49F05L,
219       0x98A9422FF8293967L, 0x244B16B01076FF7CL, 0xF8BF571C663D67EEL,
220       0x1F0D6758EEE30DA1L, 0xC9B611D97ADEB9B7L, 0xB7AFD5887B6C57A2L,
221       0x6290AE846B984FE1L, 0x94DF4CDEACC1A5FDL, 0x058A5BD1C5483AFFL,
222       0x63166CC142BA3C37L, 0x8DB8526EB2F76F40L, 0xE10880036F0D6D4EL,
223       0x9E0523C9971D311DL, 0x45EC2824CC7CD691L, 0x575B8359E62382C9L,
224       0xFA9E400DC4889995L, 0xD1823ECB45721568L, 0xDAFD983B8206082FL,
225       0xAA7D29082386A8CBL, 0x269FCD4403B87588L, 0x1B91F5F728BDD1E0L,
226       0xE4669F39040201F6L, 0x7A1D7C218CF04ADEL, 0x65623C29D79CE5CEL,
227       0x2368449096C00BB1L, 0xAB9BF1879DA503BAL, 0xBC23ECB1A458058EL,
228       0x9A58DF01BB401ECCL, 0xA070E868A85F143DL, 0x4FF188307DF2239EL,
229       0x14D565B41A641183L, 0xEE13337452701602L, 0x950E3DCF3F285E09L,
230       0x59930254B9C80953L, 0x3BF299408930DA6DL, 0xA955943F53691387L,
231       0xA15EDECAA9CB8784L, 0x29142127352BE9A0L, 0x76F0371FFF4E7AFBL,
232       0x0239F450274F2228L, 0xBB073AF01D5E868BL, 0xBFC80571C10E96C1L,
233       0xD267088568222E23L, 0x9671A3D48E80B5B0L, 0x55B5D38AE193BB81L,
234       0x693AE2D0A18B04B8L, 0x5C48B4ECADD5335FL, 0xFD743B194916A1CAL,
235       0x2577018134BE98C4L, 0xE77987E83C54A4ADL, 0x28E11014DA33E1B9L,
236       0x270CC59E226AA213L, 0x71495F756D1A5F60L, 0x9BE853FB60AFEF77L,
237       0xADC786A7F7443DBFL, 0x0904456173B29A82L, 0x58BC7A66C232BD5EL,
238       0xF306558C673AC8B2L, 0x41F639C6B6C9772AL, 0x216DEFE99FDA35DAL,
239       0x11640CC71C7BE615L, 0x93C43694565C5527L, 0xEA038E6246777839L,
240       0xF9ABF3CE5A3E2469L, 0x741E768D0FD312D2L, 0x0144B883CED652C6L,
241       0xC20B5A5BA33F8552L, 0x1AE69633C3435A9DL, 0x97A28CA4088CFDECL,
242       0x8824A43C1E96F420L, 0x37612FA66EEEA746L, 0x6B4CB165F9CF0E5AL,
243       0x43AA1C06A0ABFB4AL, 0x7F4DC26FF162796BL, 0x6CBACC8E54ED9B0FL,
244       0xA6B7FFEFD2BB253EL, 0x2E25BC95B0A29D4FL, 0x86D6A58BDEF1388CL,
245       0xDED74AC576B6F054L, 0x8030BDBC2B45805DL, 0x3C81AF70E94D9289L,
246       0x3EFF6DDA9E3100DBL, 0xB38DC39FDFCC8847L, 0x123885528D17B87EL,
247       0xF2DA0ED240B1B642L, 0x44CEFADCD54BF9A9L, 0x1312200E433C7EE6L,
248       0x9FFCC84F3A78C748L, 0xF0CD1F72248576BBL, 0xEC6974053638CFE4L,
249       0x2BA7B67C0CEC4E4CL, 0xAC2F4DF3E5CE32EDL, 0xCB33D14326EA4C11L,
250       0xA4E9044CC77E58BCL, 0x5F513293D934FCEFL, 0x5DC9645506E55444L,
251       0x50DE418F317DE40AL, 0x388CB31A69DDE259L, 0x2DB4A83455820A86L,
252       0x9010A91E84711AE9L, 0x4DF7F0B7B1498371L, 0xD62A2EABC0977179L,
253       0x22FAC097AA8D5C0EL };
254 
255   /** S-Box T3. */
256   private static final long[] T3 = {
257       0xF49FCC2FF1DAF39BL, 0x487FD5C66FF29281L, 0xE8A30667FCDCA83FL,
258       0x2C9B4BE3D2FCCE63L, 0xDA3FF74B93FBBBC2L, 0x2FA165D2FE70BA66L,
259       0xA103E279970E93D4L, 0xBECDEC77B0E45E71L, 0xCFB41E723985E497L,
260       0xB70AAA025EF75017L, 0xD42309F03840B8E0L, 0x8EFC1AD035898579L,
261       0x96C6920BE2B2ABC5L, 0x66AF4163375A9172L, 0x2174ABDCCA7127FBL,
262       0xB33CCEA64A72FF41L, 0xF04A4933083066A5L, 0x8D970ACDD7289AF5L,
263       0x8F96E8E031C8C25EL, 0xF3FEC02276875D47L, 0xEC7BF310056190DDL,
264       0xF5ADB0AEBB0F1491L, 0x9B50F8850FD58892L, 0x4975488358B74DE8L,
265       0xA3354FF691531C61L, 0x0702BBE481D2C6EEL, 0x89FB24057DEDED98L,
266       0xAC3075138596E902L, 0x1D2D3580172772EDL, 0xEB738FC28E6BC30DL,
267       0x5854EF8F63044326L, 0x9E5C52325ADD3BBEL, 0x90AA53CF325C4623L,
268       0xC1D24D51349DD067L, 0x2051CFEEA69EA624L, 0x13220F0A862E7E4FL,
269       0xCE39399404E04864L, 0xD9C42CA47086FCB7L, 0x685AD2238A03E7CCL,
270       0x066484B2AB2FF1DBL, 0xFE9D5D70EFBF79ECL, 0x5B13B9DD9C481854L,
271       0x15F0D475ED1509ADL, 0x0BEBCD060EC79851L, 0xD58C6791183AB7F8L,
272       0xD1187C5052F3EEE4L, 0xC95D1192E54E82FFL, 0x86EEA14CB9AC6CA2L,
273       0x3485BEB153677D5DL, 0xDD191D781F8C492AL, 0xF60866BAA784EBF9L,
274       0x518F643BA2D08C74L, 0x8852E956E1087C22L, 0xA768CB8DC410AE8DL,
275       0x38047726BFEC8E1AL, 0xA67738B4CD3B45AAL, 0xAD16691CEC0DDE19L,
276       0xC6D4319380462E07L, 0xC5A5876D0BA61938L, 0x16B9FA1FA58FD840L,
277       0x188AB1173CA74F18L, 0xABDA2F98C99C021FL, 0x3E0580AB134AE816L,
278       0x5F3B05B773645ABBL, 0x2501A2BE5575F2F6L, 0x1B2F74004E7E8BA9L,
279       0x1CD7580371E8D953L, 0x7F6ED89562764E30L, 0xB15926FF596F003DL,
280       0x9F65293DA8C5D6B9L, 0x6ECEF04DD690F84CL, 0x4782275FFF33AF88L,
281       0xE41433083F820801L, 0xFD0DFE409A1AF9B5L, 0x4325A3342CDB396BL,
282       0x8AE77E62B301B252L, 0xC36F9E9F6655615AL, 0x85455A2D92D32C09L,
283       0xF2C7DEA949477485L, 0x63CFB4C133A39EBAL, 0x83B040CC6EBC5462L,
284       0x3B9454C8FDB326B0L, 0x56F56A9E87FFD78CL, 0x2DC2940D99F42BC6L,
285       0x98F7DF096B096E2DL, 0x19A6E01E3AD852BFL, 0x42A99CCBDBD4B40BL,
286       0xA59998AF45E9C559L, 0x366295E807D93186L, 0x6B48181BFAA1F773L,
287       0x1FEC57E2157A0A1DL, 0x4667446AF6201AD5L, 0xE615EBCACFB0F075L,
288       0xB8F31F4F68290778L, 0x22713ED6CE22D11EL, 0x3057C1A72EC3C93BL,
289       0xCB46ACC37C3F1F2FL, 0xDBB893FD02AAF50EL, 0x331FD92E600B9FCFL,
290       0xA498F96148EA3AD6L, 0xA8D8426E8B6A83EAL, 0xA089B274B7735CDCL,
291       0x87F6B3731E524A11L, 0x118808E5CBC96749L, 0x9906E4C7B19BD394L,
292       0xAFED7F7E9B24A20CL, 0x6509EADEEB3644A7L, 0x6C1EF1D3E8EF0EDEL,
293       0xB9C97D43E9798FB4L, 0xA2F2D784740C28A3L, 0x7B8496476197566FL,
294       0x7A5BE3E6B65F069DL, 0xF96330ED78BE6F10L, 0xEEE60DE77A076A15L,
295       0x2B4BEE4AA08B9BD0L, 0x6A56A63EC7B8894EL, 0x02121359BA34FEF4L,
296       0x4CBF99F8283703FCL, 0x398071350CAF30C8L, 0xD0A77A89F017687AL,
297       0xF1C1A9EB9E423569L, 0x8C7976282DEE8199L, 0x5D1737A5DD1F7ABDL,
298       0x4F53433C09A9FA80L, 0xFA8B0C53DF7CA1D9L, 0x3FD9DCBC886CCB77L,
299       0xC040917CA91B4720L, 0x7DD00142F9D1DCDFL, 0x8476FC1D4F387B58L,
300       0x23F8E7C5F3316503L, 0x032A2244E7E37339L, 0x5C87A5D750F5A74BL,
301       0x082B4CC43698992EL, 0xDF917BECB858F63CL, 0x3270B8FC5BF86DDAL,
302       0x10AE72BB29B5DD76L, 0x576AC94E7700362BL, 0x1AD112DAC61EFB8FL,
303       0x691BC30EC5FAA427L, 0xFF246311CC327143L, 0x3142368E30E53206L,
304       0x71380E31E02CA396L, 0x958D5C960AAD76F1L, 0xF8D6F430C16DA536L,
305       0xC8FFD13F1BE7E1D2L, 0x7578AE66004DDBE1L, 0x05833F01067BE646L,
306       0xBB34B5AD3BFE586DL, 0x095F34C9A12B97F0L, 0x247AB64525D60CA8L,
307       0xDCDBC6F3017477D1L, 0x4A2E14D4DECAD24DL, 0xBDB5E6D9BE0A1EEBL,
308       0x2A7E70F7794301ABL, 0xDEF42D8A270540FDL, 0x01078EC0A34C22C1L,
309       0xE5DE511AF4C16387L, 0x7EBB3A52BD9A330AL, 0x77697857AA7D6435L,
310       0x004E831603AE4C32L, 0xE7A21020AD78E312L, 0x9D41A70C6AB420F2L,
311       0x28E06C18EA1141E6L, 0xD2B28CBD984F6B28L, 0x26B75F6C446E9D83L,
312       0xBA47568C4D418D7FL, 0xD80BADBFE6183D8EL, 0x0E206D7F5F166044L,
313       0xE258A43911CBCA3EL, 0x723A1746B21DC0BCL, 0xC7CAA854F5D7CDD3L,
314       0x7CAC32883D261D9CL, 0x7690C26423BA942CL, 0x17E55524478042B8L,
315       0xE0BE477656A2389FL, 0x4D289B5E67AB2DA0L, 0x44862B9C8FBBFD31L,
316       0xB47CC8049D141365L, 0x822C1B362B91C793L, 0x4EB14655FB13DFD8L,
317       0x1ECBBA0714E2A97BL, 0x6143459D5CDE5F14L, 0x53A8FBF1D5F0AC89L,
318       0x97EA04D81C5E5B00L, 0x622181A8D4FDB3F3L, 0xE9BCD341572A1208L,
319       0x1411258643CCE58AL, 0x9144C5FEA4C6E0A4L, 0x0D33D06565CF620FL,
320       0x54A48D489F219CA1L, 0xC43E5EAC6D63C821L, 0xA9728B3A72770DAFL,
321       0xD7934E7B20DF87EFL, 0xE35503B61A3E86E5L, 0xCAE321FBC819D504L,
322       0x129A50B3AC60BFA6L, 0xCD5E68EA7E9FB6C3L, 0xB01C90199483B1C7L,
323       0x3DE93CD5C295376CL, 0xAED52EDF2AB9AD13L, 0x2E60F512C0A07884L,
324       0xBC3D86A3E36210C9L, 0x35269D9B163951CEL, 0x0C7D6E2AD0CDB5FAL,
325       0x59E86297D87F5733L, 0x298EF221898DB0E7L, 0x55000029D1A5AA7EL,
326       0x8BC08AE1B5061B45L, 0xC2C31C2B6C92703AL, 0x94CC596BAF25EF42L,
327       0x0A1D73DB22540456L, 0x04B6A0F9D9C4179AL, 0xEFFDAFA2AE3D3C60L,
328       0xF7C8075BB49496C4L, 0x9CC5C7141D1CD4E3L, 0x78BD1638218E5534L,
329       0xB2F11568F850246AL, 0xEDFABCFA9502BC29L, 0x796CE5F2DA23051BL,
330       0xAAE128B0DC93537CL, 0x3A493DA0EE4B29AEL, 0xB5DF6B2C416895D7L,
331       0xFCABBD25122D7F37L, 0x70810B58105DC4B1L, 0xE10FDD37F7882A90L,
332       0x524DCAB5518A3F5CL, 0x3C9E85878451255BL, 0x4029828119BD34E2L,
333       0x74A05B6F5D3CECCBL, 0xB610021542E13ECAL, 0x0FF979D12F59E2ACL,
334       0x6037DA27E4F9CC50L, 0x5E92975A0DF1847DL, 0xD66DE190D3E623FEL,
335       0x5032D6B87B568048L, 0x9A36B7CE8235216EL, 0x80272A7A24F64B4AL,
336       0x93EFED8B8C6916F7L, 0x37DDBFF44CCE1555L, 0x4B95DB5D4B99BD25L,
337       0x92D3FDA169812FC0L, 0xFB1A4A9A90660BB6L, 0x730C196946A4B9B2L,
338       0x81E289AA7F49DA68L, 0x64669A0F83B1A05FL, 0x27B3FF7D9644F48BL,
339       0xCC6B615C8DB675B3L, 0x674F20B9BCEBBE95L, 0x6F31238275655982L,
340       0x5AE488713E45CF05L, 0xBF619F9954C21157L, 0xEABAC46040A8EAE9L,
341       0x454C6FE9F2C0C1CDL, 0x419CF6496412691CL, 0xD3DC3BEF265B0F70L,
342       0x6D0E60F5C3578A9EL };
343 
344   /** S-Box T4. */
345   private static final long[] T4 = {
346       0x5B0E608526323C55L, 0x1A46C1A9FA1B59F5L, 0xA9E245A17C4C8FFAL,
347       0x65CA5159DB2955D7L, 0x05DB0A76CE35AFC2L, 0x81EAC77EA9113D45L,
348       0x528EF88AB6AC0A0DL, 0xA09EA253597BE3FFL, 0x430DDFB3AC48CD56L,
349       0xC4B3A67AF45CE46FL, 0x4ECECFD8FBE2D05EL, 0x3EF56F10B39935F0L,
350       0x0B22D6829CD619C6L, 0x17FD460A74DF2069L, 0x6CF8CC8E8510ED40L,
351       0xD6C824BF3A6ECAA7L, 0x61243D581A817049L, 0x048BACB6BBC163A2L,
352       0xD9A38AC27D44CC32L, 0x7FDDFF5BAAF410ABL, 0xAD6D495AA804824BL,
353       0xE1A6A74F2D8C9F94L, 0xD4F7851235DEE8E3L, 0xFD4B7F886540D893L,
354       0x247C20042AA4BFDAL, 0x096EA1C517D1327CL, 0xD56966B4361A6685L,
355       0x277DA5C31221057DL, 0x94D59893A43ACFF7L, 0x64F0C51CCDC02281L,
356       0x3D33BCC4FF6189DBL, 0xE005CB184CE66AF1L, 0xFF5CCD1D1DB99BEAL,
357       0xB0B854A7FE42980FL, 0x7BD46A6A718D4B9FL, 0xD10FA8CC22A5FD8CL,
358       0xD31484952BE4BD31L, 0xC7FA975FCB243847L, 0x4886ED1E5846C407L,
359       0x28CDDB791EB70B04L, 0xC2B00BE2F573417FL, 0x5C9590452180F877L,
360       0x7A6BDDFFF370EB00L, 0xCE509E38D6D9D6A4L, 0xEBEB0F00647FA702L,
361       0x1DCC06CF76606F06L, 0xE4D9F28BA286FF0AL, 0xD85A305DC918C262L,
362       0x475B1D8732225F54L, 0x2D4FB51668CCB5FEL, 0xA679B9D9D72BBA20L,
363       0x53841C0D912D43A5L, 0x3B7EAA48BF12A4E8L, 0x781E0E47F22F1DDFL,
364       0xEFF20CE60AB50973L, 0x20D261D19DFFB742L, 0x16A12B03062A2E39L,
365       0x1960EB2239650495L, 0x251C16FED50EB8B8L, 0x9AC0C330F826016EL,
366       0xED152665953E7671L, 0x02D63194A6369570L, 0x5074F08394B1C987L,
367       0x70BA598C90B25CE1L, 0x794A15810B9742F6L, 0x0D5925E9FCAF8C6CL,
368       0x3067716CD868744EL, 0x910AB077E8D7731BL, 0x6A61BBDB5AC42F61L,
369       0x93513EFBF0851567L, 0xF494724B9E83E9D5L, 0xE887E1985C09648DL,
370       0x34B1D3C675370CFDL, 0xDC35E433BC0D255DL, 0xD0AAB84234131BE0L,
371       0x08042A50B48B7EAFL, 0x9997C4EE44A3AB35L, 0x829A7B49201799D0L,
372       0x263B8307B7C54441L, 0x752F95F4FD6A6CA6L, 0x927217402C08C6E5L,
373       0x2A8AB754A795D9EEL, 0xA442F7552F72943DL, 0x2C31334E19781208L,
374       0x4FA98D7CEAEE6291L, 0x55C3862F665DB309L, 0xBD0610175D53B1F3L,
375       0x46FE6CB840413F27L, 0x3FE03792DF0CFA59L, 0xCFE700372EB85E8FL,
376       0xA7BE29E7ADBCE118L, 0xE544EE5CDE8431DDL, 0x8A781B1B41F1873EL,
377       0xA5C94C78A0D2F0E7L, 0x39412E2877B60728L, 0xA1265EF3AFC9A62CL,
378       0xBCC2770C6A2506C5L, 0x3AB66DD5DCE1CE12L, 0xE65499D04A675B37L,
379       0x7D8F523481BFD216L, 0x0F6F64FCEC15F389L, 0x74EFBE618B5B13C8L,
380       0xACDC82B714273E1DL, 0xDD40BFE003199D17L, 0x37E99257E7E061F8L,
381       0xFA52626904775AAAL, 0x8BBBF63A463D56F9L, 0xF0013F1543A26E64L,
382       0xA8307E9F879EC898L, 0xCC4C27A4150177CCL, 0x1B432F2CCA1D3348L,
383       0xDE1D1F8F9F6FA013L, 0x606602A047A7DDD6L, 0xD237AB64CC1CB2C7L,
384       0x9B938E7225FCD1D3L, 0xEC4E03708E0FF476L, 0xFEB2FBDA3D03C12DL,
385       0xAE0BCED2EE43889AL, 0x22CB8923EBFB4F43L, 0x69360D013CF7396DL,
386       0x855E3602D2D4E022L, 0x073805BAD01F784CL, 0x33E17A133852F546L,
387       0xDF4874058AC7B638L, 0xBA92B29C678AA14AL, 0x0CE89FC76CFAADCDL,
388       0x5F9D4E0908339E34L, 0xF1AFE9291F5923B9L, 0x6E3480F60F4A265FL,
389       0xEEBF3A2AB29B841CL, 0xE21938A88F91B4ADL, 0x57DFEFF845C6D3C3L,
390       0x2F006B0BF62CAAF2L, 0x62F479EF6F75EE78L, 0x11A55AD41C8916A9L,
391       0xF229D29084FED453L, 0x42F1C27B16B000E6L, 0x2B1F76749823C074L,
392       0x4B76ECA3C2745360L, 0x8C98F463B91691BDL, 0x14BCC93CF1ADE66AL,
393       0x8885213E6D458397L, 0x8E177DF0274D4711L, 0xB49B73B5503F2951L,
394       0x10168168C3F96B6BL, 0x0E3D963B63CAB0AEL, 0x8DFC4B5655A1DB14L,
395       0xF789F1356E14DE5CL, 0x683E68AF4E51DAC1L, 0xC9A84F9D8D4B0FD9L,
396       0x3691E03F52A0F9D1L, 0x5ED86E46E1878E80L, 0x3C711A0E99D07150L,
397       0x5A0865B20C4E9310L, 0x56FBFC1FE4F0682EL, 0xEA8D5DE3105EDF9BL,
398       0x71ABFDB12379187AL, 0x2EB99DE1BEE77B9CL, 0x21ECC0EA33CF4523L,
399       0x59A4D7521805C7A1L, 0x3896F5EB56AE7C72L, 0xAA638F3DB18F75DCL,
400       0x9F39358DABE9808EL, 0xB7DEFA91C00B72ACL, 0x6B5541FD62492D92L,
401       0x6DC6DEE8F92E4D5BL, 0x353F57ABC4BEEA7EL, 0x735769D6DA5690CEL,
402       0x0A234AA642391484L, 0xF6F9508028F80D9DL, 0xB8E319A27AB3F215L,
403       0x31AD9C1151341A4DL, 0x773C22A57BEF5805L, 0x45C7561A07968633L,
404       0xF913DA9E249DBE36L, 0xDA652D9B78A64C68L, 0x4C27A97F3BC334EFL,
405       0x76621220E66B17F4L, 0x967743899ACD7D0BL, 0xF3EE5BCAE0ED6782L,
406       0x409F753600C879FCL, 0x06D09A39B5926DB6L, 0x6F83AEB0317AC588L,
407       0x01E6CA4A86381F21L, 0x66FF3462D19F3025L, 0x72207C24DDFD3BFBL,
408       0x4AF6B6D3E2ECE2EBL, 0x9C994DBEC7EA08DEL, 0x49ACE597B09A8BC4L,
409       0xB38C4766CF0797BAL, 0x131B9373C57C2A75L, 0xB1822CCE61931E58L,
410       0x9D7555B909BA1C0CL, 0x127FAFDD937D11D2L, 0x29DA3BADC66D92E4L,
411       0xA2C1D57154C2ECBCL, 0x58C5134D82F6FE24L, 0x1C3AE3515B62274FL,
412       0xE907C82E01CB8126L, 0xF8ED091913E37FCBL, 0x3249D8F9C80046C9L,
413       0x80CF9BEDE388FB63L, 0x1881539A116CF19EL, 0x5103F3F76BD52457L,
414       0x15B7E6F5AE47F7A8L, 0xDBD7C6DED47E9CCFL, 0x44E55C410228BB1AL,
415       0xB647D4255EDB4E99L, 0x5D11882BB8AAFC30L, 0xF5098BBB29D3212AL,
416       0x8FB5EA14E90296B3L, 0x677B942157DD025AL, 0xFB58E7C0A390ACB5L,
417       0x89D3674C83BD4A01L, 0x9E2DA4DF4BF3B93BL, 0xFCC41E328CAB4829L,
418       0x03F38C96BA582C52L, 0xCAD1BDBD7FD85DB2L, 0xBBB442C16082AE83L,
419       0xB95FE86BA5DA9AB0L, 0xB22E04673771A93FL, 0x845358C9493152D8L,
420       0xBE2A488697B4541EL, 0x95A2DC2DD38E6966L, 0xC02C11AC923C852BL,
421       0x2388B1990DF2A87BL, 0x7C8008FA1B4F37BEL, 0x1F70D0C84D54E503L,
422       0x5490ADEC7ECE57D4L, 0x002B3C27D9063A3AL, 0x7EAEA3848030A2BFL,
423       0xC602326DED2003C0L, 0x83A7287D69A94086L, 0xC57A5FCB30F57A8AL,
424       0xB56844E479EBE779L, 0xA373B40F05DCBCE9L, 0xD71A786E88570EE2L,
425       0x879CBACDBDE8F6A0L, 0x976AD1BCC164A32FL, 0xAB21E25E9666D78BL,
426       0x901063AAE5E5C33CL, 0x9818B34448698D90L, 0xE36487AE3E1E8ABBL,
427       0xAFBDF931893BDCB4L, 0x6345A0DC5FBBD519L, 0x8628FE269B9465CAL,
428       0x1E5D01603F9C51ECL, 0x4DE44006A15049B7L, 0xBF6C70E5F776CBB1L,
429       0x411218F2EF552BEDL, 0xCB0C0708705A36A3L, 0xE74D14754F986044L,
430       0xCD56D9430EA8280EL, 0xC12591D7535F5065L, 0xC83223F1720AEF96L,
431       0xC3A0396F7363A51FL };
432 
433   // The cached self-test result.
434   private static Boolean valid;
435 
436   // The context.
437   private long a, b, c;
438 
439   /**
440    * Trivial 0-arguments constructor.
441    */
Tiger()442   public Tiger()
443   {
444     super(Registry.TIGER_HASH, HASH_SIZE, BLOCK_SIZE);
445   }
446 
447   /**
448    * Private copying constructor for cloning.
449    *
450    * @param that The instance being cloned.
451    */
Tiger(Tiger that)452   private Tiger(Tiger that)
453   {
454     this();
455     this.a = that.a;
456     this.b = that.b;
457     this.c = that.c;
458     this.count = that.count;
459     this.buffer = (that.buffer != null) ? (byte[]) that.buffer.clone() : null;
460   }
461 
clone()462   public Object clone()
463   {
464     return new Tiger(this);
465   }
466 
selfTest()467   public boolean selfTest()
468   {
469     if (valid == null)
470       {
471         String d = Util.toString(new Tiger().digest());
472         valid = Boolean.valueOf(DIGEST0.equals(d));
473       }
474     return valid.booleanValue();
475   }
476 
padBuffer()477   protected byte[] padBuffer()
478   {
479     int n = (int)(count % BLOCK_SIZE);
480     int padding = (n < 56) ? (56 - n) : (120 - n);
481     byte[] pad = new byte[padding + 8];
482     pad[0] = 1;
483     long bits = count << 3;
484     pad[padding++] = (byte) bits;
485     pad[padding++] = (byte)(bits >>> 8);
486     pad[padding++] = (byte)(bits >>> 16);
487     pad[padding++] = (byte)(bits >>> 24);
488     pad[padding++] = (byte)(bits >>> 32);
489     pad[padding++] = (byte)(bits >>> 40);
490     pad[padding++] = (byte)(bits >>> 48);
491     pad[padding  ] = (byte)(bits >>> 56);
492     return pad;
493   }
494 
getResult()495   protected byte[] getResult()
496   {
497     return new byte[] {
498         (byte) a,         (byte)(a >>>  8), (byte)(a >>> 16), (byte)(a >>> 24),
499         (byte)(a >>> 32), (byte)(a >>> 40), (byte)(a >>> 48), (byte)(a >>> 56),
500         (byte) b,         (byte)(b >>>  8), (byte)(b >>> 16), (byte)(b >>> 24),
501         (byte)(b >>> 32), (byte)(b >>> 40), (byte)(b >>> 48), (byte)(b >>> 56),
502         (byte) c,         (byte)(c >>>  8), (byte)(c >>> 16), (byte)(c >>> 24),
503         (byte)(c >>> 32), (byte)(c >>> 40), (byte)(c >>> 48), (byte)(c >>> 56) };
504   }
505 
resetContext()506   protected void resetContext()
507   {
508     a = A;
509     b = B;
510     c = C;
511   }
512 
transform(byte[] in, int offset)513   protected void transform(byte[] in, int offset)
514   {
515     long x0, x1, x2, x3, x4, x5, x6, x7;
516     x0 = ((long)  in[offset++] & 0xFF)
517        | ((long) (in[offset++] & 0xFF) << 8)
518        | ((long) (in[offset++] & 0xFF) << 16)
519        | ((long) (in[offset++] & 0xFF) << 24)
520        | ((long) (in[offset++] & 0xFF) << 32)
521        | ((long) (in[offset++] & 0xFF) << 40)
522        | ((long) (in[offset++] & 0xFF) << 48)
523        | ((long) (in[offset++] & 0xFF) << 56);
524     x1 = ((long)  in[offset++] & 0xFF)
525        | ((long) (in[offset++] & 0xFF) << 8)
526        | ((long) (in[offset++] & 0xFF) << 16)
527        | ((long) (in[offset++] & 0xFF) << 24)
528        | ((long) (in[offset++] & 0xFF) << 32)
529        | ((long) (in[offset++] & 0xFF) << 40)
530        | ((long) (in[offset++] & 0xFF) << 48)
531        | ((long) (in[offset++] & 0xFF) << 56);
532     x2 = ((long)  in[offset++] & 0xFF)
533        | ((long) (in[offset++] & 0xFF) << 8)
534        | ((long) (in[offset++] & 0xFF) << 16)
535        | ((long) (in[offset++] & 0xFF) << 24)
536        | ((long) (in[offset++] & 0xFF) << 32)
537        | ((long) (in[offset++] & 0xFF) << 40)
538        | ((long) (in[offset++] & 0xFF) << 48)
539        | ((long) (in[offset++] & 0xFF) << 56);
540     x3 = ((long)  in[offset++] & 0xFF)
541        | ((long) (in[offset++] & 0xFF) << 8)
542        | ((long) (in[offset++] & 0xFF) << 16)
543        | ((long) (in[offset++] & 0xFF) << 24)
544        | ((long) (in[offset++] & 0xFF) << 32)
545        | ((long) (in[offset++] & 0xFF) << 40)
546        | ((long) (in[offset++] & 0xFF) << 48)
547        | ((long) (in[offset++] & 0xFF) << 56);
548     x4 = ((long)  in[offset++] & 0xFF)
549        | ((long) (in[offset++] & 0xFF) << 8)
550        | ((long) (in[offset++] & 0xFF) << 16)
551        | ((long) (in[offset++] & 0xFF) << 24)
552        | ((long) (in[offset++] & 0xFF) << 32)
553        | ((long) (in[offset++] & 0xFF) << 40)
554        | ((long) (in[offset++] & 0xFF) << 48)
555        | ((long) (in[offset++] & 0xFF) << 56);
556     x5 = ((long)  in[offset++] & 0xFF)
557        | ((long) (in[offset++] & 0xFF) << 8)
558        | ((long) (in[offset++] & 0xFF) << 16)
559        | ((long) (in[offset++] & 0xFF) << 24)
560        | ((long) (in[offset++] & 0xFF) << 32)
561        | ((long) (in[offset++] & 0xFF) << 40)
562        | ((long) (in[offset++] & 0xFF) << 48)
563        | ((long) (in[offset++] & 0xFF) << 56);
564     x6 = ((long)  in[offset++] & 0xFF)
565        | ((long) (in[offset++] & 0xFF) << 8)
566        | ((long) (in[offset++] & 0xFF) << 16)
567        | ((long) (in[offset++] & 0xFF) << 24)
568        | ((long) (in[offset++] & 0xFF) << 32)
569        | ((long) (in[offset++] & 0xFF) << 40)
570        | ((long) (in[offset++] & 0xFF) << 48)
571        | ((long) (in[offset++] & 0xFF) << 56);
572     x7 = ((long)  in[offset++] & 0xFF)
573        | ((long) (in[offset++] & 0xFF) << 8)
574        | ((long) (in[offset++] & 0xFF) << 16)
575        | ((long) (in[offset++] & 0xFF) << 24)
576        | ((long) (in[offset++] & 0xFF) << 32)
577        | ((long) (in[offset++] & 0xFF) << 40)
578        | ((long) (in[offset++] & 0xFF) << 48)
579        | ((long) (in[offset  ] & 0xFF) << 56);
580     // save_abc ::=
581     long aa = a, bb = b, cc = c;
582     // pass(aa, bb, cc, 5) ::=
583     cc ^= x0;
584     aa -= T1[(int) cc        & 0xff]
585         ^ T2[(int)(cc >> 16) & 0xff]
586         ^ T3[(int)(cc >> 32) & 0xff]
587         ^ T4[(int)(cc >> 48) & 0xff];
588     bb += T4[(int)(cc >>  8) & 0xff]
589         ^ T3[(int)(cc >> 24) & 0xff]
590         ^ T2[(int)(cc >> 40) & 0xff]
591         ^ T1[(int)(cc >> 56) & 0xff];
592     bb *= 5;
593     aa ^= x1;
594     bb -= T1[(int) aa        & 0xff]
595         ^ T2[(int)(aa >> 16) & 0xff]
596         ^ T3[(int)(aa >> 32) & 0xff]
597         ^ T4[(int)(aa >> 48) & 0xff];
598     cc += T4[(int)(aa >>  8) & 0xff]
599         ^ T3[(int)(aa >> 24) & 0xff]
600         ^ T2[(int)(aa >> 40) & 0xff]
601         ^ T1[(int)(aa >> 56) & 0xff];
602     cc *= 5;
603     bb ^= x2;
604     cc -= T1[(int) bb        & 0xff]
605         ^ T2[(int)(bb >> 16) & 0xff]
606         ^ T3[(int)(bb >> 32) & 0xff]
607         ^ T4[(int)(bb >> 48) & 0xff];
608     aa += T4[(int)(bb >>  8) & 0xff]
609         ^ T3[(int)(bb >> 24) & 0xff]
610         ^ T2[(int)(bb >> 40) & 0xff]
611         ^ T1[(int)(bb >> 56) & 0xff];
612     aa *= 5;
613     cc ^= x3;
614     aa -= T1[(int) cc        & 0xff]
615         ^ T2[(int)(cc >> 16) & 0xff]
616         ^ T3[(int)(cc >> 32) & 0xff]
617         ^ T4[(int)(cc >> 48) & 0xff];
618     bb += T4[(int)(cc >>  8) & 0xff]
619         ^ T3[(int)(cc >> 24) & 0xff]
620         ^ T2[(int)(cc >> 40) & 0xff]
621         ^ T1[(int)(cc >> 56) & 0xff];
622     bb *= 5;
623     aa ^= x4;
624     bb -= T1[(int) aa        & 0xff]
625         ^ T2[(int)(aa >> 16) & 0xff]
626         ^ T3[(int)(aa >> 32) & 0xff]
627         ^ T4[(int)(aa >> 48) & 0xff];
628     cc += T4[(int)(aa >>  8) & 0xff]
629         ^ T3[(int)(aa >> 24) & 0xff]
630         ^ T2[(int)(aa >> 40) & 0xff]
631         ^ T1[(int)(aa >> 56) & 0xff];
632     cc *= 5;
633     bb ^= x5;
634     cc -= T1[(int) bb        & 0xff]
635         ^ T2[(int)(bb >> 16) & 0xff]
636         ^ T3[(int)(bb >> 32) & 0xff]
637         ^ T4[(int)(bb >> 48) & 0xff];
638     aa += T4[(int)(bb >>  8) & 0xff]
639         ^ T3[(int)(bb >> 24) & 0xff]
640         ^ T2[(int)(bb >> 40) & 0xff]
641         ^ T1[(int)(bb >> 56) & 0xff];
642     aa *= 5;
643     cc ^= x6;
644     aa -= T1[(int) cc        & 0xff]
645         ^ T2[(int)(cc >> 16) & 0xff]
646         ^ T3[(int)(cc >> 32) & 0xff]
647         ^ T4[(int)(cc >> 48) & 0xff];
648     bb += T4[(int)(cc >>  8) & 0xff]
649         ^ T3[(int)(cc >> 24) & 0xff]
650         ^ T2[(int)(cc >> 40) & 0xff]
651         ^ T1[(int)(cc >> 56) & 0xff];
652     bb *= 5;
653     aa ^= x7;
654     bb -= T1[(int) aa        & 0xff]
655         ^ T2[(int)(aa >> 16) & 0xff]
656         ^ T3[(int)(aa >> 32) & 0xff]
657         ^ T4[(int)(aa >> 48) & 0xff];
658     cc += T4[(int)(aa >>  8) & 0xff]
659         ^ T3[(int)(aa >> 24) & 0xff]
660         ^ T2[(int)(aa >> 40) & 0xff]
661         ^ T1[(int)(aa >> 56) & 0xff];
662     cc *= 5;
663     // key_schedule ::=
664     x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5L;
665     x1 ^= x0;
666     x2 += x1;
667     x3 -= x2 ^ ((~x1) << 19);
668     x4 ^= x3;
669     x5 += x4;
670     x6 -= x5 ^ ((~x4) >>> 23);
671     x7 ^= x6;
672     x0 += x7;
673     x1 -= x0 ^ ((~x7) << 19);
674     x2 ^= x1;
675     x3 += x2;
676     x4 -= x3 ^ ((~x2) >>> 23);
677     x5 ^= x4;
678     x6 += x5;
679     x7 -= x6 ^ 0x0123456789ABCDEFL;
680     // pass(cc, aa, bb, 7) ::=
681     bb ^= x0;
682     cc -= T1[(int) bb        & 0xff]
683         ^ T2[(int)(bb >> 16) & 0xff]
684         ^ T3[(int)(bb >> 32) & 0xff]
685         ^ T4[(int)(bb >> 48) & 0xff];
686     aa += T4[(int)(bb >>  8) & 0xff]
687         ^ T3[(int)(bb >> 24) & 0xff]
688         ^ T2[(int)(bb >> 40) & 0xff]
689         ^ T1[(int)(bb >> 56) & 0xff];
690     aa *= 7;
691     cc ^= x1;
692     aa -= T1[(int) cc        & 0xff]
693         ^ T2[(int)(cc >> 16) & 0xff]
694         ^ T3[(int)(cc >> 32) & 0xff]
695         ^ T4[(int)(cc >> 48) & 0xff];
696     bb += T4[(int)(cc >>  8) & 0xff]
697         ^ T3[(int)(cc >> 24) & 0xff]
698         ^ T2[(int)(cc >> 40) & 0xff]
699         ^ T1[(int)(cc >> 56) & 0xff];
700     bb *= 7;
701     aa ^= x2;
702     bb -= T1[(int) aa        & 0xff]
703         ^ T2[(int)(aa >> 16) & 0xff]
704         ^ T3[(int)(aa >> 32) & 0xff]
705         ^ T4[(int)(aa >> 48) & 0xff];
706     cc += T4[(int)(aa >>  8) & 0xff]
707         ^ T3[(int)(aa >> 24) & 0xff]
708         ^ T2[(int)(aa >> 40) & 0xff]
709         ^ T1[(int)(aa >> 56) & 0xff];
710     cc *= 7;
711     bb ^= x3;
712     cc -= T1[(int) bb        & 0xff]
713         ^ T2[(int)(bb >> 16) & 0xff]
714         ^ T3[(int)(bb >> 32) & 0xff]
715         ^ T4[(int)(bb >> 48) & 0xff];
716     aa += T4[(int)(bb >>  8) & 0xff]
717         ^ T3[(int)(bb >> 24) & 0xff]
718         ^ T2[(int)(bb >> 40) & 0xff]
719         ^ T1[(int)(bb >> 56) & 0xff];
720     aa *= 7;
721     cc ^= x4;
722     aa -= T1[(int) cc        & 0xff]
723         ^ T2[(int)(cc >> 16) & 0xff]
724         ^ T3[(int)(cc >> 32) & 0xff]
725         ^ T4[(int)(cc >> 48) & 0xff];
726     bb += T4[(int)(cc >>  8) & 0xff]
727         ^ T3[(int)(cc >> 24) & 0xff]
728         ^ T2[(int)(cc >> 40) & 0xff]
729         ^ T1[(int)(cc >> 56) & 0xff];
730     bb *= 7;
731     aa ^= x5;
732     bb -= T1[(int) aa        & 0xff]
733         ^ T2[(int)(aa >> 16) & 0xff]
734         ^ T3[(int)(aa >> 32) & 0xff]
735         ^ T4[(int)(aa >> 48) & 0xff];
736     cc += T4[(int)(aa >>  8) & 0xff]
737         ^ T3[(int)(aa >> 24) & 0xff]
738         ^ T2[(int)(aa >> 40) & 0xff]
739         ^ T1[(int)(aa >> 56) & 0xff];
740     cc *= 7;
741     bb ^= x6;
742     cc -= T1[(int) bb        & 0xff]
743         ^ T2[(int)(bb >> 16) & 0xff]
744         ^ T3[(int)(bb >> 32) & 0xff]
745         ^ T4[(int)(bb >> 48) & 0xff];
746     aa += T4[(int)(bb >>  8) & 0xff]
747         ^ T3[(int)(bb >> 24) & 0xff]
748         ^ T2[(int)(bb >> 40) & 0xff]
749         ^ T1[(int)(bb >> 56) & 0xff];
750     aa *= 7;
751     cc ^= x7;
752     aa -= T1[(int) cc        & 0xff]
753         ^ T2[(int)(cc >> 16) & 0xff]
754         ^ T3[(int)(cc >> 32) & 0xff]
755         ^ T4[(int)(cc >> 48) & 0xff];
756     bb += T4[(int)(cc >>  8) & 0xff]
757         ^ T3[(int)(cc >> 24) & 0xff]
758         ^ T2[(int)(cc >> 40) & 0xff]
759         ^ T1[(int)(cc >> 56) & 0xff];
760     bb *= 7;
761     // key_schedule ::=
762     x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5L;
763     x1 ^= x0;
764     x2 += x1;
765     x3 -= x2 ^ ((~x1) << 19);
766     x4 ^= x3;
767     x5 += x4;
768     x6 -= x5 ^ ((~x4) >>> 23);
769     x7 ^= x6;
770     x0 += x7;
771     x1 -= x0 ^ ((~x7) << 19);
772     x2 ^= x1;
773     x3 += x2;
774     x4 -= x3 ^ ((~x2) >>> 23);
775     x5 ^= x4;
776     x6 += x5;
777     x7 -= x6 ^ 0x0123456789ABCDEFL;
778     // pass(bb,cc,aa,9) ::=
779     aa ^= x0;
780     bb -= T1[(int) aa        & 0xff]
781         ^ T2[(int)(aa >> 16) & 0xff]
782         ^ T3[(int)(aa >> 32) & 0xff]
783         ^ T4[(int)(aa >> 48) & 0xff];
784     cc += T4[(int)(aa >>  8) & 0xff]
785         ^ T3[(int)(aa >> 24) & 0xff]
786         ^ T2[(int)(aa >> 40) & 0xff]
787         ^ T1[(int)(aa >> 56) & 0xff];
788     cc *= 9;
789     bb ^= x1;
790     cc -= T1[(int) bb        & 0xff]
791         ^ T2[(int)(bb >> 16) & 0xff]
792         ^ T3[(int)(bb >> 32) & 0xff]
793         ^ T4[(int)(bb >> 48) & 0xff];
794     aa += T4[(int)(bb >>  8) & 0xff]
795         ^ T3[(int)(bb >> 24) & 0xff]
796         ^ T2[(int)(bb >> 40) & 0xff]
797         ^ T1[(int)(bb >> 56) & 0xff];
798     aa *= 9;
799     cc ^= x2;
800     aa -= T1[(int) cc        & 0xff]
801         ^ T2[(int)(cc >> 16) & 0xff]
802         ^ T3[(int)(cc >> 32) & 0xff]
803         ^ T4[(int)(cc >> 48) & 0xff];
804     bb += T4[(int)(cc >>  8) & 0xff]
805         ^ T3[(int)(cc >> 24) & 0xff]
806         ^ T2[(int)(cc >> 40) & 0xff]
807         ^ T1[(int)(cc >> 56) & 0xff];
808     bb *= 9;
809     aa ^= x3;
810     bb -= T1[(int) aa        & 0xff]
811         ^ T2[(int)(aa >> 16) & 0xff]
812         ^ T3[(int)(aa >> 32) & 0xff]
813         ^ T4[(int)(aa >> 48) & 0xff];
814     cc += T4[(int)(aa >>  8) & 0xff]
815         ^ T3[(int)(aa >> 24) & 0xff]
816         ^ T2[(int)(aa >> 40) & 0xff]
817         ^ T1[(int)(aa >> 56) & 0xff];
818     cc *= 9;
819     bb ^= x4;
820     cc -= T1[(int) bb        & 0xff]
821         ^ T2[(int)(bb >> 16) & 0xff]
822         ^ T3[(int)(bb >> 32) & 0xff]
823         ^ T4[(int)(bb >> 48) & 0xff];
824     aa += T4[(int)(bb >>  8) & 0xff]
825         ^ T3[(int)(bb >> 24) & 0xff]
826         ^ T2[(int)(bb >> 40) & 0xff]
827         ^ T1[(int)(bb >> 56) & 0xff];
828     aa *= 9;
829     cc ^= x5;
830     aa -= T1[(int) cc        & 0xff]
831         ^ T2[(int)(cc >> 16) & 0xff]
832         ^ T3[(int)(cc >> 32) & 0xff]
833         ^ T4[(int)(cc >> 48) & 0xff];
834     bb += T4[(int)(cc >>  8) & 0xff]
835         ^ T3[(int)(cc >> 24) & 0xff]
836         ^ T2[(int)(cc >> 40) & 0xff]
837         ^ T1[(int)(cc >> 56) & 0xff];
838     bb *= 9;
839     aa ^= x6;
840     bb -= T1[(int) aa        & 0xff]
841         ^ T2[(int)(aa >> 16) & 0xff]
842         ^ T3[(int)(aa >> 32) & 0xff]
843         ^ T4[(int)(aa >> 48) & 0xff];
844     cc += T4[(int)(aa >>  8) & 0xff]
845         ^ T3[(int)(aa >> 24) & 0xff]
846         ^ T2[(int)(aa >> 40) & 0xff]
847         ^ T1[(int)(aa >> 56) & 0xff];
848     cc *= 9;
849     bb ^= x7;
850     cc -= T1[(int) bb        & 0xff]
851         ^ T2[(int)(bb >> 16) & 0xff]
852         ^ T3[(int)(bb >> 32) & 0xff]
853         ^ T4[(int)(bb >> 48) & 0xff];
854     aa += T4[(int)(bb >>  8) & 0xff]
855         ^ T3[(int)(bb >> 24) & 0xff]
856         ^ T2[(int)(bb >> 40) & 0xff]
857         ^ T1[(int)(bb >> 56) & 0xff];
858     aa *= 9;
859     // feedforward ::=
860     a ^= aa;
861     b = bb - b;
862     c += cc;
863   }
864 }
865