Root/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
30static 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
38static 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 */
315static 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 */
349int 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}
399EXPORT_SYMBOL_GPL(blowfish_setkey);
400
401MODULE_LICENSE("GPL");
402MODULE_DESCRIPTION("Blowfish Cipher common functions");
403

Archive Download this file



interactive