• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
30 struct bf_ctx {
31 	u32 p[18];
32 	u32 s[1024];
33 };
34 
35 static 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 
43 static 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  */
encrypt_block(struct bf_ctx * bctx,u32 * dst,u32 * src)320 static 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 
bf_encrypt(struct crypto_tfm * tfm,u8 * dst,const u8 * src)351 static 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 
bf_decrypt(struct crypto_tfm * tfm,u8 * dst,const u8 * src)364 static 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  */
bf_setkey(struct crypto_tfm * tfm,const u8 * key,unsigned int keylen)401 static 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 
452 static 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 
blowfish_mod_init(void)468 static int __init blowfish_mod_init(void)
469 {
470 	return crypto_register_alg(&alg);
471 }
472 
blowfish_mod_fini(void)473 static void __exit blowfish_mod_fini(void)
474 {
475 	crypto_unregister_alg(&alg);
476 }
477 
478 module_init(blowfish_mod_init);
479 module_exit(blowfish_mod_fini);
480 
481 MODULE_LICENSE("GPL");
482 MODULE_DESCRIPTION("Blowfish Cipher Algorithm");
483