]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/seed/seed.c
Run util/openssl-format-source -v -c .
[thirdparty/openssl.git] / crypto / seed / seed.c
1 /*
2 * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Neither the name of author nor the names of its contributors may
10 * be used to endorse or promote products derived from this software
11 * without specific prior written permission.
12 *
13 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 */
26 #ifndef OPENSSL_NO_SEED
27
28 # include <stdio.h>
29 # include <stdlib.h>
30 # include <string.h>
31 # ifdef WIN32
32 # include <memory.h>
33 # endif
34
35 # include <openssl/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 */