~brian-thomason/+junk/bouncycastle

« back to all changes in this revision

Viewing changes to src/org/bouncycastle/crypto/engines/BlowfishEngine.java

  • Committer: Brian Thomason
  • Date: 2011-12-20 17:20:32 UTC
  • Revision ID: brian.thomason@canonical.com-20111220172032-rdtm13jgdxtksacr
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.bouncycastle.crypto.engines;
 
2
 
 
3
import org.bouncycastle.crypto.BlockCipher;
 
4
import org.bouncycastle.crypto.CipherParameters;
 
5
import org.bouncycastle.crypto.DataLengthException;
 
6
import org.bouncycastle.crypto.params.KeyParameter;
 
7
 
 
8
/**
 
9
 * A class that provides Blowfish key encryption operations,
 
10
 * such as encoding data and generating keys.
 
11
 * All the algorithms herein are from Applied Cryptography
 
12
 * and implement a simplified cryptography interface.
 
13
 */
 
14
public final class BlowfishEngine
 
15
implements BlockCipher
 
16
{
 
17
    private final static int[] 
 
18
        KP = {
 
19
                0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
 
20
                0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
 
21
                0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
 
22
                0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
 
23
                0x9216D5D9, 0x8979FB1B
 
24
             },
 
25
 
 
26
        KS0 = {
 
27
                0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
 
28
                0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
 
29
                0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
 
30
                0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
 
31
                0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
 
32
                0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
 
33
                0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
 
34
                0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
 
35
                0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
 
36
                0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
 
37
                0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
 
38
                0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
 
39
                0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
 
40
                0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
 
41
                0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
 
42
                0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
 
43
                0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
 
44
                0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
 
45
                0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
 
46
                0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
 
47
                0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
 
48
                0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
 
49
                0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
 
50
                0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
 
51
                0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
 
52
                0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
 
53
                0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
 
54
                0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
 
55
                0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
 
56
                0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
 
57
                0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
 
58
                0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
 
59
                0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
 
60
                0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
 
61
                0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
 
62
                0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
 
63
                0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
 
64
                0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
 
65
                0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
 
66
                0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
 
67
                0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
 
68
                0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
 
69
                0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
 
70
                0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
 
71
                0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
 
72
                0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
 
73
                0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
 
74
                0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
 
75
                0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
 
76
                0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
 
77
                0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
 
78
                0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
 
79
                0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
 
80
                0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
 
81
                0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
 
82
                0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
 
83
                0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
 
84
                0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
 
85
                0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
 
86
                0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
 
87
                0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
 
88
                0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
 
89
                0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
 
90
                0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
 
91
            },
 
92
 
 
93
        KS1 = {
 
94
                0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
 
95
                0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
 
96
                0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
 
97
                0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
 
98
                0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
 
99
                0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
 
100
                0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
 
101
                0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
 
102
                0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
 
103
                0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
 
104
                0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
 
105
                0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
 
106
                0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
 
107
                0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
 
108
                0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
 
109
                0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
 
110
                0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
 
111
                0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
 
112
                0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
 
113
                0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
 
114
                0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
 
115
                0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
 
116
                0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
 
117
                0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
 
118
                0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
 
119
                0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
 
120
                0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
 
121
                0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
 
122
                0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
 
123
                0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
 
124
                0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
 
125
                0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
 
126
                0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
 
127
                0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
 
128
                0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
 
129
                0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
 
130
                0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
 
131
                0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
 
132
                0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
 
133
                0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
 
134
                0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
 
135
                0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
 
136
                0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
 
137
                0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
 
138
                0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
 
139
                0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
 
140
                0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
 
141
                0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
 
142
                0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
 
143
                0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
 
144
                0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
 
145
                0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
 
146
                0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
 
147
                0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
 
148
                0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
 
149
                0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
 
150
                0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
 
151
                0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
 
152
                0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
 
153
                0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
 
154
                0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
 
155
                0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
 
156
                0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
 
157
                0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
 
158
            },
 
159
 
 
160
        KS2 = {
 
161
                0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
 
162
                0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
 
163
                0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
 
164
                0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
 
165
                0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
 
166
                0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
 
167
                0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
 
168
                0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
 
169
                0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
 
170
                0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
 
171
                0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
 
172
                0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
 
173
                0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
 
174
                0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
 
175
                0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
 
176
                0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
 
177
                0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
 
178
                0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
 
179
                0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
 
180
                0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
 
181
                0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
 
182
                0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
 
183
                0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
 
184
                0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
 
185
                0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
 
186
                0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
 
187
                0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
 
188
                0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
 
189
                0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
 
190
                0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
 
191
                0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
 
192
                0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
 
193
                0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
 
194
                0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
 
195
                0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
 
196
                0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
 
197
                0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
 
198
                0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
 
199
                0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
 
200
                0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
 
201
                0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
 
202
                0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
 
203
                0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
 
204
                0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
 
205
                0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
 
206
                0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
 
207
                0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
 
208
                0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
 
209
                0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
 
210
                0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
 
211
                0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
 
212
                0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
 
213
                0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
 
214
                0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
 
215
                0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
 
216
                0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
 
217
                0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
 
218
                0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
 
219
                0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
 
220
                0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
 
221
                0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
 
222
                0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
 
223
                0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
 
224
                0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
 
225
            },
 
226
 
 
227
        KS3 = {
 
228
                0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
 
229
                0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
 
230
                0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
 
231
                0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
 
232
                0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
 
233
                0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
 
234
                0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
 
235
                0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
 
236
                0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
 
237
                0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
 
238
                0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
 
239
                0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
 
240
                0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
 
241
                0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
 
242
                0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
 
243
                0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
 
244
                0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
 
245
                0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
 
246
                0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
 
247
                0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
 
248
                0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
 
249
                0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
 
250
                0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
 
251
                0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
 
252
                0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
 
253
                0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
 
254
                0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
 
255
                0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
 
256
                0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
 
257
                0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
 
258
                0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
 
259
                0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
 
260
                0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
 
261
                0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
 
262
                0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
 
263
                0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
 
264
                0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
 
265
                0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
 
266
                0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
 
267
                0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
 
268
                0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
 
269
                0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
 
270
                0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
 
271
                0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
 
272
                0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
 
273
                0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
 
274
                0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
 
275
                0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
 
276
                0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
 
277
                0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
 
278
                0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
 
279
                0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
 
280
                0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
 
281
                0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
 
282
                0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
 
283
                0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
 
284
                0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
 
285
                0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
 
286
                0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
 
287
                0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
 
288
                0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
 
289
                0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
 
290
                0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
 
291
                0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
 
292
            };
 
293
 
 
294
    //====================================
 
295
    // Useful constants
 
296
    //====================================
 
297
 
 
298
    private static final int    ROUNDS = 16;
 
299
    private static final int    BLOCK_SIZE = 8;  // bytes = 64 bits
 
300
    private static final int    SBOX_SK = 256;
 
301
    private static final int    P_SZ = ROUNDS+2;
 
302
 
 
303
    private final int[] S0, S1, S2, S3;     // the s-boxes
 
304
    private final int[] P;                  // the p-array
 
305
 
 
306
    private boolean encrypting = false;
 
307
 
 
308
    private byte[] workingKey = null;
 
309
 
 
310
    public BlowfishEngine()
 
311
    {
 
312
        S0 = new int[SBOX_SK];
 
313
        S1 = new int[SBOX_SK];
 
314
        S2 = new int[SBOX_SK];
 
315
        S3 = new int[SBOX_SK];
 
316
        P = new int[P_SZ];
 
317
    }
 
318
 
 
319
    /**
 
320
     * initialise a Blowfish cipher.
 
321
     *
 
322
     * @param encrypting whether or not we are for encryption.
 
323
     * @param params the parameters required to set up the cipher.
 
324
     * @exception IllegalArgumentException if the params argument is
 
325
     * inappropriate.
 
326
     */
 
327
    public void init(
 
328
        boolean             encrypting,
 
329
        CipherParameters    params)
 
330
    {
 
331
        if (params instanceof KeyParameter)
 
332
        {
 
333
            this.encrypting = encrypting;
 
334
            this.workingKey = ((KeyParameter)params).getKey();
 
335
            setKey(this.workingKey);
 
336
 
 
337
            return;
 
338
        }
 
339
 
 
340
        throw new IllegalArgumentException("invalid parameter passed to Blowfish init - " + params.getClass().getName());
 
341
    }
 
342
 
 
343
    public String getAlgorithmName()
 
344
    {
 
345
        return "Blowfish";
 
346
    }
 
347
 
 
348
    public final int processBlock(
 
349
        byte[] in,
 
350
        int inOff,
 
351
        byte[] out,
 
352
        int outOff)
 
353
    {
 
354
        if (workingKey == null)
 
355
        {
 
356
            throw new IllegalStateException("Blowfish not initialised");
 
357
        }
 
358
 
 
359
        if ((inOff + BLOCK_SIZE) > in.length)
 
360
        {
 
361
            throw new DataLengthException("input buffer too short");
 
362
        }
 
363
 
 
364
        if ((outOff + BLOCK_SIZE) > out.length)
 
365
        {
 
366
            throw new DataLengthException("output buffer too short");
 
367
        }
 
368
 
 
369
        if (encrypting)
 
370
        {
 
371
            encryptBlock(in, inOff, out, outOff);
 
372
        }
 
373
        else
 
374
        {    
 
375
            decryptBlock(in, inOff, out, outOff);
 
376
        }
 
377
 
 
378
        return BLOCK_SIZE;
 
379
    }
 
380
 
 
381
    public void reset()
 
382
    {
 
383
    }
 
384
 
 
385
    public int getBlockSize()
 
386
    {
 
387
        return BLOCK_SIZE;
 
388
    }
 
389
 
 
390
    //==================================
 
391
    // Private Implementation
 
392
    //==================================
 
393
 
 
394
    private int F(int x)
 
395
    {
 
396
        return (((S0[(x >>> 24)] + S1[(x >>> 16) & 0xff])
 
397
                            ^ S2[(x >>> 8) & 0xff]) + S3[x & 0xff]);
 
398
    }
 
399
 
 
400
    /**
 
401
     * apply the encryption cycle to each value pair in the table.
 
402
     */
 
403
    private void processTable(
 
404
        int     xl,
 
405
        int     xr,
 
406
        int[]   table)
 
407
    {
 
408
        int size = table.length;
 
409
 
 
410
        for (int s = 0; s < size; s += 2)
 
411
        {
 
412
            xl ^= P[0];
 
413
 
 
414
            for (int i = 1; i < ROUNDS; i += 2)
 
415
            {
 
416
                xr ^= F(xl) ^ P[i];
 
417
                xl ^= F(xr) ^ P[i + 1];
 
418
            }
 
419
 
 
420
            xr ^= P[ROUNDS + 1];
 
421
 
 
422
            table[s] = xr;
 
423
            table[s + 1] = xl;
 
424
 
 
425
            xr = xl;            // end of cycle swap
 
426
            xl = table[s];
 
427
        }
 
428
    }
 
429
 
 
430
    private void setKey(byte[] key)
 
431
    {
 
432
        /*
 
433
         * - comments are from _Applied Crypto_, Schneier, p338
 
434
         * please be careful comparing the two, AC numbers the
 
435
         * arrays from 1, the enclosed code from 0.
 
436
         *
 
437
         * (1)
 
438
         * Initialise the S-boxes and the P-array, with a fixed string
 
439
         * This string contains the hexadecimal digits of pi (3.141...)
 
440
         */
 
441
        System.arraycopy(KS0, 0, S0, 0, SBOX_SK);
 
442
        System.arraycopy(KS1, 0, S1, 0, SBOX_SK);
 
443
        System.arraycopy(KS2, 0, S2, 0, SBOX_SK);
 
444
        System.arraycopy(KS3, 0, S3, 0, SBOX_SK);
 
445
 
 
446
        System.arraycopy(KP, 0, P, 0, P_SZ);
 
447
 
 
448
        /*
 
449
         * (2)
 
450
         * Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with the
 
451
         * second 32-bits of the key, and so on for all bits of the key
 
452
         * (up to P[17]).  Repeatedly cycle through the key bits until the
 
453
         * entire P-array has been XOR-ed with the key bits
 
454
         */
 
455
        int keyLength = key.length;
 
456
        int keyIndex = 0;
 
457
 
 
458
        for (int i=0; i < P_SZ; i++)
 
459
        {
 
460
            // get the 32 bits of the key, in 4 * 8 bit chunks
 
461
            int data = 0x0000000;
 
462
            for (int j=0; j < 4; j++)
 
463
            {
 
464
                // create a 32 bit block
 
465
                data = (data << 8) | (key[keyIndex++] & 0xff);
 
466
 
 
467
                // wrap when we get to the end of the key
 
468
                if (keyIndex >= keyLength)
 
469
                {
 
470
                    keyIndex = 0;
 
471
                }
 
472
            }
 
473
            // XOR the newly created 32 bit chunk onto the P-array
 
474
            P[i] ^= data;
 
475
        }
 
476
 
 
477
        /*
 
478
         * (3)
 
479
         * Encrypt the all-zero string with the Blowfish algorithm, using
 
480
         * the subkeys described in (1) and (2)
 
481
         *
 
482
         * (4)
 
483
         * Replace P1 and P2 with the output of step (3)
 
484
         *
 
485
         * (5)
 
486
         * Encrypt the output of step(3) using the Blowfish algorithm,
 
487
         * with the modified subkeys.
 
488
         *
 
489
         * (6)
 
490
         * Replace P3 and P4 with the output of step (5)
 
491
         *
 
492
         * (7)
 
493
         * Continue the process, replacing all elements of the P-array
 
494
         * and then all four S-boxes in order, with the output of the
 
495
         * continuously changing Blowfish algorithm
 
496
         */
 
497
 
 
498
        processTable(0, 0, P);
 
499
        processTable(P[P_SZ - 2], P[P_SZ - 1], S0);
 
500
        processTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1);
 
501
        processTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2);
 
502
        processTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3);
 
503
    }
 
504
 
 
505
    /**
 
506
     * Encrypt the given input starting at the given offset and place
 
507
     * the result in the provided buffer starting at the given offset.
 
508
     * The input will be an exact multiple of our blocksize.
 
509
     */
 
510
    private void encryptBlock(
 
511
        byte[]  src,
 
512
        int     srcIndex,
 
513
        byte[]  dst,
 
514
        int     dstIndex)
 
515
    {
 
516
        int xl = BytesTo32bits(src, srcIndex);
 
517
        int xr = BytesTo32bits(src, srcIndex+4);
 
518
 
 
519
        xl ^= P[0];
 
520
 
 
521
        for (int i = 1; i < ROUNDS; i += 2)
 
522
        {
 
523
            xr ^= F(xl) ^ P[i];
 
524
            xl ^= F(xr) ^ P[i + 1];
 
525
        }
 
526
 
 
527
        xr ^= P[ROUNDS + 1];
 
528
 
 
529
        Bits32ToBytes(xr, dst, dstIndex);
 
530
        Bits32ToBytes(xl, dst, dstIndex + 4);
 
531
    }
 
532
 
 
533
    /**
 
534
     * Decrypt the given input starting at the given offset and place
 
535
     * the result in the provided buffer starting at the given offset.
 
536
     * The input will be an exact multiple of our blocksize.
 
537
     */
 
538
    private void decryptBlock(
 
539
        byte[] src, 
 
540
        int srcIndex,
 
541
        byte[] dst,
 
542
        int dstIndex)
 
543
    {
 
544
        int xl = BytesTo32bits(src, srcIndex);
 
545
        int xr = BytesTo32bits(src, srcIndex + 4);
 
546
 
 
547
        xl ^= P[ROUNDS + 1];
 
548
 
 
549
        for (int i = ROUNDS; i > 0 ; i -= 2)
 
550
        {
 
551
            xr ^= F(xl) ^ P[i];
 
552
            xl ^= F(xr) ^ P[i - 1];
 
553
        }
 
554
 
 
555
        xr ^= P[0];
 
556
 
 
557
        Bits32ToBytes(xr, dst, dstIndex);
 
558
        Bits32ToBytes(xl, dst, dstIndex+4);
 
559
    }
 
560
 
 
561
    private int BytesTo32bits(byte[] b, int i)
 
562
    {
 
563
        return ((b[i]   & 0xff) << 24) | 
 
564
             ((b[i+1] & 0xff) << 16) |
 
565
             ((b[i+2] & 0xff) << 8) |
 
566
             ((b[i+3] & 0xff));
 
567
    }
 
568
 
 
569
    private void Bits32ToBytes(int in,  byte[] b, int offset)
 
570
    {
 
571
        b[offset + 3] = (byte)in;
 
572
        b[offset + 2] = (byte)(in >> 8);
 
573
        b[offset + 1] = (byte)(in >> 16);
 
574
        b[offset]     = (byte)(in >> 24);
 
575
    }
 
576
}