UNPKG

hanewinpgp

Version:

PGP / GnuPG / OpenPGP Message Encryption in JavaScript by Herbert Hanewinkel.

6 lines 30.2 kB
/*! * hanewinpgp - PGP / GnuPG / OpenPGP Message Encryption in JavaScript by Herbert Hanewinkel. * @version v0.1.0 * @link https://github.com/dossy/hanewinpgp#readme */ var VERSION="0.1.0";"use strict";var randomByte;try{var crypto=require("crypto");randomByte=function(){return crypto.randomBytes(1)[0]}}catch(e){var Random=require("random-js");randomByte=Random.engines.browserCrypto?function(){return Random.integer(0,255)(Random.engines.browserCrypto)}:function(){return Random.integer(0,255)(Random.engines.nativeMath)}}var randomString=function(len,noNulls){var r=[],t;for(var i=0;i<len;){t=randomByte();if(t==0&&noNulls)continue;i++;r.push(String.fromCharCode(t))}return r.join("")};function hex2s(hex){var r="";if(hex.length%2)hex+="0";for(var i=0;i<hex.length;i+=2)r+=String.fromCharCode(parseInt(hex.slice(i,i+2),16));return r}function crc24(data){var crc=11994318;for(var n=0;n<data.length;n++){crc^=(data.charCodeAt(n)&255)<<16;for(var i=0;i<8;i++){crc<<=1;if(crc&16777216)crc^=25578747}}return String.fromCharCode(crc>>16&255)+String.fromCharCode(crc>>8&255)+String.fromCharCode(crc&255)}function GPGencrypt(key,text){var i,n;var len=text.length;var lsk=key.length;var bpbl=16;var iblock=new Array(bpbl);var rblock=new Array(bpbl);var ct=new Array(bpbl+2);var expandedKey=keyExpansion(key);var ciphertext=[];if(len%bpbl){for(i=len%bpbl;i<bpbl;i++){text+="\0"}}for(i=0;i<bpbl;i++){iblock[i]=0;rblock[i]=randomByte()}iblock=AESencrypt(iblock,expandedKey);for(i=0;i<bpbl;i++){ct[i]=iblock[i]^=rblock[i]}iblock=AESencrypt(iblock,expandedKey);ct[bpbl]=iblock[0]^rblock[bpbl-2];ct[bpbl+1]=iblock[1]^rblock[bpbl-1];for(i=0;i<bpbl+2;i++){ciphertext.push(String.fromCharCode(ct[i]))}iblock=ct.slice(2,bpbl+2);for(n=0;n<text.length;n+=bpbl){iblock=AESencrypt(iblock,expandedKey);for(i=0;i<bpbl;i++){iblock[i]^=text.charCodeAt(n+i);ciphertext.push(String.fromCharCode(iblock[i]))}}return ciphertext.slice(0,len+bpbl+2).join("")}function GPGpkt(tag,len){var h=[128+((tag&15)<<2)+(len>255)+(len>65535)];if(len>65535){h.push((len&4278190080)>>>24);h.push((len&16711680)>>>16)}if(len>255){h.push((len&65280)>>>8)}h.push(len&255);return h.map(function(el){return String.fromCharCode(el)}).join("")}function GPGpkesk(keyId,keytyp,symAlgo,sessionkey,pkey){var el=[3,5,9,17,513,2049,4097,8193];var s=r2s(pkey);var l=Math.floor((s.charCodeAt(0)*256+s.charCodeAt(1)+7)/8);var mod=mpi2b(s.substr(0,l+2));var exp=new Array;if(keytyp){var grp=new Array;var y=new Array;var B=new Array;var C=new Array;var l2=Math.floor((s.charCodeAt(l+2)*256+s.charCodeAt(l+3)+7)/8)+2;grp=mpi2b(s.substr(l+2,l2));y=mpi2b(s.substr(l+2+l2));exp[0]=9;B=bmodexp(grp,exp,mod);C=bmodexp(y,exp,mod)}else{exp=mpi2b(s.substr(l+2))}var lsk=sessionkey.length;var c=0;for(var i=0;i<lsk;i++)c+=sessionkey.charCodeAt(i);c&=65535;var lm=(l-2)*8+2;var m=String.fromCharCode(lm/256)+String.fromCharCode(lm%256)+String.fromCharCode(2)+randomString(l-lsk-6,1)+"\0"+String.fromCharCode(symAlgo)+sessionkey+String.fromCharCode(c/256)+String.fromCharCode(c&255);if(keytyp){var enc=b2mpi(B)+b2mpi(bmod(bmul(mpi2b(m),C),mod));return GPGpkt(1,enc.length+10)+String.fromCharCode(3)+keyId+String.fromCharCode(16)+enc}else{var enc=b2mpi(bmodexp(mpi2b(m),exp,mod));return GPGpkt(1,enc.length+10)+String.fromCharCode(3)+keyId+String.fromCharCode(1)+enc}}function GPGsed(key,data){var ld=GPGld(data);var enc=GPGencrypt(key,ld);var pkt=GPGpkt(9,enc.length)+enc;return pkt}function GPGld(data,type){type=type||0;return GPGpkt(11,data.length+10)+["b","t","u"][type]+String.fromCharCode(4)+"file"+"\0\0\0\0"+data.map(function(el){return String.fromCharCode(el)}).join("")}module.exports.encrypt=function(key,message){if(typeof navigator!="undefined"&&/MSIE [0-8]\.[0-9]+/.test(navigator.appVersion)){throw new Error("IE8 and older not supported.")}var arr=message;if(typeof arr=="string"){arr=Buffer.from(arr,"utf8")}if(typeof arr=="object"&&!(arr instanceof Array)){arr=Array.prototype.slice.call(arr,0)}var symAlg=7;var kSize=[16,24,32];var keylen=kSize[symAlg-7];var sesskey=randomString(keylen,0);var keyId=hex2s(key.id);var cp=GPGpkesk(keyId,key.type,symAlg,sesskey,key.key)+GPGsed(sesskey,arr);return["-----BEGIN PGP MESSAGE-----","Version: hanewinpgp v"+VERSION,"",s2r(cp),"="+s2r(crc24(cp)),"-----END PGP MESSAGE-----"].join("\n")};"use strict";function s2hex(s){var result="";for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);result+=(c<16?"0":"")+c.toString(16)}return result}function getPublicKey(text){var found=0,len;var i=text.indexOf("-----BEGIN PGP PUBLIC KEY BLOCK-----");if(i==-1){alert("No PGP Public Key Block");this.vers="";this.fp="";this.keyid="";this.user="";this.pkey="";return}var a=text.indexOf("\n\n",i);if(a>0)a+=2;else{a=text.indexOf("\n\r\n",i);if(a>0)a+=3}var e=text.indexOf("\n=",i);if(a>0&&e>0)text=text.slice(a,e);else{alert("Invalid PGP Public Key Block");this.vers="";this.fp="";this.keyid="";this.user="";this.pkey="";return}var s=r2s(text);for(var i=0;i<s.length;){var tag=s.charCodeAt(i++);if((tag&128)==0)break;if(tag&64){tag&=63;len=s.charCodeAt(i++);if(len>191&&len<224)len=(len-192<<8)+s.charCodeAt(i++);else if(len==255)len=(s.charCodeAt(i++)<<24)+(s.charCodeAt(i++)<<16)+(s.charCodeAt(i++)<<8)+s.charCodeAt(i++);else if(len>223&&len<255)len=1<<(len&31)}else{len=tag&3;tag=tag>>2&15;if(len==0)len=s.charCodeAt(i++);else if(len==1)len=(s.charCodeAt(i++)<<8)+s.charCodeAt(i++);else if(len==2)len=(s.charCodeAt(i++)<<24)+(s.charCodeAt(i++)<<16)+(s.charCodeAt(i++)<<8)+s.charCodeAt(i++);else len=s.length-1}if(tag==6||tag==14){var k=i;var vers=s.charCodeAt(i++);found=1;this.vers=vers;var time=(s.charCodeAt(i++)<<24)+(s.charCodeAt(i++)<<16)+(s.charCodeAt(i++)<<8)+s.charCodeAt(i++);if(vers==2||vers==3)var valid=s.charCodeAt(i++)<<8+s.charCodeAt(i++);var algo=s.charCodeAt(i++);if(algo==1||algo==2){var m=i;var lm=Math.floor((s.charCodeAt(i)*256+s.charCodeAt(i+1)+7)/8);i+=lm+2;var mod=s.substr(m,lm+2);var le=Math.floor((s.charCodeAt(i)*256+s.charCodeAt(i+1)+7)/8);i+=le+2;this.pkey=s2r(s.substr(m,lm+le+4));this.type="RSA";if(vers==3){this.fp="";this.keyid=s2hex(mod.substr(mod.length-8,8))}else if(vers==4){var pkt=String.fromCharCode(153)+String.fromCharCode(len>>8)+String.fromCharCode(len&255)+s.substr(k,len);var fp=str_sha1(pkt);this.fp=s2hex(fp);this.keyid=s2hex(fp.substr(fp.length-8,8))}else{this.fp="";this.keyid=""}found=2}else if((algo==16||algo==20)&&vers==4){var m=i;var lp=Math.floor((s.charCodeAt(i)*256+s.charCodeAt(i+1)+7)/8);i+=lp+2;var lg=Math.floor((s.charCodeAt(i)*256+s.charCodeAt(i+1)+7)/8);i+=lg+2;var ly=Math.floor((s.charCodeAt(i)*256+s.charCodeAt(i+1)+7)/8);i+=ly+2;this.pkey=s2r(s.substr(m,lp+lg+ly+6));var pkt=String.fromCharCode(153)+String.fromCharCode(len>>8)+String.fromCharCode(len&255)+s.substr(k,len);var fp=str_sha1(pkt);this.fp=s2hex(fp);this.keyid=s2hex(fp.substr(fp.length-8,8));this.type="ELGAMAL";found=3}else{i=k+len}}else if(tag==13){this.user=s.substr(i,len);i+=len}else{i+=len}}if(found<2){this.vers="";this.fp="";this.keyid="";if(found==0)this.user="No public key packet found.";else if(found==1){this.user="public key algorithm is "+algo+" not RSA or ELGAMAL."}this.pkey=""}}module.exports.extract=function(text){var key=new getPublicKey(text);return{version:key.vers,user:key.user,id:key.keyid,type:key.type=="RSA"?0:1,key:key.pkey.replace(/\n/g,"")}};var Rcon=[1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145];var S=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];var T1=[2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849,2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458,3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124,1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284,133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117,572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996];var T2=[1667483301,2088564868,2004348569,2071721613,4076011277,1802229437,1869602481,3318059348,808476752,16843267,1734856361,724260477,4278118169,3621238114,2880130534,1987505306,3402272581,2189565853,3385428288,2105408135,4210749205,1499050731,1195871945,4042324747,2913812972,3570709351,2728550397,2947499498,2627478463,2762232823,1920132246,3233848155,3082253762,4261273884,2475900334,640044138,909536346,1061125697,4160222466,3435955023,875849820,2779075060,3857043764,4059166984,1903288979,3638078323,825320019,353708607,67373068,3351745874,589514341,3284376926,404238376,2526427041,84216335,2593796021,117902857,303178806,2155879323,3806519101,3958099238,656887401,2998042573,1970662047,151589403,2206408094,741103732,437924910,454768173,1852759218,1515893998,2694863867,1381147894,993752653,3604395873,3014884814,690573947,3823361342,791633521,2223248279,1397991157,3520182632,0,3991781676,538984544,4244431647,2981198280,1532737261,1785386174,3419114822,3200149465,960066123,1246401758,1280088276,1482207464,3486483786,3503340395,4025468202,2863288293,4227591446,1128498885,1296931543,859006549,2240090516,1162185423,4193904912,33686534,2139094657,1347461360,1010595908,2678007226,2829601763,1364304627,2745392638,1077969088,2408514954,2459058093,2644320700,943222856,4126535940,3166462943,3065411521,3671764853,555827811,269492272,4294960410,4092853518,3537026925,3452797260,202119188,320022069,3974939439,1600110305,2543269282,1145342156,387395129,3301217111,2812761586,2122251394,1027439175,1684326572,1566423783,421081643,1936975509,1616953504,2172721560,1330618065,3705447295,572671078,707417214,2425371563,2290617219,1179028682,4008625961,3099093971,336865340,3739133817,1583267042,185275933,3688607094,3772832571,842163286,976909390,168432670,1229558491,101059594,606357612,1549580516,3267534685,3553869166,2896970735,1650640038,2442213800,2509582756,3840201527,2038035083,3890730290,3368586051,926379609,1835915959,2374828428,3587551588,1313774802,2846444e3,1819072692,1448520954,4109693703,3941256997,1701169839,2054878350,2930657257,134746136,3132780501,2021191816,623200879,774790258,471611428,2795919345,3031724999,3334903633,3907570467,3722289532,1953818780,522141217,1263245021,3183305180,2341145990,2324303749,1886445712,1044282434,3048567236,1718013098,1212715224,50529797,4143380225,235805714,1633796771,892693087,1465364217,3115936208,2256934801,3250690392,488454695,2661164985,3789674808,4177062675,2560109491,286335539,1768542907,3654920560,2391672713,2492740519,2610638262,505297954,2273777042,3924412704,3469641545,1431677695,673730680,3755976058,2357986191,2711706104,2307459456,218962455,3216991706,3873888049,1111655622,1751699640,1094812355,2576951728,757946999,252648977,2964356043,1414834428,3149622742,370551866];var T3=[1673962851,2096661628,2012125559,2079755643,4076801522,1809235307,1876865391,3314635973,811618352,16909057,1741597031,727088427,4276558334,3618988759,2874009259,1995217526,3398387146,2183110018,3381215433,2113570685,4209972730,1504897881,1200539975,4042984432,2906778797,3568527316,2724199842,2940594863,2619588508,2756966308,1927583346,3231407040,3077948087,4259388669,2470293139,642542118,913070646,1065238847,4160029431,3431157708,879254580,2773611685,3855693029,4059629809,1910674289,3635114968,828527409,355090197,67636228,3348452039,591815971,3281870531,405809176,2520228246,84545285,2586817946,118360327,304363026,2149292928,3806281186,3956090603,659450151,2994720178,1978310517,152181513,2199756419,743994412,439627290,456535323,1859957358,1521806938,2690382752,1386542674,997608763,3602342358,3011366579,693271337,3822927587,794718511,2215876484,1403450707,3518589137,0,3988860141,541089824,4242743292,2977548465,1538714971,1792327274,3415033547,3194476990,963791673,1251270218,1285084236,1487988824,3481619151,3501943760,4022676207,2857362858,4226619131,1132905795,1301993293,862344499,2232521861,1166724933,4192801017,33818114,2147385727,1352724560,1014514748,2670049951,2823545768,1369633617,2740846243,1082179648,2399505039,2453646738,2636233885,946882616,4126213365,3160661948,3061301686,3668932058,557998881,270544912,4293204735,4093447923,3535760850,3447803085,202904588,321271059,3972214764,1606345055,2536874647,1149815876,388905239,3297990596,2807427751,2130477694,1031423805,1690872932,1572530013,422718233,1944491379,1623236704,2165938305,1335808335,3701702620,574907938,710180394,2419829648,2282455944,1183631942,4006029806,3094074296,338181140,3735517662,1589437022,185998603,3685578459,3772464096,845436466,980700730,169090570,1234361161,101452294,608726052,1555620956,3265224130,3552407251,2890133420,1657054818,2436475025,2503058581,3839047652,2045938553,3889509095,3364570056,929978679,1843050349,2365688973,3585172693,1318900302,2840191145,1826141292,1454176854,4109567988,3939444202,1707781989,2062847610,2923948462,135272456,3127891386,2029029496,625635109,777810478,473441308,2790781350,3027486644,3331805638,3905627112,3718347997,1961401460,524165407,1268178251,3177307325,2332919435,2316273034,1893765232,1048330814,3044132021,1724688998,1217452104,50726147,4143383030,236720654,1640145761,896163637,1471084887,3110719673,2249691526,3248052417,490350365,2653403550,3789109473,4176155640,2553000856,287453969,1775418217,3651760345,2382858638,2486413204,2603464347,507257374,2266337927,3922272489,3464972750,1437269845,676362280,3752164063,2349043596,2707028129,2299101321,219813645,3211123391,3872862694,1115997762,1758509160,1099088705,2569646233,760903469,253628687,2960903088,1420360788,3144537787,371997206];var T4=[3332727651,4169432188,4003034999,4136467323,4279104242,3602738027,3736170351,2438251973,1615867952,33751297,3467208551,1451043627,3877240574,3043153879,1306962859,3969545846,2403715786,530416258,2302724553,4203183485,4011195130,3001768281,2395555655,4211863792,1106029997,3009926356,1610457762,1173008303,599760028,1408738468,3835064946,2606481600,1975695287,3776773629,1034851219,1282024998,1817851446,2118205247,4110612471,2203045068,1750873140,1374987685,3509904869,4178113009,3801313649,2876496088,1649619249,708777237,135005188,2505230279,1181033251,2640233411,807933976,933336726,168756485,800430746,235472647,607523346,463175808,3745374946,3441880043,1315514151,2144187058,3936318837,303761673,496927619,1484008492,875436570,908925723,3702681198,3035519578,1543217312,2767606354,1984772923,3076642518,2110698419,1383803177,3711886307,1584475951,328696964,2801095507,3110654417,0,3240947181,1080041504,3810524412,2043195825,3069008731,3569248874,2370227147,1742323390,1917532473,2497595978,2564049996,2968016984,2236272591,3144405200,3307925487,1340451498,3977706491,2261074755,2597801293,1716859699,294946181,2328839493,3910203897,67502594,4269899647,2700103760,2017737788,632987551,1273211048,2733855057,1576969123,2160083008,92966799,1068339858,566009245,1883781176,4043634165,1675607228,2009183926,2943736538,1113792801,540020752,3843751935,4245615603,3211645650,2169294285,403966988,641012499,3274697964,3202441055,899848087,2295088196,775493399,2472002756,1441965991,4236410494,2051489085,3366741092,3135724893,841685273,3868554099,3231735904,429425025,2664517455,2743065820,1147544098,1417554474,1001099408,193169544,2362066502,3341414126,1809037496,675025940,2809781982,3168951902,371002123,2910247899,3678134496,1683370546,1951283770,337512970,2463844681,201983494,1215046692,3101973596,2673722050,3178157011,1139780780,3299238498,967348625,832869781,3543655652,4069226873,3576883175,2336475336,1851340599,3669454189,25988493,2976175573,2631028302,1239460265,3635702892,2902087254,4077384948,3475368682,3400492389,4102978170,1206496942,270010376,1876277946,4035475576,1248797989,1550986798,941890588,1475454630,1942467764,2538718918,3408128232,2709315037,3902567540,1042358047,2531085131,1641856445,226921355,260409994,3767562352,2084716094,1908716981,3433719398,2430093384,100991747,4144101110,470945294,3265487201,1784624437,2935576407,1775286713,395413126,2572730817,975641885,666476190,3644383713,3943954680,733190296,573772049,3535497577,2842745305,126455438,866620564,766942107,1008868894,361924487,3374377449,2269761230,2868860245,1350051880,2776293343,59739276,1509466529,159418761,437718285,1708834751,3610371814,2227585602,3501746280,2193834305,699439513,1517759789,504434447,2076946608,2835108948,1842789307,742004246];function B0(x){return x&255}function B1(x){return x>>8&255}function B2(x){return x>>16&255}function B3(x){return x>>24&255}function F1(x0,x1,x2,x3){return B1(T1[x0&255])|B1(T1[x1>>8&255])<<8|B1(T1[x2>>16&255])<<16|B1(T1[x3>>>24])<<24}function packBytes(octets){var i,j;var len=octets.length;var b=new Array(len/4);if(!octets||len%4)return;for(i=0,j=0;j<len;j+=4)b[i++]=octets[j]|octets[j+1]<<8|octets[j+2]<<16|octets[j+3]<<24;return b}function unpackBytes(packed){var j;var i=0,l=packed.length;var r=new Array(l*4);for(j=0;j<l;j++){r[i++]=B0(packed[j]);r[i++]=B1(packed[j]);r[i++]=B2(packed[j]);r[i++]=B3(packed[j])}return r}var maxkc=8;var maxrk=14;function keyExpansion(key){var kc,i,j,r,t;var rounds;var keySched=new Array(maxrk+1);var keylen=key.length;var k=new Array(maxkc);var tk=new Array(maxkc);var rconpointer=0;if(keylen==16){rounds=10;kc=4}else if(keylen==24){rounds=12;kc=6}else if(keylen==32){rounds=14;kc=8}else{alert("Invalid AES key length "+keylen);return}for(i=0;i<maxrk+1;i++)keySched[i]=new Array(4);for(i=0,j=0;j<keylen;j++,i+=4)k[j]=key.charCodeAt(i)|key.charCodeAt(i+1)<<8|key.charCodeAt(i+2)<<16|key.charCodeAt(i+3)<<24;for(j=kc-1;j>=0;j--)tk[j]=k[j];r=0;t=0;for(j=0;j<kc&&r<rounds+1;){for(;j<kc&&t<4;j++,t++){keySched[r][t]=tk[j]}if(t==4){r++;t=0}}while(r<rounds+1){var temp=tk[kc-1];tk[0]^=S[B1(temp)]|S[B2(temp)]<<8|S[B3(temp)]<<16|S[B0(temp)]<<24;tk[0]^=Rcon[rconpointer++];if(kc!=8){for(j=1;j<kc;j++)tk[j]^=tk[j-1]}else{for(j=1;j<kc/2;j++)tk[j]^=tk[j-1];temp=tk[kc/2-1];tk[kc/2]^=S[B0(temp)]|S[B1(temp)]<<8|S[B2(temp)]<<16|S[B3(temp)]<<24;for(j=kc/2+1;j<kc;j++)tk[j]^=tk[j-1]}for(j=0;j<kc&&r<rounds+1;){for(;j<kc&&t<4;j++,t++){keySched[r][t]=tk[j]}if(t==4){r++;t=0}}}return{rounds:rounds,rk:keySched}}function AESencrypt(block,ctx){var r;var t0,t1,t2,t3;var b=packBytes(block);var rounds=ctx.rounds;var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];for(r=0;r<rounds-1;r++){t0=b0^ctx.rk[r][0];t1=b1^ctx.rk[r][1];t2=b2^ctx.rk[r][2];t3=b3^ctx.rk[r][3];b0=T1[t0&255]^T2[t1>>8&255]^T3[t2>>16&255]^T4[t3>>>24];b1=T1[t1&255]^T2[t2>>8&255]^T3[t3>>16&255]^T4[t0>>>24];b2=T1[t2&255]^T2[t3>>8&255]^T3[t0>>16&255]^T4[t1>>>24];b3=T1[t3&255]^T2[t0>>8&255]^T3[t1>>16&255]^T4[t2>>>24]}r=rounds-1;t0=b0^ctx.rk[r][0];t1=b1^ctx.rk[r][1];t2=b2^ctx.rk[r][2];t3=b3^ctx.rk[r][3];b[0]=F1(t0,t1,t2,t3)^ctx.rk[rounds][0];b[1]=F1(t1,t2,t3,t0)^ctx.rk[rounds][1];b[2]=F1(t2,t3,t0,t1)^ctx.rk[rounds][2];b[3]=F1(t3,t0,t1,t2)^ctx.rk[rounds][3];return unpackBytes(b)}var b64s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function s2r(t){var a,c,n;var r="",l=0,s=0;var tl=t.length;for(n=0;n<tl;n++){c=t.charCodeAt(n);if(s==0){r+=b64s.charAt(c>>2&63);a=(c&3)<<4}else if(s==1){r+=b64s.charAt(a|c>>4&15);a=(c&15)<<2}else if(s==2){r+=b64s.charAt(a|c>>6&3);l+=1;if(l%60==0)r+="\n";r+=b64s.charAt(c&63)}l+=1;if(l%60==0)r+="\n";s+=1;if(s==3)s=0}if(s>0){r+=b64s.charAt(a);l+=1;if(l%60==0)r+="\n";r+="=";l+=1}if(s==1){if(l%60==0)r+="\n";r+="="}return r}function r2s(t){var c,n;var r="",s=0,a=0;var tl=t.length;for(n=0;n<tl;n++){c=b64s.indexOf(t.charAt(n));if(c>=0){if(s)r+=String.fromCharCode(a|c>>6-s&255);s=s+2&7;a=c<<s&255}}return r}var alert=function(message){throw new Error(message)};"use strict";var bs=28;var bx2=1<<bs,bm=bx2-1,bx=bx2>>1,bd=bs>>1,bdm=(1<<bd)-1;var log2=Math.log(2);function zeros(n){var r=new Array(n);while(n-- >0)r[n]=0;return r}function zclip(r){var n=r.length;if(r[n-1])return r;while(n>1&&r[n-1]==0)n--;return r.slice(0,n)}function nbits(x){var n=1,t;if((t=x>>>16)!=0){x=t;n+=16}if((t=x>>8)!=0){x=t;n+=8}if((t=x>>4)!=0){x=t;n+=4}if((t=x>>2)!=0){x=t;n+=2}if((t=x>>1)!=0){x=t;n+=1}return n}function badd(a,b){var al=a.length;var bl=b.length;if(al<bl)return badd(b,a);var r=new Array(al);var c=0,n=0;for(;n<bl;n++){c+=a[n]+b[n];r[n]=c&bm;c>>>=bs}for(;n<al;n++){c+=a[n];r[n]=c&bm;c>>>=bs}if(c)r[n]=c;return r}function bsub(a,b){var al=a.length;var bl=b.length;if(bl>al)return[];if(bl==al){if(b[bl-1]>a[bl-1])return[];if(bl==1)return[a[0]-b[0]]}var r=new Array(al);var c=0;for(var n=0;n<bl;n++){c+=a[n]-b[n];r[n]=c&bm;c>>=bs}for(;n<al;n++){c+=a[n];r[n]=c&bm;c>>=bs}if(c)return[];return zclip(r)}function ip(w,n,x,y,c){var xl=x&bdm;var xh=x>>bd;var yl=y&bdm;var yh=y>>bd;var m=xh*yl+yh*xl;var l=xl*yl+((m&bdm)<<bd)+w[n]+c;w[n]=l&bm;c=xh*yh+(m>>bd)+(l>>bs);return c}function bsqr(x){var t=x.length;var n=2*t;var r=zeros(n);var c=0;var i,j;for(i=0;i<t;i++){c=ip(r,2*i,x[i],x[i],0);for(j=i+1;j<t;j++){c=ip(r,i+j,2*x[j],x[i],c)}r[i+t]=c}return zclip(r)}function bmul(x,y){var n=x.length;var t=y.length;var r=zeros(n+t-1);var c,i,j;for(i=0;i<t;i++){c=0;for(j=0;j<n;j++){c=ip(r,i+j,x[j],y[i],c)}r[i+n]=c}return zclip(r)}function toppart(x,start,len){var n=0;while(start>=0&&len-- >0)n=n*bx2+x[start--];return n}function bdiv(a,b){var n=a.length-1;var t=b.length-1;var nmt=n-t;if(n<t||n==t&&(a[n]<b[n]||n>0&&a[n]==b[n]&&a[n-1]<b[n-1])){return{q:[0],mod:a}}if(n==t&&toppart(a,t,2)/toppart(b,t,2)<4){var x=a.concat();var qq=0;var xx;for(;;){xx=bsub(x,b);if(xx.length==0)break;x=xx;qq++}return{q:[qq],mod:x}}var shift2=Math.floor(Math.log(b[t])/log2)+1;var shift=bs-shift2;var x=a.concat();var y=b.concat();if(shift){for(i=t;i>0;i--)y[i]=y[i]<<shift&bm|y[i-1]>>shift2;y[0]=y[0]<<shift&bm;if(x[n]&(bm<<shift2&bm)){x[++n]=0;nmt++}for(i=n;i>0;i--)x[i]=x[i]<<shift&bm|x[i-1]>>shift2;x[0]=x[0]<<shift&bm}var i,j,x2;var q=zeros(nmt+1);var y2=zeros(nmt).concat(y);for(;;){x2=bsub(x,y2);if(x2.length==0)break;q[nmt]++;x=x2}var yt=y[t],top=toppart(y,t,2);for(i=n;i>t;i--){var m=i-t-1;if(i>=x.length)q[m]=1;else if(x[i]==yt)q[m]=bm;else q[m]=Math.floor(toppart(x,i,2)/yt);var topx=toppart(x,i,3);while(q[m]*top>topx)q[m]--;y2=y2.slice(1);x2=bsub(x,bmul([q[m]],y2));if(x2.length==0){q[m]--;x2=bsub(x,bmul([q[m]],y2))}x=x2}if(shift){for(i=0;i<x.length-1;i++)x[i]=x[i]>>shift|x[i+1]<<shift2&bm;x[x.length-1]>>=shift}return{q:zclip(q),mod:zclip(x)}}function simplemod(i,m){var c=0,v;for(var n=i.length-1;n>=0;n--){v=i[n];c=((v>>bd)+(c<<bd))%m;c=((v&bdm)+(c<<bd))%m}return c}function bmod(p,m){if(m.length==1){if(p.length==1)return[p[0]%m[0]];if(m[0]<bdm)return[simplemod(p,m[0])]}var r=bdiv(p,m);return r.mod}function bmod2(x,m,mu){var xl=x.length-(m.length<<1);if(xl>0)return bmod2(x.slice(0,xl).concat(bmod2(x.slice(xl),m,mu)),m,mu);var ml1=m.length+1,ml2=m.length-1,rr;var q3=bmul(x.slice(ml2),mu).slice(ml1);var r1=x.slice(0,ml1);var r2=bmul(q3,m).slice(0,ml1);var r=bsub(r1,r2);if(r.length==0){r1[ml1]=1;r=bsub(r1,r2)}for(var n=0;;n++){rr=bsub(r,m);if(rr.length==0)break;r=rr;if(n>=3)return bmod2(r,m,mu)}return r}function bexpmod(g,e,m){var a=g.concat();var l=e.length-1;var n=nbits(e[l])-2;for(;l>=0;l--){for(;n>=0;n-=1){a=bmod(bsqr(a),m);if(e[l]&1<<n)a=bmod(bmul(a,g),m)}n=bs-1}return a}function bmodexp(g,e,m){var a=g.concat();var l=e.length-1;var n=m.length*2;var mu=zeros(n+1);mu[n]=1;mu=bdiv(mu,m).q;n=nbits(e[l])-2;for(;l>=0;l--){for(;n>=0;n-=1){a=bmod2(bsqr(a),m,mu);if(e[l]&1<<n)a=bmod2(bmul(a,g),m,mu)}n=bs-1}return a}function RSAencrypt(s,e,m){return bexpmod(s,e,m)}function RSAdecrypt(m,d,p,q,u){var xp=bmodexp(bmod(m,p),bmod(d,bsub(p,[1])),p);var xq=bmodexp(bmod(m,q),bmod(d,bsub(q,[1])),q);var t=bsub(xq,xp);if(t.length==0){t=bsub(xp,xq);t=bmod(bmul(t,u),q);t=bsub(q,t)}else{t=bmod(bmul(t,u),q)}return badd(bmul(t,p),xp)}function mpi2b(s){var bn=1,r=[0],rn=0,sb=256;var c,sn=s.length;if(sn<2){alert("string too short, not a MPI");return 0}var len=(sn-2)*8;var bits=s.charCodeAt(0)*256+s.charCodeAt(1);if(bits>len||bits<len-8){alert("not a MPI, bits="+bits+",len="+len);return 0}for(var n=0;n<len;n++){if((sb<<=1)>255){sb=1;c=s.charCodeAt(--sn)}if(bn>bm){bn=1;r[++rn]=0}if(c&sb)r[rn]|=bn;bn<<=1}return r}function b2mpi(b){var bn=1,bc=0,r=[0],rb=1,rn=0;var bits=b.length*bs;var n,rr="";for(n=0;n<bits;n++){if(b[bc]&bn)r[rn]|=rb;if((rb<<=1)>255){rb=1;r[++rn]=0}if((bn<<=1)>bm){bn=1;bc++}}while(rn&&r[rn]==0)rn--;bn=256;for(bits=8;bits>0;bits--)if(r[rn]&(bn>>=1))break;bits+=rn*8;rr+=String.fromCharCode(bits/256)+String.fromCharCode(bits%256);if(bits)for(n=rn;n>=0;n--)rr+=String.fromCharCode(r[n]);return rr}var hexcase=0;var b64pad="";var chrsz=8;function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length*chrsz))}function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length*chrsz))}function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length*chrsz))}function hex_hmac_sha1(key,data){return binb2hex(core_hmac_sha1(key,data))}function b64_hmac_sha1(key,data){return binb2b64(core_hmac_sha1(key,data))}function str_hmac_sha1(key,data){return binb2str(core_hmac_sha1(key,data))}function sha1_vm_test(){return hex_sha1("abc")=="a9993e364706816aba3e25717850c26c9cd0d89d"}function core_sha1(x,len){x[len>>5]|=128<<24-len%32;x[(len+64>>9<<4)+15]=len;var w=Array(80);var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var e=-1009589776;for(var i=0;i<x.length;i+=16){var olda=a;var oldb=b;var oldc=c;var oldd=d;var olde=e;for(var j=0;j<80;j++){if(j<16)w[j]=x[i+j];else w[j]=rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);var t=safe_add(safe_add(rol(a,5),sha1_ft(j,b,c,d)),safe_add(safe_add(e,w[j]),sha1_kt(j)));e=d;d=c;c=rol(b,30);b=a;a=t}a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd);e=safe_add(e,olde)}return Array(a,b,c,d,e)}function sha1_ft(t,b,c,d){if(t<20)return b&c|~b&d;if(t<40)return b^c^d;if(t<60)return b&c|b&d|c&d;return b^c^d}function sha1_kt(t){return t<20?1518500249:t<40?1859775393:t<60?-1894007588:-899497514}function core_hmac_sha1(key,data){var bkey=str2binb(key);if(bkey.length>16)bkey=core_sha1(bkey,key.length*chrsz);var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++){ipad[i]=bkey[i]^909522486;opad[i]=bkey[i]^1549556828}var hash=core_sha1(ipad.concat(str2binb(data)),512+data.length*chrsz);return core_sha1(opad.concat(hash),512+160)}function safe_add(x,y){var lsw=(x&65535)+(y&65535);var msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|lsw&65535}function rol(num,cnt){return num<<cnt|num>>>32-cnt}function str2binb(str){var bin=Array();var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz)bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<24-i%32;return bin}function binb2str(bin){var str="";var mask=(1<<chrsz)-1;for(var i=0;i<bin.length*32;i+=chrsz)str+=String.fromCharCode(bin[i>>5]>>>24-i%32&mask);return str}function binb2hex(binarray){var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i<binarray.length*4;i++){str+=hex_tab.charAt(binarray[i>>2]>>(3-i%4)*8+4&15)+hex_tab.charAt(binarray[i>>2]>>(3-i%4)*8&15)}return str}function binb2b64(binarray){var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";for(var i=0;i<binarray.length*4;i+=3){var triplet=(binarray[i>>2]>>8*(3-i%4)&255)<<16|(binarray[i+1>>2]>>8*(3-(i+1)%4)&255)<<8|binarray[i+2>>2]>>8*(3-(i+2)%4)&255;for(var j=0;j<4;j++){if(i*8+j*6>binarray.length*32)str+=b64pad;else str+=tab.charAt(triplet>>6*(3-j)&63)}}return str}