Source Code Cross Referenced for CAST5Engine.java in  » Security » Bouncy-Castle » org » bouncycastle » crypto » engines » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. 6.0 JDK Core
2. 6.0 JDK Modules
3. 6.0 JDK Modules com.sun
4. 6.0 JDK Modules com.sun.java
5. 6.0 JDK Modules sun
6. 6.0 JDK Platform
7. Ajax
8. Apache Harmony Java SE
9. Aspect oriented
10. Authentication Authorization
11. Blogger System
12. Build
13. Byte Code
14. Cache
15. Chart
16. Chat
17. Code Analyzer
18. Collaboration
19. Content Management System
20. Database Client
21. Database DBMS
22. Database JDBC Connection Pool
23. Database ORM
24. Development
25. EJB Server geronimo
26. EJB Server GlassFish
27. EJB Server JBoss 4.2.1
28. EJB Server resin 3.1.5
29. ERP CRM Financial
30. ESB
31. Forum
32. GIS
33. Graphic Library
34. Groupware
35. HTML Parser
36. IDE
37. IDE Eclipse
38. IDE Netbeans
39. Installer
40. Internationalization Localization
41. Inversion of Control
42. Issue Tracking
43. J2EE
44. JBoss
45. JMS
46. JMX
47. Library
48. Mail Clients
49. Net
50. Parser
51. PDF
52. Portal
53. Profiler
54. Project Management
55. Report
56. RSS RDF
57. Rule Engine
58. Science
59. Scripting
60. Search Engine
61. Security
62. Sevlet Container
63. Source Control
64. Swing Library
65. Template Engine
66. Test Coverage
67. Testing
68. UML
69. Web Crawler
70. Web Framework
71. Web Mail
72. Web Server
73. Web Services
74. Web Services apache cxf 2.0.1
75. Web Services AXIS2
76. Wiki Engine
77. Workflow Engines
78. XML
79. XML UI
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
Photoshop Tutorials
Maya Tutorials
Flash Tutorials
3ds-Max Tutorials
Illustrator Tutorials
GIMP Tutorials
C# / C Sharp
C# / CSharp Tutorial
C# / CSharp Open Source
ASP.Net
ASP.NET Tutorial
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
Ruby
PHP
Python
Python Tutorial
Python Open Source
SQL Server / T-SQL
SQL Server / T-SQL Tutorial
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
XML
XML Tutorial
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
Java Source Code / Java Documentation » Security » Bouncy Castle » org.bouncycastle.crypto.engines 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


0001:        package org.bouncycastle.crypto.engines;
0002:
0003:        import org.bouncycastle.crypto.BlockCipher;
0004:        import org.bouncycastle.crypto.CipherParameters;
0005:        import org.bouncycastle.crypto.DataLengthException;
0006:        import org.bouncycastle.crypto.params.KeyParameter;
0007:
0008:        /**
0009:         * A class that provides CAST key encryption operations,
0010:         * such as encoding data and generating keys.
0011:         *
0012:         * All the algorithms herein are from the Internet RFC's
0013:         *
0014:         * RFC2144 - CAST5 (64bit block, 40-128bit key)
0015:         * RFC2612 - CAST6 (128bit block, 128-256bit key)
0016:         *
0017:         * and implement a simplified cryptography interface.
0018:         */
0019:        public class CAST5Engine implements  BlockCipher {
0020:            protected final static int M32 = 0xffffffff;
0021:
0022:            protected final static int[] S1 = { 0x30fb40d4, 0x9fa0ff0b,
0023:                    0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540,
0024:                    0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675,
0025:                    0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f,
0026:                    0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656,
0027:                    0x887ca41a, 0xa2d2bd2d, 0xa1c9e0d6, 0x346c4819, 0x61b76d87,
0028:                    0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,
0029:                    0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac,
0030:                    0x4a97c1d8, 0x527644b7, 0xb5f437a7, 0xb82cbaef, 0xd751d159,
0031:                    0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054,
0032:                    0xbc8e5935, 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d,
0033:                    0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, 0xfd45c240,
0034:                    0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae,
0035:                    0xa2d4b76d, 0xc19b0c50, 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7,
0036:                    0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
0037:                    0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5,
0038:                    0x6a390493, 0xe63d37e0, 0x2a54f6b3, 0x3a787d5f, 0x6276a0b5,
0039:                    0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e,
0040:                    0xaa508167, 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f,
0041:                    0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, 0xd7894360,
0042:                    0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14,
0043:                    0xa0bebc3c, 0x54623779, 0x64459eab, 0x3f328b82, 0x7718cf82,
0044:                    0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,
0045:                    0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf,
0046:                    0x380782d5, 0xc7fa5cf6, 0x8ac31511, 0x35e79e13, 0x47da91d0,
0047:                    0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04,
0048:                    0x4a805d8d, 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e,
0049:                    0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, 0x6b54bfab,
0050:                    0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3,
0051:                    0x1b55db94, 0xaad4e324, 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02,
0052:                    0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
0053:                    0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6,
0054:                    0x22513f1e, 0xaa51a79b, 0x2ad344cc, 0x7b5a41f0, 0xd37cfbad,
0055:                    0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc,
0056:                    0xce387e6d, 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de,
0057:                    0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, 0x75bb0fc3,
0058:                    0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a,
0059:                    0xa70aec10, 0xac39570a, 0x3f04442f, 0x6188b153, 0xe0397a2e,
0060:                    0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
0061:                    0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4,
0062:                    0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, 0xf01144f9, 0xd2240eb1,
0063:                    0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596,
0064:                    0xa5bb15e6, 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb,
0065:                    0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, 0x98a52666,
0066:                    0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1,
0067:                    0xd5ea50f1, 0x85a92872, 0xaf1fbda7, 0xd4234870, 0xa7870bf3,
0068:                    0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,
0069:                    0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db,
0070:                    0xab838653, 0x6e2f1e23, 0x83719c9e, 0xbd91e046, 0x9a56456e,
0071:                    0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08,
0072:                    0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d,
0073:                    0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf }, S2 = {
0074:                    0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
0075:                    0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235,
0076:                    0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d,
0077:                    0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909,
0078:                    0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, 0xd1da4181,
0079:                    0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b,
0080:                    0x25a1ff41, 0xe180f806, 0x1fc41080, 0x179bee7a, 0xd37ac6a9,
0081:                    0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,
0082:                    0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154,
0083:                    0x0d554b63, 0x5d681121, 0xc866c359, 0x3d63cf73, 0xcee234c0,
0084:                    0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084,
0085:                    0xe4eb573b, 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d,
0086:                    0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, 0x10843094,
0087:                    0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74,
0088:                    0xd9e0a227, 0x4ec73a34, 0xfc884f69, 0x3e4de8df, 0xef0e0088,
0089:                    0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,
0090:                    0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1,
0091:                    0x27e19ba5, 0xd5a6c252, 0xe49754bd, 0xc5d655dd, 0xeb667064,
0092:                    0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7,
0093:                    0xe5d05860, 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755,
0094:                    0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, 0xeccf01db,
0095:                    0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6,
0096:                    0x5ee22b95, 0x5f0e5304, 0x81ed6f61, 0x20e74364, 0xb45e1378,
0097:                    0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
0098:                    0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402,
0099:                    0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, 0xa20c3005, 0x8871df63,
0100:                    0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835,
0101:                    0x9f63293c, 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3,
0102:                    0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, 0x73f98417,
0103:                    0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741,
0104:                    0x7cbad9a2, 0x2180036f, 0x50d99c08, 0xcb3f4861, 0xc26bd765,
0105:                    0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
0106:                    0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb,
0107:                    0x846a3bae, 0x8ff77888, 0xee5d60f6, 0x7af75673, 0x2fdd5cdb,
0108:                    0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc,
0109:                    0xd152de58, 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8,
0110:                    0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, 0xb8da230c,
0111:                    0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560,
0112:                    0x61a3c9e8, 0xbca8f54d, 0xc72feffa, 0x22822e99, 0x82c570b4,
0113:                    0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,
0114:                    0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a,
0115:                    0xf7e19798, 0x7619b72f, 0x8f1c9ba4, 0xdc8637a0, 0x16a7d3b1,
0116:                    0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc,
0117:                    0x520365d6, 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e,
0118:                    0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, 0x5483697b,
0119:                    0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9,
0120:                    0x6c387e8a, 0x0ae6d249, 0xb284600c, 0xd835731d, 0xdcb1c647,
0121:                    0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
0122:                    0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589,
0123:                    0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c,
0124:                    0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605,
0125:                    0x4523ecf1 }, S3 = { 0x8defc240, 0x25fa5d9f, 0xeb903dbf,
0126:                    0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,
0127:                    0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
0128:                    0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9,
0129:                    0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b,
0130:                    0x8272792e, 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc,
0131:                    0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, 0x4e1a8302,
0132:                    0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188,
0133:                    0xa6fc4ee8, 0xc982b5a5, 0xa8c01db7, 0x579fc264, 0x67094f31,
0134:                    0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
0135:                    0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c,
0136:                    0x4a012d6e, 0xc5884a28, 0xccc36f71, 0xb843c213, 0x6c0743f1,
0137:                    0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf,
0138:                    0x5afb9a04, 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380,
0139:                    0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, 0x8c96fdad,
0140:                    0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790,
0141:                    0x796fb449, 0x8252dc15, 0xefbd7d9b, 0xa672597d, 0xada840d8,
0142:                    0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,
0143:                    0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574,
0144:                    0x927985b2, 0x8276dbcb, 0x02778176, 0xf8af918d, 0x4e48f79e,
0145:                    0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682,
0146:                    0x93b4b148, 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d,
0147:                    0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, 0x8b907cee,
0148:                    0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d,
0149:                    0x6094d1e3, 0xcd9ca341, 0x5c76460e, 0x00ea983b, 0xd4d67881,
0150:                    0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,
0151:                    0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff,
0152:                    0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, 0x68cc7bfb, 0xd90f2788,
0153:                    0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368,
0154:                    0x925d958f, 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b,
0155:                    0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, 0x61bd8ba0,
0156:                    0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972,
0157:                    0x9270c4a8, 0x127de50b, 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5,
0158:                    0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
0159:                    0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11,
0160:                    0x236a5cae, 0x12deca4d, 0x2c3f8cc5, 0xd2d02dfe, 0xf8ef5896,
0161:                    0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc,
0162:                    0x89d36b45, 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49,
0163:                    0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, 0xa2d02fff,
0164:                    0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888,
0165:                    0xa2e53f55, 0xb9e6d4bc, 0xa2048016, 0x97573833, 0xd7207d67,
0166:                    0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
0167:                    0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff,
0168:                    0x856302e0, 0x72dbd92b, 0xee971b69, 0x6ea22fde, 0x5f08ae2b,
0169:                    0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571,
0170:                    0xcc8239c2, 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce,
0171:                    0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, 0x5727c148,
0172:                    0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425,
0173:                    0x99833be5, 0x600d457d, 0x282f9350, 0x8334b362, 0xd91d1120,
0174:                    0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,
0175:                    0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
0176:                    0xa133c501, 0xe9d3531c, 0xee353783 },
0177:                    S4 = { 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298,
0178:                            0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,
0179:                            0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120,
0180:                            0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,
0181:                            0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220,
0182:                            0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
0183:                            0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe,
0184:                            0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,
0185:                            0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701,
0186:                            0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,
0187:                            0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b,
0188:                            0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
0189:                            0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93,
0190:                            0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,
0191:                            0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746,
0192:                            0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,
0193:                            0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9,
0194:                            0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
0195:                            0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb,
0196:                            0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,
0197:                            0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c,
0198:                            0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,
0199:                            0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7,
0200:                            0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
0201:                            0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340,
0202:                            0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
0203:                            0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327,
0204:                            0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,
0205:                            0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec,
0206:                            0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
0207:                            0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205,
0208:                            0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,
0209:                            0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031,
0210:                            0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,
0211:                            0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5,
0212:                            0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
0213:                            0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c,
0214:                            0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
0215:                            0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69,
0216:                            0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,
0217:                            0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9,
0218:                            0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
0219:                            0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff,
0220:                            0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
0221:                            0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3,
0222:                            0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,
0223:                            0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2,
0224:                            0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
0225:                            0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff,
0226:                            0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
0227:                            0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091,
0228:                            0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,
0229:                            0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df,
0230:                            0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
0231:                            0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf,
0232:                            0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
0233:                            0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367,
0234:                            0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,
0235:                            0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c,
0236:                            0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
0237:                            0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43,
0238:                            0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,
0239:                            0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e,
0240:                            0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 },
0241:                    S5 = { 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911,
0242:                            0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,
0243:                            0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00,
0244:                            0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,
0245:                            0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180,
0246:                            0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
0247:                            0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2,
0248:                            0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
0249:                            0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725,
0250:                            0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
0251:                            0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b,
0252:                            0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
0253:                            0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571,
0254:                            0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,
0255:                            0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec,
0256:                            0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,
0257:                            0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea,
0258:                            0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
0259:                            0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263,
0260:                            0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,
0261:                            0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468,
0262:                            0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,
0263:                            0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b,
0264:                            0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
0265:                            0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284,
0266:                            0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,
0267:                            0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4,
0268:                            0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,
0269:                            0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7,
0270:                            0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
0271:                            0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce,
0272:                            0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,
0273:                            0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6,
0274:                            0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,
0275:                            0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4,
0276:                            0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
0277:                            0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561,
0278:                            0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,
0279:                            0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6,
0280:                            0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,
0281:                            0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406,
0282:                            0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
0283:                            0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472,
0284:                            0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,
0285:                            0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487,
0286:                            0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,
0287:                            0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288,
0288:                            0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
0289:                            0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2,
0290:                            0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
0291:                            0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78,
0292:                            0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,
0293:                            0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76,
0294:                            0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
0295:                            0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0,
0296:                            0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
0297:                            0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58,
0298:                            0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
0299:                            0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2,
0300:                            0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
0301:                            0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be,
0302:                            0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,
0303:                            0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55,
0304:                            0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4 },
0305:                    S6 = { 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c,
0306:                            0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,
0307:                            0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9,
0308:                            0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,
0309:                            0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e,
0310:                            0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
0311:                            0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866,
0312:                            0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,
0313:                            0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c,
0314:                            0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
0315:                            0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd,
0316:                            0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
0317:                            0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53,
0318:                            0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
0319:                            0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d,
0320:                            0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,
0321:                            0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf,
0322:                            0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
0323:                            0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807,
0324:                            0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,
0325:                            0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a,
0326:                            0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,
0327:                            0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563,
0328:                            0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
0329:                            0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0,
0330:                            0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,
0331:                            0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be,
0332:                            0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,
0333:                            0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0,
0334:                            0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
0335:                            0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2,
0336:                            0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,
0337:                            0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853,
0338:                            0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,
0339:                            0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa,
0340:                            0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
0341:                            0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9,
0342:                            0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,
0343:                            0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751,
0344:                            0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,
0345:                            0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358,
0346:                            0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
0347:                            0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397,
0348:                            0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,
0349:                            0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459,
0350:                            0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,
0351:                            0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4,
0352:                            0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
0353:                            0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f,
0354:                            0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,
0355:                            0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb,
0356:                            0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,
0357:                            0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2,
0358:                            0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
0359:                            0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab,
0360:                            0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,
0361:                            0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b,
0362:                            0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,
0363:                            0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b,
0364:                            0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
0365:                            0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855,
0366:                            0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,
0367:                            0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454,
0368:                            0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f },
0369:                    S7 = { 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693,
0370:                            0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,
0371:                            0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82,
0372:                            0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,
0373:                            0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd,
0374:                            0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
0375:                            0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f,
0376:                            0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,
0377:                            0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9,
0378:                            0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,
0379:                            0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e,
0380:                            0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
0381:                            0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83,
0382:                            0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
0383:                            0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e,
0384:                            0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,
0385:                            0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a,
0386:                            0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
0387:                            0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f,
0388:                            0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
0389:                            0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b,
0390:                            0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,
0391:                            0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78,
0392:                            0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
0393:                            0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d,
0394:                            0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,
0395:                            0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802,
0396:                            0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,
0397:                            0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9,
0398:                            0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
0399:                            0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302,
0400:                            0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
0401:                            0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858,
0402:                            0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
0403:                            0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a,
0404:                            0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
0405:                            0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4,
0406:                            0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,
0407:                            0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df,
0408:                            0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
0409:                            0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9,
0410:                            0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
0411:                            0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c,
0412:                            0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,
0413:                            0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07,
0414:                            0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,
0415:                            0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939,
0416:                            0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
0417:                            0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e,
0418:                            0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
0419:                            0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378,
0420:                            0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,
0421:                            0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd,
0422:                            0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
0423:                            0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567,
0424:                            0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,
0425:                            0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2,
0426:                            0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,
0427:                            0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf,
0428:                            0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
0429:                            0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2,
0430:                            0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,
0431:                            0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada,
0432:                            0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3 },
0433:                    S8 = { 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095,
0434:                            0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,
0435:                            0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174,
0436:                            0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,
0437:                            0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940,
0438:                            0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
0439:                            0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42,
0440:                            0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,
0441:                            0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164,
0442:                            0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,
0443:                            0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4,
0444:                            0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
0445:                            0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0,
0446:                            0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,
0447:                            0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6,
0448:                            0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,
0449:                            0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491,
0450:                            0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
0451:                            0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b,
0452:                            0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,
0453:                            0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8,
0454:                            0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
0455:                            0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006,
0456:                            0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
0457:                            0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564,
0458:                            0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,
0459:                            0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab,
0460:                            0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,
0461:                            0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc,
0462:                            0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
0463:                            0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8,
0464:                            0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,
0465:                            0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441,
0466:                            0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,
0467:                            0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f,
0468:                            0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
0469:                            0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504,
0470:                            0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,
0471:                            0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c,
0472:                            0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,
0473:                            0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6,
0474:                            0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
0475:                            0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd,
0476:                            0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,
0477:                            0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4,
0478:                            0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,
0479:                            0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc,
0480:                            0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
0481:                            0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba,
0482:                            0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,
0483:                            0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf,
0484:                            0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,
0485:                            0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603,
0486:                            0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
0487:                            0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37,
0488:                            0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,
0489:                            0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819,
0490:                            0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,
0491:                            0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d,
0492:                            0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
0493:                            0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347,
0494:                            0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
0495:                            0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d,
0496:                            0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e };
0497:
0498:            //====================================
0499:            // Useful constants
0500:            //====================================
0501:
0502:            protected static final int MAX_ROUNDS = 16;
0503:            protected static final int RED_ROUNDS = 12;
0504:
0505:            protected static final int BLOCK_SIZE = 8; // bytes = 64 bits
0506:
0507:            protected int _Kr[] = new int[17]; // the rotating round key
0508:            protected int _Km[] = new int[17]; // the masking round key
0509:
0510:            private boolean _encrypting = false;
0511:
0512:            private byte[] _workingKey = null;
0513:            private int _rounds = MAX_ROUNDS;
0514:
0515:            public CAST5Engine() {
0516:            }
0517:
0518:            /**
0519:             * initialise a CAST cipher.
0520:             *
0521:             * @param encrypting whether or not we are for encryption.
0522:             * @param params the parameters required to set up the cipher.
0523:             * @exception IllegalArgumentException if the params argument is
0524:             * inappropriate.
0525:             */
0526:            public void init(boolean encrypting, CipherParameters params) {
0527:                if (params instanceof  KeyParameter) {
0528:                    _encrypting = encrypting;
0529:                    _workingKey = ((KeyParameter) params).getKey();
0530:
0531:                    setKey(_workingKey);
0532:
0533:                    return;
0534:                }
0535:
0536:                throw new IllegalArgumentException(
0537:                        "Invalid parameter passed to " + getAlgorithmName()
0538:                                + " init - " + params.getClass().getName());
0539:            }
0540:
0541:            public String getAlgorithmName() {
0542:                return "CAST5";
0543:            }
0544:
0545:            public int processBlock(byte[] in, int inOff, byte[] out, int outOff) {
0546:                if (_workingKey == null) {
0547:                    throw new IllegalStateException(getAlgorithmName()
0548:                            + " not initialised");
0549:                }
0550:
0551:                int blockSize = getBlockSize();
0552:                if ((inOff + blockSize) > in.length) {
0553:                    throw new DataLengthException("Input buffer too short");
0554:                }
0555:
0556:                if ((outOff + blockSize) > out.length) {
0557:                    throw new DataLengthException("Output buffer too short");
0558:                }
0559:
0560:                if (_encrypting) {
0561:                    return encryptBlock(in, inOff, out, outOff);
0562:                } else {
0563:                    return decryptBlock(in, inOff, out, outOff);
0564:                }
0565:            }
0566:
0567:            public void reset() {
0568:            }
0569:
0570:            public int getBlockSize() {
0571:                return BLOCK_SIZE;
0572:            }
0573:
0574:            //==================================
0575:            // Private Implementation
0576:            //==================================
0577:
0578:            /*
0579:             * Creates the subkeys using the same nomenclature
0580:             * as described in RFC2144.
0581:             *
0582:             * See section 2.4
0583:             */
0584:            protected void setKey(byte[] key) {
0585:                /* 
0586:                 * Determine the key size here, if required
0587:                 *
0588:                 * if keysize <= 80bits, use 12 rounds instead of 16
0589:                 * if keysize < 128bits, pad with 0
0590:                 *
0591:                 * Typical key sizes => 40, 64, 80, 128
0592:                 */
0593:
0594:                if (key.length < 11) {
0595:                    _rounds = RED_ROUNDS;
0596:                }
0597:
0598:                int z[] = new int[16];
0599:                int x[] = new int[16];
0600:
0601:                int z03, z47, z8B, zCF;
0602:                int x03, x47, x8B, xCF;
0603:
0604:                /* copy the key into x */
0605:                for (int i = 0; i < key.length; i++) {
0606:                    x[i] = key[i] & 0xff;
0607:                }
0608:
0609:                /*
0610:                 * This will look different because the selection of
0611:                 * bytes from the input key I've already chosen the
0612:                 * correct int.
0613:                 */
0614:                x03 = IntsTo32bits(x, 0x0);
0615:                x47 = IntsTo32bits(x, 0x4);
0616:                x8B = IntsTo32bits(x, 0x8);
0617:                xCF = IntsTo32bits(x, 0xC);
0618:
0619:                z03 = x03 ^ S5[x[0xD]] ^ S6[x[0xF]] ^ S7[x[0xC]] ^ S8[x[0xE]]
0620:                        ^ S7[x[0x8]];
0621:
0622:                Bits32ToInts(z03, z, 0x0);
0623:                z47 = x8B ^ S5[z[0x0]] ^ S6[z[0x2]] ^ S7[z[0x1]] ^ S8[z[0x3]]
0624:                        ^ S8[x[0xA]];
0625:                Bits32ToInts(z47, z, 0x4);
0626:                z8B = xCF ^ S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x5]] ^ S8[z[0x4]]
0627:                        ^ S5[x[0x9]];
0628:                Bits32ToInts(z8B, z, 0x8);
0629:                zCF = x47 ^ S5[z[0xA]] ^ S6[z[0x9]] ^ S7[z[0xB]] ^ S8[z[0x8]]
0630:                        ^ S6[x[0xB]];
0631:                Bits32ToInts(zCF, z, 0xC);
0632:                _Km[1] = S5[z[0x8]] ^ S6[z[0x9]] ^ S7[z[0x7]] ^ S8[z[0x6]]
0633:                        ^ S5[z[0x2]];
0634:                _Km[2] = S5[z[0xA]] ^ S6[z[0xB]] ^ S7[z[0x5]] ^ S8[z[0x4]]
0635:                        ^ S6[z[0x6]];
0636:                _Km[3] = S5[z[0xC]] ^ S6[z[0xD]] ^ S7[z[0x3]] ^ S8[z[0x2]]
0637:                        ^ S7[z[0x9]];
0638:                _Km[4] = S5[z[0xE]] ^ S6[z[0xF]] ^ S7[z[0x1]] ^ S8[z[0x0]]
0639:                        ^ S8[z[0xC]];
0640:
0641:                z03 = IntsTo32bits(z, 0x0);
0642:                z47 = IntsTo32bits(z, 0x4);
0643:                z8B = IntsTo32bits(z, 0x8);
0644:                zCF = IntsTo32bits(z, 0xC);
0645:                x03 = z8B ^ S5[z[0x5]] ^ S6[z[0x7]] ^ S7[z[0x4]] ^ S8[z[0x6]]
0646:                        ^ S7[z[0x0]];
0647:                Bits32ToInts(x03, x, 0x0);
0648:                x47 = z03 ^ S5[x[0x0]] ^ S6[x[0x2]] ^ S7[x[0x1]] ^ S8[x[0x3]]
0649:                        ^ S8[z[0x2]];
0650:                Bits32ToInts(x47, x, 0x4);
0651:                x8B = z47 ^ S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x5]] ^ S8[x[0x4]]
0652:                        ^ S5[z[0x1]];
0653:                Bits32ToInts(x8B, x, 0x8);
0654:                xCF = zCF ^ S5[x[0xA]] ^ S6[x[0x9]] ^ S7[x[0xB]] ^ S8[x[0x8]]
0655:                        ^ S6[z[0x3]];
0656:                Bits32ToInts(xCF, x, 0xC);
0657:                _Km[5] = S5[x[0x3]] ^ S6[x[0x2]] ^ S7[x[0xC]] ^ S8[x[0xD]]
0658:                        ^ S5[x[0x8]];
0659:                _Km[6] = S5[x[0x1]] ^ S6[x[0x0]] ^ S7[x[0xE]] ^ S8[x[0xF]]
0660:                        ^ S6[x[0xD]];
0661:                _Km[7] = S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x8]] ^ S8[x[0x9]]
0662:                        ^ S7[x[0x3]];
0663:                _Km[8] = S5[x[0x5]] ^ S6[x[0x4]] ^ S7[x[0xA]] ^ S8[x[0xB]]
0664:                        ^ S8[x[0x7]];
0665:
0666:                x03 = IntsTo32bits(x, 0x0);
0667:                x47 = IntsTo32bits(x, 0x4);
0668:                x8B = IntsTo32bits(x, 0x8);
0669:                xCF = IntsTo32bits(x, 0xC);
0670:                z03 = x03 ^ S5[x[0xD]] ^ S6[x[0xF]] ^ S7[x[0xC]] ^ S8[x[0xE]]
0671:                        ^ S7[x[0x8]];
0672:                Bits32ToInts(z03, z, 0x0);
0673:                z47 = x8B ^ S5[z[0x0]] ^ S6[z[0x2]] ^ S7[z[0x1]] ^ S8[z[0x3]]
0674:                        ^ S8[x[0xA]];
0675:                Bits32ToInts(z47, z, 0x4);
0676:                z8B = xCF ^ S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x5]] ^ S8[z[0x4]]
0677:                        ^ S5[x[0x9]];
0678:                Bits32ToInts(z8B, z, 0x8);
0679:                zCF = x47 ^ S5[z[0xA]] ^ S6[z[0x9]] ^ S7[z[0xB]] ^ S8[z[0x8]]
0680:                        ^ S6[x[0xB]];
0681:                Bits32ToInts(zCF, z, 0xC);
0682:                _Km[9] = S5[z[0x3]] ^ S6[z[0x2]] ^ S7[z[0xC]] ^ S8[z[0xD]]
0683:                        ^ S5[z[0x9]];
0684:                _Km[10] = S5[z[0x1]] ^ S6[z[0x0]] ^ S7[z[0xE]] ^ S8[z[0xF]]
0685:                        ^ S6[z[0xc]];
0686:                _Km[11] = S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x8]] ^ S8[z[0x9]]
0687:                        ^ S7[z[0x2]];
0688:                _Km[12] = S5[z[0x5]] ^ S6[z[0x4]] ^ S7[z[0xA]] ^ S8[z[0xB]]
0689:                        ^ S8[z[0x6]];
0690:
0691:                z03 = IntsTo32bits(z, 0x0);
0692:                z47 = IntsTo32bits(z, 0x4);
0693:                z8B = IntsTo32bits(z, 0x8);
0694:                zCF = IntsTo32bits(z, 0xC);
0695:                x03 = z8B ^ S5[z[0x5]] ^ S6[z[0x7]] ^ S7[z[0x4]] ^ S8[z[0x6]]
0696:                        ^ S7[z[0x0]];
0697:                Bits32ToInts(x03, x, 0x0);
0698:                x47 = z03 ^ S5[x[0x0]] ^ S6[x[0x2]] ^ S7[x[0x1]] ^ S8[x[0x3]]
0699:                        ^ S8[z[0x2]];
0700:                Bits32ToInts(x47, x, 0x4);
0701:                x8B = z47 ^ S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x5]] ^ S8[x[0x4]]
0702:                        ^ S5[z[0x1]];
0703:                Bits32ToInts(x8B, x, 0x8);
0704:                xCF = zCF ^ S5[x[0xA]] ^ S6[x[0x9]] ^ S7[x[0xB]] ^ S8[x[0x8]]
0705:                        ^ S6[z[0x3]];
0706:                Bits32ToInts(xCF, x, 0xC);
0707:                _Km[13] = S5[x[0x8]] ^ S6[x[0x9]] ^ S7[x[0x7]] ^ S8[x[0x6]]
0708:                        ^ S5[x[0x3]];
0709:                _Km[14] = S5[x[0xA]] ^ S6[x[0xB]] ^ S7[x[0x5]] ^ S8[x[0x4]]
0710:                        ^ S6[x[0x7]];
0711:                _Km[15] = S5[x[0xC]] ^ S6[x[0xD]] ^ S7[x[0x3]] ^ S8[x[0x2]]
0712:                        ^ S7[x[0x8]];
0713:                _Km[16] = S5[x[0xE]] ^ S6[x[0xF]] ^ S7[x[0x1]] ^ S8[x[0x0]]
0714:                        ^ S8[x[0xD]];
0715:
0716:                x03 = IntsTo32bits(x, 0x0);
0717:                x47 = IntsTo32bits(x, 0x4);
0718:                x8B = IntsTo32bits(x, 0x8);
0719:                xCF = IntsTo32bits(x, 0xC);
0720:                z03 = x03 ^ S5[x[0xD]] ^ S6[x[0xF]] ^ S7[x[0xC]] ^ S8[x[0xE]]
0721:                        ^ S7[x[0x8]];
0722:                Bits32ToInts(z03, z, 0x0);
0723:                z47 = x8B ^ S5[z[0x0]] ^ S6[z[0x2]] ^ S7[z[0x1]] ^ S8[z[0x3]]
0724:                        ^ S8[x[0xA]];
0725:                Bits32ToInts(z47, z, 0x4);
0726:                z8B = xCF ^ S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x5]] ^ S8[z[0x4]]
0727:                        ^ S5[x[0x9]];
0728:                Bits32ToInts(z8B, z, 0x8);
0729:                zCF = x47 ^ S5[z[0xA]] ^ S6[z[0x9]] ^ S7[z[0xB]] ^ S8[z[0x8]]
0730:                        ^ S6[x[0xB]];
0731:                Bits32ToInts(zCF, z, 0xC);
0732:                _Kr[1] = (S5[z[0x8]] ^ S6[z[0x9]] ^ S7[z[0x7]] ^ S8[z[0x6]] ^ S5[z[0x2]]) & 0x1f;
0733:                _Kr[2] = (S5[z[0xA]] ^ S6[z[0xB]] ^ S7[z[0x5]] ^ S8[z[0x4]] ^ S6[z[0x6]]) & 0x1f;
0734:                _Kr[3] = (S5[z[0xC]] ^ S6[z[0xD]] ^ S7[z[0x3]] ^ S8[z[0x2]] ^ S7[z[0x9]]) & 0x1f;
0735:                _Kr[4] = (S5[z[0xE]] ^ S6[z[0xF]] ^ S7[z[0x1]] ^ S8[z[0x0]] ^ S8[z[0xC]]) & 0x1f;
0736:
0737:                z03 = IntsTo32bits(z, 0x0);
0738:                z47 = IntsTo32bits(z, 0x4);
0739:                z8B = IntsTo32bits(z, 0x8);
0740:                zCF = IntsTo32bits(z, 0xC);
0741:                x03 = z8B ^ S5[z[0x5]] ^ S6[z[0x7]] ^ S7[z[0x4]] ^ S8[z[0x6]]
0742:                        ^ S7[z[0x0]];
0743:                Bits32ToInts(x03, x, 0x0);
0744:                x47 = z03 ^ S5[x[0x0]] ^ S6[x[0x2]] ^ S7[x[0x1]] ^ S8[x[0x3]]
0745:                        ^ S8[z[0x2]];
0746:                Bits32ToInts(x47, x, 0x4);
0747:                x8B = z47 ^ S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x5]] ^ S8[x[0x4]]
0748:                        ^ S5[z[0x1]];
0749:                Bits32ToInts(x8B, x, 0x8);
0750:                xCF = zCF ^ S5[x[0xA]] ^ S6[x[0x9]] ^ S7[x[0xB]] ^ S8[x[0x8]]
0751:                        ^ S6[z[0x3]];
0752:                Bits32ToInts(xCF, x, 0xC);
0753:                _Kr[5] = (S5[x[0x3]] ^ S6[x[0x2]] ^ S7[x[0xC]] ^ S8[x[0xD]] ^ S5[x[0x8]]) & 0x1f;
0754:                _Kr[6] = (S5[x[0x1]] ^ S6[x[0x0]] ^ S7[x[0xE]] ^ S8[x[0xF]] ^ S6[x[0xD]]) & 0x1f;
0755:                _Kr[7] = (S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x8]] ^ S8[x[0x9]] ^ S7[x[0x3]]) & 0x1f;
0756:                _Kr[8] = (S5[x[0x5]] ^ S6[x[0x4]] ^ S7[x[0xA]] ^ S8[x[0xB]] ^ S8[x[0x7]]) & 0x1f;
0757:
0758:                x03 = IntsTo32bits(x, 0x0);
0759:                x47 = IntsTo32bits(x, 0x4);
0760:                x8B = IntsTo32bits(x, 0x8);
0761:                xCF = IntsTo32bits(x, 0xC);
0762:                z03 = x03 ^ S5[x[0xD]] ^ S6[x[0xF]] ^ S7[x[0xC]] ^ S8[x[0xE]]
0763:                        ^ S7[x[0x8]];
0764:                Bits32ToInts(z03, z, 0x0);
0765:                z47 = x8B ^ S5[z[0x0]] ^ S6[z[0x2]] ^ S7[z[0x1]] ^ S8[z[0x3]]
0766:                        ^ S8[x[0xA]];
0767:                Bits32ToInts(z47, z, 0x4);
0768:                z8B = xCF ^ S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x5]] ^ S8[z[0x4]]
0769:                        ^ S5[x[0x9]];
0770:                Bits32ToInts(z8B, z, 0x8);
0771:                zCF = x47 ^ S5[z[0xA]] ^ S6[z[0x9]] ^ S7[z[0xB]] ^ S8[z[0x8]]
0772:                        ^ S6[x[0xB]];
0773:                Bits32ToInts(zCF, z, 0xC);
0774:                _Kr[9] = (S5[z[0x3]] ^ S6[z[0x2]] ^ S7[z[0xC]] ^ S8[z[0xD]] ^ S5[z[0x9]]) & 0x1f;
0775:                _Kr[10] = (S5[z[0x1]] ^ S6[z[0x0]] ^ S7[z[0xE]] ^ S8[z[0xF]] ^ S6[z[0xc]]) & 0x1f;
0776:                _Kr[11] = (S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x8]] ^ S8[z[0x9]] ^ S7[z[0x2]]) & 0x1f;
0777:                _Kr[12] = (S5[z[0x5]] ^ S6[z[0x4]] ^ S7[z[0xA]] ^ S8[z[0xB]] ^ S8[z[0x6]]) & 0x1f;
0778:
0779:                z03 = IntsTo32bits(z, 0x0);
0780:                z47 = IntsTo32bits(z, 0x4);
0781:                z8B = IntsTo32bits(z, 0x8);
0782:                zCF = IntsTo32bits(z, 0xC);
0783:                x03 = z8B ^ S5[z[0x5]] ^ S6[z[0x7]] ^ S7[z[0x4]] ^ S8[z[0x6]]
0784:                        ^ S7[z[0x0]];
0785:                Bits32ToInts(x03, x, 0x0);
0786:                x47 = z03 ^ S5[x[0x0]] ^ S6[x[0x2]] ^ S7[x[0x1]] ^ S8[x[0x3]]
0787:                        ^ S8[z[0x2]];
0788:                Bits32ToInts(x47, x, 0x4);
0789:                x8B = z47 ^ S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x5]] ^ S8[x[0x4]]
0790:                        ^ S5[z[0x1]];
0791:                Bits32ToInts(x8B, x, 0x8);
0792:                xCF = zCF ^ S5[x[0xA]] ^ S6[x[0x9]] ^ S7[x[0xB]] ^ S8[x[0x8]]
0793:                        ^ S6[z[0x3]];
0794:                Bits32ToInts(xCF, x, 0xC);
0795:                _Kr[13] = (S5[x[0x8]] ^ S6[x[0x9]] ^ S7[x[0x7]] ^ S8[x[0x6]] ^ S5[x[0x3]]) & 0x1f;
0796:                _Kr[14] = (S5[x[0xA]] ^ S6[x[0xB]] ^ S7[x[0x5]] ^ S8[x[0x4]] ^ S6[x[0x7]]) & 0x1f;
0797:                _Kr[15] = (S5[x[0xC]] ^ S6[x[0xD]] ^ S7[x[0x3]] ^ S8[x[0x2]] ^ S7[x[0x8]]) & 0x1f;
0798:                _Kr[16] = (S5[x[0xE]] ^ S6[x[0xF]] ^ S7[x[0x1]] ^ S8[x[0x0]] ^ S8[x[0xD]]) & 0x1f;
0799:            }
0800:
0801:            /**
0802:             * Encrypt the given input starting at the given offset and place
0803:             * the result in the provided buffer starting at the given offset.
0804:             *
0805:             * @param src        The plaintext buffer
0806:             * @param srcIndex    An offset into src
0807:             * @param dst        The ciphertext buffer
0808:             * @param dstIndex    An offset into dst
0809:             */
0810:            protected int encryptBlock(byte[] src, int srcIndex, byte[] dst,
0811:                    int dstIndex) {
0812:
0813:                int result[] = new int[2];
0814:
0815:                // process the input block 
0816:                // batch the units up into a 32 bit chunk and go for it
0817:                // the array is in bytes, the increment is 8x8 bits = 64
0818:
0819:                int L0 = BytesTo32bits(src, srcIndex);
0820:                int R0 = BytesTo32bits(src, srcIndex + 4);
0821:
0822:                CAST_Encipher(L0, R0, result);
0823:
0824:                // now stuff them into the destination block
0825:                Bits32ToBytes(result[0], dst, dstIndex);
0826:                Bits32ToBytes(result[1], dst, dstIndex + 4);
0827:
0828:                return BLOCK_SIZE;
0829:            }
0830:
0831:            /**
0832:             * Decrypt the given input starting at the given offset and place
0833:             * the result in the provided buffer starting at the given offset.
0834:             *
0835:             * @param src        The plaintext buffer
0836:             * @param srcIndex    An offset into src
0837:             * @param dst        The ciphertext buffer
0838:             * @param dstIndex    An offset into dst
0839:             */
0840:            protected int decryptBlock(byte[] src, int srcIndex, byte[] dst,
0841:                    int dstIndex) {
0842:                int result[] = new int[2];
0843:
0844:                // process the input block
0845:                // batch the units up into a 32 bit chunk and go for it
0846:                // the array is in bytes, the increment is 8x8 bits = 64
0847:                int L16 = BytesTo32bits(src, srcIndex);
0848:                int R16 = BytesTo32bits(src, srcIndex + 4);
0849:
0850:                CAST_Decipher(L16, R16, result);
0851:
0852:                // now stuff them into the destination block
0853:                Bits32ToBytes(result[0], dst, dstIndex);
0854:                Bits32ToBytes(result[1], dst, dstIndex + 4);
0855:
0856:                return BLOCK_SIZE;
0857:            }
0858:
0859:            /**
0860:             * The first of the three processing functions for the
0861:             * encryption and decryption.
0862:             *
0863:             * @param D            the input to be processed
0864:             * @param Kmi        the mask to be used from Km[n]
0865:             * @param Kri        the rotation value to be used
0866:             *
0867:             */
0868:            protected final int F1(int D, int Kmi, int Kri) {
0869:                int I = Kmi + D;
0870:                I = I << Kri | I >>> (32 - Kri);
0871:                return ((S1[(I >>> 24) & 0xff] ^ S2[(I >>> 16) & 0xff]) - S3[(I >>> 8) & 0xff])
0872:                        + S4[I & 0xff];
0873:            }
0874:
0875:            /**
0876:             * The second of the three processing functions for the
0877:             * encryption and decryption.
0878:             *
0879:             * @param D            the input to be processed
0880:             * @param Kmi        the mask to be used from Km[n]
0881:             * @param Kri        the rotation value to be used
0882:             *
0883:             */
0884:            protected final int F2(int D, int Kmi, int Kri) {
0885:                int I = Kmi ^ D;
0886:                I = I << Kri | I >>> (32 - Kri);
0887:                return ((S1[(I >>> 24) & 0xff] - S2[(I >>> 16) & 0xff]) + S3[(I >>> 8) & 0xff])
0888:                        ^ S4[I & 0xff];
0889:            }
0890:
0891:            /**
0892:             * The third of the three processing functions for the
0893:             * encryption and decryption.
0894:             *
0895:             * @param D            the input to be processed
0896:             * @param Kmi        the mask to be used from Km[n]
0897:             * @param Kri        the rotation value to be used
0898:             *
0899:             */
0900:            protected final int F3(int D, int Kmi, int Kri) {
0901:                int I = Kmi - D;
0902:                I = I << Kri | I >>> (32 - Kri);
0903:                return ((S1[(I >>> 24) & 0xff] + S2[(I >>> 16) & 0xff]) ^ S3[(I >>> 8) & 0xff])
0904:                        - S4[I & 0xff];
0905:            }
0906:
0907:            /**
0908:             * Does the 16 rounds to encrypt the block.
0909:             * 
0910:             * @param L0    the LH-32bits of the plaintext block
0911:             * @param R0    the RH-32bits of the plaintext block
0912:             */
0913:            protected final void CAST_Encipher(int L0, int R0, int result[]) {
0914:                int Lp = L0; // the previous value, equiv to L[i-1]
0915:                int Rp = R0; // equivalent to R[i-1]
0916:
0917:                /* 
0918:                 * numbering consistent with paper to make
0919:                 * checking and validating easier
0920:                 */
0921:                int Li = L0, Ri = R0;
0922:
0923:                for (int i = 1; i <= _rounds; i++) {
0924:                    Lp = Li;
0925:                    Rp = Ri;
0926:
0927:                    Li = Rp;
0928:                    switch (i) {
0929:                    case 1:
0930:                    case 4:
0931:                    case 7:
0932:                    case 10:
0933:                    case 13:
0934:                    case 16:
0935:                        Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]);
0936:                        break;
0937:                    case 2:
0938:                    case 5:
0939:                    case 8:
0940:                    case 11:
0941:                    case 14:
0942:                        Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]);
0943:                        break;
0944:                    case 3:
0945:                    case 6:
0946:                    case 9:
0947:                    case 12:
0948:                    case 15:
0949:                        Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]);
0950:                        break;
0951:                    }
0952:                }
0953:
0954:                result[0] = Ri;
0955:                result[1] = Li;
0956:
0957:                return;
0958:            }
0959:
0960:            protected final void CAST_Decipher(int L16, int R16, int result[]) {
0961:                int Lp = L16; // the previous value, equiv to L[i-1]
0962:                int Rp = R16; // equivalent to R[i-1]
0963:
0964:                /* 
0965:                 * numbering consistent with paper to make
0966:                 * checking and validating easier
0967:                 */
0968:                int Li = L16, Ri = R16;
0969:
0970:                for (int i = _rounds; i > 0; i--) {
0971:                    Lp = Li;
0972:                    Rp = Ri;
0973:
0974:                    Li = Rp;
0975:                    switch (i) {
0976:                    case 1:
0977:                    case 4:
0978:                    case 7:
0979:                    case 10:
0980:                    case 13:
0981:                    case 16:
0982:                        Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]);
0983:                        break;
0984:                    case 2:
0985:                    case 5:
0986:                    case 8:
0987:                    case 11:
0988:                    case 14:
0989:                        Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]);
0990:                        break;
0991:                    case 3:
0992:                    case 6:
0993:                    case 9:
0994:                    case 12:
0995:                    case 15:
0996:                        Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]);
0997:                        break;
0998:                    }
0999:                }
1000:
1001:                result[0] = Ri;
1002:                result[1] = Li;
1003:
1004:                return;
1005:            }
1006:
1007:            protected final void Bits32ToInts(int in, int[] b, int offset) {
1008:                b[offset + 3] = (in & 0xff);
1009:                b[offset + 2] = ((in >>> 8) & 0xff);
1010:                b[offset + 1] = ((in >>> 16) & 0xff);
1011:                b[offset] = ((in >>> 24) & 0xff);
1012:            }
1013:
1014:            protected final int IntsTo32bits(int[] b, int i) {
1015:                int rv = 0;
1016:
1017:                rv = ((b[i] & 0xff) << 24) | ((b[i + 1] & 0xff) << 16)
1018:                        | ((b[i + 2] & 0xff) << 8) | ((b[i + 3] & 0xff));
1019:
1020:                return rv;
1021:            }
1022:
1023:            protected final void Bits32ToBytes(int in, byte[] b, int offset) {
1024:                b[offset + 3] = (byte) in;
1025:                b[offset + 2] = (byte) (in >>> 8);
1026:                b[offset + 1] = (byte) (in >>> 16);
1027:                b[offset] = (byte) (in >>> 24);
1028:            }
1029:
1030:            protected final int BytesTo32bits(byte[] b, int i) {
1031:                return ((b[i] & 0xff) << 24) | ((b[i + 1] & 0xff) << 16)
1032:                        | ((b[i + 2] & 0xff) << 8) | ((b[i + 3] & 0xff));
1033:            }
1034:        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.