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