Merge branches 'acpica', 'acpi-tpm' and 'acpi-processor'
[platform/kernel/linux-arm64.git] / crypto / blowfish_common.c
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
30 static 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
38 static 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  */
315 static 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  */
349 int 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 }
399 EXPORT_SYMBOL_GPL(blowfish_setkey);
400
401 MODULE_LICENSE("GPL");
402 MODULE_DESCRIPTION("Blowfish Cipher common functions");