1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003 |
- (function() {
- var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
-
- var util = C.util, charenc = C.charenc, UTF8 = charenc.UTF8;
-
- var KeySchedule;
-
- KeySchedule = function(key) {
-
- this.keys = new Array(16);
- this._initialiseKeys(key);
- };
-
- KeySchedule.PC1_offsets = [ 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0,
- 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6,
- 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 3, 2, 1, 0 ];
-
- KeySchedule.PC1_masks = [ 128, 128, 128, 128, 128, 128, 128, 128, 64, 64,
- 64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16,
- 16, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
- 8, 8, 8, 16, 16, 16, 16 ];
-
- KeySchedule.PC2_offsets1 = [ 0, 3, 1, 2, 0, 1, 3, 2, 0, 1, 0, 2, 3, 0, 1,
- 3, 0, 0, 2, 3, 1, 0, 2, 0, 0, 2, 3, 1 ];
-
- KeySchedule.PC2_offsets2 = [ 7, 5, 4, 7, 5, 6, 0, 7, 4, 0, 6, 5, 4, 7, 0,
- 6, 5, 7, 4, 5, 6, 7, 5, 4, 6, 0, 4, 6 ];
-
- KeySchedule.PC2_masks1 = [ 2, 1, 32, 4, 1, 4, 16, 1, 0, 1, 8, 8, 2, 32, 8,
- 32, 16, 0, 16, 4, 2, 0, 32, 4, 0, 2, 8, 16 ];
-
- KeySchedule.PC2_masks2 = [ 2, 32, 8, 1, 2, 2, 0, 4, 4, 0, 8, 16, 32, 16, 0,
- 32, 4, 32, 2, 1, 16, 8, 8, 16, 1, 0, 1, 4 ];
-
- KeySchedule.keyShifts = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23,
- 25, 27, 28 ];
- KeySchedule.prototype._initialiseKeys = function(key) {
- var i;
-
- var bits = new Array(56);
- for (i = 0; i < 56; i++) {
- bits[i] = (key[KeySchedule.PC1_offsets[i]] & KeySchedule.PC1_masks[i]) != 0;
- }
-
- var bits1 = bits.slice(0, 28);
- var bits2 = bits.slice(28, 56);
-
- bits1 = bits1.concat(bits1);
- bits2 = bits2.concat(bits2);
-
- for (i = 0; i < 16; i++) {
- var k = [ 0, 0, 0, 0, 0, 0, 0, 0 ];
-
- var s = KeySchedule.keyShifts[i];
- for ( var j = 0; j < 28; j++) {
- if (bits1[j + s]) {
- k[KeySchedule.PC2_offsets1[j]] += KeySchedule.PC2_masks1[j];
- }
- if (bits2[j + s]) {
- k[KeySchedule.PC2_offsets2[j]] += KeySchedule.PC2_masks2[j];
- }
- }
-
- k[0] = ((k[0] & 0x1f) << 27) + ((k[0] & 0x20) >> 5);
- for ( var j = 1; j <= 6; j++) {
- k[j] = k[j] << (27 - 4 * j);
- }
- k[7] = ((k[7] & 0x3e) >> 1) + ((k[7] & 0x1) << 31);
- this.keys[i] = k;
- }
- };
-
- KeySchedule.prototype.getKey = function(i) {
- return this.keys[i];
- };
-
- var State;
-
- State = function() {
-
- this.lhs = 0;
-
- this.rhs = 0;
- };
-
- State.SBOX_MASK = [ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
- 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f ];
-
- State.SBOX = new Array(8);
- var SBOX = State.SBOX;
- SBOX[0] = new Array();
- SBOX[0][0] = 0x808200;
- SBOX[0][268435456] = 0x8000;
- SBOX[0][536870912] = 0x808002;
- SBOX[0][805306368] = 0x2;
- SBOX[0][1073741824] = 0x200;
- SBOX[0][1342177280] = 0x808202;
- SBOX[0][1610612736] = 0x800202;
- SBOX[0][1879048192] = 0x800000;
- SBOX[0][-2147483648] = 0x202;
- SBOX[0][-1879048192] = 0x800200;
- SBOX[0][-1610612736] = 0x8200;
- SBOX[0][-1342177280] = 0x808000;
- SBOX[0][-1073741824] = 0x8002;
- SBOX[0][-805306368] = 0x800002;
- SBOX[0][-536870912] = 0x0;
- SBOX[0][-268435456] = 0x8202;
- SBOX[0][134217728] = 0x0;
- SBOX[0][402653184] = 0x808202;
- SBOX[0][671088640] = 0x8202;
- SBOX[0][939524096] = 0x8000;
- SBOX[0][1207959552] = 0x808200;
- SBOX[0][1476395008] = 0x200;
- SBOX[0][1744830464] = 0x808002;
- SBOX[0][2013265920] = 0x2;
- SBOX[0][-2013265920] = 0x800200;
- SBOX[0][-1744830464] = 0x8200;
- SBOX[0][-1476395008] = 0x808000;
- SBOX[0][-1207959552] = 0x800202;
- SBOX[0][-939524096] = 0x800002;
- SBOX[0][-671088640] = 0x8002;
- SBOX[0][-402653184] = 0x202;
- SBOX[0][-134217728] = 0x800000;
- SBOX[0][1] = 0x8000;
- SBOX[0][268435457] = 0x2;
- SBOX[0][536870913] = 0x808200;
- SBOX[0][805306369] = 0x800000;
- SBOX[0][1073741825] = 0x808002;
- SBOX[0][1342177281] = 0x8200;
- SBOX[0][1610612737] = 0x200;
- SBOX[0][1879048193] = 0x800202;
- SBOX[0][-2147483647] = 0x808202;
- SBOX[0][-1879048191] = 0x808000;
- SBOX[0][-1610612735] = 0x800002;
- SBOX[0][-1342177279] = 0x8202;
- SBOX[0][-1073741823] = 0x202;
- SBOX[0][-805306367] = 0x800200;
- SBOX[0][-536870911] = 0x8002;
- SBOX[0][-268435455] = 0x0;
- SBOX[0][134217729] = 0x808202;
- SBOX[0][402653185] = 0x808000;
- SBOX[0][671088641] = 0x800000;
- SBOX[0][939524097] = 0x200;
- SBOX[0][1207959553] = 0x8000;
- SBOX[0][1476395009] = 0x800002;
- SBOX[0][1744830465] = 0x2;
- SBOX[0][2013265921] = 0x8202;
- SBOX[0][-2013265919] = 0x8002;
- SBOX[0][-1744830463] = 0x800202;
- SBOX[0][-1476395007] = 0x202;
- SBOX[0][-1207959551] = 0x808200;
- SBOX[0][-939524095] = 0x800200;
- SBOX[0][-671088639] = 0x0;
- SBOX[0][-402653183] = 0x8200;
- SBOX[0][-134217727] = 0x808002;
- SBOX[1] = new Array();
- SBOX[1][0] = 0x40084010;
- SBOX[1][16777216] = 0x4000;
- SBOX[1][33554432] = 0x80000;
- SBOX[1][50331648] = 0x40080010;
- SBOX[1][67108864] = 0x40000010;
- SBOX[1][83886080] = 0x40084000;
- SBOX[1][100663296] = 0x40004000;
- SBOX[1][117440512] = 0x10;
- SBOX[1][134217728] = 0x84000;
- SBOX[1][150994944] = 0x40004010;
- SBOX[1][167772160] = 0x40000000;
- SBOX[1][184549376] = 0x84010;
- SBOX[1][201326592] = 0x80010;
- SBOX[1][218103808] = 0x0;
- SBOX[1][234881024] = 0x4010;
- SBOX[1][251658240] = 0x40080000;
- SBOX[1][8388608] = 0x40004000;
- SBOX[1][25165824] = 0x84010;
- SBOX[1][41943040] = 0x10;
- SBOX[1][58720256] = 0x40004010;
- SBOX[1][75497472] = 0x40084010;
- SBOX[1][92274688] = 0x40000000;
- SBOX[1][109051904] = 0x80000;
- SBOX[1][125829120] = 0x40080010;
- SBOX[1][142606336] = 0x80010;
- SBOX[1][159383552] = 0x0;
- SBOX[1][176160768] = 0x4000;
- SBOX[1][192937984] = 0x40080000;
- SBOX[1][209715200] = 0x40000010;
- SBOX[1][226492416] = 0x84000;
- SBOX[1][243269632] = 0x40084000;
- SBOX[1][260046848] = 0x4010;
- SBOX[1][268435456] = 0x0;
- SBOX[1][285212672] = 0x40080010;
- SBOX[1][301989888] = 0x40004010;
- SBOX[1][318767104] = 0x40084000;
- SBOX[1][335544320] = 0x40080000;
- SBOX[1][352321536] = 0x10;
- SBOX[1][369098752] = 0x84010;
- SBOX[1][385875968] = 0x4000;
- SBOX[1][402653184] = 0x4010;
- SBOX[1][419430400] = 0x80000;
- SBOX[1][436207616] = 0x80010;
- SBOX[1][452984832] = 0x40000010;
- SBOX[1][469762048] = 0x84000;
- SBOX[1][486539264] = 0x40004000;
- SBOX[1][503316480] = 0x40000000;
- SBOX[1][520093696] = 0x40084010;
- SBOX[1][276824064] = 0x84010;
- SBOX[1][293601280] = 0x80000;
- SBOX[1][310378496] = 0x40080000;
- SBOX[1][327155712] = 0x4000;
- SBOX[1][343932928] = 0x40004000;
- SBOX[1][360710144] = 0x40084010;
- SBOX[1][377487360] = 0x10;
- SBOX[1][394264576] = 0x40000000;
- SBOX[1][411041792] = 0x40084000;
- SBOX[1][427819008] = 0x40000010;
- SBOX[1][444596224] = 0x40004010;
- SBOX[1][461373440] = 0x80010;
- SBOX[1][478150656] = 0x0;
- SBOX[1][494927872] = 0x4010;
- SBOX[1][511705088] = 0x40080010;
- SBOX[1][528482304] = 0x84000;
- SBOX[2] = new Array();
- SBOX[2][0] = 0x104;
- SBOX[2][1048576] = 0x0;
- SBOX[2][2097152] = 0x4000100;
- SBOX[2][3145728] = 0x10104;
- SBOX[2][4194304] = 0x10004;
- SBOX[2][5242880] = 0x4000004;
- SBOX[2][6291456] = 0x4010104;
- SBOX[2][7340032] = 0x4010000;
- SBOX[2][8388608] = 0x4000000;
- SBOX[2][9437184] = 0x4010100;
- SBOX[2][10485760] = 0x10100;
- SBOX[2][11534336] = 0x4010004;
- SBOX[2][12582912] = 0x4000104;
- SBOX[2][13631488] = 0x10000;
- SBOX[2][14680064] = 0x4;
- SBOX[2][15728640] = 0x100;
- SBOX[2][524288] = 0x4010100;
- SBOX[2][1572864] = 0x4010004;
- SBOX[2][2621440] = 0x0;
- SBOX[2][3670016] = 0x4000100;
- SBOX[2][4718592] = 0x4000004;
- SBOX[2][5767168] = 0x10000;
- SBOX[2][6815744] = 0x10004;
- SBOX[2][7864320] = 0x104;
- SBOX[2][8912896] = 0x4;
- SBOX[2][9961472] = 0x100;
- SBOX[2][11010048] = 0x4010000;
- SBOX[2][12058624] = 0x10104;
- SBOX[2][13107200] = 0x10100;
- SBOX[2][14155776] = 0x4000104;
- SBOX[2][15204352] = 0x4010104;
- SBOX[2][16252928] = 0x4000000;
- SBOX[2][16777216] = 0x4010100;
- SBOX[2][17825792] = 0x10004;
- SBOX[2][18874368] = 0x10000;
- SBOX[2][19922944] = 0x4000100;
- SBOX[2][20971520] = 0x100;
- SBOX[2][22020096] = 0x4010104;
- SBOX[2][23068672] = 0x4000004;
- SBOX[2][24117248] = 0x0;
- SBOX[2][25165824] = 0x4000104;
- SBOX[2][26214400] = 0x4000000;
- SBOX[2][27262976] = 0x4;
- SBOX[2][28311552] = 0x10100;
- SBOX[2][29360128] = 0x4010000;
- SBOX[2][30408704] = 0x104;
- SBOX[2][31457280] = 0x10104;
- SBOX[2][32505856] = 0x4010004;
- SBOX[2][17301504] = 0x4000000;
- SBOX[2][18350080] = 0x104;
- SBOX[2][19398656] = 0x4010100;
- SBOX[2][20447232] = 0x0;
- SBOX[2][21495808] = 0x10004;
- SBOX[2][22544384] = 0x4000100;
- SBOX[2][23592960] = 0x100;
- SBOX[2][24641536] = 0x4010004;
- SBOX[2][25690112] = 0x10000;
- SBOX[2][26738688] = 0x4010104;
- SBOX[2][27787264] = 0x10104;
- SBOX[2][28835840] = 0x4000004;
- SBOX[2][29884416] = 0x4000104;
- SBOX[2][30932992] = 0x4010000;
- SBOX[2][31981568] = 0x4;
- SBOX[2][33030144] = 0x10100;
- SBOX[3] = new Array();
- SBOX[3][0] = 0x80401000;
- SBOX[3][65536] = 0x80001040;
- SBOX[3][131072] = 0x401040;
- SBOX[3][196608] = 0x80400000;
- SBOX[3][262144] = 0x0;
- SBOX[3][327680] = 0x401000;
- SBOX[3][393216] = 0x80000040;
- SBOX[3][458752] = 0x400040;
- SBOX[3][524288] = 0x80000000;
- SBOX[3][589824] = 0x400000;
- SBOX[3][655360] = 0x40;
- SBOX[3][720896] = 0x80001000;
- SBOX[3][786432] = 0x80400040;
- SBOX[3][851968] = 0x1040;
- SBOX[3][917504] = 0x1000;
- SBOX[3][983040] = 0x80401040;
- SBOX[3][32768] = 0x80001040;
- SBOX[3][98304] = 0x40;
- SBOX[3][163840] = 0x80400040;
- SBOX[3][229376] = 0x80001000;
- SBOX[3][294912] = 0x401000;
- SBOX[3][360448] = 0x80401040;
- SBOX[3][425984] = 0x0;
- SBOX[3][491520] = 0x80400000;
- SBOX[3][557056] = 0x1000;
- SBOX[3][622592] = 0x80401000;
- SBOX[3][688128] = 0x400000;
- SBOX[3][753664] = 0x1040;
- SBOX[3][819200] = 0x80000000;
- SBOX[3][884736] = 0x400040;
- SBOX[3][950272] = 0x401040;
- SBOX[3][1015808] = 0x80000040;
- SBOX[3][1048576] = 0x400040;
- SBOX[3][1114112] = 0x401000;
- SBOX[3][1179648] = 0x80000040;
- SBOX[3][1245184] = 0x0;
- SBOX[3][1310720] = 0x1040;
- SBOX[3][1376256] = 0x80400040;
- SBOX[3][1441792] = 0x80401000;
- SBOX[3][1507328] = 0x80001040;
- SBOX[3][1572864] = 0x80401040;
- SBOX[3][1638400] = 0x80000000;
- SBOX[3][1703936] = 0x80400000;
- SBOX[3][1769472] = 0x401040;
- SBOX[3][1835008] = 0x80001000;
- SBOX[3][1900544] = 0x400000;
- SBOX[3][1966080] = 0x40;
- SBOX[3][2031616] = 0x1000;
- SBOX[3][1081344] = 0x80400000;
- SBOX[3][1146880] = 0x80401040;
- SBOX[3][1212416] = 0x0;
- SBOX[3][1277952] = 0x401000;
- SBOX[3][1343488] = 0x400040;
- SBOX[3][1409024] = 0x80000000;
- SBOX[3][1474560] = 0x80001040;
- SBOX[3][1540096] = 0x40;
- SBOX[3][1605632] = 0x80000040;
- SBOX[3][1671168] = 0x1000;
- SBOX[3][1736704] = 0x80001000;
- SBOX[3][1802240] = 0x80400040;
- SBOX[3][1867776] = 0x1040;
- SBOX[3][1933312] = 0x80401000;
- SBOX[3][1998848] = 0x400000;
- SBOX[3][2064384] = 0x401040;
- SBOX[4] = new Array();
- SBOX[4][0] = 0x80;
- SBOX[4][4096] = 0x1040000;
- SBOX[4][8192] = 0x40000;
- SBOX[4][12288] = 0x20000000;
- SBOX[4][16384] = 0x20040080;
- SBOX[4][20480] = 0x1000080;
- SBOX[4][24576] = 0x21000080;
- SBOX[4][28672] = 0x40080;
- SBOX[4][32768] = 0x1000000;
- SBOX[4][36864] = 0x20040000;
- SBOX[4][40960] = 0x20000080;
- SBOX[4][45056] = 0x21040080;
- SBOX[4][49152] = 0x21040000;
- SBOX[4][53248] = 0x0;
- SBOX[4][57344] = 0x1040080;
- SBOX[4][61440] = 0x21000000;
- SBOX[4][2048] = 0x1040080;
- SBOX[4][6144] = 0x21000080;
- SBOX[4][10240] = 0x80;
- SBOX[4][14336] = 0x1040000;
- SBOX[4][18432] = 0x40000;
- SBOX[4][22528] = 0x20040080;
- SBOX[4][26624] = 0x21040000;
- SBOX[4][30720] = 0x20000000;
- SBOX[4][34816] = 0x20040000;
- SBOX[4][38912] = 0x0;
- SBOX[4][43008] = 0x21040080;
- SBOX[4][47104] = 0x1000080;
- SBOX[4][51200] = 0x20000080;
- SBOX[4][55296] = 0x21000000;
- SBOX[4][59392] = 0x1000000;
- SBOX[4][63488] = 0x40080;
- SBOX[4][65536] = 0x40000;
- SBOX[4][69632] = 0x80;
- SBOX[4][73728] = 0x20000000;
- SBOX[4][77824] = 0x21000080;
- SBOX[4][81920] = 0x1000080;
- SBOX[4][86016] = 0x21040000;
- SBOX[4][90112] = 0x20040080;
- SBOX[4][94208] = 0x1000000;
- SBOX[4][98304] = 0x21040080;
- SBOX[4][102400] = 0x21000000;
- SBOX[4][106496] = 0x1040000;
- SBOX[4][110592] = 0x20040000;
- SBOX[4][114688] = 0x40080;
- SBOX[4][118784] = 0x20000080;
- SBOX[4][122880] = 0x0;
- SBOX[4][126976] = 0x1040080;
- SBOX[4][67584] = 0x21000080;
- SBOX[4][71680] = 0x1000000;
- SBOX[4][75776] = 0x1040000;
- SBOX[4][79872] = 0x20040080;
- SBOX[4][83968] = 0x20000000;
- SBOX[4][88064] = 0x1040080;
- SBOX[4][92160] = 0x80;
- SBOX[4][96256] = 0x21040000;
- SBOX[4][100352] = 0x40080;
- SBOX[4][104448] = 0x21040080;
- SBOX[4][108544] = 0x0;
- SBOX[4][112640] = 0x21000000;
- SBOX[4][116736] = 0x1000080;
- SBOX[4][120832] = 0x40000;
- SBOX[4][124928] = 0x20040000;
- SBOX[4][129024] = 0x20000080;
- SBOX[5] = new Array();
- SBOX[5][0] = 0x10000008;
- SBOX[5][256] = 0x2000;
- SBOX[5][512] = 0x10200000;
- SBOX[5][768] = 0x10202008;
- SBOX[5][1024] = 0x10002000;
- SBOX[5][1280] = 0x200000;
- SBOX[5][1536] = 0x200008;
- SBOX[5][1792] = 0x10000000;
- SBOX[5][2048] = 0x0;
- SBOX[5][2304] = 0x10002008;
- SBOX[5][2560] = 0x202000;
- SBOX[5][2816] = 0x8;
- SBOX[5][3072] = 0x10200008;
- SBOX[5][3328] = 0x202008;
- SBOX[5][3584] = 0x2008;
- SBOX[5][3840] = 0x10202000;
- SBOX[5][128] = 0x10200000;
- SBOX[5][384] = 0x10202008;
- SBOX[5][640] = 0x8;
- SBOX[5][896] = 0x200000;
- SBOX[5][1152] = 0x202008;
- SBOX[5][1408] = 0x10000008;
- SBOX[5][1664] = 0x10002000;
- SBOX[5][1920] = 0x2008;
- SBOX[5][2176] = 0x200008;
- SBOX[5][2432] = 0x2000;
- SBOX[5][2688] = 0x10002008;
- SBOX[5][2944] = 0x10200008;
- SBOX[5][3200] = 0x0;
- SBOX[5][3456] = 0x10202000;
- SBOX[5][3712] = 0x202000;
- SBOX[5][3968] = 0x10000000;
- SBOX[5][4096] = 0x10002000;
- SBOX[5][4352] = 0x10200008;
- SBOX[5][4608] = 0x10202008;
- SBOX[5][4864] = 0x2008;
- SBOX[5][5120] = 0x200000;
- SBOX[5][5376] = 0x10000000;
- SBOX[5][5632] = 0x10000008;
- SBOX[5][5888] = 0x202000;
- SBOX[5][6144] = 0x202008;
- SBOX[5][6400] = 0x0;
- SBOX[5][6656] = 0x8;
- SBOX[5][6912] = 0x10200000;
- SBOX[5][7168] = 0x2000;
- SBOX[5][7424] = 0x10002008;
- SBOX[5][7680] = 0x10202000;
- SBOX[5][7936] = 0x200008;
- SBOX[5][4224] = 0x8;
- SBOX[5][4480] = 0x202000;
- SBOX[5][4736] = 0x200000;
- SBOX[5][4992] = 0x10000008;
- SBOX[5][5248] = 0x10002000;
- SBOX[5][5504] = 0x2008;
- SBOX[5][5760] = 0x10202008;
- SBOX[5][6016] = 0x10200000;
- SBOX[5][6272] = 0x10202000;
- SBOX[5][6528] = 0x10200008;
- SBOX[5][6784] = 0x2000;
- SBOX[5][7040] = 0x202008;
- SBOX[5][7296] = 0x200008;
- SBOX[5][7552] = 0x0;
- SBOX[5][7808] = 0x10000000;
- SBOX[5][8064] = 0x10002008;
- SBOX[6] = new Array();
- SBOX[6][0] = 0x100000;
- SBOX[6][16] = 0x2000401;
- SBOX[6][32] = 0x400;
- SBOX[6][48] = 0x100401;
- SBOX[6][64] = 0x2100401;
- SBOX[6][80] = 0x0;
- SBOX[6][96] = 0x1;
- SBOX[6][112] = 0x2100001;
- SBOX[6][128] = 0x2000400;
- SBOX[6][144] = 0x100001;
- SBOX[6][160] = 0x2000001;
- SBOX[6][176] = 0x2100400;
- SBOX[6][192] = 0x2100000;
- SBOX[6][208] = 0x401;
- SBOX[6][224] = 0x100400;
- SBOX[6][240] = 0x2000000;
- SBOX[6][8] = 0x2100001;
- SBOX[6][24] = 0x0;
- SBOX[6][40] = 0x2000401;
- SBOX[6][56] = 0x2100400;
- SBOX[6][72] = 0x100000;
- SBOX[6][88] = 0x2000001;
- SBOX[6][104] = 0x2000000;
- SBOX[6][120] = 0x401;
- SBOX[6][136] = 0x100401;
- SBOX[6][152] = 0x2000400;
- SBOX[6][168] = 0x2100000;
- SBOX[6][184] = 0x100001;
- SBOX[6][200] = 0x400;
- SBOX[6][216] = 0x2100401;
- SBOX[6][232] = 0x1;
- SBOX[6][248] = 0x100400;
- SBOX[6][256] = 0x2000000;
- SBOX[6][272] = 0x100000;
- SBOX[6][288] = 0x2000401;
- SBOX[6][304] = 0x2100001;
- SBOX[6][320] = 0x100001;
- SBOX[6][336] = 0x2000400;
- SBOX[6][352] = 0x2100400;
- SBOX[6][368] = 0x100401;
- SBOX[6][384] = 0x401;
- SBOX[6][400] = 0x2100401;
- SBOX[6][416] = 0x100400;
- SBOX[6][432] = 0x1;
- SBOX[6][448] = 0x0;
- SBOX[6][464] = 0x2100000;
- SBOX[6][480] = 0x2000001;
- SBOX[6][496] = 0x400;
- SBOX[6][264] = 0x100400;
- SBOX[6][280] = 0x2000401;
- SBOX[6][296] = 0x2100001;
- SBOX[6][312] = 0x1;
- SBOX[6][328] = 0x2000000;
- SBOX[6][344] = 0x100000;
- SBOX[6][360] = 0x401;
- SBOX[6][376] = 0x2100400;
- SBOX[6][392] = 0x2000001;
- SBOX[6][408] = 0x2100000;
- SBOX[6][424] = 0x0;
- SBOX[6][440] = 0x2100401;
- SBOX[6][456] = 0x100401;
- SBOX[6][472] = 0x400;
- SBOX[6][488] = 0x2000400;
- SBOX[6][504] = 0x100001;
- SBOX[7] = new Array();
- SBOX[7][0] = 0x8000820;
- SBOX[7][1] = 0x20000;
- SBOX[7][2] = 0x8000000;
- SBOX[7][3] = 0x20;
- SBOX[7][4] = 0x20020;
- SBOX[7][5] = 0x8020820;
- SBOX[7][6] = 0x8020800;
- SBOX[7][7] = 0x800;
- SBOX[7][8] = 0x8020000;
- SBOX[7][9] = 0x8000800;
- SBOX[7][10] = 0x20800;
- SBOX[7][11] = 0x8020020;
- SBOX[7][12] = 0x820;
- SBOX[7][13] = 0x0;
- SBOX[7][14] = 0x8000020;
- SBOX[7][15] = 0x20820;
- SBOX[7][-2147483648] = 0x800;
- SBOX[7][-2147483647] = 0x8020820;
- SBOX[7][-2147483646] = 0x8000820;
- SBOX[7][-2147483645] = 0x8000000;
- SBOX[7][-2147483644] = 0x8020000;
- SBOX[7][-2147483643] = 0x20800;
- SBOX[7][-2147483642] = 0x20820;
- SBOX[7][-2147483641] = 0x20;
- SBOX[7][-2147483640] = 0x8000020;
- SBOX[7][-2147483639] = 0x820;
- SBOX[7][-2147483638] = 0x20020;
- SBOX[7][-2147483637] = 0x8020800;
- SBOX[7][-2147483636] = 0x0;
- SBOX[7][-2147483635] = 0x8020020;
- SBOX[7][-2147483634] = 0x8000800;
- SBOX[7][-2147483633] = 0x20000;
- SBOX[7][16] = 0x20820;
- SBOX[7][17] = 0x8020800;
- SBOX[7][18] = 0x20;
- SBOX[7][19] = 0x800;
- SBOX[7][20] = 0x8000800;
- SBOX[7][21] = 0x8000020;
- SBOX[7][22] = 0x8020020;
- SBOX[7][23] = 0x20000;
- SBOX[7][24] = 0x0;
- SBOX[7][25] = 0x20020;
- SBOX[7][26] = 0x8020000;
- SBOX[7][27] = 0x8000820;
- SBOX[7][28] = 0x8020820;
- SBOX[7][29] = 0x20800;
- SBOX[7][30] = 0x820;
- SBOX[7][31] = 0x8000000;
- SBOX[7][-2147483632] = 0x20000;
- SBOX[7][-2147483631] = 0x800;
- SBOX[7][-2147483630] = 0x8020020;
- SBOX[7][-2147483629] = 0x20820;
- SBOX[7][-2147483628] = 0x20;
- SBOX[7][-2147483627] = 0x8020000;
- SBOX[7][-2147483626] = 0x8000000;
- SBOX[7][-2147483625] = 0x8000820;
- SBOX[7][-2147483624] = 0x8020820;
- SBOX[7][-2147483623] = 0x8000020;
- SBOX[7][-2147483622] = 0x8000800;
- SBOX[7][-2147483621] = 0x0;
- SBOX[7][-2147483620] = 0x20800;
- SBOX[7][-2147483619] = 0x820;
- SBOX[7][-2147483618] = 0x20020;
- SBOX[7][-2147483617] = 0x8020800;
- State.prototype._exchangeLR = function(v, m) {
- var t = ((this.lhs >> v) ^ this.rhs) & m;
- this.rhs ^= t;
- this.lhs ^= (t << v);
- };
- State.prototype._exchangeRL = function(v, m) {
- var t = ((this.rhs >> v) ^ this.lhs) & m;
- this.lhs ^= t;
- this.rhs ^= (t << v);
- };
-
- State.prototype.initialPerm = function(message, offset) {
- var input = message.slice(offset, offset + 8);
- this.lhs = (input[0] << 24) + (input[1] << 16) + (input[2] << 8)
- + input[3];
- this.rhs = (input[4] << 24) + (input[5] << 16) + (input[6] << 8)
- + input[7];
- this._exchangeLR(4, 0x0f0f0f0f);
- this._exchangeLR(16, 0x0000ffff);
- this._exchangeRL(2, 0x33333333);
- this._exchangeRL(8, 0x00ff00ff);
- this._exchangeLR(1, 0x55555555);
- };
-
- State.prototype.round = function(k) {
- var r = this.rhs, l = this.lhs;
- var f = 0;
- for ( var i = 0; i < 8; i++) {
- var v = (r ^ k[i]) & State.SBOX_MASK[i];
- f += State.SBOX[i][v];
- }
- this.lhs = r;
- this.rhs = l ^ f;
- };
-
- State.prototype.finalPerm = function(cipherText, offset) {
- var t = this.lhs;
- this.lhs = this.rhs;
- this.rhs = t;
- this._exchangeLR(1, 0x55555555);
- this._exchangeRL(8, 0x00ff00ff);
- this._exchangeRL(2, 0x33333333);
- this._exchangeLR(16, 0x0000ffff);
- this._exchangeLR(4, 0x0f0f0f0f);
- cipherText[offset] = (this.lhs >> 24) & 0xff;
- cipherText[offset + 1] = (this.lhs >> 16) & 0xff;
- cipherText[offset + 2] = (this.lhs >> 8) & 0xff;
- cipherText[offset + 3] = (this.lhs) & 0xff;
- cipherText[offset + 4] = (this.rhs >> 24) & 0xff;
- cipherText[offset + 5] = (this.rhs >> 16) & 0xff;
- cipherText[offset + 6] = (this.rhs >> 8) & 0xff;
- cipherText[offset + 7] = (this.rhs) & 0xff;
- };
-
- var DES = C.DES = {
- _blocksize : 2,
- _keyschedule : null,
- _state : new State(),
- _init : function(k) {
- this._keyschedule = new KeySchedule(k);
- },
- encrypt : function(message, password, options) {
- options = options || {};
-
- var mode = options.mode || new C.mode.OFB;
-
- if (mode.fixOptions)
- mode.fixOptions(options);
- var
-
- m = (message.constructor == String ? UTF8.stringToBytes(message)
- : message),
-
- iv = options.iv || util.randomBytes(8),
-
- k = (password.constructor == String ?
-
- C.PBKDF2(password, iv, 8, {
- asBytes : true
- }) :
-
- password);
-
- this._keyschedule = new KeySchedule(k);
-
- mode.encrypt(DES, m, iv);
-
- m = options.iv ? m : iv.concat(m);
- return (options && options.asBytes) ? m : util.bytesToBase64(m);
- },
- _encryptblock : function(message, offset) {
- this._state.initialPerm(message, offset);
- for ( var i = 0; i <= 15; i++) {
- this._state.round(this._keyschedule.getKey(i));
- }
- this._state.finalPerm(message, offset);
- },
- decrypt : function(ciphertext, password, options) {
- options = options || {};
-
- var mode = options.mode || new C.mode.OFB;
-
- if (mode.fixOptions)
- mode.fixOptions(options);
- var
-
- c = (ciphertext.constructor == String ? util
- .base64ToBytes(ciphertext) : ciphertext),
-
- iv = options.iv || c.splice(0, 8),
-
- k = (password.constructor == String ?
-
- C.PBKDF2(password, iv, 32, {
- asBytes : true
- }) :
-
- password);
-
- this._keyschedule = new KeySchedule(k);
- mode.decrypt(DES, c, iv);
-
- return (options && options.asBytes) ? c : UTF8.bytesToString(c);
- },
- _decryptblock : function(message, offset) {
- this._state.initialPerm(message, offset);
- for ( var i = 15; i >= 0; i--) {
- this._state.round(this._keyschedule.getKey(i));
- }
- this._state.finalPerm(message, offset);
- }
- };
- })();
|