OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [crypto/] [blowfish.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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
 */
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
 
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
 
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
 */
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
 
468
static int __init init(void)
469
{
470
        return crypto_register_alg(&alg);
471
}
472
 
473
static void __exit fini(void)
474
{
475
        crypto_unregister_alg(&alg);
476
}
477
 
478
module_init(init);
479
module_exit(fini);
480
 
481
MODULE_LICENSE("GPL");
482
MODULE_DESCRIPTION("Blowfish Cipher Algorithm");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.