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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [crypto/] [seed.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
 * SEED Cipher Algorithm.
5
 *
6
 * This program is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * Documentation of SEED can be found in RFC 4269.
12
 * Copyright (C) 2007 Korea Information Security Agency (KISA).
13
 */
14
 
15
#include <linux/module.h>
16
#include <linux/init.h>
17
#include <linux/types.h>
18
#include <linux/errno.h>
19
#include <linux/crypto.h>
20
#include <asm/byteorder.h>
21
 
22
#define SEED_NUM_KCONSTANTS     16
23
#define SEED_KEY_SIZE           16
24
#define SEED_BLOCK_SIZE         16
25
#define SEED_KEYSCHED_LEN       32
26
 
27
/*
28
 * #define byte(x, nr) ((unsigned char)((x) >> (nr*8)))
29
 */
30
static inline u8
31
byte(const u32 x, const unsigned n)
32
{
33
        return x >> (n << 3);
34
}
35
 
36
struct seed_ctx {
37
        u32 keysched[SEED_KEYSCHED_LEN];
38
};
39
 
40
static const u32 SS0[256] = {
41
        0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0,
42
        0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124,
43
        0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c,
44
        0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360,
45
        0x28082028, 0x04444044, 0x20002020, 0x1d8d919c,
46
        0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314,
47
        0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378,
48
        0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec,
49
        0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8,
50
        0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074,
51
        0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354,
52
        0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100,
53
        0x24042024, 0x1c0c101c, 0x33437370, 0x18889098,
54
        0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8,
55
        0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380,
56
        0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8,
57
        0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8,
58
        0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c,
59
        0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078,
60
        0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4,
61
        0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140,
62
        0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008,
63
        0x1f0f131c, 0x19899198, 0x00000000, 0x19091118,
64
        0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0,
65
        0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324,
66
        0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8,
67
        0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c,
68
        0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208,
69
        0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4,
70
        0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064,
71
        0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218,
72
        0x06060204, 0x21012120, 0x2b4b6368, 0x26466264,
73
        0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288,
74
        0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0,
75
        0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4,
76
        0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc,
77
        0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac,
78
        0x36063234, 0x15051114, 0x22022220, 0x38083038,
79
        0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c,
80
        0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394,
81
        0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c,
82
        0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188,
83
        0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8,
84
        0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4,
85
        0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364,
86
        0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8,
87
        0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320,
88
        0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4,
89
        0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0,
90
        0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040,
91
        0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0,
92
        0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154,
93
        0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c,
94
        0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254,
95
        0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244,
96
        0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8,
97
        0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c,
98
        0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0,
99
        0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c,
100
        0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088,
101
        0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4,
102
        0x22426260, 0x29092128, 0x07070304, 0x33033330,
103
        0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178,
104
        0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298,
105
};
106
 
107
static const u32 SS1[256] = {
108
        0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2,
109
        0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0,
110
        0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3,
111
        0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53,
112
        0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1,
113
        0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3,
114
        0xd013c3d3, 0x90118191, 0x10110111, 0x04060602,
115
        0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43,
116
        0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0,
117
        0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0,
118
        0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2,
119
        0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890,
120
        0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32,
121
        0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3,
122
        0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72,
123
        0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272,
124
        0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0,
125
        0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83,
126
        0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13,
127
        0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430,
128
        0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1,
129
        0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0,
130
        0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1,
131
        0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1,
132
        0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131,
133
        0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1,
134
        0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202,
135
        0x20220222, 0x04040400, 0x68284860, 0x70314171,
136
        0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991,
137
        0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951,
138
        0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0,
139
        0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0,
140
        0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12,
141
        0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3,
142
        0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2,
143
        0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41,
144
        0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32,
145
        0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62,
146
        0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292,
147
        0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0,
148
        0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571,
149
        0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303,
150
        0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470,
151
        0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901,
152
        0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040,
153
        0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501,
154
        0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22,
155
        0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343,
156
        0x84058581, 0x14140410, 0x88098981, 0x981b8b93,
157
        0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971,
158
        0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282,
159
        0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53,
160
        0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11,
161
        0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642,
162
        0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3,
163
        0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1,
164
        0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30,
165
        0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70,
166
        0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622,
167
        0x30320232, 0x84048480, 0x68294961, 0x90138393,
168
        0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0,
169
        0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783,
170
        0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83,
171
        0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3,
172
};
173
 
174
static const u32 SS2[256] = {
175
        0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3,
176
        0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505,
177
        0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e,
178
        0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343,
179
        0x20282808, 0x40440444, 0x20202000, 0x919c1d8d,
180
        0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707,
181
        0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b,
182
        0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece,
183
        0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888,
184
        0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444,
185
        0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747,
186
        0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101,
187
        0x20242404, 0x101c1c0c, 0x73703343, 0x90981888,
188
        0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9,
189
        0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383,
190
        0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9,
191
        0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb,
192
        0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f,
193
        0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848,
194
        0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5,
195
        0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141,
196
        0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808,
197
        0x131c1f0f, 0x91981989, 0x00000000, 0x11181909,
198
        0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1,
199
        0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707,
200
        0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b,
201
        0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d,
202
        0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a,
203
        0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5,
204
        0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444,
205
        0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a,
206
        0x02040606, 0x21202101, 0x63682b4b, 0x62642646,
207
        0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a,
208
        0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0,
209
        0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5,
210
        0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf,
211
        0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e,
212
        0x32343606, 0x11141505, 0x22202202, 0x30383808,
213
        0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c,
214
        0x81800181, 0xe1e829c9, 0x80840484, 0x93941787,
215
        0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c,
216
        0x71703141, 0x11101101, 0xc3c407c7, 0x81880989,
217
        0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8,
218
        0x90941484, 0x51581949, 0x82800282, 0xc0c404c4,
219
        0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747,
220
        0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888,
221
        0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303,
222
        0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484,
223
        0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2,
224
        0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040,
225
        0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1,
226
        0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545,
227
        0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f,
228
        0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646,
229
        0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646,
230
        0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca,
231
        0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f,
232
        0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282,
233
        0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f,
234
        0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888,
235
        0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4,
236
        0x62602242, 0x21282909, 0x03040707, 0x33303303,
237
        0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949,
238
        0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a,
239
};
240
 
241
static const u32 SS3[256] = {
242
        0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426,
243
        0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
244
        0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407,
245
        0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
246
        0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435,
247
        0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
248
        0xc3d3d013, 0x81919011, 0x01111011, 0x06020406,
249
        0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
250
        0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828,
251
        0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
252
        0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416,
253
        0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
254
        0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e,
255
        0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
256
        0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a,
257
        0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
258
        0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000,
259
        0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
260
        0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f,
261
        0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
262
        0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829,
263
        0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
264
        0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405,
265
        0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
266
        0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031,
267
        0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
268
        0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002,
269
        0x02222022, 0x04000404, 0x48606828, 0x41717031,
270
        0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819,
271
        0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
272
        0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c,
273
        0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
274
        0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a,
275
        0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
276
        0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022,
277
        0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
278
        0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a,
279
        0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
280
        0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012,
281
        0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
282
        0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435,
283
        0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
284
        0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434,
285
        0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
286
        0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000,
287
        0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
288
        0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a,
289
        0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
290
        0x85818405, 0x04101414, 0x89818809, 0x8b93981b,
291
        0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
292
        0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002,
293
        0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
294
        0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d,
295
        0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
296
        0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b,
297
        0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
298
        0x00303030, 0x85919415, 0x45616425, 0x0c303c3c,
299
        0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
300
        0x0e020c0e, 0x40505010, 0x09313839, 0x06222426,
301
        0x02323032, 0x84808404, 0x49616829, 0x83939013,
302
        0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424,
303
        0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
304
        0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f,
305
        0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437,
306
};
307
 
308
static const u32 KC[SEED_NUM_KCONSTANTS] = {
309
        0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc,
310
        0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf,
311
        0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1,
312
        0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b,
313
};
314
 
315
#define OP(X1, X2, X3, X4, rbase)                       \
316
        t0 = X3 ^ ks[rbase];                            \
317
        t1 = X4 ^ ks[rbase+1];                          \
318
        t1 ^= t0;                                       \
319
        t1 = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^       \
320
                SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)];    \
321
        t0 += t1;                                       \
322
        t0 = SS0[byte(t0, 0)] ^ SS1[byte(t0, 1)] ^       \
323
                SS2[byte(t0, 2)] ^ SS3[byte(t0, 3)];    \
324
        t1 += t0;                                       \
325
        t1 = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^       \
326
                SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)];    \
327
        t0 += t1;                                       \
328
        X1 ^= t0;                                       \
329
        X2 ^= t1;
330
 
331
static int seed_set_key(struct crypto_tfm *tfm, const u8 *in_key,
332
                        unsigned int key_len)
333
{
334
        struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
335
        u32 *keyout = ctx->keysched;
336
        const __be32 *key = (const __be32 *)in_key;
337
        u32 i, t0, t1, x1, x2, x3, x4;
338
 
339
        x1 = be32_to_cpu(key[0]);
340
        x2 = be32_to_cpu(key[1]);
341
        x3 = be32_to_cpu(key[2]);
342
        x4 = be32_to_cpu(key[3]);
343
 
344
        for (i = 0; i < SEED_NUM_KCONSTANTS; i++) {
345
                t0 = x1 + x3 - KC[i];
346
                t1 = x2 + KC[i] - x4;
347
                *(keyout++) = SS0[byte(t0, 0)] ^ SS1[byte(t0, 1)] ^
348
                                SS2[byte(t0, 2)] ^ SS3[byte(t0, 3)];
349
                *(keyout++) = SS0[byte(t1, 0)] ^ SS1[byte(t1, 1)] ^
350
                                SS2[byte(t1, 2)] ^ SS3[byte(t1, 3)];
351
 
352
                if (i % 2 == 0) {
353
                        t0 = x1;
354
                        x1 = (x1 >> 8) ^ (x2 << 24);
355
                        x2 = (x2 >> 8) ^ (t0 << 24);
356
                } else {
357
                        t0 = x3;
358
                        x3 = (x3 << 8) ^ (x4 >> 24);
359
                        x4 = (x4 << 8) ^ (t0 >> 24);
360
                }
361
        }
362
 
363
        return 0;
364
}
365
 
366
/* encrypt a block of text */
367
 
368
static void seed_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
369
{
370
        const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
371
        const __be32 *src = (const __be32 *)in;
372
        __be32 *dst = (__be32 *)out;
373
        u32 x1, x2, x3, x4, t0, t1;
374
        const u32 *ks = ctx->keysched;
375
 
376
        x1 = be32_to_cpu(src[0]);
377
        x2 = be32_to_cpu(src[1]);
378
        x3 = be32_to_cpu(src[2]);
379
        x4 = be32_to_cpu(src[3]);
380
 
381
        OP(x1, x2, x3, x4, 0);
382
        OP(x3, x4, x1, x2, 2);
383
        OP(x1, x2, x3, x4, 4);
384
        OP(x3, x4, x1, x2, 6);
385
        OP(x1, x2, x3, x4, 8);
386
        OP(x3, x4, x1, x2, 10);
387
        OP(x1, x2, x3, x4, 12);
388
        OP(x3, x4, x1, x2, 14);
389
        OP(x1, x2, x3, x4, 16);
390
        OP(x3, x4, x1, x2, 18);
391
        OP(x1, x2, x3, x4, 20);
392
        OP(x3, x4, x1, x2, 22);
393
        OP(x1, x2, x3, x4, 24);
394
        OP(x3, x4, x1, x2, 26);
395
        OP(x1, x2, x3, x4, 28);
396
        OP(x3, x4, x1, x2, 30);
397
 
398
        dst[0] = cpu_to_be32(x3);
399
        dst[1] = cpu_to_be32(x4);
400
        dst[2] = cpu_to_be32(x1);
401
        dst[3] = cpu_to_be32(x2);
402
}
403
 
404
/* decrypt a block of text */
405
 
406
static void seed_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
407
{
408
        const struct seed_ctx *ctx = crypto_tfm_ctx(tfm);
409
        const __be32 *src = (const __be32 *)in;
410
        __be32 *dst = (__be32 *)out;
411
        u32 x1, x2, x3, x4, t0, t1;
412
        const u32 *ks = ctx->keysched;
413
 
414
        x1 = be32_to_cpu(src[0]);
415
        x2 = be32_to_cpu(src[1]);
416
        x3 = be32_to_cpu(src[2]);
417
        x4 = be32_to_cpu(src[3]);
418
 
419
        OP(x1, x2, x3, x4, 30);
420
        OP(x3, x4, x1, x2, 28);
421
        OP(x1, x2, x3, x4, 26);
422
        OP(x3, x4, x1, x2, 24);
423
        OP(x1, x2, x3, x4, 22);
424
        OP(x3, x4, x1, x2, 20);
425
        OP(x1, x2, x3, x4, 18);
426
        OP(x3, x4, x1, x2, 16);
427
        OP(x1, x2, x3, x4, 14);
428
        OP(x3, x4, x1, x2, 12);
429
        OP(x1, x2, x3, x4, 10);
430
        OP(x3, x4, x1, x2, 8);
431
        OP(x1, x2, x3, x4, 6);
432
        OP(x3, x4, x1, x2, 4);
433
        OP(x1, x2, x3, x4, 2);
434
        OP(x3, x4, x1, x2, 0);
435
 
436
        dst[0] = cpu_to_be32(x3);
437
        dst[1] = cpu_to_be32(x4);
438
        dst[2] = cpu_to_be32(x1);
439
        dst[3] = cpu_to_be32(x2);
440
}
441
 
442
 
443
static struct crypto_alg seed_alg = {
444
        .cra_name               =       "seed",
445
        .cra_driver_name        =       "seed-generic",
446
        .cra_priority           =       100,
447
        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
448
        .cra_blocksize          =       SEED_BLOCK_SIZE,
449
        .cra_ctxsize            =       sizeof(struct seed_ctx),
450
        .cra_alignmask          =       3,
451
        .cra_module             =       THIS_MODULE,
452
        .cra_list               =       LIST_HEAD_INIT(seed_alg.cra_list),
453
        .cra_u                  =       {
454
                .cipher = {
455
                        .cia_min_keysize        =       SEED_KEY_SIZE,
456
                        .cia_max_keysize        =       SEED_KEY_SIZE,
457
                        .cia_setkey             =       seed_set_key,
458
                        .cia_encrypt            =       seed_encrypt,
459
                        .cia_decrypt            =       seed_decrypt
460
                }
461
        }
462
};
463
 
464
static int __init seed_init(void)
465
{
466
        return crypto_register_alg(&seed_alg);
467
}
468
 
469
static void __exit seed_fini(void)
470
{
471
        crypto_unregister_alg(&seed_alg);
472
}
473
 
474
module_init(seed_init);
475
module_exit(seed_fini);
476
 
477
MODULE_DESCRIPTION("SEED Cipher Algorithm");
478
MODULE_LICENSE("GPL");
479
MODULE_AUTHOR("Hye-Shik Chang <perky@FreeBSD.org>, Kim Hyun <hkim@kisa.or.kr>");

powered by: WebSVN 2.1.0

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