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