2 * Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Neither the name of author nor the names of its contributors may
10 * be used to endorse or promote products derived from this software
11 * without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 #ifndef OPENSSL_NO_SEED
35 # include <openssl/seed.h>
36 # include "seed_locl.h"
38 # ifdef SS /* can get defined on Solaris by inclusion of
43 static const seed_word SS[4][256] = { {
44 0x2989a1a8, 0x05858184, 0x16c6d2d4,
45 0x13c3d3d0, 0x14445054, 0x1d0d111c,
46 0x2c8ca0ac, 0x25052124,
47 0x1d4d515c, 0x03434340, 0x18081018,
48 0x1e0e121c, 0x11415150, 0x3cccf0fc,
49 0x0acac2c8, 0x23436360,
50 0x28082028, 0x04444044, 0x20002020,
51 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0,
52 0x08c8c0c8, 0x17071314,
53 0x2585a1a4, 0x0f8f838c, 0x03030300,
54 0x3b4b7378, 0x3b8bb3b8, 0x13031310,
55 0x12c2d2d0, 0x2ecee2ec,
56 0x30407070, 0x0c8c808c, 0x3f0f333c,
57 0x2888a0a8, 0x32023230, 0x1dcdd1dc,
58 0x36c6f2f4, 0x34447074,
59 0x2ccce0ec, 0x15859194, 0x0b0b0308,
60 0x17475354, 0x1c4c505c, 0x1b4b5358,
61 0x3d8db1bc, 0x01010100,
62 0x24042024, 0x1c0c101c, 0x33437370,
63 0x18889098, 0x10001010, 0x0cccc0cc,
64 0x32c2f2f0, 0x19c9d1d8,
65 0x2c0c202c, 0x27c7e3e4, 0x32427270,
66 0x03838380, 0x1b8b9398, 0x11c1d1d0,
67 0x06868284, 0x09c9c1c8,
68 0x20406060, 0x10405050, 0x2383a3a0,
69 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4,
70 0x1e8e929c, 0x0f4f434c,
71 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4,
72 0x38487078, 0x2686a2a4, 0x12021210,
73 0x2f8fa3ac, 0x15c5d1d4,
74 0x21416160, 0x03c3c3c0, 0x3484b0b4,
75 0x01414140, 0x12425250, 0x3d4d717c,
76 0x0d8d818c, 0x08080008,
77 0x1f0f131c, 0x19899198, 0x00000000,
78 0x19091118, 0x04040004, 0x13435350,
79 0x37c7f3f4, 0x21c1e1e0,
80 0x3dcdf1fc, 0x36467274, 0x2f0f232c,
81 0x27072324, 0x3080b0b0, 0x0b8b8388,
82 0x0e0e020c, 0x2b8ba3a8,
83 0x2282a2a0, 0x2e4e626c, 0x13839390,
84 0x0d4d414c, 0x29496168, 0x3c4c707c,
85 0x09090108, 0x0a0a0208,
86 0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0,
87 0x05c5c1c4, 0x07878384, 0x14041014,
88 0x3ecef2fc, 0x24446064,
89 0x1eced2dc, 0x2e0e222c, 0x0b4b4348,
90 0x1a0a1218, 0x06060204, 0x21012120,
91 0x2b4b6368, 0x26466264,
92 0x02020200, 0x35c5f1f4, 0x12829290,
93 0x0a8a8288, 0x0c0c000c, 0x3383b3b0,
94 0x3e4e727c, 0x10c0d0d0,
95 0x3a4a7278, 0x07474344, 0x16869294,
96 0x25c5e1e4, 0x26062224, 0x00808080,
97 0x2d8da1ac, 0x1fcfd3dc,
98 0x2181a1a0, 0x30003030, 0x37073334,
99 0x2e8ea2ac, 0x36063234, 0x15051114,
100 0x22022220, 0x38083038,
101 0x34c4f0f4, 0x2787a3a4, 0x05454144,
102 0x0c4c404c, 0x01818180, 0x29c9e1e8,
103 0x04848084, 0x17879394,
104 0x35053134, 0x0bcbc3c8, 0x0ecec2cc,
105 0x3c0c303c, 0x31417170, 0x11011110,
106 0x07c7c3c4, 0x09898188,
107 0x35457174, 0x3bcbf3f8, 0x1acad2d8,
108 0x38c8f0f8, 0x14849094, 0x19495158,
109 0x02828280, 0x04c4c0c4,
110 0x3fcff3fc, 0x09494148, 0x39093138,
111 0x27476364, 0x00c0c0c0, 0x0fcfc3cc,
112 0x17c7d3d4, 0x3888b0b8,
113 0x0f0f030c, 0x0e8e828c, 0x02424240,
114 0x23032320, 0x11819190, 0x2c4c606c,
115 0x1bcbd3d8, 0x2484a0a4,
116 0x34043034, 0x31c1f1f0, 0x08484048,
117 0x02c2c2c0, 0x2f4f636c, 0x3d0d313c,
118 0x2d0d212c, 0x00404040,
119 0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc,
120 0x01c1c1c0, 0x2a8aa2a8, 0x3a8ab2b8,
121 0x0e4e424c, 0x15455154,
122 0x3b0b3338, 0x1cccd0dc, 0x28486068,
123 0x3f4f737c, 0x1c8c909c, 0x18c8d0d8,
124 0x0a4a4248, 0x16465254,
125 0x37477374, 0x2080a0a0, 0x2dcde1ec,
126 0x06464244, 0x3585b1b4, 0x2b0b2328,
127 0x25456164, 0x3acaf2f8,
128 0x23c3e3e0, 0x3989b1b8, 0x3181b1b0,
129 0x1f8f939c, 0x1e4e525c, 0x39c9f1f8,
130 0x26c6e2e4, 0x3282b2b0,
131 0x31013130, 0x2acae2e8, 0x2d4d616c,
132 0x1f4f535c, 0x24c4e0e4, 0x30c0f0f0,
133 0x0dcdc1cc, 0x08888088,
134 0x16061214, 0x3a0a3238, 0x18485058,
135 0x14c4d0d4, 0x22426260, 0x29092128,
136 0x07070304, 0x33033330,
137 0x28c8e0e8, 0x1b0b1318, 0x05050104,
138 0x39497178, 0x10809090, 0x2a4a6268,
139 0x2a0a2228, 0x1a8a9298}, {
397 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3, 0x50541444, 0x111c1d0d,
398 0xa0ac2c8c, 0x21242505,
399 0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e, 0x51501141, 0xf0fc3ccc,
400 0xc2c80aca, 0x63602343,
401 0x20282808, 0x40440444, 0x20202000, 0x919c1d8d, 0xe0e020c0, 0xe2e022c2,
402 0xc0c808c8, 0x13141707,
403 0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b, 0xb3b83b8b, 0x13101303,
404 0xd2d012c2, 0xe2ec2ece,
405 0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888, 0x32303202, 0xd1dc1dcd,
406 0xf2f436c6, 0x70743444,
407 0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747, 0x505c1c4c, 0x53581b4b,
408 0xb1bc3d8d, 0x01000101,
409 0x20242404, 0x101c1c0c, 0x73703343, 0x90981888, 0x10101000, 0xc0cc0ccc,
410 0xf2f032c2, 0xd1d819c9,
411 0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383, 0x93981b8b, 0xd1d011c1,
412 0x82840686, 0xc1c809c9,
413 0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb, 0x010c0d0d, 0xb2b43686,
414 0x929c1e8e, 0x434c0f4f,
415 0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848, 0xa2a42686, 0x12101202,
416 0xa3ac2f8f, 0xd1d415c5,
417 0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141, 0x52501242, 0x717c3d4d,
418 0x818c0d8d, 0x00080808,
419 0x131c1f0f, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343,
420 0xf3f437c7, 0xe1e021c1,
421 0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707, 0xb0b03080, 0x83880b8b,
422 0x020c0e0e, 0xa3a82b8b,
423 0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d, 0x61682949, 0x707c3c4c,
424 0x01080909, 0x02080a0a,
425 0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5, 0x83840787, 0x10141404,
426 0xf2fc3ece, 0x60642444,
427 0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a, 0x02040606, 0x21202101,
428 0x63682b4b, 0x62642646,
429 0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a, 0x000c0c0c, 0xb3b03383,
430 0x727c3e4e, 0xd0d010c0,
431 0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5, 0x22242606, 0x80800080,
432 0xa1ac2d8d, 0xd3dc1fcf,
433 0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e, 0x32343606, 0x11141505,
434 0x22202202, 0x30383808,
435 0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c, 0x81800181, 0xe1e829c9,
436 0x80840484, 0x93941787,
437 0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c, 0x71703141, 0x11101101,
438 0xc3c407c7, 0x81880989,
439 0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8, 0x90941484, 0x51581949,
440 0x82800282, 0xc0c404c4,
441 0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747, 0xc0c000c0, 0xc3cc0fcf,
442 0xd3d417c7, 0xb0b83888,
443 0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303, 0x91901181, 0x606c2c4c,
444 0xd3d81bcb, 0xa0a42484,
445 0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2, 0x636c2f4f, 0x313c3d0d,
446 0x212c2d0d, 0x40400040,
447 0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1, 0xa2a82a8a, 0xb2b83a8a,
448 0x424c0e4e, 0x51541545,
449 0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f, 0x909c1c8c, 0xd0d818c8,
450 0x42480a4a, 0x52541646,
451 0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646, 0xb1b43585, 0x23282b0b,
452 0x61642545, 0xf2f83aca,
453 0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f, 0x525c1e4e, 0xf1f839c9,
454 0xe2e426c6, 0xb2b03282,
455 0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f, 0xe0e424c4, 0xf0f030c0,
456 0xc1cc0dcd, 0x80880888,
457 0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4, 0x62602242, 0x21282909,
458 0x03040707, 0x33303303,
459 0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949, 0x90901080, 0x62682a4a,
460 0x22282a0a, 0x92981a8a}, {
461 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426,
462 0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
463 0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407,
464 0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
465 0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435,
466 0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
467 0xc3d3d013, 0x81919011, 0x01111011, 0x06020406,
468 0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
469 0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828,
470 0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
471 0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416,
472 0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
473 0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e,
474 0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
475 0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a,
476 0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
477 0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000,
478 0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
479 0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f,
480 0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
481 0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829,
482 0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
483 0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405,
484 0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
485 0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031,
486 0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
487 0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002,
488 0x02222022, 0x04000404, 0x48606828, 0x41717031,
489 0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819,
490 0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
491 0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c,
492 0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
493 0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a,
494 0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
495 0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022,
496 0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
497 0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a,
498 0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
499 0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012,
500 0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
501 0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435,
502 0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
503 0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434,
504 0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
505 0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000,
506 0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
507 0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a,
508 0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
509 0x85818405, 0x04101414, 0x89818809, 0x8b93981b,
510 0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
511 0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002,
512 0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
513 0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d,
514 0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
515 0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b,
516 0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
517 0x00303030, 0x85919415, 0x45616425, 0x0c303c3c,
518 0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
519 0x0e020c0e, 0x40505010, 0x09313839, 0x06222426,
520 0x02323032, 0x84808404, 0x49616829, 0x83939013,
521 0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424,
522 0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
523 0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f,
524 0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437}
527 /* key schedule constants - golden ratio */
528 # define KC0 0x9e3779b9
529 # define KC1 0x3c6ef373
530 # define KC2 0x78dde6e6
531 # define KC3 0xf1bbcdcc
532 # define KC4 0xe3779b99
533 # define KC5 0xc6ef3733
534 # define KC6 0x8dde6e67
535 # define KC7 0x1bbcdccf
536 # define KC8 0x3779b99e
537 # define KC9 0x6ef3733c
538 # define KC10 0xdde6e678
539 # define KC11 0xbbcdccf1
540 # define KC12 0x779b99e3
541 # define KC13 0xef3733c6
542 # define KC14 0xde6e678d
543 # define KC15 0xbcdccf1b
545 # if defined(OPENSSL_SMALL_FOOTPRINT)
546 static const seed_word KC[] = {
547 KC0, KC1, KC2, KC3, KC4, KC5, KC6, KC7,
548 KC8, KC9, KC10, KC11, KC12, KC13, KC14, KC15
552 void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH],
553 SEED_KEY_SCHEDULE *ks)
555 seed_word x1, x2, x3, x4;
558 char2word(rawkey, x1);
559 char2word(rawkey + 4, x2);
560 char2word(rawkey + 8, x3);
561 char2word(rawkey + 12, x4);
563 t0 = (x1 + x3 - KC0) & 0xffffffff;
564 t1 = (x2 - x4 + KC0) & 0xffffffff;
565 KEYUPDATE_TEMP(t0, t1, &ks->data[0]);
566 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1);
567 KEYUPDATE_TEMP(t0, t1, &ks->data[2]);
569 # if !defined(OPENSSL_SMALL_FOOTPRINT)
570 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2);
571 KEYUPDATE_TEMP(t0, t1, &ks->data[4]);
572 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3);
573 KEYUPDATE_TEMP(t0, t1, &ks->data[6]);
574 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4);
575 KEYUPDATE_TEMP(t0, t1, &ks->data[8]);
576 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC5);
577 KEYUPDATE_TEMP(t0, t1, &ks->data[10]);
578 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC6);
579 KEYUPDATE_TEMP(t0, t1, &ks->data[12]);
580 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC7);
581 KEYUPDATE_TEMP(t0, t1, &ks->data[14]);
582 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC8);
583 KEYUPDATE_TEMP(t0, t1, &ks->data[16]);
584 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC9);
585 KEYUPDATE_TEMP(t0, t1, &ks->data[18]);
586 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC10);
587 KEYUPDATE_TEMP(t0, t1, &ks->data[20]);
588 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC11);
589 KEYUPDATE_TEMP(t0, t1, &ks->data[22]);
590 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC12);
591 KEYUPDATE_TEMP(t0, t1, &ks->data[24]);
592 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13);
593 KEYUPDATE_TEMP(t0, t1, &ks->data[26]);
594 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14);
595 KEYUPDATE_TEMP(t0, t1, &ks->data[28]);
596 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15);
597 KEYUPDATE_TEMP(t0, t1, &ks->data[30]);
601 for (i = 2; i < 16; i += 2) {
602 KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC[i]);
603 KEYUPDATE_TEMP(t0, t1, &ks->data[i * 2]);
604 KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC[i + 1]);
605 KEYUPDATE_TEMP(t0, t1, &ks->data[i * 2 + 2]);
611 void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE],
612 unsigned char d[SEED_BLOCK_SIZE],
613 const SEED_KEY_SCHEDULE *ks)
615 seed_word x1, x2, x3, x4;
619 char2word(s + 4, x2);
620 char2word(s + 8, x3);
621 char2word(s + 12, x4);
623 # if !defined(OPENSSL_SMALL_FOOTPRINT)
624 E_SEED(t0, t1, x1, x2, x3, x4, 0);
625 E_SEED(t0, t1, x3, x4, x1, x2, 2);
626 E_SEED(t0, t1, x1, x2, x3, x4, 4);
627 E_SEED(t0, t1, x3, x4, x1, x2, 6);
628 E_SEED(t0, t1, x1, x2, x3, x4, 8);
629 E_SEED(t0, t1, x3, x4, x1, x2, 10);
630 E_SEED(t0, t1, x1, x2, x3, x4, 12);
631 E_SEED(t0, t1, x3, x4, x1, x2, 14);
632 E_SEED(t0, t1, x1, x2, x3, x4, 16);
633 E_SEED(t0, t1, x3, x4, x1, x2, 18);
634 E_SEED(t0, t1, x1, x2, x3, x4, 20);
635 E_SEED(t0, t1, x3, x4, x1, x2, 22);
636 E_SEED(t0, t1, x1, x2, x3, x4, 24);
637 E_SEED(t0, t1, x3, x4, x1, x2, 26);
638 E_SEED(t0, t1, x1, x2, x3, x4, 28);
639 E_SEED(t0, t1, x3, x4, x1, x2, 30);
643 for (i = 0; i < 30; i += 4) {
644 E_SEED(t0, t1, x1, x2, x3, x4, i);
645 E_SEED(t0, t1, x3, x4, x1, x2, i + 2);
651 word2char(x4, d + 4);
652 word2char(x1, d + 8);
653 word2char(x2, d + 12);
656 void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE],
657 unsigned char d[SEED_BLOCK_SIZE],
658 const SEED_KEY_SCHEDULE *ks)
660 seed_word x1, x2, x3, x4;
664 char2word(s + 4, x2);
665 char2word(s + 8, x3);
666 char2word(s + 12, x4);
668 # if !defined(OPENSSL_SMALL_FOOTPRINT)
669 E_SEED(t0, t1, x1, x2, x3, x4, 30);
670 E_SEED(t0, t1, x3, x4, x1, x2, 28);
671 E_SEED(t0, t1, x1, x2, x3, x4, 26);
672 E_SEED(t0, t1, x3, x4, x1, x2, 24);
673 E_SEED(t0, t1, x1, x2, x3, x4, 22);
674 E_SEED(t0, t1, x3, x4, x1, x2, 20);
675 E_SEED(t0, t1, x1, x2, x3, x4, 18);
676 E_SEED(t0, t1, x3, x4, x1, x2, 16);
677 E_SEED(t0, t1, x1, x2, x3, x4, 14);
678 E_SEED(t0, t1, x3, x4, x1, x2, 12);
679 E_SEED(t0, t1, x1, x2, x3, x4, 10);
680 E_SEED(t0, t1, x3, x4, x1, x2, 8);
681 E_SEED(t0, t1, x1, x2, x3, x4, 6);
682 E_SEED(t0, t1, x3, x4, x1, x2, 4);
683 E_SEED(t0, t1, x1, x2, x3, x4, 2);
684 E_SEED(t0, t1, x3, x4, x1, x2, 0);
688 for (i = 30; i > 0; i -= 4) {
689 E_SEED(t0, t1, x1, x2, x3, x4, i);
690 E_SEED(t0, t1, x3, x4, x1, x2, i - 2);
697 word2char(x4, d + 4);
698 word2char(x1, d + 8);
699 word2char(x2, d + 12);
702 #endif /* OPENSSL_NO_SEED */