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