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
30struct bf_ctx {
31	u32 p[18];
32	u32 s[1024];
33};
34
35static 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
43static 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 */
320static 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
351static 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
364static 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 */
401static 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
452static 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
468static int __init blowfish_mod_init(void)
469{
470	return crypto_register_alg(&alg);
471}
472
473static void __exit blowfish_mod_fini(void)
474{
475	crypto_unregister_alg(&alg);
476}
477
478module_init(blowfish_mod_init);
479module_exit(blowfish_mod_fini);
480
481MODULE_LICENSE("GPL");
482MODULE_DESCRIPTION("Blowfish Cipher Algorithm");
483