Root/crypto/blowfish.c

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
30struct bf_ctx {
31    u32 p[18];
32    u32 s[1024];
33};
34
35static 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
43static 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 */
320static 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
351static 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
364static 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 */
401static 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
452static 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
468static int __init blowfish_mod_init(void)
469{
470    return crypto_register_alg(&alg);
471}
472
473static void __exit blowfish_mod_fini(void)
474{
475    crypto_unregister_alg(&alg);
476}
477
478module_init(blowfish_mod_init);
479module_exit(blowfish_mod_fini);
480
481MODULE_LICENSE("GPL");
482MODULE_DESCRIPTION("Blowfish Cipher Algorithm");
483

Archive Download this file



interactive