1/*
2 * Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (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_local.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
60static 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 */
326static 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
397static 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)
434static 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
440void 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
499void 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
544void 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 */
591