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