tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

seed.c (24854B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifdef FREEBL_NO_DEPEND
      6 #include "../stubs.h"
      7 #endif
      8 
      9 #include <stdio.h>
     10 #include <stdlib.h>
     11 #include <string.h>
     12 #include <stddef.h>
     13 #ifdef WIN32
     14 #include <memory.h>
     15 #endif
     16 
     17 #include "seed.h"
     18 #include "secerr.h"
     19 
     20 static const seed_word SS[4][256] = {
     21    { 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0,
     22      0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124,
     23      0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c,
     24      0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360,
     25      0x28082028, 0x04444044, 0x20002020, 0x1d8d919c,
     26      0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314,
     27      0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378,
     28      0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec,
     29      0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8,
     30      0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074,
     31      0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354,
     32      0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100,
     33      0x24042024, 0x1c0c101c, 0x33437370, 0x18889098,
     34      0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8,
     35      0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380,
     36      0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8,
     37      0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8,
     38      0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c,
     39      0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078,
     40      0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4,
     41      0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140,
     42      0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008,
     43      0x1f0f131c, 0x19899198, 0x00000000, 0x19091118,
     44      0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0,
     45      0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324,
     46      0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8,
     47      0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c,
     48      0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208,
     49      0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4,
     50      0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064,
     51      0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218,
     52      0x06060204, 0x21012120, 0x2b4b6368, 0x26466264,
     53      0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288,
     54      0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0,
     55      0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4,
     56      0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc,
     57      0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac,
     58      0x36063234, 0x15051114, 0x22022220, 0x38083038,
     59      0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c,
     60      0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394,
     61      0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c,
     62      0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188,
     63      0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8,
     64      0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4,
     65      0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364,
     66      0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8,
     67      0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320,
     68      0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4,
     69      0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0,
     70      0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040,
     71      0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0,
     72      0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154,
     73      0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c,
     74      0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254,
     75      0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244,
     76      0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8,
     77      0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c,
     78      0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0,
     79      0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c,
     80      0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088,
     81      0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4,
     82      0x22426260, 0x29092128, 0x07070304, 0x33033330,
     83      0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178,
     84      0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298 },
     85    { 0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2,
     86      0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0,
     87      0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3,
     88      0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53,
     89      0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1,
     90      0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3,
     91      0xd013c3d3, 0x90118191, 0x10110111, 0x04060602,
     92      0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43,
     93      0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0,
     94      0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0,
     95      0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2,
     96      0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890,
     97      0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32,
     98      0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3,
     99      0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72,
    100      0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272,
    101      0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0,
    102      0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83,
    103      0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13,
    104      0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430,
    105      0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1,
    106      0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0,
    107      0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1,
    108      0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1,
    109      0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131,
    110      0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1,
    111      0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202,
    112      0x20220222, 0x04040400, 0x68284860, 0x70314171,
    113      0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991,
    114      0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951,
    115      0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0,
    116      0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0,
    117      0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12,
    118      0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3,
    119      0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2,
    120      0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41,
    121      0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32,
    122      0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62,
    123      0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292,
    124      0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0,
    125      0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571,
    126      0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303,
    127      0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470,
    128      0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901,
    129      0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040,
    130      0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501,
    131      0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22,
    132      0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343,
    133      0x84058581, 0x14140410, 0x88098981, 0x981b8b93,
    134      0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971,
    135      0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282,
    136      0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53,
    137      0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11,
    138      0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642,
    139      0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3,
    140      0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1,
    141      0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30,
    142      0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70,
    143      0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622,
    144      0x30320232, 0x84048480, 0x68294961, 0x90138393,
    145      0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0,
    146      0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783,
    147      0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83,
    148      0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3 },
    149    { 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3,
    150      0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505,
    151      0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e,
    152      0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343,
    153      0x20282808, 0x40440444, 0x20202000, 0x919c1d8d,
    154      0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707,
    155      0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b,
    156      0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece,
    157      0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888,
    158      0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444,
    159      0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747,
    160      0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101,
    161      0x20242404, 0x101c1c0c, 0x73703343, 0x90981888,
    162      0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9,
    163      0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383,
    164      0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9,
    165      0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb,
    166      0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f,
    167      0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848,
    168      0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5,
    169      0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141,
    170      0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808,
    171      0x131c1f0f, 0x91981989, 0x00000000, 0x11181909,
    172      0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1,
    173      0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707,
    174      0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b,
    175      0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d,
    176      0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a,
    177      0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5,
    178      0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444,
    179      0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a,
    180      0x02040606, 0x21202101, 0x63682b4b, 0x62642646,
    181      0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a,
    182      0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0,
    183      0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5,
    184      0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf,
    185      0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e,
    186      0x32343606, 0x11141505, 0x22202202, 0x30383808,
    187      0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c,
    188      0x81800181, 0xe1e829c9, 0x80840484, 0x93941787,
    189      0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c,
    190      0x71703141, 0x11101101, 0xc3c407c7, 0x81880989,
    191      0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8,
    192      0x90941484, 0x51581949, 0x82800282, 0xc0c404c4,
    193      0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747,
    194      0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888,
    195      0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303,
    196      0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484,
    197      0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2,
    198      0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040,
    199      0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1,
    200      0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545,
    201      0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f,
    202      0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646,
    203      0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646,
    204      0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca,
    205      0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f,
    206      0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282,
    207      0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f,
    208      0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888,
    209      0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4,
    210      0x62602242, 0x21282909, 0x03040707, 0x33303303,
    211      0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949,
    212      0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a },
    213    { 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426,
    214      0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838,
    215      0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407,
    216      0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b,
    217      0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435,
    218      0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427,
    219      0xc3d3d013, 0x81919011, 0x01111011, 0x06020406,
    220      0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b,
    221      0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828,
    222      0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434,
    223      0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416,
    224      0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818,
    225      0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e,
    226      0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f,
    227      0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a,
    228      0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032,
    229      0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000,
    230      0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b,
    231      0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f,
    232      0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434,
    233      0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829,
    234      0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838,
    235      0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405,
    236      0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839,
    237      0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031,
    238      0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031,
    239      0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002,
    240      0x02222022, 0x04000404, 0x48606828, 0x41717031,
    241      0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819,
    242      0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819,
    243      0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c,
    244      0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010,
    245      0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a,
    246      0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f,
    247      0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022,
    248      0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d,
    249      0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a,
    250      0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e,
    251      0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012,
    252      0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c,
    253      0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435,
    254      0x4f737c3f, 0x05313435, 0x00101010, 0x03030003,
    255      0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434,
    256      0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809,
    257      0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000,
    258      0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405,
    259      0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a,
    260      0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003,
    261      0x85818405, 0x04101414, 0x89818809, 0x8b93981b,
    262      0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839,
    263      0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002,
    264      0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f,
    265      0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d,
    266      0x05212425, 0x4f434c0f, 0x00000000, 0x46424406,
    267      0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b,
    268      0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d,
    269      0x00303030, 0x85919415, 0x45616425, 0x0c303c3c,
    270      0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c,
    271      0x0e020c0e, 0x40505010, 0x09313839, 0x06222426,
    272      0x02323032, 0x84808404, 0x49616829, 0x83939013,
    273      0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424,
    274      0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407,
    275      0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f,
    276      0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437 }
    277 };
    278 
    279 /* key schedule constants - golden ratio */
    280 #define KC0 0x9e3779b9
    281 #define KC1 0x3c6ef373
    282 #define KC2 0x78dde6e6
    283 #define KC3 0xf1bbcdcc
    284 #define KC4 0xe3779b99
    285 #define KC5 0xc6ef3733
    286 #define KC6 0x8dde6e67
    287 #define KC7 0x1bbcdccf
    288 #define KC8 0x3779b99e
    289 #define KC9 0x6ef3733c
    290 #define KC10 0xdde6e678
    291 #define KC11 0xbbcdccf1
    292 #define KC12 0x779b99e3
    293 #define KC13 0xef3733c6
    294 #define KC14 0xde6e678d
    295 #define KC15 0xbcdccf1b
    296 
    297 void
    298 SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH],
    299             SEED_KEY_SCHEDULE *ks)
    300 {
    301    seed_word K0, K1, K2, K3;
    302    seed_word t0, t1;
    303 
    304    char2word(rawkey, K0);
    305    char2word(rawkey + 4, K1);
    306    char2word(rawkey + 8, K2);
    307    char2word(rawkey + 12, K3);
    308 
    309    t0 = (K0 + K2 - KC0);
    310    t1 = (K1 - K3 + KC0);
    311    KEYUPDATE_TEMP(t0, t1, &ks->data[0]);
    312    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC1);
    313    KEYUPDATE_TEMP(t0, t1, &ks->data[2]);
    314    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC2);
    315    KEYUPDATE_TEMP(t0, t1, &ks->data[4]);
    316    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC3);
    317    KEYUPDATE_TEMP(t0, t1, &ks->data[6]);
    318    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC4);
    319    KEYUPDATE_TEMP(t0, t1, &ks->data[8]);
    320    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC5);
    321    KEYUPDATE_TEMP(t0, t1, &ks->data[10]);
    322    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC6);
    323    KEYUPDATE_TEMP(t0, t1, &ks->data[12]);
    324    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC7);
    325    KEYUPDATE_TEMP(t0, t1, &ks->data[14]);
    326    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC8);
    327    KEYUPDATE_TEMP(t0, t1, &ks->data[16]);
    328    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC9);
    329    KEYUPDATE_TEMP(t0, t1, &ks->data[18]);
    330    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC10);
    331    KEYUPDATE_TEMP(t0, t1, &ks->data[20]);
    332    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC11);
    333    KEYUPDATE_TEMP(t0, t1, &ks->data[22]);
    334    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC12);
    335    KEYUPDATE_TEMP(t0, t1, &ks->data[24]);
    336    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC13);
    337    KEYUPDATE_TEMP(t0, t1, &ks->data[26]);
    338    KEYSCHEDULE_UPDATE0(t0, t1, K0, K1, K2, K3, KC14);
    339    KEYUPDATE_TEMP(t0, t1, &ks->data[28]);
    340    KEYSCHEDULE_UPDATE1(t0, t1, K0, K1, K2, K3, KC15);
    341    KEYUPDATE_TEMP(t0, t1, &ks->data[30]);
    342 }
    343 
    344 void
    345 SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE],
    346             unsigned char d[SEED_BLOCK_SIZE],
    347             const SEED_KEY_SCHEDULE *ks)
    348 {
    349    seed_word L0, L1, R0, R1;
    350    seed_word t0, t1;
    351 
    352    char2word(s, L0);
    353    char2word(s + 4, L1);
    354    char2word(s + 8, R0);
    355    char2word(s + 12, R1);
    356 
    357    E_SEED(t0, t1, L0, L1, R0, R1, 0);
    358    E_SEED(t0, t1, R0, R1, L0, L1, 2);
    359    E_SEED(t0, t1, L0, L1, R0, R1, 4);
    360    E_SEED(t0, t1, R0, R1, L0, L1, 6);
    361    E_SEED(t0, t1, L0, L1, R0, R1, 8);
    362    E_SEED(t0, t1, R0, R1, L0, L1, 10);
    363    E_SEED(t0, t1, L0, L1, R0, R1, 12);
    364    E_SEED(t0, t1, R0, R1, L0, L1, 14);
    365    E_SEED(t0, t1, L0, L1, R0, R1, 16);
    366    E_SEED(t0, t1, R0, R1, L0, L1, 18);
    367    E_SEED(t0, t1, L0, L1, R0, R1, 20);
    368    E_SEED(t0, t1, R0, R1, L0, L1, 22);
    369    E_SEED(t0, t1, L0, L1, R0, R1, 24);
    370    E_SEED(t0, t1, R0, R1, L0, L1, 26);
    371    E_SEED(t0, t1, L0, L1, R0, R1, 28);
    372    E_SEED(t0, t1, R0, R1, L0, L1, 30);
    373 
    374    word2char(R0, d);
    375    word2char(R1, d + 4);
    376    word2char(L0, d + 8);
    377    word2char(L1, d + 12);
    378 }
    379 
    380 void
    381 SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE],
    382             unsigned char d[SEED_BLOCK_SIZE],
    383             const SEED_KEY_SCHEDULE *ks)
    384 {
    385    seed_word L0, L1, R0, R1;
    386    seed_word t0, t1;
    387 
    388    char2word(s, L0);
    389    char2word(s + 4, L1);
    390    char2word(s + 8, R0);
    391    char2word(s + 12, R1);
    392 
    393    E_SEED(t0, t1, L0, L1, R0, R1, 30);
    394    E_SEED(t0, t1, R0, R1, L0, L1, 28);
    395    E_SEED(t0, t1, L0, L1, R0, R1, 26);
    396    E_SEED(t0, t1, R0, R1, L0, L1, 24);
    397    E_SEED(t0, t1, L0, L1, R0, R1, 22);
    398    E_SEED(t0, t1, R0, R1, L0, L1, 20);
    399    E_SEED(t0, t1, L0, L1, R0, R1, 18);
    400    E_SEED(t0, t1, R0, R1, L0, L1, 16);
    401    E_SEED(t0, t1, L0, L1, R0, R1, 14);
    402    E_SEED(t0, t1, R0, R1, L0, L1, 12);
    403    E_SEED(t0, t1, L0, L1, R0, R1, 10);
    404    E_SEED(t0, t1, R0, R1, L0, L1, 8);
    405    E_SEED(t0, t1, L0, L1, R0, R1, 6);
    406    E_SEED(t0, t1, R0, R1, L0, L1, 4);
    407    E_SEED(t0, t1, L0, L1, R0, R1, 2);
    408    E_SEED(t0, t1, R0, R1, L0, L1, 0);
    409 
    410    word2char(R0, d);
    411    word2char(R1, d + 4);
    412    word2char(L0, d + 8);
    413    word2char(L1, d + 12);
    414 }
    415 
    416 void
    417 SEED_ecb_encrypt(const unsigned char *in,
    418                 unsigned char *out,
    419                 size_t inLen,
    420                 const SEED_KEY_SCHEDULE *ks, int enc)
    421 {
    422    if (enc) {
    423        while (inLen > 0) {
    424            SEED_encrypt(in, out, ks);
    425            out += SEED_BLOCK_SIZE;
    426            in += SEED_BLOCK_SIZE;
    427            inLen -= SEED_BLOCK_SIZE;
    428        }
    429    } else {
    430        while (inLen > 0) {
    431            SEED_decrypt(in, out, ks);
    432            out += SEED_BLOCK_SIZE;
    433            in += SEED_BLOCK_SIZE;
    434            inLen -= SEED_BLOCK_SIZE;
    435        }
    436    }
    437 }
    438 
    439 void
    440 SEED_cbc_encrypt(const unsigned char *in, unsigned char *out,
    441                 size_t len, const SEED_KEY_SCHEDULE *ks,
    442                 unsigned char ivec[SEED_BLOCK_SIZE], int enc)
    443 {
    444    size_t n;
    445    unsigned char tmp[SEED_BLOCK_SIZE];
    446    const unsigned char *iv = ivec;
    447 
    448    if (enc) {
    449        while (len >= SEED_BLOCK_SIZE) {
    450            for (n = 0; n < SEED_BLOCK_SIZE; ++n) {
    451                out[n] = in[n] ^ iv[n];
    452            }
    453 
    454            SEED_encrypt(out, out, ks);
    455            iv = out;
    456            len -= SEED_BLOCK_SIZE;
    457            in += SEED_BLOCK_SIZE;
    458            out += SEED_BLOCK_SIZE;
    459        }
    460 
    461        if (len) {
    462            for (n = 0; n < len; ++n) {
    463                out[n] = in[n] ^ iv[n];
    464            }
    465 
    466            for (n = len; n < SEED_BLOCK_SIZE; ++n) {
    467                out[n] = iv[n];
    468            }
    469 
    470            SEED_encrypt(out, out, ks);
    471            iv = out;
    472        }
    473 
    474        memcpy(ivec, iv, SEED_BLOCK_SIZE);
    475    } else if (in != out) {
    476        while (len >= SEED_BLOCK_SIZE) {
    477            SEED_decrypt(in, out, ks);
    478 
    479            for (n = 0; n < SEED_BLOCK_SIZE; ++n) {
    480                out[n] ^= iv[n];
    481            }
    482 
    483            iv = in;
    484            len -= SEED_BLOCK_SIZE;
    485            in += SEED_BLOCK_SIZE;
    486            out += SEED_BLOCK_SIZE;
    487        }
    488 
    489        if (len) {
    490            SEED_decrypt(in, tmp, ks);
    491 
    492            for (n = 0; n < len; ++n) {
    493                out[n] = tmp[n] ^ iv[n];
    494            }
    495 
    496            iv = in;
    497        }
    498 
    499        memcpy(ivec, iv, SEED_BLOCK_SIZE);
    500    } else {
    501        while (len >= SEED_BLOCK_SIZE) {
    502            memcpy(tmp, in, SEED_BLOCK_SIZE);
    503            SEED_decrypt(in, out, ks);
    504 
    505            for (n = 0; n < SEED_BLOCK_SIZE; ++n) {
    506                out[n] ^= ivec[n];
    507            }
    508 
    509            memcpy(ivec, tmp, SEED_BLOCK_SIZE);
    510            len -= SEED_BLOCK_SIZE;
    511            in += SEED_BLOCK_SIZE;
    512            out += SEED_BLOCK_SIZE;
    513        }
    514 
    515        if (len) {
    516            memcpy(tmp, in, SEED_BLOCK_SIZE);
    517            SEED_decrypt(tmp, tmp, ks);
    518 
    519            for (n = 0; n < len; ++n) {
    520                out[n] = tmp[n] ^ ivec[n];
    521            }
    522 
    523            memcpy(ivec, tmp, SEED_BLOCK_SIZE);
    524        }
    525    }
    526 }
    527 
    528 SEEDContext *
    529 SEED_AllocateContext(void)
    530 {
    531    return PORT_ZNew(SEEDContext);
    532 }
    533 
    534 SECStatus
    535 SEED_InitContext(SEEDContext *cx, const unsigned char *key,
    536                 unsigned int keylen, const unsigned char *iv,
    537                 int mode, unsigned int encrypt, unsigned int unused)
    538 {
    539    if (!cx) {
    540        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    541        return SECFailure;
    542    }
    543 
    544    switch (mode) {
    545        case NSS_SEED:
    546            SEED_set_key(key, &cx->ks);
    547            cx->mode = NSS_SEED;
    548            cx->encrypt = encrypt;
    549            break;
    550 
    551        case NSS_SEED_CBC:
    552            memcpy(cx->iv, iv, 16);
    553            SEED_set_key(key, &cx->ks);
    554            cx->mode = NSS_SEED_CBC;
    555            cx->encrypt = encrypt;
    556            break;
    557 
    558        default:
    559            PORT_SetError(SEC_ERROR_INVALID_ARGS);
    560            return SECFailure;
    561    }
    562 
    563    return SECSuccess;
    564 }
    565 
    566 SEEDContext *
    567 SEED_CreateContext(const unsigned char *key, const unsigned char *iv,
    568                   int mode, PRBool encrypt)
    569 {
    570    SEEDContext *cx = PORT_ZNew(SEEDContext);
    571    SECStatus rv = SEED_InitContext(cx, key, SEED_KEY_LENGTH, iv, mode,
    572                                    encrypt, 0);
    573 
    574    if (rv != SECSuccess) {
    575        PORT_ZFree(cx, sizeof *cx);
    576        cx = NULL;
    577    }
    578 
    579    return cx;
    580 }
    581 
    582 void
    583 SEED_DestroyContext(SEEDContext *cx, PRBool freeit)
    584 {
    585    if (cx) {
    586        memset(cx, 0, sizeof *cx);
    587 
    588        if (freeit)
    589            PORT_Free(cx);
    590    }
    591 }
    592 
    593 SECStatus
    594 SEED_Encrypt(SEEDContext *cx, unsigned char *out, unsigned int *outLen,
    595             unsigned int maxOutLen, const unsigned char *in,
    596             unsigned int inLen)
    597 {
    598    if (!cx) {
    599        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    600        return SECFailure;
    601    }
    602 
    603    if ((inLen % SEED_BLOCK_SIZE) != 0 || maxOutLen < SEED_BLOCK_SIZE ||
    604        maxOutLen < inLen) {
    605        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    606        return SECFailure;
    607    }
    608 
    609    if (!cx->encrypt) {
    610        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    611        return SECFailure;
    612    }
    613 
    614    switch (cx->mode) {
    615        case NSS_SEED:
    616            SEED_ecb_encrypt(in, out, inLen, &cx->ks, 1);
    617            *outLen = inLen;
    618            break;
    619 
    620        case NSS_SEED_CBC:
    621            SEED_cbc_encrypt(in, out, inLen, &cx->ks, cx->iv, 1);
    622            *outLen = inLen;
    623            break;
    624 
    625        default:
    626            PORT_SetError(SEC_ERROR_INVALID_ARGS);
    627            return SECFailure;
    628    }
    629 
    630    return SECSuccess;
    631 }
    632 
    633 SECStatus
    634 SEED_Decrypt(SEEDContext *cx, unsigned char *out, unsigned int *outLen,
    635             unsigned int maxOutLen, const unsigned char *in,
    636             unsigned int inLen)
    637 {
    638    if (!cx) {
    639        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    640        return SECFailure;
    641    }
    642 
    643    if ((inLen % SEED_BLOCK_SIZE) != 0 || maxOutLen < SEED_BLOCK_SIZE ||
    644        maxOutLen < inLen) {
    645        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    646        return SECFailure;
    647    }
    648 
    649    if (cx->encrypt) {
    650        PORT_SetError(SEC_ERROR_INVALID_ARGS);
    651        return SECFailure;
    652    }
    653 
    654    switch (cx->mode) {
    655        case NSS_SEED:
    656            SEED_ecb_encrypt(in, out, inLen, &cx->ks, 0);
    657            *outLen = inLen;
    658            break;
    659 
    660        case NSS_SEED_CBC:
    661            SEED_cbc_encrypt(in, out, inLen, &cx->ks, cx->iv, 0);
    662            *outLen = inLen;
    663            break;
    664 
    665        default:
    666            PORT_SetError(SEC_ERROR_INVALID_ARGS);
    667            return SECFailure;
    668    }
    669 
    670    return SECSuccess;
    671 }