]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - Crypto/src/Blowfish.c
df69afadc5ff9d83fb72b5a3618c55dff5344d71
[tahoe-lafs/tahoe-lafs.git] / Crypto / src / Blowfish.c
1
2 /*
3  *  blowfish.c : Source code for the Blowfish block cipher
4  *
5  * Part of the Python Cryptography Toolkit
6  *
7  * Distribute and use freely; there are no restrictions on further 
8  * dissemination and usage except those imposed by the laws of your 
9  * country of residence.
10  *
11  */
12
13 /*************************************************************************/
14 /* File: bf.c
15    Blowfish cipher by Bruce Schneier,
16    Code by Bryan Olson, based partly on Schneier's.
17 */
18
19 #include "Python.h"
20
21 #define MODULE_NAME Blowfish
22 #define BLOCK_SIZE 8
23 #define KEY_SIZE 0
24   
25 /* Define IntU32 to be an unsigned in 32 bits long */
26 typedef unsigned int IntU32 ;
27 typedef unsigned char IntU8 ;
28 #define NROUNDS         16
29
30
31
32 /* Define IntP to be an integer which
33    is the same size as a pointer. */
34 typedef unsigned long IntP ;
35
36
37 typedef struct
38 {
39         IntU32 p[2][NROUNDS+2],
40                 sbox[4][256] ;
41 } BFkey_type ; 
42
43 typedef struct 
44 {
45         BFkey_type bfkey;
46 } block_state;
47
48 /*  File bfinit.h
49     Data to initialize P and S in BlowFish.
50 */
51
52 static IntU32 p_init[NROUNDS+2] = 
53 {
54         608135816UL, 2242054355UL,  320440878UL,   57701188UL,
55         2752067618UL,  698298832UL,  137296536UL, 3964562569UL,
56         1160258022UL,  953160567UL, 3193202383UL,  887688300UL,
57         3232508343UL, 3380367581UL, 1065670069UL, 3041331479UL,
58         2450970073UL, 2306472731UL
59 } ;
60
61 static IntU32  s_init[4][256] = {
62         {3509652390UL, 2564797868UL,  805139163UL, 3491422135UL,
63          3101798381UL, 1780907670UL, 3128725573UL, 4046225305UL,
64          614570311UL, 3012652279UL,  134345442UL, 2240740374UL,
65          1667834072UL, 1901547113UL, 2757295779UL, 4103290238UL,
66          227898511UL, 1921955416UL, 1904987480UL, 2182433518UL,
67          2069144605UL, 3260701109UL, 2620446009UL,  720527379UL,
68          3318853667UL,  677414384UL, 3393288472UL, 3101374703UL,
69          2390351024UL, 1614419982UL, 1822297739UL, 2954791486UL,
70          3608508353UL, 3174124327UL, 2024746970UL, 1432378464UL,
71          3864339955UL, 2857741204UL, 1464375394UL, 1676153920UL,
72          1439316330UL,  715854006UL, 3033291828UL,  289532110UL,
73          2706671279UL, 2087905683UL, 3018724369UL, 1668267050UL,
74          732546397UL, 1947742710UL, 3462151702UL, 2609353502UL,
75          2950085171UL, 1814351708UL, 2050118529UL,  680887927UL,
76          999245976UL, 1800124847UL, 3300911131UL, 1713906067UL,
77          1641548236UL, 4213287313UL, 1216130144UL, 1575780402UL,
78          4018429277UL, 3917837745UL, 3693486850UL, 3949271944UL,
79          596196993UL, 3549867205UL,  258830323UL, 2213823033UL,
80          772490370UL, 2760122372UL, 1774776394UL, 2652871518UL,
81          566650946UL, 4142492826UL, 1728879713UL, 2882767088UL,
82          1783734482UL, 3629395816UL, 2517608232UL, 2874225571UL,
83          1861159788UL,  326777828UL, 3124490320UL, 2130389656UL,
84          2716951837UL,  967770486UL, 1724537150UL, 2185432712UL,
85          2364442137UL, 1164943284UL, 2105845187UL,  998989502UL,
86          3765401048UL, 2244026483UL, 1075463327UL, 1455516326UL,
87          1322494562UL,  910128902UL,  469688178UL, 1117454909UL,
88          936433444UL, 3490320968UL, 3675253459UL, 1240580251UL,
89          122909385UL, 2157517691UL,  634681816UL, 4142456567UL,
90          3825094682UL, 3061402683UL, 2540495037UL,   79693498UL,
91          3249098678UL, 1084186820UL, 1583128258UL,  426386531UL,
92          1761308591UL, 1047286709UL,  322548459UL,  995290223UL,
93          1845252383UL, 2603652396UL, 3431023940UL, 2942221577UL,
94          3202600964UL, 3727903485UL, 1712269319UL,  422464435UL,
95          3234572375UL, 1170764815UL, 3523960633UL, 3117677531UL,
96          1434042557UL,  442511882UL, 3600875718UL, 1076654713UL,
97          1738483198UL, 4213154764UL, 2393238008UL, 3677496056UL,
98          1014306527UL, 4251020053UL,  793779912UL, 2902807211UL,
99          842905082UL, 4246964064UL, 1395751752UL, 1040244610UL,
100          2656851899UL, 3396308128UL,  445077038UL, 3742853595UL,
101          3577915638UL,  679411651UL, 2892444358UL, 2354009459UL,
102          1767581616UL, 3150600392UL, 3791627101UL, 3102740896UL,
103          284835224UL, 4246832056UL, 1258075500UL,  768725851UL,
104          2589189241UL, 3069724005UL, 3532540348UL, 1274779536UL,
105          3789419226UL, 2764799539UL, 1660621633UL, 3471099624UL,
106          4011903706UL,  913787905UL, 3497959166UL,  737222580UL,
107          2514213453UL, 2928710040UL, 3937242737UL, 1804850592UL,
108          3499020752UL, 2949064160UL, 2386320175UL, 2390070455UL,
109          2415321851UL, 4061277028UL, 2290661394UL, 2416832540UL,
110          1336762016UL, 1754252060UL, 3520065937UL, 3014181293UL,
111          791618072UL, 3188594551UL, 3933548030UL, 2332172193UL,
112          3852520463UL, 3043980520UL,  413987798UL, 3465142937UL,
113          3030929376UL, 4245938359UL, 2093235073UL, 3534596313UL,
114          375366246UL, 2157278981UL, 2479649556UL,  555357303UL,
115          3870105701UL, 2008414854UL, 3344188149UL, 4221384143UL,
116          3956125452UL, 2067696032UL, 3594591187UL, 2921233993UL,
117          2428461UL,  544322398UL,  577241275UL, 1471733935UL,
118          610547355UL, 4027169054UL, 1432588573UL, 1507829418UL,
119          2025931657UL, 3646575487UL,  545086370UL,   48609733UL,
120          2200306550UL, 1653985193UL,  298326376UL, 1316178497UL,
121          3007786442UL, 2064951626UL,  458293330UL, 2589141269UL,
122          3591329599UL, 3164325604UL,  727753846UL, 2179363840UL,
123          146436021UL, 1461446943UL, 4069977195UL,  705550613UL,
124          3059967265UL, 3887724982UL, 4281599278UL, 3313849956UL,
125          1404054877UL, 2845806497UL,  146425753UL, 1854211946UL},
126
127         { 1266315497UL, 3048417604UL, 3681880366UL, 3289982499UL,
128           2909710000UL, 1235738493UL, 2632868024UL, 2414719590UL,
129           3970600049UL, 1771706367UL, 1449415276UL, 3266420449UL,
130           422970021UL, 1963543593UL, 2690192192UL, 3826793022UL,
131           1062508698UL, 1531092325UL, 1804592342UL, 2583117782UL,
132           2714934279UL, 4024971509UL, 1294809318UL, 4028980673UL,
133           1289560198UL, 2221992742UL, 1669523910UL,   35572830UL,
134           157838143UL, 1052438473UL, 1016535060UL, 1802137761UL,
135           1753167236UL, 1386275462UL, 3080475397UL, 2857371447UL,
136           1040679964UL, 2145300060UL, 2390574316UL, 1461121720UL,
137           2956646967UL, 4031777805UL, 4028374788UL,   33600511UL,
138           2920084762UL, 1018524850UL,  629373528UL, 3691585981UL,
139           3515945977UL, 2091462646UL, 2486323059UL,  586499841UL,
140           988145025UL,  935516892UL, 3367335476UL, 2599673255UL,
141           2839830854UL,  265290510UL, 3972581182UL, 2759138881UL,
142           3795373465UL, 1005194799UL,  847297441UL,  406762289UL,
143           1314163512UL, 1332590856UL, 1866599683UL, 4127851711UL,
144           750260880UL,  613907577UL, 1450815602UL, 3165620655UL,
145           3734664991UL, 3650291728UL, 3012275730UL, 3704569646UL,
146           1427272223UL,  778793252UL, 1343938022UL, 2676280711UL,
147           2052605720UL, 1946737175UL, 3164576444UL, 3914038668UL,
148           3967478842UL, 3682934266UL, 1661551462UL, 3294938066UL,
149           4011595847UL,  840292616UL, 3712170807UL,  616741398UL,
150           312560963UL,  711312465UL, 1351876610UL,  322626781UL,
151           1910503582UL,  271666773UL, 2175563734UL, 1594956187UL,
152           70604529UL, 3617834859UL, 1007753275UL, 1495573769UL,
153           4069517037UL, 2549218298UL, 2663038764UL,  504708206UL,
154           2263041392UL, 3941167025UL, 2249088522UL, 1514023603UL,
155           1998579484UL, 1312622330UL,  694541497UL, 2582060303UL,
156           2151582166UL, 1382467621UL,  776784248UL, 2618340202UL,
157           3323268794UL, 2497899128UL, 2784771155UL,  503983604UL,
158           4076293799UL,  907881277UL,  423175695UL,  432175456UL,
159           1378068232UL, 4145222326UL, 3954048622UL, 3938656102UL,
160           3820766613UL, 2793130115UL, 2977904593UL,   26017576UL,
161           3274890735UL, 3194772133UL, 1700274565UL, 1756076034UL,
162           4006520079UL, 3677328699UL,  720338349UL, 1533947780UL,
163           354530856UL,  688349552UL, 3973924725UL, 1637815568UL,
164           332179504UL, 3949051286UL,   53804574UL, 2852348879UL,
165           3044236432UL, 1282449977UL, 3583942155UL, 3416972820UL,
166           4006381244UL, 1617046695UL, 2628476075UL, 3002303598UL,
167           1686838959UL,  431878346UL, 2686675385UL, 1700445008UL,
168           1080580658UL, 1009431731UL,  832498133UL, 3223435511UL,
169           2605976345UL, 2271191193UL, 2516031870UL, 1648197032UL,
170           4164389018UL, 2548247927UL,  300782431UL,  375919233UL,
171           238389289UL, 3353747414UL, 2531188641UL, 2019080857UL,
172           1475708069UL,  455242339UL, 2609103871UL,  448939670UL,
173           3451063019UL, 1395535956UL, 2413381860UL, 1841049896UL,
174           1491858159UL,  885456874UL, 4264095073UL, 4001119347UL,
175           1565136089UL, 3898914787UL, 1108368660UL,  540939232UL,
176           1173283510UL, 2745871338UL, 3681308437UL, 4207628240UL,
177           3343053890UL, 4016749493UL, 1699691293UL, 1103962373UL,
178           3625875870UL, 2256883143UL, 3830138730UL, 1031889488UL,
179           3479347698UL, 1535977030UL, 4236805024UL, 3251091107UL,
180           2132092099UL, 1774941330UL, 1199868427UL, 1452454533UL,
181           157007616UL, 2904115357UL,  342012276UL,  595725824UL,
182           1480756522UL,  206960106UL,  497939518UL,  591360097UL,
183           863170706UL, 2375253569UL, 3596610801UL, 1814182875UL,
184           2094937945UL, 3421402208UL, 1082520231UL, 3463918190UL,
185           2785509508UL,  435703966UL, 3908032597UL, 1641649973UL,
186           2842273706UL, 3305899714UL, 1510255612UL, 2148256476UL,
187           2655287854UL, 3276092548UL, 4258621189UL,  236887753UL,
188           3681803219UL,  274041037UL, 1734335097UL, 3815195456UL,
189           3317970021UL, 1899903192UL, 1026095262UL, 4050517792UL,
190           356393447UL, 2410691914UL, 3873677099UL, 3682840055UL},
191
192         { 3913112168UL, 2491498743UL, 4132185628UL, 2489919796UL,
193           1091903735UL, 1979897079UL, 3170134830UL, 3567386728UL,
194           3557303409UL,  857797738UL, 1136121015UL, 1342202287UL,
195           507115054UL, 2535736646UL,  337727348UL, 3213592640UL,
196           1301675037UL, 2528481711UL, 1895095763UL, 1721773893UL,
197           3216771564UL,   62756741UL, 2142006736UL,  835421444UL,
198           2531993523UL, 1442658625UL, 3659876326UL, 2882144922UL,
199           676362277UL, 1392781812UL,  170690266UL, 3921047035UL,
200           1759253602UL, 3611846912UL, 1745797284UL,  664899054UL,
201           1329594018UL, 3901205900UL, 3045908486UL, 2062866102UL,
202           2865634940UL, 3543621612UL, 3464012697UL, 1080764994UL,
203           553557557UL, 3656615353UL, 3996768171UL,  991055499UL,
204           499776247UL, 1265440854UL,  648242737UL, 3940784050UL,
205           980351604UL, 3713745714UL, 1749149687UL, 3396870395UL,
206           4211799374UL, 3640570775UL, 1161844396UL, 3125318951UL,
207           1431517754UL,  545492359UL, 4268468663UL, 3499529547UL,
208           1437099964UL, 2702547544UL, 3433638243UL, 2581715763UL,
209           2787789398UL, 1060185593UL, 1593081372UL, 2418618748UL,
210           4260947970UL,   69676912UL, 2159744348UL,   86519011UL,
211           2512459080UL, 3838209314UL, 1220612927UL, 3339683548UL,
212           133810670UL, 1090789135UL, 1078426020UL, 1569222167UL,
213           845107691UL, 3583754449UL, 4072456591UL, 1091646820UL,
214           628848692UL, 1613405280UL, 3757631651UL,  526609435UL,
215           236106946UL,   48312990UL, 2942717905UL, 3402727701UL,
216           1797494240UL,  859738849UL,  992217954UL, 4005476642UL,
217           2243076622UL, 3870952857UL, 3732016268UL,  765654824UL,
218           3490871365UL, 2511836413UL, 1685915746UL, 3888969200UL,
219           1414112111UL, 2273134842UL, 3281911079UL, 4080962846UL,
220           172450625UL, 2569994100UL,  980381355UL, 4109958455UL,
221           2819808352UL, 2716589560UL, 2568741196UL, 3681446669UL,
222           3329971472UL, 1835478071UL,  660984891UL, 3704678404UL,
223           4045999559UL, 3422617507UL, 3040415634UL, 1762651403UL,
224           1719377915UL, 3470491036UL, 2693910283UL, 3642056355UL,
225           3138596744UL, 1364962596UL, 2073328063UL, 1983633131UL,
226           926494387UL, 3423689081UL, 2150032023UL, 4096667949UL,
227           1749200295UL, 3328846651UL,  309677260UL, 2016342300UL,
228           1779581495UL, 3079819751UL,  111262694UL, 1274766160UL,
229           443224088UL,  298511866UL, 1025883608UL, 3806446537UL,
230           1145181785UL,  168956806UL, 3641502830UL, 3584813610UL,
231           1689216846UL, 3666258015UL, 3200248200UL, 1692713982UL,
232           2646376535UL, 4042768518UL, 1618508792UL, 1610833997UL,
233           3523052358UL, 4130873264UL, 2001055236UL, 3610705100UL,
234           2202168115UL, 4028541809UL, 2961195399UL, 1006657119UL,
235           2006996926UL, 3186142756UL, 1430667929UL, 3210227297UL,
236           1314452623UL, 4074634658UL, 4101304120UL, 2273951170UL,
237           1399257539UL, 3367210612UL, 3027628629UL, 1190975929UL,
238           2062231137UL, 2333990788UL, 2221543033UL, 2438960610UL,
239           1181637006UL,  548689776UL, 2362791313UL, 3372408396UL,
240           3104550113UL, 3145860560UL,  296247880UL, 1970579870UL,
241           3078560182UL, 3769228297UL, 1714227617UL, 3291629107UL,
242           3898220290UL,  166772364UL, 1251581989UL,  493813264UL,
243           448347421UL,  195405023UL, 2709975567UL,  677966185UL,
244           3703036547UL, 1463355134UL, 2715995803UL, 1338867538UL,
245           1343315457UL, 2802222074UL, 2684532164UL,  233230375UL,
246           2599980071UL, 2000651841UL, 3277868038UL, 1638401717UL,
247           4028070440UL, 3237316320UL,    6314154UL,  819756386UL,
248           300326615UL,  590932579UL, 1405279636UL, 3267499572UL,
249           3150704214UL, 2428286686UL, 3959192993UL, 3461946742UL,
250           1862657033UL, 1266418056UL,  963775037UL, 2089974820UL,
251           2263052895UL, 1917689273UL,  448879540UL, 3550394620UL,
252           3981727096UL,  150775221UL, 3627908307UL, 1303187396UL,
253           508620638UL, 2975983352UL, 2726630617UL, 1817252668UL,
254           1876281319UL, 1457606340UL,  908771278UL, 3720792119UL,
255           3617206836UL, 2455994898UL, 1729034894UL, 1080033504UL},
256
257         {  976866871UL, 3556439503UL, 2881648439UL, 1522871579UL,
258            1555064734UL, 1336096578UL, 3548522304UL, 2579274686UL,
259            3574697629UL, 3205460757UL, 3593280638UL, 3338716283UL,
260            3079412587UL,  564236357UL, 2993598910UL, 1781952180UL,
261            1464380207UL, 3163844217UL, 3332601554UL, 1699332808UL,
262            1393555694UL, 1183702653UL, 3581086237UL, 1288719814UL,
263            691649499UL, 2847557200UL, 2895455976UL, 3193889540UL,
264            2717570544UL, 1781354906UL, 1676643554UL, 2592534050UL,
265            3230253752UL, 1126444790UL, 2770207658UL, 2633158820UL,
266            2210423226UL, 2615765581UL, 2414155088UL, 3127139286UL,
267            673620729UL, 2805611233UL, 1269405062UL, 4015350505UL,
268            3341807571UL, 4149409754UL, 1057255273UL, 2012875353UL,
269            2162469141UL, 2276492801UL, 2601117357UL,  993977747UL,
270            3918593370UL, 2654263191UL,  753973209UL,   36408145UL,
271            2530585658UL,   25011837UL, 3520020182UL, 2088578344UL,
272            530523599UL, 2918365339UL, 1524020338UL, 1518925132UL,
273            3760827505UL, 3759777254UL, 1202760957UL, 3985898139UL,
274            3906192525UL,  674977740UL, 4174734889UL, 2031300136UL,
275            2019492241UL, 3983892565UL, 4153806404UL, 3822280332UL,
276            352677332UL, 2297720250UL,   60907813UL,   90501309UL,
277            3286998549UL, 1016092578UL, 2535922412UL, 2839152426UL,
278            457141659UL,  509813237UL, 4120667899UL,  652014361UL,
279            1966332200UL, 2975202805UL,   55981186UL, 2327461051UL,
280            676427537UL, 3255491064UL, 2882294119UL, 3433927263UL,
281            1307055953UL,  942726286UL,  933058658UL, 2468411793UL,
282            3933900994UL, 4215176142UL, 1361170020UL, 2001714738UL,
283            2830558078UL, 3274259782UL, 1222529897UL, 1679025792UL,
284            2729314320UL, 3714953764UL, 1770335741UL,  151462246UL,
285            3013232138UL, 1682292957UL, 1483529935UL,  471910574UL,
286            1539241949UL,  458788160UL, 3436315007UL, 1807016891UL,
287            3718408830UL,  978976581UL, 1043663428UL, 3165965781UL,
288            1927990952UL, 4200891579UL, 2372276910UL, 3208408903UL,
289            3533431907UL, 1412390302UL, 2931980059UL, 4132332400UL,
290            1947078029UL, 3881505623UL, 4168226417UL, 2941484381UL,
291            1077988104UL, 1320477388UL,  886195818UL,   18198404UL,
292            3786409000UL, 2509781533UL,  112762804UL, 3463356488UL,
293            1866414978UL,  891333506UL,   18488651UL,  661792760UL,
294            1628790961UL, 3885187036UL, 3141171499UL,  876946877UL,
295            2693282273UL, 1372485963UL,  791857591UL, 2686433993UL,
296            3759982718UL, 3167212022UL, 3472953795UL, 2716379847UL,
297            445679433UL, 3561995674UL, 3504004811UL, 3574258232UL,
298            54117162UL, 3331405415UL, 2381918588UL, 3769707343UL,
299            4154350007UL, 1140177722UL, 4074052095UL,  668550556UL,
300            3214352940UL,  367459370UL,  261225585UL, 2610173221UL,
301            4209349473UL, 3468074219UL, 3265815641UL,  314222801UL,
302            3066103646UL, 3808782860UL,  282218597UL, 3406013506UL,
303            3773591054UL,  379116347UL, 1285071038UL,  846784868UL,
304            2669647154UL, 3771962079UL, 3550491691UL, 2305946142UL,
305            453669953UL, 1268987020UL, 3317592352UL, 3279303384UL,
306            3744833421UL, 2610507566UL, 3859509063UL,  266596637UL,
307            3847019092UL,  517658769UL, 3462560207UL, 3443424879UL,
308            370717030UL, 4247526661UL, 2224018117UL, 4143653529UL,
309            4112773975UL, 2788324899UL, 2477274417UL, 1456262402UL,
310            2901442914UL, 1517677493UL, 1846949527UL, 2295493580UL,
311            3734397586UL, 2176403920UL, 1280348187UL, 1908823572UL,
312            3871786941UL,  846861322UL, 1172426758UL, 3287448474UL,
313            3383383037UL, 1655181056UL, 3139813346UL,  901632758UL,
314            1897031941UL, 2986607138UL, 3066810236UL, 3447102507UL,
315            1393639104UL,  373351379UL,  950779232UL,  625454576UL,
316            3124240540UL, 4148612726UL, 2007998917UL,  544563296UL,
317            2244738638UL, 2330496472UL, 2058025392UL, 1291430526UL,
318            424198748UL,   50039436UL,   29584100UL, 3605783033UL,
319            2429876329UL, 2791104160UL, 1057563949UL, 3255363231UL,
320            3075367218UL, 3463963227UL, 1469046755UL,  985887462UL}
321 } ;
322
323 /* sLb(s,n) allows us to subsript s by byte offsets, which
324    allows us to avoid a subscript scaling.
325 */
326 #define sub(s,n) *((IntU32 *)((IntP)s+(n)))
327
328 /* Below is one BlowFish round including the F function 
329 */
330 #define bf_round(l,r,n) \
331        l ^= P[n]; \
332        r ^= ( (sub(S[0],l>>22 & 0x3fc) + sub(S[1],l>>14 & 0x3fc)) \
333               ^ sub(S[2],l>>6 & 0x3fc) ) +S[3][l & 0xff] 
334
335
336
337 /* This function requires the block to be two 32 bit integers, in 
338 whatever endian form the machine uses.  On little endian machines 
339 use crypt_8bytes() on user data.  make_bfkey should call crypt_block
340 on either endian machine.  Pass direction 0 to encrypt, 1 to decrypt.
341 */
342 static void crypt_block(IntU32 block[2], BFkey_type *bfkey, int direction) 
343 {
344         register IntU32 left, right, 
345                 (*S)[256], 
346                 *P ; 
347                   
348         left = block[0] ; right = block[1] ; 
349
350         S = bfkey->sbox ; 
351         P = bfkey->p[direction] ;
352
353         bf_round( left, right,  0 ) ;   bf_round( right, left,  1 ) ;  
354         bf_round( left, right,  2 ) ;   bf_round( right, left,  3 ) ;
355         bf_round( left, right,  4 ) ;   bf_round( right, left,  5 ) ;
356         bf_round( left, right,  6 ) ;   bf_round( right, left,  7 ) ;
357         bf_round( left, right,  8 ) ;   bf_round( right, left,  9 ) ;
358         bf_round( left, right, 10 ) ;   bf_round( right, left, 11 ) ;
359         bf_round( left, right, 12 ) ;   bf_round( right, left, 13 ) ;
360         bf_round( left, right, 14 ) ;   bf_round( right, left, 15 ) ;
361
362         left = left ^ P[NROUNDS] ;
363         right = right ^ P[NROUNDS+1] ;
364         block[0] = right ;
365         block[1] = left ;
366 }
367
368 /* The following should be allignment and endian independent.
369    I have not tested it on a little-endian machine.
370    It takes the input block from source, and puts the output
371    in dest.  They can be the same.  It takes the same direction
372    parameter as crypt_block().
373 */
374 static void crypt_8bytes(IntU8 *source, IntU8 *dest, BFkey_type *bfkey, 
375                          int direction)
376 {
377         IntU32  block[2] ;
378
379         block[0] = source[3] | source[2]<<8 | source[1]<<16 | source[0]<<24 ;
380         block[1] = source[7] | source[6]<<8 | source[5]<<16 | source[4]<<24 ;
381
382         crypt_block( block, bfkey, direction ) ;
383
384         dest[0]= block[0]>>24 ;
385         dest[1]= block[0]>>16 & 0xff ;
386         dest[2]= block[0]>>8  & 0xff ;
387         dest[3]= block[0]     & 0xff ;
388         dest[4]= block[1]>>24 ;
389         dest[5]= block[1]>>16 & 0xff ;
390         dest[6]= block[1]>> 8 & 0xff ;
391         dest[7]= block[1]     & 0xff ;
392 }
393
394 /* make_bfkey() takes the address of the key data as a char*,
395    and the length of the key in bytes.  It generates and returns
396    a pointer to an object of BFkey_type, which can be passed
397    to the crypt functions.  It does some simple testing of the
398    init data and crypt routine, and returns 0 on error.
399 */
400 static void make_bfkey(unsigned char *key_string, int keylength, 
401                        BFkey_type *bfkey)
402 {
403         int       i, j, k ;
404         IntU32      dspace[2],
405                 checksum=0 ;
406
407         /* Copy constant initial data to P vector */
408         for( i=0 ; i<NROUNDS+2 ; ++i )
409         {
410                 bfkey->p[0][i] = p_init[i] ;
411                 bfkey->p[1][NROUNDS+1-i] = p_init[i] ;
412                 checksum = (checksum<<1 | checksum>>31)+p_init[i] ;
413         }
414
415         /* Copy constant initial data to sboxes */
416         for( i=0 ; i<4 ; ++i )
417                 for( j=0 ; j<256 ; ++j )
418                 {
419                         bfkey->sbox[i][j] = s_init[i][j] ;
420                         checksum = ((checksum*13)<<11 | (checksum*13)>>21)
421                                 + s_init[i][j] ;         
422                 }
423
424         /* Test init data. */
425         if( checksum != 0x55861a61 )
426         {
427                 PyErr_SetString(PyExc_SystemError,
428                                 "Blowfish: Bad initialization data");
429                 return;
430         }
431
432         dspace[0] = 0 ;
433         dspace[1] = 0 ;
434
435         /* Test the crypt_block() routine. */
436         for( i=0 ; i<10 ; ++i )
437                 crypt_block( dspace, bfkey, 0 ) ;
438         checksum = dspace[0] ;
439         for( i=0 ; i<10 ; ++i )
440                 crypt_block( dspace, bfkey, 1 ) ;
441         if( (checksum!=0xaafe4ebd) || dspace[0] || dspace[1] )
442         {
443                 PyErr_SetString(PyExc_SystemError,
444                                 "Blowfish: Error in crypt_block routine");
445                 return;
446         }
447
448    
449         /* Xor key string into encryption key vector */
450         j = 0 ;
451         for (i=0 ; i<NROUNDS+2 ; ++i) 
452         {
453                 IntU32 data;
454                 data = 0 ;
455                 for (k=0 ; k<4 ; ++k ) 
456                         data = (data << 8) | key_string[j++ % keylength];
457                 (bfkey->p)[0][i] ^= data; 
458         }
459
460
461         for (i = 0 ; i<NROUNDS+2 ; i+=2) 
462         {
463                 crypt_block( dspace, bfkey, 0 ) ;
464                 bfkey->p[0][i] = dspace[0] ;
465                 bfkey->p[1][NROUNDS+1-i] = dspace[0] ;
466                 bfkey->p[0][i+1] = dspace[1] ;
467                 bfkey->p[1][NROUNDS-i] = dspace[1] ;
468         }
469    
470         for ( i=0 ; i<4 ; ++i )
471                 for ( j=0 ; j<256 ; j+=2 ) 
472                 {
473                         crypt_block( dspace, bfkey, 0 ) ;
474                         bfkey->sbox[i][j] = dspace[0] ;
475                         bfkey->sbox[i][j+1] = dspace[1] ;
476                 }
477 }
478
479
480 static void
481 block_encrypt(block_state *self, unsigned char *in, unsigned char *out)
482 {
483         crypt_8bytes(in, out, &(self->bfkey), 0);
484 }
485
486
487 static void
488 block_decrypt(block_state *self, unsigned char *in, unsigned char *out)
489 {
490         crypt_8bytes(in, out, &(self->bfkey), 1);
491 }
492
493 static void 
494 block_init(block_state *self, unsigned char *key, int keylength)
495 {
496         make_bfkey(key, keylength, &(self->bfkey));
497 }
498
499 #include "block_template.c"