Merge tag 'drm-next-2023-05-05' of git://anongit.freedesktop.org/drm/drm
[platform/kernel/linux-starfive.git] / crypto / blowfish_common.c
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
26 static 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
34 static 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  */
311 static 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  */
345 int 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 }
395 EXPORT_SYMBOL_GPL(blowfish_setkey);
396
397 MODULE_LICENSE("GPL");
398 MODULE_DESCRIPTION("Blowfish Cipher common functions");