]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - crypto/blowfish.c
fcrypt endianness misannotations
[karo-tx-linux.git] / crypto / blowfish.c
1 /* 
2  * Cryptographic API.
3  *
4  * Blowfish Cipher Algorithm, by Bruce Schneier.
5  * http://www.counterpane.com/blowfish.html
6  *
7  * Adapted from Kerneli implementation.
8  *
9  * Copyright (c) Herbert Valerio Riedel <hvr@hvrlab.org>
10  * Copyright (c) Kyle McMartin <kyle@debian.org>
11  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  */
19 #include <linux/init.h>
20 #include <linux/module.h>
21 #include <linux/mm.h>
22 #include <asm/byteorder.h>
23 #include <linux/crypto.h>
24 #include <linux/types.h>
25
26 #define BF_BLOCK_SIZE 8
27 #define BF_MIN_KEY_SIZE 4
28 #define BF_MAX_KEY_SIZE 56
29
30 struct bf_ctx {
31         u32 p[18];
32         u32 s[1024];
33 };
34
35 static const u32 bf_pbox[16 + 2] = {
36         0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
37         0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
38         0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
39         0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
40         0x9216d5d9, 0x8979fb1b,
41 };
42
43 static const u32 bf_sbox[256 * 4] = {
44         0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
45         0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
46         0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
47         0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
48         0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
49         0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
50         0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
51         0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
52         0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
53         0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
54         0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
55         0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
56         0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
57         0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
58         0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
59         0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
60         0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
61         0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
62         0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
63         0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
64         0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
65         0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
66         0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
67         0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
68         0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
69         0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
70         0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
71         0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
72         0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
73         0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
74         0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
75         0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
76         0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
77         0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
78         0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
79         0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
80         0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
81         0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
82         0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
83         0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
84         0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
85         0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
86         0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
87         0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
88         0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
89         0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
90         0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
91         0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
92         0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
93         0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
94         0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
95         0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
96         0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
97         0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
98         0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
99         0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
100         0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
101         0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
102         0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
103         0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
104         0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
105         0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
106         0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
107         0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
108         0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
109         0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
110         0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
111         0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
112         0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
113         0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
114         0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
115         0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
116         0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
117         0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
118         0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
119         0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
120         0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
121         0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
122         0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
123         0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
124         0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
125         0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
126         0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
127         0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
128         0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
129         0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
130         0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
131         0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
132         0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
133         0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
134         0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
135         0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
136         0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
137         0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
138         0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
139         0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
140         0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
141         0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
142         0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
143         0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
144         0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
145         0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
146         0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
147         0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
148         0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
149         0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
150         0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
151         0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
152         0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
153         0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
154         0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
155         0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
156         0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
157         0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
158         0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
159         0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
160         0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
161         0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
162         0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
163         0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
164         0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
165         0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
166         0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
167         0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
168         0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
169         0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
170         0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
171         0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
172         0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
173         0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
174         0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
175         0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
176         0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
177         0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
178         0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
179         0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
180         0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
181         0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
182         0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
183         0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
184         0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
185         0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
186         0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
187         0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
188         0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
189         0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
190         0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
191         0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
192         0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
193         0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
194         0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
195         0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
196         0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
197         0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
198         0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
199         0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
200         0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
201         0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
202         0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
203         0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
204         0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
205         0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
206         0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
207         0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
208         0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
209         0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
210         0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
211         0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
212         0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
213         0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
214         0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
215         0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
216         0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
217         0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
218         0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
219         0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
220         0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
221         0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
222         0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
223         0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
224         0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
225         0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
226         0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
227         0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
228         0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
229         0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
230         0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
231         0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
232         0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
233         0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
234         0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
235         0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
236         0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
237         0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
238         0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
239         0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
240         0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
241         0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
242         0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
243         0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
244         0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
245         0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
246         0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
247         0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
248         0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
249         0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
250         0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
251         0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
252         0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
253         0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
254         0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
255         0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
256         0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
257         0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
258         0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
259         0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
260         0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
261         0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
262         0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
263         0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
264         0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
265         0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
266         0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
267         0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
268         0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
269         0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
270         0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
271         0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
272         0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
273         0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
274         0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
275         0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
276         0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
277         0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
278         0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
279         0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
280         0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
281         0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
282         0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
283         0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
284         0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
285         0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
286         0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
287         0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
288         0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
289         0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
290         0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
291         0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
292         0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
293         0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
294         0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
295         0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
296         0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
297         0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
298         0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
299         0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
300 };
301
302 /* 
303  * Round loop unrolling macros, S is a pointer to a S-Box array
304  * organized in 4 unsigned longs at a row.
305  */
306 #define GET32_3(x) (((x) & 0xff))
307 #define GET32_2(x) (((x) >> (8)) & (0xff))
308 #define GET32_1(x) (((x) >> (16)) & (0xff))
309 #define GET32_0(x) (((x) >> (24)) & (0xff))
310
311 #define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
312           S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
313
314 #define ROUND(a, b, n)  b ^= P[n]; a ^= bf_F (b)
315
316 /*
317  * The blowfish encipher, processes 64-bit blocks.
318  * NOTE: This function MUSTN'T respect endianess 
319  */
320 static void encrypt_block(struct bf_ctx *bctx, u32 *dst, u32 *src)
321 {
322         const u32 *P = bctx->p;
323         const u32 *S = bctx->s;
324         u32 yl = src[0];
325         u32 yr = src[1];
326
327         ROUND(yr, yl, 0);
328         ROUND(yl, yr, 1);
329         ROUND(yr, yl, 2);
330         ROUND(yl, yr, 3);
331         ROUND(yr, yl, 4);
332         ROUND(yl, yr, 5);
333         ROUND(yr, yl, 6);
334         ROUND(yl, yr, 7);
335         ROUND(yr, yl, 8);
336         ROUND(yl, yr, 9);
337         ROUND(yr, yl, 10);
338         ROUND(yl, yr, 11);
339         ROUND(yr, yl, 12);
340         ROUND(yl, yr, 13);
341         ROUND(yr, yl, 14);
342         ROUND(yl, yr, 15);
343
344         yl ^= P[16];
345         yr ^= P[17];
346
347         dst[0] = yr;
348         dst[1] = yl;
349 }
350
351 static void bf_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
352 {
353         const __be32 *in_blk = (const __be32 *)src;
354         __be32 *const out_blk = (__be32 *)dst;
355         u32 in32[2], out32[2];
356
357         in32[0] = be32_to_cpu(in_blk[0]);
358         in32[1] = be32_to_cpu(in_blk[1]);
359         encrypt_block(crypto_tfm_ctx(tfm), out32, in32);
360         out_blk[0] = cpu_to_be32(out32[0]);
361         out_blk[1] = cpu_to_be32(out32[1]);
362 }
363
364 static void bf_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
365 {
366         struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
367         const __be32 *in_blk = (const __be32 *)src;
368         __be32 *const out_blk = (__be32 *)dst;
369         const u32 *P = ctx->p;
370         const u32 *S = ctx->s;
371         u32 yl = be32_to_cpu(in_blk[0]);
372         u32 yr = be32_to_cpu(in_blk[1]);
373
374         ROUND(yr, yl, 17);
375         ROUND(yl, yr, 16);
376         ROUND(yr, yl, 15);
377         ROUND(yl, yr, 14);
378         ROUND(yr, yl, 13);
379         ROUND(yl, yr, 12);
380         ROUND(yr, yl, 11);
381         ROUND(yl, yr, 10);
382         ROUND(yr, yl, 9);
383         ROUND(yl, yr, 8);
384         ROUND(yr, yl, 7);
385         ROUND(yl, yr, 6);
386         ROUND(yr, yl, 5);
387         ROUND(yl, yr, 4);
388         ROUND(yr, yl, 3);
389         ROUND(yl, yr, 2);
390
391         yl ^= P[1];
392         yr ^= P[0];
393
394         out_blk[0] = cpu_to_be32(yr);
395         out_blk[1] = cpu_to_be32(yl);
396 }
397
398 /* 
399  * Calculates the blowfish S and P boxes for encryption and decryption.
400  */
401 static int bf_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
402 {
403         struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
404         u32 *P = ctx->p;
405         u32 *S = ctx->s;
406         short i, j, count;
407         u32 data[2], temp;
408
409         /* Copy the initialization s-boxes */
410         for (i = 0, count = 0; i < 256; i++)
411                 for (j = 0; j < 4; j++, count++)
412                         S[count] = bf_sbox[count];
413
414         /* Set the p-boxes */
415         for (i = 0; i < 16 + 2; i++)
416                 P[i] = bf_pbox[i];
417
418         /* Actual subkey generation */
419         for (j = 0, i = 0; i < 16 + 2; i++) {
420                 temp = (((u32 )key[j] << 24) |
421                         ((u32 )key[(j + 1) % keylen] << 16) |
422                         ((u32 )key[(j + 2) % keylen] << 8) |
423                         ((u32 )key[(j + 3) % keylen]));
424
425                 P[i] = P[i] ^ temp;
426                 j = (j + 4) % keylen;
427         }
428
429         data[0] = 0x00000000;
430         data[1] = 0x00000000;
431
432         for (i = 0; i < 16 + 2; i += 2) {
433                 encrypt_block((struct bf_ctx *)ctx, data, data);
434
435                 P[i] = data[0];
436                 P[i + 1] = data[1];
437         }
438
439         for (i = 0; i < 4; i++) {
440                 for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
441                         encrypt_block((struct bf_ctx *)ctx, data, data);
442
443                         S[count] = data[0];
444                         S[count + 1] = data[1];
445                 }
446         }
447         
448         /* Bruce says not to bother with the weak key check. */
449         return 0;
450 }
451
452 static struct crypto_alg alg = {
453         .cra_name               =       "blowfish",
454         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
455         .cra_blocksize          =       BF_BLOCK_SIZE,
456         .cra_ctxsize            =       sizeof(struct bf_ctx),
457         .cra_alignmask          =       3,
458         .cra_module             =       THIS_MODULE,
459         .cra_list               =       LIST_HEAD_INIT(alg.cra_list),
460         .cra_u                  =       { .cipher = {
461         .cia_min_keysize        =       BF_MIN_KEY_SIZE,
462         .cia_max_keysize        =       BF_MAX_KEY_SIZE,
463         .cia_setkey             =       bf_setkey,
464         .cia_encrypt            =       bf_encrypt,
465         .cia_decrypt            =       bf_decrypt } }
466 };
467
468 static int __init init(void)
469 {
470         return crypto_register_alg(&alg);
471 }
472
473 static void __exit fini(void)
474 {
475         crypto_unregister_alg(&alg);
476 }
477
478 module_init(init);
479 module_exit(fini);
480
481 MODULE_LICENSE("GPL");
482 MODULE_DESCRIPTION("Blowfish Cipher Algorithm");