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