Coverage Report

Created: 2024-08-27 12:20

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