Coverage Report

Created: 2018-08-29 13:53

/src/openssl/crypto/seed/seed.c
Line
Count
Source (jump to first uncovered line)
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
0
        SS[0][(unsigned char)      (v) & 0xff] ^ \
56
0
        SS[1][(unsigned char) ((v)>>8) & 0xff] ^ \
57
0
        SS[2][(unsigned char)((v)>>16) & 0xff] ^ \
58
0
        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
0
# 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
0
{
443
0
    seed_word x1, x2, x3, x4;
444
0
    seed_word t0, t1;
445
0
446
0
    char2word(rawkey, x1);
447
0
    char2word(rawkey + 4, x2);
448
0
    char2word(rawkey + 8, x3);
449
0
    char2word(rawkey + 12, x4);
450
0
451
0
    t0 = (x1 + x3 - KC0) & 0xffffffff;
452
0
    t1 = (x2 - x4 + KC0) & 0xffffffff;
453
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[0]);
454
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1);
455
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[2]);
456
0
457
0
# if !defined(OPENSSL_SMALL_FOOTPRINT)
458
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2);
459
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[4]);
460
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3);
461
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[6]);
462
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4);
463
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[8]);
464
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC5);
465
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[10]);
466
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC6);
467
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[12]);
468
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC7);
469
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[14]);
470
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC8);
471
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[16]);
472
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC9);
473
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[18]);
474
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC10);
475
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[20]);
476
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC11);
477
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[22]);
478
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC12);
479
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[24]);
480
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13);
481
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[26]);
482
0
    KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14);
483
0
    KEYUPDATE_TEMP(t0, t1, &ks->data[28]);
484
0
    KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15);
485
0
    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
0
{
503
0
    seed_word x1, x2, x3, x4;
504
0
    seed_word t0, t1;
505
0
506
0
    char2word(s, x1);
507
0
    char2word(s + 4, x2);
508
0
    char2word(s + 8, x3);
509
0
    char2word(s + 12, x4);
510
0
511
0
# if !defined(OPENSSL_SMALL_FOOTPRINT)
512
0
    E_SEED(t0, t1, x1, x2, x3, x4, 0);
513
0
    E_SEED(t0, t1, x3, x4, x1, x2, 2);
514
0
    E_SEED(t0, t1, x1, x2, x3, x4, 4);
515
0
    E_SEED(t0, t1, x3, x4, x1, x2, 6);
516
0
    E_SEED(t0, t1, x1, x2, x3, x4, 8);
517
0
    E_SEED(t0, t1, x3, x4, x1, x2, 10);
518
0
    E_SEED(t0, t1, x1, x2, x3, x4, 12);
519
0
    E_SEED(t0, t1, x3, x4, x1, x2, 14);
520
0
    E_SEED(t0, t1, x1, x2, x3, x4, 16);
521
0
    E_SEED(t0, t1, x3, x4, x1, x2, 18);
522
0
    E_SEED(t0, t1, x1, x2, x3, x4, 20);
523
0
    E_SEED(t0, t1, x3, x4, x1, x2, 22);
524
0
    E_SEED(t0, t1, x1, x2, x3, x4, 24);
525
0
    E_SEED(t0, t1, x3, x4, x1, x2, 26);
526
0
    E_SEED(t0, t1, x1, x2, x3, x4, 28);
527
0
    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
0
    word2char(x3, d);
539
0
    word2char(x4, d + 4);
540
0
    word2char(x1, d + 8);
541
0
    word2char(x2, d + 12);
542
0
}
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
0
{
548
0
    seed_word x1, x2, x3, x4;
549
0
    seed_word t0, t1;
550
0
551
0
    char2word(s, x1);
552
0
    char2word(s + 4, x2);
553
0
    char2word(s + 8, x3);
554
0
    char2word(s + 12, x4);
555
0
556
0
# if !defined(OPENSSL_SMALL_FOOTPRINT)
557
0
    E_SEED(t0, t1, x1, x2, x3, x4, 30);
558
0
    E_SEED(t0, t1, x3, x4, x1, x2, 28);
559
0
    E_SEED(t0, t1, x1, x2, x3, x4, 26);
560
0
    E_SEED(t0, t1, x3, x4, x1, x2, 24);
561
0
    E_SEED(t0, t1, x1, x2, x3, x4, 22);
562
0
    E_SEED(t0, t1, x3, x4, x1, x2, 20);
563
0
    E_SEED(t0, t1, x1, x2, x3, x4, 18);
564
0
    E_SEED(t0, t1, x3, x4, x1, x2, 16);
565
0
    E_SEED(t0, t1, x1, x2, x3, x4, 14);
566
0
    E_SEED(t0, t1, x3, x4, x1, x2, 12);
567
0
    E_SEED(t0, t1, x1, x2, x3, x4, 10);
568
0
    E_SEED(t0, t1, x3, x4, x1, x2, 8);
569
0
    E_SEED(t0, t1, x1, x2, x3, x4, 6);
570
0
    E_SEED(t0, t1, x3, x4, x1, x2, 4);
571
0
    E_SEED(t0, t1, x1, x2, x3, x4, 2);
572
0
    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
0
    word2char(x3, d);
585
0
    word2char(x4, d + 4);
586
0
    word2char(x1, d + 8);
587
0
    word2char(x2, d + 12);
588
0
}
589
590
#endif                          /* OPENSSL_NO_SEED */