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