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