/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifdef FREEBL_NO_DEPEND
#include "../stubs.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#ifdef WIN32
#include <memory.h>
#endif
#include "seed.h"
#include "secerr.h"
static const seed_word SS[
4 ][
256 ] = {
{
0 x2989a1a8,
0 x05858184,
0 x16c6d2d4,
0 x13c3d3d0,
0 x14445054,
0 x1d0d111c,
0 x2c8ca0ac,
0 x25052124,
0 x1d4d515c,
0 x03434340,
0 x18081018,
0 x1e0e121c,
0 x11415150,
0 x3cccf0fc,
0 x0acac2c8,
0 x23436360,
0 x28082028,
0 x04444044,
0 x20002020,
0 x1d8d919c,
0 x20c0e0e0,
0 x22c2e2e0,
0 x08c8c0c8,
0 x17071314,
0 x2585a1a4,
0 x0f8f838c,
0 x03030300,
0 x3b4b7378,
0 x3b8bb3b8,
0 x13031310,
0 x12c2d2d0,
0 x2ecee2ec,
0 x30407070,
0 x0c8c808c,
0 x3f0f333c,
0 x2888a0a8,
0 x32023230,
0 x1dcdd1dc,
0 x36c6f2f4,
0 x34447074,
0 x2ccce0ec,
0 x15859194,
0 x0b0b0308,
0 x17475354,
0 x1c4c505c,
0 x1b4b5358,
0 x3d8db1bc,
0 x01010100,
0 x24042024,
0 x1c0c101c,
0 x33437370,
0 x18889098,
0 x10001010,
0 x0cccc0cc,
0 x32c2f2f0,
0 x19c9d1d8,
0 x2c0c202c,
0 x27c7e3e4,
0 x32427270,
0 x03838380,
0 x1b8b9398,
0 x11c1d1d0,
0 x06868284,
0 x09c9c1c8,
0 x20406060,
0 x10405050,
0 x2383a3a0,
0 x2bcbe3e8,
0 x0d0d010c,
0 x3686b2b4,
0 x1e8e929c,
0 x0f4f434c,
0 x3787b3b4,
0 x1a4a5258,
0 x06c6c2c4,
0 x38487078,
0 x2686a2a4,
0 x12021210,
0 x2f8fa3ac,
0 x15c5d1d4,
0 x21416160,
0 x03c3c3c0,
0 x3484b0b4,
0 x01414140,
0 x12425250,
0 x3d4d717c,
0 x0d8d818c,
0 x08080008,
0 x1f0f131c,
0 x19899198,
0 x00000000,
0 x19091118,
0 x04040004,
0 x13435350,
0 x37c7f3f4,
0 x21c1e1e0,
0 x3dcdf1fc,
0 x36467274,
0 x2f0f232c,
0 x27072324,
0 x3080b0b0,
0 x0b8b8388,
0 x0e0e020c,
0 x2b8ba3a8,
0 x2282a2a0,
0 x2e4e626c,
0 x13839390,
0 x0d4d414c,
0 x29496168,
0 x3c4c707c,
0 x09090108,
0 x0a0a0208,
0 x3f8fb3bc,
0 x2fcfe3ec,
0 x33c3f3f0,
0 x05c5c1c4,
0 x07878384,
0 x14041014,
0 x3ecef2fc,
0 x24446064,
0 x1eced2dc,
0 x2e0e222c,
0 x0b4b4348,
0 x1a0a1218,
0 x06060204,
0 x21012120,
0 x2b4b6368,
0 x26466264,
0 x02020200,
0 x35c5f1f4,
0 x12829290,
0 x0a8a8288,
0 x0c0c000c,
0 x3383b3b0,
0 x3e4e727c,
0 x10c0d0d0,
0 x3a4a7278,
0 x07474344,
0 x16869294,
0 x25c5e1e4,
0 x26062224,
0 x00808080,
0 x2d8da1ac,
0 x1fcfd3dc,
0 x2181a1a0,
0 x30003030,
0 x37073334,
0 x2e8ea2ac,
0 x36063234,
0 x15051114,
0 x22022220,
0 x38083038,
0 x34c4f0f4,
0 x2787a3a4,
0 x05454144,
0 x0c4c404c,
0 x01818180,
0 x29c9e1e8,
0 x04848084,
0 x17879394,
0 x35053134,
0 x0bcbc3c8,
0 x0ecec2cc,
0 x3c0c303c,
0 x31417170,
0 x11011110,
0 x07c7c3c4,
0 x09898188,
0 x35457174,
0 x3bcbf3f8,
0 x1acad2d8,
0 x38c8f0f8,
0 x14849094,
0 x19495158,
0 x02828280,
0 x04c4c0c4,
0 x3fcff3fc,
0 x09494148,
0 x39093138,
0 x27476364,
0 x00c0c0c0,
0 x0fcfc3cc,
0 x17c7d3d4,
0 x3888b0b8,
0 x0f0f030c,
0 x0e8e828c,
0 x02424240,
0 x23032320,
0 x11819190,
0 x2c4c606c,
0 x1bcbd3d8,
0 x2484a0a4,
0 x34043034,
0 x31c1f1f0,
0 x08484048,
0 x02c2c2c0,
0 x2f4f636c,
0 x3d0d313c,
0 x2d0d212c,
0 x00404040,
0 x3e8eb2bc,
0 x3e0e323c,
0 x3c8cb0bc,
0 x01c1c1c0,
0 x2a8aa2a8,
0 x3a8ab2b8,
0 x0e4e424c,
0 x15455154,
0 x3b0b3338,
0 x1cccd0dc,
0 x28486068,
0 x3f4f737c,
0 x1c8c909c,
0 x18c8d0d8,
0 x0a4a4248,
0 x16465254,
0 x37477374,
0 x2080a0a0,
0 x2dcde1ec,
0 x06464244,
0 x3585b1b4,
0 x2b0b2328,
0 x25456164,
0 x3acaf2f8,
0 x23c3e3e0,
0 x3989b1b8,
0 x3181b1b0,
0 x1f8f939c,
0 x1e4e525c,
0 x39c9f1f8,
0 x26c6e2e4,
0 x3282b2b0,
0 x31013130,
0 x2acae2e8,
0 x2d4d616c,
0 x1f4f535c,
0 x24c4e0e4,
0 x30c0f0f0,
0 x0dcdc1cc,
0 x08888088,
0 x16061214,
0 x3a0a3238,
0 x18485058,
0 x14c4d0d4,
0 x22426260,
0 x29092128,
0 x07070304,
0 x33033330,
0 x28c8e0e8,
0 x1b0b1318,
0 x05050104,
0 x39497178,
0 x10809090,
0 x2a4a6268,
0 x2a0a2228,
0 x1a8a9298 },
{
0 x38380830,
0 xe828c8e0,
0 x2c2d0d21,
0 xa42686a2,
0 xcc0fcfc3,
0 xdc1eced2,
0 xb03383b3,
0 xb83888b0,
0 xac2f8fa3,
0 x60204060,
0 x54154551,
0 xc407c7c3,
0 x44044440,
0 x6c2f4f63,
0 x682b4b63,
0 x581b4b53,
0 xc003c3c3,
0 x60224262,
0 x30330333,
0 xb43585b1,
0 x28290921,
0 xa02080a0,
0 xe022c2e2,
0 xa42787a3,
0 xd013c3d3,
0 x90118191,
0 x10110111,
0 x04060602,
0 x1c1c0c10,
0 xbc3c8cb0,
0 x34360632,
0 x480b4b43,
0 xec2fcfe3,
0 x88088880,
0 x6c2c4c60,
0 xa82888a0,
0 x14170713,
0 xc404c4c0,
0 x14160612,
0 xf434c4f0,
0 xc002c2c2,
0 x44054541,
0 xe021c1e1,
0 xd416c6d2,
0 x3c3f0f33,
0 x3c3d0d31,
0 x8c0e8e82,
0 x98188890,
0 x28280820,
0 x4c0e4e42,
0 xf436c6f2,
0 x3c3e0e32,
0 xa42585a1,
0 xf839c9f1,
0 x0c0d0d01,
0 xdc1fcfd3,
0 xd818c8d0,
0 x282b0b23,
0 x64264662,
0 x783a4a72,
0 x24270723,
0 x2c2f0f23,
0 xf031c1f1,
0 x70324272,
0 x40024242,
0 xd414c4d0,
0 x40014141,
0 xc000c0c0,
0 x70334373,
0 x64274763,
0 xac2c8ca0,
0 x880b8b83,
0 xf437c7f3,
0 xac2d8da1,
0 x80008080,
0 x1c1f0f13,
0 xc80acac2,
0 x2c2c0c20,
0 xa82a8aa2,
0 x34340430,
0 xd012c2d2,
0 x080b0b03,
0 xec2ecee2,
0 xe829c9e1,
0 x5c1d4d51,
0 x94148490,
0 x18180810,
0 xf838c8f0,
0 x54174753,
0 xac2e8ea2,
0 x08080800,
0 xc405c5c1,
0 x10130313,
0 xcc0dcdc1,
0 x84068682,
0 xb83989b1,
0 xfc3fcff3,
0 x7c3d4d71,
0 xc001c1c1,
0 x30310131,
0 xf435c5f1,
0 x880a8a82,
0 x682a4a62,
0 xb03181b1,
0 xd011c1d1,
0 x20200020,
0 xd417c7d3,
0 x00020202,
0 x20220222,
0 x04040400,
0 x68284860,
0 x70314171,
0 x04070703,
0 xd81bcbd3,
0 x9c1d8d91,
0 x98198991,
0 x60214161,
0 xbc3e8eb2,
0 xe426c6e2,
0 x58194951,
0 xdc1dcdd1,
0 x50114151,
0 x90108090,
0 xdc1cccd0,
0 x981a8a92,
0 xa02383a3,
0 xa82b8ba3,
0 xd010c0d0,
0 x80018181,
0 x0c0f0f03,
0 x44074743,
0 x181a0a12,
0 xe023c3e3,
0 xec2ccce0,
0 x8c0d8d81,
0 xbc3f8fb3,
0 x94168692,
0 x783b4b73,
0 x5c1c4c50,
0 xa02282a2,
0 xa02181a1,
0 x60234363,
0 x20230323,
0 x4c0d4d41,
0 xc808c8c0,
0 x9c1e8e92,
0 x9c1c8c90,
0 x383a0a32,
0 x0c0c0c00,
0 x2c2e0e22,
0 xb83a8ab2,
0 x6c2e4e62,
0 x9c1f8f93,
0 x581a4a52,
0 xf032c2f2,
0 x90128292,
0 xf033c3f3,
0 x48094941,
0 x78384870,
0 xcc0cccc0,
0 x14150511,
0 xf83bcbf3,
0 x70304070,
0 x74354571,
0 x7c3f4f73,
0 x34350531,
0 x10100010,
0 x00030303,
0 x64244460,
0 x6c2d4d61,
0 xc406c6c2,
0 x74344470,
0 xd415c5d1,
0 xb43484b0,
0 xe82acae2,
0 x08090901,
0 x74364672,
0 x18190911,
0 xfc3ecef2,
0 x40004040,
0 x10120212,
0 xe020c0e0,
0 xbc3d8db1,
0 x04050501,
0 xf83acaf2,
0 x00010101,
0 xf030c0f0,
0 x282a0a22,
0 x5c1e4e52,
0 xa82989a1,
0 x54164652,
0 x40034343,
0 x84058581,
0 x14140410,
0 x88098981,
0 x981b8b93,
0 xb03080b0,
0 xe425c5e1,
0 x48084840,
0 x78394971,
0 x94178793,
0 xfc3cccf0,
0 x1c1e0e12,
0 x80028282,
0 x20210121,
0 x8c0c8c80,
0 x181b0b13,
0 x5c1f4f53,
0 x74374773,
0 x54144450,
0 xb03282b2,
0 x1c1d0d11,
0 x24250521,
0 x4c0f4f43,
0 x00000000,
0 x44064642,
0 xec2dcde1,
0 x58184850,
0 x50124252,
0 xe82bcbe3,
0 x7c3e4e72,
0 xd81acad2,
0 xc809c9c1,
0 xfc3dcdf1,
0 x30300030,
0 x94158591,
0 x64254561,
0 x3c3c0c30,
0 xb43686b2,
0 xe424c4e0,
0 xb83b8bb3,
0 x7c3c4c70,
0 x0c0e0e02,
0 x50104050,
0 x38390931,
0 x24260622,
0 x30320232,
0 x84048480,
0 x68294961,
0 x90138393,
0 x34370733,
0 xe427c7e3,
0 x24240420,
0 xa42484a0,
0 xc80bcbc3,
0 x50134353,
0 x080a0a02,
0 x84078783,
0 xd819c9d1,
0 x4c0c4c40,
0 x80038383,
0 x8c0f8f83,
0 xcc0ecec2,
0 x383b0b33,
0 x480a4a42,
0 xb43787b3 },
{
0 xa1a82989,
0 x81840585,
0 xd2d416c6,
0 xd3d013c3,
0 x50541444,
0 x111c1d0d,
0 xa0ac2c8c,
0 x21242505,
0 x515c1d4d,
0 x43400343,
0 x10181808,
0 x121c1e0e,
0 x51501141,
0 xf0fc3ccc,
0 xc2c80aca,
0 x63602343,
0 x20282808,
0 x40440444,
0 x20202000,
0 x919c1d8d,
0 xe0e020c0,
0 xe2e022c2,
0 xc0c808c8,
0 x13141707,
0 xa1a42585,
0 x838c0f8f,
0 x03000303,
0 x73783b4b,
0 xb3b83b8b,
0 x13101303,
0 xd2d012c2,
0 xe2ec2ece,
0 x70703040,
0 x808c0c8c,
0 x333c3f0f,
0 xa0a82888,
0 x32303202,
0 xd1dc1dcd,
0 xf2f436c6,
0 x70743444,
0 xe0ec2ccc,
0 x91941585,
0 x03080b0b,
0 x53541747,
0 x505c1c4c,
0 x53581b4b,
0 xb1bc3d8d,
0 x01000101,
0 x20242404,
0 x101c1c0c,
0 x73703343,
0 x90981888,
0 x10101000,
0 xc0cc0ccc,
0 xf2f032c2,
0 xd1d819c9,
0 x202c2c0c,
0 xe3e427c7,
0 x72703242,
0 x83800383,
0 x93981b8b,
0 xd1d011c1,
0 x82840686,
0 xc1c809c9,
0 x60602040,
0 x50501040,
0 xa3a02383,
0 xe3e82bcb,
0 x010c0d0d,
0 xb2b43686,
0 x929c1e8e,
0 x434c0f4f,
0 xb3b43787,
0 x52581a4a,
0 xc2c406c6,
0 x70783848,
0 xa2a42686,
0 x12101202,
0 xa3ac2f8f,
0 xd1d415c5,
0 x61602141,
0 xc3c003c3,
0 xb0b43484,
0 x41400141,
0 x52501242,
0 x717c3d4d,
0 x818c0d8d,
0 x00080808,
0 x131c1f0f,
0 x91981989,
0 x00000000,
0 x11181909,
0 x00040404,
0 x53501343,
0 xf3f437c7,
0 xe1e021c1,
0 xf1fc3dcd,
0 x72743646,
0 x232c2f0f,
0 x23242707,
0 xb0b03080,
0 x83880b8b,
0 x020c0e0e,
0 xa3a82b8b,
0 xa2a02282,
0 x626c2e4e,
0 x93901383,
0 x414c0d4d,
0 x61682949,
0 x707c3c4c,
0 x01080909,
0 x02080a0a,
0 xb3bc3f8f,
0 xe3ec2fcf,
0 xf3f033c3,
0 xc1c405c5,
0 x83840787,
0 x10141404,
0 xf2fc3ece,
0 x60642444,
0 xd2dc1ece,
0 x222c2e0e,
0 x43480b4b,
0 x12181a0a,
0 x02040606,
0 x21202101,
0 x63682b4b,
0 x62642646,
0 x02000202,
0 xf1f435c5,
0 x92901282,
0 x82880a8a,
0 x000c0c0c,
0 xb3b03383,
0 x727c3e4e,
0 xd0d010c0,
0 x72783a4a,
0 x43440747,
0 x92941686,
0 xe1e425c5,
0 x22242606,
0 x80800080,
0 xa1ac2d8d,
0 xd3dc1fcf,
0 xa1a02181,
0 x30303000,
0 x33343707,
0 xa2ac2e8e,
0 x32343606,
0 x11141505,
0 x22202202,
0 x30383808,
0 xf0f434c4,
0 xa3a42787,
0 x41440545,
0 x404c0c4c,
0 x81800181,
0 xe1e829c9,
0 x80840484,
0 x93941787,
0 x31343505,
0 xc3c80bcb,
0 xc2cc0ece,
0 x303c3c0c,
0 x71703141,
0 x11101101,
0 xc3c407c7,
0 x81880989,
0 x71743545,
0 xf3f83bcb,
0 xd2d81aca,
0 xf0f838c8,
0 x90941484,
0 x51581949,
0 x82800282,
0 xc0c404c4,
0 xf3fc3fcf,
0 x41480949,
0 x31383909,
0 x63642747,
0 xc0c000c0,
0 xc3cc0fcf,
0 xd3d417c7,
0 xb0b83888,
0 x030c0f0f,
0 x828c0e8e,
0 x42400242,
0 x23202303,
0 x91901181,
0 x606c2c4c,
0 xd3d81bcb,
0 xa0a42484,
0 x30343404,
0 xf1f031c1,
0 x40480848,
0 xc2c002c2,
0 x636c2f4f,
0 x313c3d0d,
0 x212c2d0d,
0 x40400040,
0 xb2bc3e8e,
0 x323c3e0e,
0 xb0bc3c8c,
0 xc1c001c1,
0 xa2a82a8a,
0 xb2b83a8a,
0 x424c0e4e,
0 x51541545,
0 x33383b0b,
0 xd0dc1ccc,
0 x60682848,
0 x737c3f4f,
0 x909c1c8c,
0 xd0d818c8,
0 x42480a4a,
0 x52541646,
0 x73743747,
0 xa0a02080,
0 xe1ec2dcd,
0 x42440646,
0 xb1b43585,
0 x23282b0b,
0 x61642545,
0 xf2f83aca,
0 xe3e023c3,
0 xb1b83989,
0 xb1b03181,
0 x939c1f8f,
0 x525c1e4e,
0 xf1f839c9,
0 xe2e426c6,
0 xb2b03282,
0 x31303101,
0 xe2e82aca,
0 x616c2d4d,
0 x535c1f4f,
0 xe0e424c4,
0 xf0f030c0,
0 xc1cc0dcd,
0 x80880888,
0 x12141606,
0 x32383a0a,
0 x50581848,
0 xd0d414c4,
0 x62602242,
0 x21282909,
0 x03040707,
0 x33303303,
0 xe0e828c8,
0 x13181b0b,
0 x01040505,
0 x71783949,
0 x90901080,
0 x62682a4a,
0 x22282a0a,
0 x92981a8a },
{
0 x08303838,
0 xc8e0e828,
0 x0d212c2d,
0 x86a2a426,
0 xcfc3cc0f,
0 xced2dc1e,
0 x83b3b033,
0 x88b0b838,
0 x8fa3ac2f,
0 x40606020,
0 x45515415,
0 xc7c3c407,
0 x44404404,
0 x4f636c2f,
0 x4b63682b,
0 x4b53581b,
0 xc3c3c003,
0 x42626022,
0 x03333033,
0 x85b1b435,
0 x09212829,
0 x80a0a020,
0 xc2e2e022,
0 x87a3a427,
0 xc3d3d013,
0 x81919011,
0 x01111011,
0 x06020406,
0 x0c101c1c,
0 x8cb0bc3c,
0 x06323436,
0 x4b43480b,
0 xcfe3ec2f,
0 x88808808,
0 x4c606c2c,
0 x88a0a828,
0 x07131417,
0 xc4c0c404,
0 x06121416,
0 xc4f0f434,
0 xc2c2c002,
0 x45414405,
0 xc1e1e021,
0 xc6d2d416,
0 x0f333c3f,
0 x0d313c3d,
0 x8e828c0e,
0 x88909818,
0 x08202828,
0 x4e424c0e,
0 xc6f2f436,
0 x0e323c3e,
0 x85a1a425,
0 xc9f1f839,
0 x0d010c0d,
0 xcfd3dc1f,
0 xc8d0d818,
0 x0b23282b,
0 x46626426,
0 x4a72783a,
0 x07232427,
0 x0f232c2f,
0 xc1f1f031,
0 x42727032,
0 x42424002,
0 xc4d0d414,
0 x41414001,
0 xc0c0c000,
0 x43737033,
0 x47636427,
0 x8ca0ac2c,
0 x8b83880b,
0 xc7f3f437,
0 x8da1ac2d,
0 x80808000,
0 x0f131c1f,
0 xcac2c80a,
0 x0c202c2c,
0 x8aa2a82a,
0 x04303434,
0 xc2d2d012,
0 x0b03080b,
0 xcee2ec2e,
0 xc9e1e829,
0 x4d515c1d,
0 x84909414,
0 x08101818,
0 xc8f0f838,
0 x47535417,
0 x8ea2ac2e,
0 x08000808,
0 xc5c1c405,
0 x03131013,
0 xcdc1cc0d,
0 x86828406,
0 x89b1b839,
0 xcff3fc3f,
0 x4d717c3d,
0 xc1c1c001,
0 x01313031,
0 xc5f1f435,
0 x8a82880a,
0 x4a62682a,
0 x81b1b031,
0 xc1d1d011,
0 x00202020,
0 xc7d3d417,
0 x02020002,
0 x02222022,
0 x04000404,
0 x48606828,
0 x41717031,
0 x07030407,
0 xcbd3d81b,
0 x8d919c1d,
0 x89919819,
0 x41616021,
0 x8eb2bc3e,
0 xc6e2e426,
0 x49515819,
0 xcdd1dc1d,
0 x41515011,
0 x80909010,
0 xccd0dc1c,
0 x8a92981a,
0 x83a3a023,
0 x8ba3a82b,
0 xc0d0d010,
0 x81818001,
0 x0f030c0f,
0 x47434407,
0 x0a12181a,
0 xc3e3e023,
0 xcce0ec2c,
0 x8d818c0d,
0 x8fb3bc3f,
0 x86929416,
0 x4b73783b,
0 x4c505c1c,
0 x82a2a022,
0 x81a1a021,
0 x43636023,
0 x03232023,
0 x4d414c0d,
0 xc8c0c808,
0 x8e929c1e,
0 x8c909c1c,
0 x0a32383a,
0 x0c000c0c,
0 x0e222c2e,
0 x8ab2b83a,
0 x4e626c2e,
0 x8f939c1f,
0 x4a52581a,
0 xc2f2f032,
0 x82929012,
0 xc3f3f033,
0 x49414809,
0 x48707838,
0 xccc0cc0c,
0 x05111415,
0 xcbf3f83b,
0 x40707030,
0 x45717435,
0 x4f737c3f,
0 x05313435,
0 x00101010,
0 x03030003,
0 x44606424,
0 x4d616c2d,
0 xc6c2c406,
0 x44707434,
0 xc5d1d415,
0 x84b0b434,
0 xcae2e82a,
0 x09010809,
0 x46727436,
0 x09111819,
0 xcef2fc3e,
0 x40404000,
0 x02121012,
0 xc0e0e020,
0 x8db1bc3d,
0 x05010405,
0 xcaf2f83a,
0 x01010001,
0 xc0f0f030,
0 x0a22282a,
0 x4e525c1e,
0 x89a1a829,
0 x46525416,
0 x43434003,
0 x85818405,
0 x04101414,
0 x89818809,
0 x8b93981b,
0 x80b0b030,
0 xc5e1e425,
0 x48404808,
0 x49717839,
0 x87939417,
0 xccf0fc3c,
0 x0e121c1e,
0 x82828002,
0 x01212021,
0 x8c808c0c,
0 x0b13181b,
0 x4f535c1f,
0 x47737437,
0 x44505414,
0 x82b2b032,
0 x0d111c1d,
0 x05212425,
0 x4f434c0f,
0 x00000000,
0 x46424406,
0 xcde1ec2d,
0 x48505818,
0 x42525012,
0 xcbe3e82b,
0 x4e727c3e,
0 xcad2d81a,
0 xc9c1c809,
0 xcdf1fc3d,
0 x00303030,
0 x85919415,
0 x45616425,
0 x0c303c3c,
0 x86b2b436,
0 xc4e0e424,
0 x8bb3b83b,
0 x4c707c3c,
0 x0e020c0e,
0 x40505010,
0 x09313839,
0 x06222426,
0 x02323032,
0 x84808404,
0 x49616829,
0 x83939013,
0 x07333437,
0 xc7e3e427,
0 x04202424,
0 x84a0a424,
0 xcbc3c80b,
0 x43535013,
0 x0a02080a,
0 x87838407,
0 xc9d1d819,
0 x4c404c0c,
0 x83838003,
0 x8f838c0f,
0 xcec2cc0e,
0 x0b33383b,
0 x4a42480a,
0 x87b3b437 }
};
/* key schedule constants - golden ratio */
#define KC0
0 x9e3779b9
#define KC1
0 x3c6ef373
#define KC2
0 x78dde6e6
#define KC3
0 xf1bbcdcc
#define KC4
0 xe3779b99
#define KC5
0 xc6ef3733
#define KC6
0 x8dde6e67
#define KC7
0 x1bbcdccf
#define KC8
0 x3779b99e
#define KC9
0 x6ef3733c
#define KC10
0 xdde6e678
#define KC11
0 xbbcdccf1
#define KC12
0 x779b99e3
#define KC13
0 xef3733c6
#define KC14
0 xde6e678d
#define KC15
0 xbcdccf1b
void
SEED_set_key(
const unsigned char rawkey[SEED_KEY_LENGTH],
SEED_KEY_SCHEDULE *ks)
{
seed_word K0, K1, K2, K3;
seed_word t0, t1;
char2word(rawkey, K0);
char2word(rawkey +
4 , K1);
char2word(rawkey +
8 , K2);
char2word(rawkey +
12 , K3);
t0 = (K0 + K2 - KC0);
t1 = (K1 - K3 + KC0);
KEYUPDATE_TEMP(t0, t1, &ks->data[
0 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC1);
KEYUPDATE_TEMP(t0, t1, &ks->data[
2 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC2);
KEYUPDATE_TEMP(t0, t1, &ks->data[
4 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC3);
KEYUPDATE_TEMP(t0, t1, &ks->data[
6 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC4);
KEYUPDATE_TEMP(t0, t1, &ks->data[
8 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC5);
KEYUPDATE_TEMP(t0, t1, &ks->data[
10 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC6);
KEYUPDATE_TEMP(t0, t1, &ks->data[
12 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC7);
KEYUPDATE_TEMP(t0, t1, &ks->data[
14 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC8);
KEYUPDATE_TEMP(t0, t1, &ks->data[
16 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC9);
KEYUPDATE_TEMP(t0, t1, &ks->data[
18 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC10);
KEYUPDATE_TEMP(t0, t1, &ks->data[
20 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC11);
KEYUPDATE_TEMP(t0, t1, &ks->data[
22 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC12);
KEYUPDATE_TEMP(t0, t1, &ks->data[
24 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC13);
KEYUPDATE_TEMP(t0, t1, &ks->data[
26 ]);
KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC14);
KEYUPDATE_TEMP(t0, t1, &ks->data[
28 ]);
KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC15);
KEYUPDATE_TEMP(t0, t1, &ks->data[
30 ]);
}
void
SEED_encrypt(
const unsigned char s[SEED_BLOCK_SIZE],
unsigned char d[SEED_BLOCK_SIZE],
const SEED_KEY_SCHEDULE *ks)
{
seed_word L0, L1, R0, R1;
seed_word t0, t1;
char2word(s, L0);
char2word(s +
4 , L1);
char2word(s +
8 , R0);
char2word(s +
12 , R1);
E_SEED(t0, t1, L0, L1, R0, R1,
0 );
E_SEED(t0, t1, R0, R1, L0, L1,
2 );
E_SEED(t0, t1, L0, L1, R0, R1,
4 );
E_SEED(t0, t1, R0, R1, L0, L1,
6 );
E_SEED(t0, t1, L0, L1, R0, R1,
8 );
E_SEED(t0, t1, R0, R1, L0, L1,
10 );
E_SEED(t0, t1, L0, L1, R0, R1,
12 );
E_SEED(t0, t1, R0, R1, L0, L1,
14 );
E_SEED(t0, t1, L0, L1, R0, R1,
16 );
E_SEED(t0, t1, R0, R1, L0, L1,
18 );
E_SEED(t0, t1, L0, L1, R0, R1,
20 );
E_SEED(t0, t1, R0, R1, L0, L1,
22 );
E_SEED(t0, t1, L0, L1, R0, R1,
24 );
E_SEED(t0, t1, R0, R1, L0, L1,
26 );
E_SEED(t0, t1, L0, L1, R0, R1,
28 );
E_SEED(t0, t1, R0, R1, L0, L1,
30 );
word2char(R0, d);
word2char(R1, d +
4 );
word2char(L0, d +
8 );
word2char(L1, d +
12 );
}
void
SEED_decrypt(
const unsigned char s[SEED_BLOCK_SIZE],
unsigned char d[SEED_BLOCK_SIZE],
const SEED_KEY_SCHEDULE *ks)
{
seed_word L0, L1, R0, R1;
seed_word t0, t1;
char2word(s, L0);
char2word(s +
4 , L1);
char2word(s +
8 , R0);
char2word(s +
12 , R1);
E_SEED(t0, t1, L0, L1, R0, R1,
30 );
E_SEED(t0, t1, R0, R1, L0, L1,
28 );
E_SEED(t0, t1, L0, L1, R0, R1,
26 );
E_SEED(t0, t1, R0, R1, L0, L1,
24 );
E_SEED(t0, t1, L0, L1, R0, R1,
22 );
E_SEED(t0, t1, R0, R1, L0, L1,
20 );
E_SEED(t0, t1, L0, L1, R0, R1,
18 );
E_SEED(t0, t1, R0, R1, L0, L1,
16 );
E_SEED(t0, t1, L0, L1, R0, R1,
14 );
E_SEED(t0, t1, R0, R1, L0, L1,
12 );
E_SEED(t0, t1, L0, L1, R0, R1,
10 );
E_SEED(t0, t1, R0, R1, L0, L1,
8 );
E_SEED(t0, t1, L0, L1, R0, R1,
6 );
E_SEED(t0, t1, R0, R1, L0, L1,
4 );
E_SEED(t0, t1, L0, L1, R0, R1,
2 );
E_SEED(t0, t1, R0, R1, L0, L1,
0 );
word2char(R0, d);
word2char(R1, d +
4 );
word2char(L0, d +
8 );
word2char(L1, d +
12 );
}
void
SEED_ecb_encrypt(
const unsigned char *in,
unsigned char *out,
size_t inLen,
const SEED_KEY_SCHEDULE *ks,
int enc)
{
if (enc) {
while (inLen >
0 ) {
SEED_encrypt(in, out, ks);
out += SEED_BLOCK_SIZE;
in += SEED_BLOCK_SIZE;
inLen -= SEED_BLOCK_SIZE;
}
}
else {
while (inLen >
0 ) {
SEED_decrypt(in, out, ks);
out += SEED_BLOCK_SIZE;
in += SEED_BLOCK_SIZE;
inLen -= SEED_BLOCK_SIZE;
}
}
}
void
SEED_cbc_encrypt(
const unsigned char *in,
unsigned char *out,
size_t len,
const SEED_KEY_SCHEDULE *ks,
unsigned char ivec[SEED_BLOCK_SIZE],
int enc)
{
size_t n;
unsigned char tmp[SEED_BLOCK_SIZE];
const unsigned char *iv = ivec;
if (enc) {
while (len >= SEED_BLOCK_SIZE) {
for (n =
0 ; n < SEED_BLOCK_SIZE; ++n) {
out[n] = in[n] ^ iv[n];
}
SEED_encrypt(out, out, ks);
iv = out;
len -= SEED_BLOCK_SIZE;
in += SEED_BLOCK_SIZE;
out += SEED_BLOCK_SIZE;
}
if (len) {
for (n =
0 ; n < len; ++n) {
out[n] = in[n] ^ iv[n];
}
for (n = len; n < SEED_BLOCK_SIZE; ++n) {
out[n] = iv[n];
}
SEED_encrypt(out, out, ks);
iv = out;
}
memcpy(ivec, iv, SEED_BLOCK_SIZE);
}
else if (in != out) {
while (len >= SEED_BLOCK_SIZE) {
SEED_decrypt(in, out, ks);
for (n =
0 ; n < SEED_BLOCK_SIZE; ++n) {
out[n] ^= iv[n];
}
iv = in;
len -= SEED_BLOCK_SIZE;
in += SEED_BLOCK_SIZE;
out += SEED_BLOCK_SIZE;
}
if (len) {
SEED_decrypt(in, tmp, ks);
for (n =
0 ; n < len; ++n) {
out[n] = tmp[n] ^ iv[n];
}
iv = in;
}
memcpy(ivec, iv, SEED_BLOCK_SIZE);
}
else {
while (len >= SEED_BLOCK_SIZE) {
memcpy(tmp, in, SEED_BLOCK_SIZE);
SEED_decrypt(in, out, ks);
for (n =
0 ; n < SEED_BLOCK_SIZE; ++n) {
out[n] ^= ivec[n];
}
memcpy(ivec, tmp, SEED_BLOCK_SIZE);
len -= SEED_BLOCK_SIZE;
in += SEED_BLOCK_SIZE;
out += SEED_BLOCK_SIZE;
}
if (len) {
memcpy(tmp, in, SEED_BLOCK_SIZE);
SEED_decrypt(tmp, tmp, ks);
for (n =
0 ; n < len; ++n) {
out[n] = tmp[n] ^ ivec[n];
}
memcpy(ivec, tmp, SEED_BLOCK_SIZE);
}
}
}
SEEDContext *
SEED_AllocateContext(
void )
{
return PORT_ZNew(SEEDContext);
}
SECStatus
SEED_InitContext(SEEDContext *cx,
const unsigned char *key,
unsigned int keylen,
const unsigned char *iv,
int mode,
unsigned int encrypt,
unsigned int unused)
{
if (!cx) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
switch (mode) {
case NSS_SEED:
SEED_set_key(key, &cx->ks);
cx->mode = NSS_SEED;
cx->encrypt = encrypt;
break ;
case NSS_SEED_CBC:
memcpy(cx->iv, iv,
16 );
SEED_set_key(key, &cx->ks);
cx->mode = NSS_SEED_CBC;
cx->encrypt = encrypt;
break ;
default :
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
return SECSuccess;
}
SEEDContext *
SEED_CreateContext(
const unsigned char *key,
const unsigned char *iv,
int mode, PRBool encrypt)
{
SEEDContext *cx = PORT_ZNew(SEEDContext);
SECStatus rv = SEED_InitContext(cx, key, SEED_KEY_LENGTH, iv, mode,
encrypt,
0 );
if (rv != SECSuccess) {
PORT_ZFree(cx,
sizeof *cx);
cx = NULL;
}
return cx;
}
void
SEED_DestroyContext(SEEDContext *cx, PRBool freeit)
{
if (cx) {
memset(cx,
0 ,
sizeof *cx);
if (freeit)
PORT_Free(cx);
}
}
SECStatus
SEED_Encrypt(SEEDContext *cx,
unsigned char *out,
unsigned int *outLen,
unsigned int maxOutLen,
const unsigned char *in,
unsigned int inLen)
{
if (!cx) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
if ((inLen % SEED_BLOCK_SIZE) !=
0 || maxOutLen < SEED_BLOCK_SIZE ||
maxOutLen < inLen) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
if (!cx->encrypt) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
switch (cx->mode) {
case NSS_SEED:
SEED_ecb_encrypt(in, out, inLen, &cx->ks,
1 );
*outLen = inLen;
break ;
case NSS_SEED_CBC:
SEED_cbc_encrypt(in, out, inLen, &cx->ks, cx->iv,
1 );
*outLen = inLen;
break ;
default :
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
return SECSuccess;
}
SECStatus
SEED_Decrypt(SEEDContext *cx,
unsigned char *out,
unsigned int *outLen,
unsigned int maxOutLen,
const unsigned char *in,
unsigned int inLen)
{
if (!cx) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
if ((inLen % SEED_BLOCK_SIZE) !=
0 || maxOutLen < SEED_BLOCK_SIZE ||
maxOutLen < inLen) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
if (cx->encrypt) {
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
switch (cx->mode) {
case NSS_SEED:
SEED_ecb_encrypt(in, out, inLen, &cx->ks,
0 );
*outLen = inLen;
break ;
case NSS_SEED_CBC:
SEED_cbc_encrypt(in, out, inLen, &cx->ks, cx->iv,
0 );
*outLen = inLen;
break ;
default :
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return SECFailure;
}
return SECSuccess;
}
Messung V0.5 in Prozent C=94 H=72 G=83
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-06)
¤
*© Formatika GbR, Deutschland