874d7b3f687431d78b552b51ef4bdd0f6b476e93
[openssl.git] / crypto / seed / seed.c
1 /*
2  * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Neither the name of author nor the names of its contributors may
10  *    be used to endorse or promote products derived from this software
11  *    without specific prior written permission.
12  *
13  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  */
26 #ifndef OPENSSL_NO_SEED
27
28 # include <stdio.h>
29 # include <stdlib.h>
30 # include <string.h>
31 # ifdef WIN32
32 #  include <memory.h>
33 # endif
34
35 # include <openssl/seed.h>
36 # include "seed_locl.h"
37
38 # ifdef SS                      /* can get defined on Solaris by inclusion of
39                                  * <stdlib.h> */
40 #  undef SS
41 # endif
42
43 static const seed_word SS[4][256] = { {
44                                        0x2989a1a8, 0x05858184, 0x16c6d2d4,
45                                        0x13c3d3d0, 0x14445054, 0x1d0d111c,
46                                        0x2c8ca0ac, 0x25052124,
47                                        0x1d4d515c, 0x03434340, 0x18081018,
48                                        0x1e0e121c, 0x11415150, 0x3cccf0fc,
49                                        0x0acac2c8, 0x23436360,
50                                        0x28082028, 0x04444044, 0x20002020,
51                                        0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0,
52                                        0x08c8c0c8, 0x17071314,
53                                        0x2585a1a4, 0x0f8f838c, 0x03030300,
54                                        0x3b4b7378, 0x3b8bb3b8, 0x13031310,
55                                        0x12c2d2d0, 0x2ecee2ec,
56                                        0x30407070, 0x0c8c808c, 0x3f0f333c,
57                                        0x2888a0a8, 0x32023230, 0x1dcdd1dc,
58                                        0x36c6f2f4, 0x34447074,
59                                        0x2ccce0ec, 0x15859194, 0x0b0b0308,
60                                        0x17475354, 0x1c4c505c, 0x1b4b5358,
61                                        0x3d8db1bc, 0x01010100,
62                                        0x24042024, 0x1c0c101c, 0x33437370,
63                                        0x18889098, 0x10001010, 0x0cccc0cc,
64                                        0x32c2f2f0, 0x19c9d1d8,
65                                        0x2c0c202c, 0x27c7e3e4, 0x32427270,
66                                        0x03838380, 0x1b8b9398, 0x11c1d1d0,
67                                        0x06868284, 0x09c9c1c8,
68                                        0x20406060, 0x10405050, 0x2383a3a0,
69                                        0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4,
70                                        0x1e8e929c, 0x0f4f434c,
71                                        0x3787b3b4, 0x1a4a5258, 0x06c6c2c4,
72                                        0x38487078, 0x2686a2a4, 0x12021210,
73                                        0x2f8fa3ac, 0x15c5d1d4,
74                                        0x21416160, 0x03c3c3c0, 0x3484b0b4,
75                                        0x01414140, 0x12425250, 0x3d4d717c,
76                                        0x0d8d818c, 0x08080008,
77                                        0x1f0f131c, 0x19899198, 0x00000000,
78                                        0x19091118, 0x04040004, 0x13435350,
79                                        0x37c7f3f4, 0x21c1e1e0,
80                                        0x3dcdf1fc, 0x36467274, 0x2f0f232c,
81                                        0x27072324, 0x3080b0b0, 0x0b8b8388,
82                                        0x0e0e020c, 0x2b8ba3a8,
83                                        0x2282a2a0, 0x2e4e626c, 0x13839390,
84                                        0x0d4d414c, 0x29496168, 0x3c4c707c,
85                                        0x09090108, 0x0a0a0208,
86                                        0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0,
87                                        0x05c5c1c4, 0x07878384, 0x14041014,
88                                        0x3ecef2fc, 0x24446064,
89                                        0x1eced2dc, 0x2e0e222c, 0x0b4b4348,
90                                        0x1a0a1218, 0x06060204, 0x21012120,
91                                        0x2b4b6368, 0x26466264,
92                                        0x02020200, 0x35c5f1f4, 0x12829290,
93                                        0x0a8a8288, 0x0c0c000c, 0x3383b3b0,
94                                        0x3e4e727c, 0x10c0d0d0,
95                                        0x3a4a7278, 0x07474344, 0x16869294,
96                                        0x25c5e1e4, 0x26062224, 0x00808080,
97                                        0x2d8da1ac, 0x1fcfd3dc,
98                                        0x2181a1a0, 0x30003030, 0x37073334,
99                                        0x2e8ea2ac, 0x36063234, 0x15051114,
100                                        0x22022220, 0x38083038,
101                                        0x34c4f0f4, 0x2787a3a4, 0x05454144,
102                                        0x0c4c404c, 0x01818180, 0x29c9e1e8,
103                                        0x04848084, 0x17879394,
104                                        0x35053134, 0x0bcbc3c8, 0x0ecec2cc,
105                                        0x3c0c303c, 0x31417170, 0x11011110,
106                                        0x07c7c3c4, 0x09898188,
107                                        0x35457174, 0x3bcbf3f8, 0x1acad2d8,
108                                        0x38c8f0f8, 0x14849094, 0x19495158,
109                                        0x02828280, 0x04c4c0c4,
110                                        0x3fcff3fc, 0x09494148, 0x39093138,
111                                        0x27476364, 0x00c0c0c0, 0x0fcfc3cc,
112                                        0x17c7d3d4, 0x3888b0b8,
113                                        0x0f0f030c, 0x0e8e828c, 0x02424240,
114                                        0x23032320, 0x11819190, 0x2c4c606c,
115                                        0x1bcbd3d8, 0x2484a0a4,
116                                        0x34043034, 0x31c1f1f0, 0x08484048,
117                                        0x02c2c2c0, 0x2f4f636c, 0x3d0d313c,
118                                        0x2d0d212c, 0x00404040,
119                                        0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc,
120                                        0x01c1c1c0, 0x2a8aa2a8, 0x3a8ab2b8,
121                                        0x0e4e424c, 0x15455154,
122                                        0x3b0b3338, 0x1cccd0dc, 0x28486068,
123                                        0x3f4f737c, 0x1c8c909c, 0x18c8d0d8,
124                                        0x0a4a4248, 0x16465254,
125                                        0x37477374, 0x2080a0a0, 0x2dcde1ec,
126                                        0x06464244, 0x3585b1b4, 0x2b0b2328,
127                                        0x25456164, 0x3acaf2f8,
128                                        0x23c3e3e0, 0x3989b1b8, 0x3181b1b0,
129                                        0x1f8f939c, 0x1e4e525c, 0x39c9f1f8,
130                                        0x26c6e2e4, 0x3282b2b0,
131                                        0x31013130, 0x2acae2e8, 0x2d4d616c,
132                                        0x1f4f535c, 0x24c4e0e4, 0x30c0f0f0,
133                                        0x0dcdc1cc, 0x08888088,
134                                        0x16061214, 0x3a0a3238, 0x18485058,
135                                        0x14c4d0d4, 0x22426260, 0x29092128,
136                                        0x07070304, 0x33033330,
137                                        0x28c8e0e8, 0x1b0b1318, 0x05050104,
138                                        0x39497178, 0x10809090, 0x2a4a6268,
139                                        0x2a0a2228, 0x1a8a9298}, {
140                                                                  0x38380830,
141                                                                  0xe828c8e0,
142                                                                  0x2c2d0d21,
143                                                                  0xa42686a2,
144                                                                  0xcc0fcfc3,
145                                                                  0xdc1eced2,
146                                                                  0xb03383b3,
147                                                                  0xb83888b0,
148                                                                  0xac2f8fa3,
149                                                                  0x60204060,
150                                                                  0x54154551,
151                                                                  0xc407c7c3,
152                                                                  0x44044440,
153                                                                  0x6c2f4f63,
154                                                                  0x682b4b63,
155                                                                  0x581b4b53,
156                                                                  0xc003c3c3,
157                                                                  0x60224262,
158                                                                  0x30330333,
159                                                                  0xb43585b1,
160                                                                  0x28290921,
161                                                                  0xa02080a0,
162                                                                  0xe022c2e2,
163                                                                  0xa42787a3,
164                                                                  0xd013c3d3,
165                                                                  0x90118191,
166                                                                  0x10110111,
167                                                                  0x04060602,
168                                                                  0x1c1c0c10,
169                                                                  0xbc3c8cb0,
170                                                                  0x34360632,
171                                                                  0x480b4b43,
172                                                                  0xec2fcfe3,
173                                                                  0x88088880,
174                                                                  0x6c2c4c60,
175                                                                  0xa82888a0,
176                                                                  0x14170713,
177                                                                  0xc404c4c0,
178                                                                  0x14160612,
179                                                                  0xf434c4f0,
180                                                                  0xc002c2c2,
181                                                                  0x44054541,
182                                                                  0xe021c1e1,
183                                                                  0xd416c6d2,
184                                                                  0x3c3f0f33,
185                                                                  0x3c3d0d31,
186                                                                  0x8c0e8e82,
187                                                                  0x98188890,
188                                                                  0x28280820,
189                                                                  0x4c0e4e42,
190                                                                  0xf436c6f2,
191                                                                  0x3c3e0e32,
192                                                                  0xa42585a1,
193                                                                  0xf839c9f1,
194                                                                  0x0c0d0d01,
195                                                                  0xdc1fcfd3,
196                                                                  0xd818c8d0,
197                                                                  0x282b0b23,
198                                                                  0x64264662,
199                                                                  0x783a4a72,
200                                                                  0x24270723,
201                                                                  0x2c2f0f23,
202                                                                  0xf031c1f1,
203                                                                  0x70324272,
204                                                                  0x40024242,
205                                                                  0xd414c4d0,
206                                                                  0x40014141,
207                                                                  0xc000c0c0,
208                                                                  0x70334373,
209                                                                  0x64274763,
210                                                                  0xac2c8ca0,
211                                                                  0x880b8b83,
212                                                                  0xf437c7f3,
213                                                                  0xac2d8da1,
214                                                                  0x80008080,
215                                                                  0x1c1f0f13,
216                                                                  0xc80acac2,
217                                                                  0x2c2c0c20,
218                                                                  0xa82a8aa2,
219                                                                  0x34340430,
220                                                                  0xd012c2d2,
221                                                                  0x080b0b03,
222                                                                  0xec2ecee2,
223                                                                  0xe829c9e1,
224                                                                  0x5c1d4d51,
225                                                                  0x94148490,
226                                                                  0x18180810,
227                                                                  0xf838c8f0,
228                                                                  0x54174753,
229                                                                  0xac2e8ea2,
230                                                                  0x08080800,
231                                                                  0xc405c5c1,
232                                                                  0x10130313,
233                                                                  0xcc0dcdc1,
234                                                                  0x84068682,
235                                                                  0xb83989b1,
236                                                                  0xfc3fcff3,
237                                                                  0x7c3d4d71,
238                                                                  0xc001c1c1,
239                                                                  0x30310131,
240                                                                  0xf435c5f1,
241                                                                  0x880a8a82,
242                                                                  0x682a4a62,
243                                                                  0xb03181b1,
244                                                                  0xd011c1d1,
245                                                                  0x20200020,
246                                                                  0xd417c7d3,
247                                                                  0x00020202,
248                                                                  0x20220222,
249                                                                  0x04040400,
250                                                                  0x68284860,
251                                                                  0x70314171,
252                                                                  0x04070703,
253                                                                  0xd81bcbd3,
254                                                                  0x9c1d8d91,
255                                                                  0x98198991,
256                                                                  0x60214161,
257                                                                  0xbc3e8eb2,
258                                                                  0xe426c6e2,
259                                                                  0x58194951,
260                                                                  0xdc1dcdd1,
261                                                                  0x50114151,
262                                                                  0x90108090,
263                                                                  0xdc1cccd0,
264                                                                  0x981a8a92,
265                                                                  0xa02383a3,
266                                                                  0xa82b8ba3,
267                                                                  0xd010c0d0,
268                                                                  0x80018181,
269                                                                  0x0c0f0f03,
270                                                                  0x44074743,
271                                                                  0x181a0a12,
272                                                                  0xe023c3e3,
273                                                                  0xec2ccce0,
274                                                                  0x8c0d8d81,
275                                                                  0xbc3f8fb3,
276                                                                  0x94168692,
277                                                                  0x783b4b73,
278                                                                  0x5c1c4c50,
279                                                                  0xa02282a2,
280                                                                  0xa02181a1,
281                                                                  0x60234363,
282                                                                  0x20230323,
283                                                                  0x4c0d4d41,
284                                                                  0xc808c8c0,
285                                                                  0x9c1e8e92,
286                                                                  0x9c1c8c90,
287                                                                  0x383a0a32,
288                                                                  0x0c0c0c00,
289                                                                  0x2c2e0e22,
290                                                                  0xb83a8ab2,
291                                                                  0x6c2e4e62,
292                                                                  0x9c1f8f93,
293                                                                  0x581a4a52,
294                                                                  0xf032c2f2,
295                                                                  0x90128292,
296                                                                  0xf033c3f3,
297                                                                  0x48094941,
298                                                                  0x78384870,
299                                                                  0xcc0cccc0,
300                                                                  0x14150511,
301                                                                  0xf83bcbf3,
302                                                                  0x70304070,
303                                                                  0x74354571,
304                                                                  0x7c3f4f73,
305                                                                  0x34350531,
306                                                                  0x10100010,
307                                                                  0x00030303,
308                                                                  0x64244460,
309                                                                  0x6c2d4d61,
310                                                                  0xc406c6c2,
311                                                                  0x74344470,
312                                                                  0xd415c5d1,
313                                                                  0xb43484b0,
314                                                                  0xe82acae2,
315                                                                  0x08090901,
316                                                                  0x74364672,
317                                                                  0x18190911,
318                                                                  0xfc3ecef2,
319                                                                  0x40004040,
320                                                                  0x10120212,
321                                                                  0xe020c0e0,
322                                                                  0xbc3d8db1,
323                                                                  0x04050501,
324                                                                  0xf83acaf2,
325                                                                  0x00010101,
326                                                                  0xf030c0f0,
327                                                                  0x282a0a22,
328                                                                  0x5c1e4e52,
329                                                                  0xa82989a1,
330                                                                  0x54164652,
331                                                                  0x40034343,
332                                                                  0x84058581,
333                                                                  0x14140410,
334                                                                  0x88098981,
335                                                                  0x981b8b93,
336                                                                  0xb03080b0,
337                                                                  0xe425c5e1,
338                                                                  0x48084840,
339                                                                  0x78394971,
340                                                                  0x94178793,
341                                                                  0xfc3cccf0,
342                                                                  0x1c1e0e12,
343                                                                  0x80028282,
344                                                                  0x20210121,
345                                                                  0x8c0c8c80,
346                                                                  0x181b0b13,
347                                                                  0x5c1f4f53,
348                                                                  0x74374773,
349                                                                  0x54144450,
350                                                                  0xb03282b2,
351                                                                  0x1c1d0d11,
352                                                                  0x24250521,
353                                                                  0x4c0f4f43,
354                                                                  0x00000000,
355                                                                  0x44064642,
356                                                                  0xec2dcde1,
357                                                                  0x58184850,
358                                                                  0x50124252,
359                                                                  0xe82bcbe3,
360                                                                  0x7c3e4e72,
361                                                                  0xd81acad2,
362                                                                  0xc809c9c1,
363                                                                  0xfc3dcdf1,
364                                                                  0x30300030,
365                                                                  0x94158591,
366                                                                  0x64254561,
367                                                                  0x3c3c0c30,
368                                                                  0xb43686b2,
369                                                                  0xe424c4e0,
370                                                                  0xb83b8bb3,
371                                                                  0x7c3c4c70,
372                                                                  0x0c0e0e02,
373                                                                  0x50104050,
374                                                                  0x38390931,
375                                                                  0x24260622,
376                                                                  0x30320232,
377                                                                  0x84048480,
378                                                                  0x68294961,
379                                                                  0x90138393,
380                                                                  0x34370733,
381                                                                  0xe427c7e3,
382                                                                  0x24240420,
383                                                                  0xa42484a0,
384                                                                  0xc80bcbc3,
385                                                                  0x50134353,
386                                                                  0x080a0a02,
387                                                                  0x84078783,
388                                                                  0xd819c9d1,
389                                                                  0x4c0c4c40,
390                                                                  0x80038383,
391                                                                  0x8c0f8f83,
392                                                                  0xcc0ecec2,
393                                                                  0x383b0b33,
394                                                                  0x480a4a42,
395                                                                  0xb43787b3},
396 {
397  0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3, 0x50541444, 0x111c1d0d,
398  0xa0ac2c8c, 0x21242505,
399  0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e, 0x51501141, 0xf0fc3ccc,
400  0xc2c80aca, 0x63602343,
401  0x20282808, 0x40440444, 0x20202000, 0x919c1d8d, 0xe0e020c0, 0xe2e022c2,
402  0xc0c808c8, 0x13141707,
403  0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b, 0xb3b83b8b, 0x13101303,
404  0xd2d012c2, 0xe2ec2ece,
405  0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888, 0x32303202, 0xd1dc1dcd,
406  0xf2f436c6, 0x70743444,
407  0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747, 0x505c1c4c, 0x53581b4b,
408  0xb1bc3d8d, 0x01000101,
409  0x20242404, 0x101c1c0c, 0x73703343, 0x90981888, 0x10101000, 0xc0cc0ccc,
410  0xf2f032c2, 0xd1d819c9,
411  0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383, 0x93981b8b, 0xd1d011c1,
412  0x82840686, 0xc1c809c9,
413  0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb, 0x010c0d0d, 0xb2b43686,
414  0x929c1e8e, 0x434c0f4f,
415  0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848, 0xa2a42686, 0x12101202,
416  0xa3ac2f8f, 0xd1d415c5,
417  0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141, 0x52501242, 0x717c3d4d,
418  0x818c0d8d, 0x00080808,
419  0x131c1f0f, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343,
420  0xf3f437c7, 0xe1e021c1,
421  0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707, 0xb0b03080, 0x83880b8b,
422  0x020c0e0e, 0xa3a82b8b,
423  0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d, 0x61682949, 0x707c3c4c,
424  0x01080909, 0x02080a0a,
425  0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5, 0x83840787, 0x10141404,
426  0xf2fc3ece, 0x60642444,
427  0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a, 0x02040606, 0x21202101,
428  0x63682b4b, 0x62642646,
429  0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a, 0x000c0c0c, 0xb3b03383,
430  0x727c3e4e, 0xd0d010c0,
431  0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5, 0x22242606, 0x80800080,
432  0xa1ac2d8d, 0xd3dc1fcf,
433  0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e, 0x32343606, 0x11141505,
434  0x22202202, 0x30383808,
435  0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c, 0x81800181, 0xe1e829c9,
436  0x80840484, 0x93941787,
437  0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c, 0x71703141, 0x11101101,
438  0xc3c407c7, 0x81880989,
439  0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8, 0x90941484, 0x51581949,
440  0x82800282, 0xc0c404c4,
441  0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747, 0xc0c000c0, 0xc3cc0fcf,
442  0xd3d417c7, 0xb0b83888,
443  0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303, 0x91901181, 0x606c2c4c,
444  0xd3d81bcb, 0xa0a42484,
445  0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2, 0x636c2f4f, 0x313c3d0d,
446  0x212c2d0d, 0x40400040,
447  0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1, 0xa2a82a8a, 0xb2b83a8a,
448  0x424c0e4e, 0x51541545,
449  0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f, 0x909c1c8c, 0xd0d818c8,
450  0x42480a4a, 0x52541646,
451  0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646, 0xb1b43585, 0x23282b0b,
452  0x61642545, 0xf2f83aca,
453  0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f, 0x525c1e4e, 0xf1f839c9,
454  0xe2e426c6, 0xb2b03282,
455  0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f, 0xe0e424c4, 0xf0f030c0,
456  0xc1cc0dcd, 0x80880888,
457  0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4, 0x62602242, 0x21282909,
458  0x03040707, 0x33303303,
459  0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949, 0x90901080, 0x62682a4a,
460  0x22282a0a, 0x92981a8a}, {
461                            0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426,
462                            0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
463                            0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407,
464                            0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
465                            0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435,
466                            0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
467                            0xc3d3d013, 0x81919011, 0x01111011, 0x06020406,
468                            0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
469                            0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828,
470                            0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
471                            0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416,
472                            0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
473                            0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e,
474                            0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
475                            0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a,
476                            0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
477                            0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000,
478                            0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
479                            0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f,
480                            0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
481                            0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829,
482                            0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
483                            0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405,
484                            0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
485                            0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031,
486                            0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
487                            0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002,
488                            0x02222022, 0x04000404, 0x48606828, 0x41717031,
489                            0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819,
490                            0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
491                            0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c,
492                            0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
493                            0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a,
494                            0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
495                            0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022,
496                            0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
497                            0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a,
498                            0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
499                            0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012,
500                            0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
501                            0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435,
502                            0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
503                            0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434,
504                            0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
505                            0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000,
506                            0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
507                            0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a,
508                            0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
509                            0x85818405, 0x04101414, 0x89818809, 0x8b93981b,
510                            0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
511                            0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002,
512                            0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
513                            0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d,
514                            0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
515                            0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b,
516                            0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
517                            0x00303030, 0x85919415, 0x45616425, 0x0c303c3c,
518                            0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
519                            0x0e020c0e, 0x40505010, 0x09313839, 0x06222426,
520                            0x02323032, 0x84808404, 0x49616829, 0x83939013,
521                            0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424,
522                            0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
523                            0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f,
524                            0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437}
525 };
526
527 /* key schedule constants - golden ratio */
528 # define KC0     0x9e3779b9
529 # define KC1     0x3c6ef373
530 # define KC2     0x78dde6e6
531 # define KC3     0xf1bbcdcc
532 # define KC4     0xe3779b99
533 # define KC5     0xc6ef3733
534 # define KC6     0x8dde6e67
535 # define KC7     0x1bbcdccf
536 # define KC8     0x3779b99e
537 # define KC9     0x6ef3733c
538 # define KC10    0xdde6e678
539 # define KC11    0xbbcdccf1
540 # define KC12    0x779b99e3
541 # define KC13    0xef3733c6
542 # define KC14    0xde6e678d
543 # define KC15    0xbcdccf1b
544
545 # if defined(OPENSSL_SMALL_FOOTPRINT)
546 static const seed_word KC[] = {
547     KC0, KC1, KC2, KC3, KC4, KC5, KC6, KC7,
548     KC8, KC9, KC10, KC11, KC12, KC13, KC14, KC15
549 };
550 # endif
551
552 void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH],
553                   SEED_KEY_SCHEDULE *ks)
554 {
555     seed_word x1, x2, x3, x4;
556     seed_word t0, t1;
557
558     char2word(rawkey, x1);
559     char2word(rawkey + 4, x2);
560     char2word(rawkey + 8, x3);
561     char2word(rawkey + 12, x4);
562
563     t0 = (x1 + x3 - KC0) & 0xffffffff;
564     t1 = (x2 - x4 + KC0) & 0xffffffff;
565     KEYUPDATE_TEMP(t0, t1, &ks->data[0]);
566     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1);
567     KEYUPDATE_TEMP(t0, t1, &ks->data[2]);
568
569 # if !defined(OPENSSL_SMALL_FOOTPRINT)
570     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2);
571     KEYUPDATE_TEMP(t0, t1, &ks->data[4]);
572     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3);
573     KEYUPDATE_TEMP(t0, t1, &ks->data[6]);
574     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4);
575     KEYUPDATE_TEMP(t0, t1, &ks->data[8]);
576     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC5);
577     KEYUPDATE_TEMP(t0, t1, &ks->data[10]);
578     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC6);
579     KEYUPDATE_TEMP(t0, t1, &ks->data[12]);
580     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC7);
581     KEYUPDATE_TEMP(t0, t1, &ks->data[14]);
582     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC8);
583     KEYUPDATE_TEMP(t0, t1, &ks->data[16]);
584     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC9);
585     KEYUPDATE_TEMP(t0, t1, &ks->data[18]);
586     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC10);
587     KEYUPDATE_TEMP(t0, t1, &ks->data[20]);
588     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC11);
589     KEYUPDATE_TEMP(t0, t1, &ks->data[22]);
590     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC12);
591     KEYUPDATE_TEMP(t0, t1, &ks->data[24]);
592     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13);
593     KEYUPDATE_TEMP(t0, t1, &ks->data[26]);
594     KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14);
595     KEYUPDATE_TEMP(t0, t1, &ks->data[28]);
596     KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15);
597     KEYUPDATE_TEMP(t0, t1, &ks->data[30]);
598 # else
599     {
600         int i;
601         for (i = 2; i < 16; i += 2) {
602             KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC[i]);
603             KEYUPDATE_TEMP(t0, t1, &ks->data[i * 2]);
604             KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC[i + 1]);
605             KEYUPDATE_TEMP(t0, t1, &ks->data[i * 2 + 2]);
606         }
607     }
608 # endif
609 }
610
611 void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE],
612                   unsigned char d[SEED_BLOCK_SIZE],
613                   const SEED_KEY_SCHEDULE *ks)
614 {
615     seed_word x1, x2, x3, x4;
616     seed_word t0, t1;
617
618     char2word(s, x1);
619     char2word(s + 4, x2);
620     char2word(s + 8, x3);
621     char2word(s + 12, x4);
622
623 # if !defined(OPENSSL_SMALL_FOOTPRINT)
624     E_SEED(t0, t1, x1, x2, x3, x4, 0);
625     E_SEED(t0, t1, x3, x4, x1, x2, 2);
626     E_SEED(t0, t1, x1, x2, x3, x4, 4);
627     E_SEED(t0, t1, x3, x4, x1, x2, 6);
628     E_SEED(t0, t1, x1, x2, x3, x4, 8);
629     E_SEED(t0, t1, x3, x4, x1, x2, 10);
630     E_SEED(t0, t1, x1, x2, x3, x4, 12);
631     E_SEED(t0, t1, x3, x4, x1, x2, 14);
632     E_SEED(t0, t1, x1, x2, x3, x4, 16);
633     E_SEED(t0, t1, x3, x4, x1, x2, 18);
634     E_SEED(t0, t1, x1, x2, x3, x4, 20);
635     E_SEED(t0, t1, x3, x4, x1, x2, 22);
636     E_SEED(t0, t1, x1, x2, x3, x4, 24);
637     E_SEED(t0, t1, x3, x4, x1, x2, 26);
638     E_SEED(t0, t1, x1, x2, x3, x4, 28);
639     E_SEED(t0, t1, x3, x4, x1, x2, 30);
640 # else
641     {
642         int i;
643         for (i = 0; i < 30; i += 4) {
644             E_SEED(t0, t1, x1, x2, x3, x4, i);
645             E_SEED(t0, t1, x3, x4, x1, x2, i + 2);
646         }
647     }
648 # endif
649
650     word2char(x3, d);
651     word2char(x4, d + 4);
652     word2char(x1, d + 8);
653     word2char(x2, d + 12);
654 }
655
656 void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE],
657                   unsigned char d[SEED_BLOCK_SIZE],
658                   const SEED_KEY_SCHEDULE *ks)
659 {
660     seed_word x1, x2, x3, x4;
661     seed_word t0, t1;
662
663     char2word(s, x1);
664     char2word(s + 4, x2);
665     char2word(s + 8, x3);
666     char2word(s + 12, x4);
667
668 # if !defined(OPENSSL_SMALL_FOOTPRINT)
669     E_SEED(t0, t1, x1, x2, x3, x4, 30);
670     E_SEED(t0, t1, x3, x4, x1, x2, 28);
671     E_SEED(t0, t1, x1, x2, x3, x4, 26);
672     E_SEED(t0, t1, x3, x4, x1, x2, 24);
673     E_SEED(t0, t1, x1, x2, x3, x4, 22);
674     E_SEED(t0, t1, x3, x4, x1, x2, 20);
675     E_SEED(t0, t1, x1, x2, x3, x4, 18);
676     E_SEED(t0, t1, x3, x4, x1, x2, 16);
677     E_SEED(t0, t1, x1, x2, x3, x4, 14);
678     E_SEED(t0, t1, x3, x4, x1, x2, 12);
679     E_SEED(t0, t1, x1, x2, x3, x4, 10);
680     E_SEED(t0, t1, x3, x4, x1, x2, 8);
681     E_SEED(t0, t1, x1, x2, x3, x4, 6);
682     E_SEED(t0, t1, x3, x4, x1, x2, 4);
683     E_SEED(t0, t1, x1, x2, x3, x4, 2);
684     E_SEED(t0, t1, x3, x4, x1, x2, 0);
685 # else
686     {
687         int i;
688         for (i = 30; i > 0; i -= 4) {
689             E_SEED(t0, t1, x1, x2, x3, x4, i);
690             E_SEED(t0, t1, x3, x4, x1, x2, i - 2);
691
692         }
693     }
694 # endif
695
696     word2char(x3, d);
697     word2char(x4, d + 4);
698     word2char(x1, d + 8);
699     word2char(x2, d + 12);
700 }
701
702 #endif                          /* OPENSSL_NO_SEED */