{"version":3,"sources":["crypto/custom_sjcl_1.0.8.js","img/logo.ts","layout/darkmode.tsx","redux/main-slice.tsx","redux/store.tsx","api/api-def.tsx","components/ResultAlert.tsx","components/TimeDelayShowAndEdit.tsx","components/CreateNewKeys.tsx","utils/utils.ts","components/BoldTime.tsx","utils/PdfDocument.tsx","components/ShareOrForget.tsx","crypto/cryptoUtils.ts","crypto/otp_parts.ts","components/DataTextEffects.tsx","components/CEmoji.tsx","components/AvailData.tsx","components/AddLockData.tsx","components/KeyInput.tsx","components/StartUnlock.tsx","components/DebugData.tsx","components/AlertList.tsx","components/StoreForTemp.tsx","components/ShareTemp.tsx","components/UseSharedCode.tsx","App.tsx","index.tsx"],"names":["sjcl","cipher","hash","keyexchange","mode","misc","codec","exception","corrupt","message","this","toString","invalid","bug","notReady","bitArray","bitSlice","a","bstart","bend","_shiftRight","slice","undefined","clamp","extract","blength","sh","Math","floor","concat","a1","a2","length","last","shift","getPartial","bitLength","x","l","len","ceil","partial","_end","round","equal","b","i","carry","out","last2","shift2","push","pop","_xor4","y","byteswapM","v","bn","it","initWith","prototype","radix","maxMul","_class","copy","k","limbs","normalize","replace","parseInt","substring","max","equals","that","difference","fullReduce","getLimb","greaterEquals","less","greater","s","addM","ll","doubleM","tmp","r","m","radixMask","halveM","subM","mod","neg","ci","sub","trim","inverseMod","p","nz","add","mul","j","ai","al","bl","c","ii","cnormalize","reduce","square","power","pow","mulmod","N","powermod","montOut","montpowermod","R","wind","bitsize","map","RR","NN","RP","NP","RT","R2","montIn","montMul","ab","right","abBar","mask","h","precomp","cap","getBit","exp","off","indx","pv","placeVal","ipv","toBits","exponent","w","e","min","fromBits","bits","words","t","unshift","pseudoMersennePrime","coeff","mo","ppr","modOffset","offset","factor","minOffset","fullMask","fullOffset","fullFactor","modulus","ol","fac","_strongReduce","inverse","globals","sbp","prime","p127","p25519","p192k","p224k","p256k","p192","p224","p256","p384","p521","random","paranoia","randomWords","arrayBuffer","ArrayBuffer","DataView","ccm","defaults","tlen","compat_encrypt","prf","plaintext","iv","adata","encrypted_obj","ct","plaintext_buffer","encrypt","ciphertext_buffer","tag","compat_decrypt","ciphertext","decrypt","mac","L","ivl","byteLength","_computeTag","_ctrMode","mac2","data_buffer","data","_macAdditionalData","setUint8","getUint32","ctr","word0","word1","word2","word3","keyblock","xor","n","_callProgressListener","setUint32","arr","padding","padding_count","smallest","buffer","getUint8","inView","hexDumpBuffer","width","stringBufferView","string","getUint16","Array","join","console","log","toUpperCase","base32","_chars","_hexChars","BITS","BASE","REMAINING","_noEquals","_hex","ta","charAt","str","format","indexOf","base32hex","base64","_url","substr","base64url","bytes","hex","utf8String","String","fromCharCode","decodeURIComponent","escape","unescape","encodeURIComponent","charCodeAt","json","iter","ks","ts","_encrypt","password","params","rp","prp","_add","salt","cachedPbkdf2","key","ecc","elGamal","publicKey","kem","kemtag","apply","arguments","encode","_decrypt","secretKey","unkem","raw","decode","obj","comma","hasOwnProperty","match","split","target","src","requireSame","_subtract","plus","minus","_filter","filter","_pbkdf2Cache","cp","cache","firstSalt","pbkdf2","point","curve","isIdentity","field","toJac","pointJac","mult","toAffine","mult2","k2","affine2","multiples","_multiples","doubl","negate","newY","isValid","z","T","sz2","d","c2","x1","x2","y1","y2","S","z2","zi","zi2","affine","k1","l1","l2","m1","m2","z4","z6","Field","G","curves","c192","c224","c256","c384","c521","k192","k224","k256","curveName","curcurve","deserialize","type","basicKey","_curve","_curveBitLength","_point","serialize","getType","get","pointbits","_exponent","generateKeys","cn","sec","pub","sha256","dh","pk","dhJavaEc","ecdsa","verify","rs","fakeLegacyVersion","ss","hG","hA","r2","sign","fixedKForTesting","module","exports","hkdf","ikm","keyBitLength","info","Hash","hmac","hashLen","loops","curOut","ret","update","digest","hmacKeys","_hash","exKey","bs","blockSize","_baseHash","serverKey","clientKey","_resultHash","_updated","reset","finalize","result","ocb2","name","premac","bi","pad","times2","_times2","checksum","delta","output","pmac","ocb2progressive","createEncryptor","datacache","process","createDecryptor","cachelen","count","Prff","u","ui","prng","defaultParanoia","_pools","_poolEntropy","_reseedCount","_robins","_eventId","_collectorIds","_collectorIdNext","_strength","_poolStrength","_nextReseed","_key","_counter","_cipher","_defaultParanoia","_collectorsStarted","_callbacks","progress","seeded","_callbackI","_NOT_READY","_READY","_REQUIRES_RESEED","_MAX_WORDS_PER_BURST","_PARANOIA_LEVELS","_MILLISECONDS_PER_RESEED","_BITS_PER_RESEED","nwords","g","readiness","isReady","_reseedFromPools","_gate","_gen4words","setDefaultParanoia","allowZeroParanoia","addEntropy","estimatedEntropy","source","id","objName","Date","valueOf","robin","oldReady","err","Object","call","_fireEvent","getProgress","entropyRequired","startCollectors","_eventListener","loadTimeCollector","_bind","_loadTimeCollector","mouseCollector","_mouseCollector","keyboardCollector","_keyboardCollector","accelerometerCollector","_accelerometerCollector","touchCollector","_touchCollector","window","addEventListener","document","attachEvent","stopCollectors","removeEventListener","detachEvent","callback","cb","cbs","jsTemp","func","aes","_reseed","seedWords","full","reseedData","strength","_addCurrentTimeToEntropy","ev","clientX","offsetX","clientY","offsetY","touch","touches","changedTouches","pageX","pageY","performance","now","ac","accelerationIncludingGravity","orientation","or","arg","cbsTemp","ripemd160","_h","_buffer","_length","_h0","nl","splice","_cvt","_block","zp","_k1","_k2","_r1","_r2","_s1","_s2","_f0","_f1","_f2","_f3","_f4","_rol","X","A1","B1","C1","D1","E1","A2","B2","C2","D2","E2","_precompute","_init","export","JSON","stringify","import","_data","parse","Uint32Array","subarray","isPrime","frac","h0","h1","h2","h3","h4","h5","h6","h7","sha1","_f","_S","srp","makeVerifier","I","P","group","makeX","inner","knownGroup","_didInitKnownGroups","_initKnownGroups","_knownGroups","size","_knownGroupSizes","buf","crypt","require","getCryptoModule","randomBytes","Uint8Array","crypto","getRandomValues","msCrypto","logo","stylesheets","light","dark","getStylesheetLink","head","querySelector","link","createElement","rel","appendChild","createStylesheetLink","getTheme","localStorage","getItem","matchMedia","matches","setTheme","setItem","href","ToggleDarkMode","React","useState","theme","setStrTheme","useEffect","checkedChildren","unCheckedChildren","checked","onChange","MainSliceStorageKey","MainSliceTypePrefix","initialState","keys","lockedData","unlocks","temps","mainSlice","createSlice","reducers","addKey","reducer","state","action","payload","prepare","addLockedData","addUnLockedData","delKey","forgetKey","keySalt","keyProof","delLockedData","desc","delUnLockedData","from","to","clearAll","addTempInfo","token","delTempInfo","tempproof","proof","actions","store","configureStore","mainSliceReducer","middleware","getDefaultMiddleware","subscribe","throttle","dataToSave","getState","useAppDispatch","useDispatch","useAppSelector","useSelector","safeB64Pairs","makeSafeB64_32","b64string","forEach","SERVER_BASE","fastFetch","path","url","reqBody","isArray","val","fetch","method","headers","body","response","fetchNewGroup","times","time","fetchEncPass","salts","pass","fetchEncHash","hashparts","fetchStartUnlock","encPass","keyId","offsetMin","durationMin","enckey","tokenproof","offsetstartmin","duration","fetchFinishUnlockSimple","timeLeftOpen","fetchFinishUnlockSha","hashtype","hashstate","hashsecret","hashstep","fetchFinishUnlockOTP","hashextra","fetchCreateTemp","fetchConvertFastTemp","fetchUnloackWithFast","mindiff","fastproof","ResultAlert","props","msg","TimeDelayShowAndEdit","value","visible","setVisible","fastChange","index","current","onClick","EditOutlined","title","closeIcon","footer","style","lineHeight","listStyleType","CaretUpOutlined","CaretDownOutlined","CreateNewKeys","dispath","groups","main","setTimes","alertList","setAlertList","clearOldTimeout","setClearOldTimeout","addAlert","old","clearTimeout","setTimeout","direction","margin","danger","aclone","DeleteOutlined","newvalue","float","disabled","timeStrings","array","existing","then","tokens","catch","startNewKeyProcess","BoldTime","color","fontSize","PdfDocument","ready","setReady","fileName","loading","error","Paragraph","Typography","styles","StyleSheet","create","txt","textAlign","backgroundColor","img","height","section","border","flexDirection","header","pageNumber","position","bottom","left","TestDocument","fixed","toDateString","flexWrap","justifyContent","images","viewBox","top","borderLeft","opacity","render","totalPages","getQR","Promise","ok","bad","QRCode","ShareForgetKeys","dispatch","keysQR","setKeysQr","modifyKey","setModifyKey","singleModalVisible","setSingleModalVisible","selQR","setSelQR","selID","setSelID","display","copyable","text","icon","CopyOutlined","CheckOutlined","tooltips","startsWith","QrcodeOutlined","marginBottom","all","closable","hashStep","hashFinalStepBytes","hashFinalStep","uint32_arr","TOTP2Keys","secretBase32","hashAlgo","hex2FFarr","finalHashBytesArray","_","twoStepSha1Hmac","getKeyOut_server","keyIn_client","code_int_arr","counterUint32Arr","innerState","innerDigest","innerDigestLeft","innerDigestRight","serverOutState","finalHash","NumericToUint8Array","counter","number","digits","hexCounter","bytesArr","getTimeDataNumArray","steps","GenerateTOTPWithSign","signature","signatureArray","Title","Text","isLink","sha256_simple","msgBuffer","TextEncoder","subtle","hashBuffer","hashArray","hashHex","padStart","redactCopy","AsyncImage","setSrc","getSrc","alt","SecretMessage","setResult","input","setInput","placeholder","sharedSecret","wordBreak","SecretMessageParts","CalculateHash","code","unlock","dataparts","SHA_DELIM","part","hashType","unlockProof","Error","hashresult","TOTPParts","CalculateTOTPHashCode","innerText","MAC_DELIM","serverKey_enc","totp_signature","TextEffects","endsWith","isImage","encodeURI","isTotpParts","totpStr","isTOTP","authenticator","generate","isHASH256Parts","hashSahredSecret","isHASH1Parts","isHASH256","isQR","qrData","CEmoji","className","SimpleEmpty","ShowOrDelete","deleteFunc","setDeleteFunc","modalVisible","setModalVisible","alertMsg","setAlertMsg","modalData","setModalData","closeTimeout","setCloseTimeout","selectedUnlock","setSelectedUnlock","customCallback","alert","deleteCB","closeModal","onOk","onCancel","wrap","alignItems","dir","wordWrap","unlocksArray","btnType","btnDanger","timeprefix","prettyms","timecalc","secondsDecimalDigits","AvailableData","nowTime","setNowTime","setInterval","clearInterval","deleteUnlock","unlockFinishProcess","setAlert","delCB","encryptor","encData","level","deleteOnly","Panel","Collapse","TextArea","Input","AddLockData","locked","selectedKeysSalt","setSelectedKeysSalt","setData","setName","key2value","value2salt","convertMacParts","randomPass","dataStripped","MACparts","MACKeyPairs","encparts","encrHashParts","dataWithHashparts","convertHashParts","startLockDataProcess","encRandomPass","dataWithEncHashParts","dataEncrypted","availablePass","description","showIcon","Group","options","label","values","paddingLeft","mark","resize","set","QrReader","QrReaderAll","trimf","KeyInput","setId","setSalt","setProof","pasteVisible","setPasteVisible","pasteData","setPasteData","qrVisible","setQrVisible","setQrData","modalMsgs","paste","scan","valid","pasteValidMsg","setPasteValidMsg","qrValidMsg","setQrValidMsg","errorValidMsg","validateKeyObj","infoMsg","clearPasteModal","qrKey","setQrKey","clearQrModal","clearInputs","marginLeft","whiteSpace","extraChecks","onSubmit","buttonText","okText","okButtonProps","marginTop","delay","onError","onScan","facingMode","Select","Option","StartUnlock","sLocked","setSLocked","setOffset","onKeyUp","currentTarget","cbKey","keyID","DebugData","setUrl","location","reload","AddToAlertList","listName","dispatchEvent","CustomEvent","detail","AlertList","eventHandler","resetClearTimeout","StoreForTemp","ALERT_LIST_NAME","startSaveTempProcess","ShowCode","strong","test","ShareTemp","myNow","setMyNow","selectedTemp","setSelectedTemp","VALID_TIME","tempCodeStart","setTempCodeStart","tempCode","setTempCode","shareVisible","setVisibleShare","startShareTemp","tempinfo","closeShowTemp","status","bordered","column","Item","strokeColor","percent","showInfo","UseSharedCode","locks","selectedLocked","setSelectedLocked","selectedSaltKey","setSelectedSaltKey","shareCode","setShareCode","timeCode","setTimeCode","findIndex","encPassObj","startUnlockWithSharedCode","QRCodeALL","DatePicker","RangePicker","Steps","Step","ImportKeys","setMsg","final","ManageData","dataName","setDataName","ClearAll","App","showDebug","setShowDebug","scrollTimeout","setScrollTimeout","throttleFunc","scrollIntoView","block","behavior","onCollapse","querySelectorAll","mainKeys","accordion","defaultActiveKey","rootElement","getElementById"],"mappings":"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CA,EACA,GACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,GACA,EACA,GACA,EACA,GACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EACA,EACA,GACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EACA,EACA,EACA,IAGEC,EAAM,CACR,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EACA,EACA,GACA,EACA,GACA,GACA,EACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,GACA,EACA,GACA,GACA,GACA,EACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,GACA,EACA,GACA,EACA,EACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,GAEEC,EAAM,CACR,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,GACA,GACA,EACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,EACA,EACA,GACA,GACA,EACA,EACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,EACA,GACA,EACA,EACA,GACA,EACA,GACA,EACA,GACA,EACA,EACA,EACA,GACA,EACA,GACA,EACA,GACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,IAGF,SAASC,EAAI5gB,EAAGiB,EAAGsR,GACjB,OAAOvS,EAAIiB,EAAIsR,EAGjB,SAASsO,EAAI7gB,EAAGiB,EAAGsR,GACjB,OAAQvS,EA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","file":"static/js/main.c510bd84.chunk.js","sourcesContent":["/** @fileOverview Javascript cryptography implementation.\r\n *\r\n * Crush to remove comments, shorten variable names and\r\n * generally reduce transmission size.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n(\"use strict\");\r\n/*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */\r\n/*global document, window, escape, unescape, module, require, Uint32Array */\r\n\r\n/**\r\n * The Stanford Javascript Crypto Library, top-level namespace.\r\n * @namespace\r\n */\r\nvar sjcl = {\r\n /**\r\n * Symmetric ciphers.\r\n * @namespace\r\n */\r\n cipher: {},\r\n\r\n /**\r\n * Hash functions. Right now only SHA256 is implemented.\r\n * @namespace\r\n */\r\n hash: {},\r\n\r\n /**\r\n * Key exchange functions. Right now only SRP is implemented.\r\n * @namespace\r\n */\r\n keyexchange: {},\r\n\r\n /**\r\n * Cipher modes of operation.\r\n * @namespace\r\n */\r\n mode: {},\r\n\r\n /**\r\n * Miscellaneous. HMAC and PBKDF2.\r\n * @namespace\r\n */\r\n misc: {},\r\n\r\n /**\r\n * Bit array encoders and decoders.\r\n * @namespace\r\n *\r\n * @description\r\n * The members of this namespace are functions which translate between\r\n * SJCL's bitArrays and other objects (usually strings). Because it\r\n * isn't always clear which direction is encoding and which is decoding,\r\n * the method names are \"fromBits\" and \"toBits\".\r\n */\r\n codec: {},\r\n\r\n /**\r\n * Exceptions.\r\n * @namespace\r\n */\r\n exception: {\r\n /**\r\n * Ciphertext is corrupt.\r\n * @constructor\r\n */\r\n corrupt: function (message) {\r\n this.toString = function () {\r\n return \"CORRUPT: \" + this.message;\r\n };\r\n this.message = message;\r\n },\r\n\r\n /**\r\n * Invalid parameter.\r\n * @constructor\r\n */\r\n invalid: function (message) {\r\n this.toString = function () {\r\n return \"INVALID: \" + this.message;\r\n };\r\n this.message = message;\r\n },\r\n\r\n /**\r\n * Bug or missing feature in SJCL.\r\n * @constructor\r\n */\r\n bug: function (message) {\r\n this.toString = function () {\r\n return \"BUG: \" + this.message;\r\n };\r\n this.message = message;\r\n },\r\n\r\n /**\r\n * Something isn't ready.\r\n * @constructor\r\n */\r\n notReady: function (message) {\r\n this.toString = function () {\r\n return \"NOT READY: \" + this.message;\r\n };\r\n this.message = message;\r\n }\r\n }\r\n};\r\n\r\n/** @fileOverview Arrays of bits, encoded as arrays of Numbers.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Arrays of bits, encoded as arrays of Numbers.\r\n * @namespace\r\n * @description\r\n *

\r\n * These objects are the currency accepted by SJCL's crypto functions.\r\n *

\r\n *\r\n *

\r\n * Most of our crypto primitives operate on arrays of 4-byte words internally,\r\n * but many of them can take arguments that are not a multiple of 4 bytes.\r\n * This library encodes arrays of bits (whose size need not be a multiple of 8\r\n * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an\r\n * array of words, 32 bits at a time. Since the words are double-precision\r\n * floating point numbers, they fit some extra data. We use this (in a private,\r\n * possibly-changing manner) to encode the number of bits actually present\r\n * in the last word of the array.\r\n *

\r\n *\r\n *

\r\n * Because bitwise ops clear this out-of-band data, these arrays can be passed\r\n * to ciphers like AES which want arrays of words.\r\n *

\r\n */\r\nsjcl.bitArray = {\r\n /**\r\n * Array slices in units of bits.\r\n * @param {bitArray} a The array to slice.\r\n * @param {Number} bstart The offset to the start of the slice, in bits.\r\n * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined,\r\n * slice until the end of the array.\r\n * @return {bitArray} The requested slice.\r\n */\r\n bitSlice: function (a, bstart, bend) {\r\n a = sjcl.bitArray\r\n ._shiftRight(a.slice(bstart / 32), 32 - (bstart & 31))\r\n .slice(1);\r\n return bend === undefined ? a : sjcl.bitArray.clamp(a, bend - bstart);\r\n },\r\n\r\n /**\r\n * Extract a number packed into a bit array.\r\n * @param {bitArray} a The array to slice.\r\n * @param {Number} bstart The offset to the start of the slice, in bits.\r\n * @param {Number} blength The length of the number to extract.\r\n * @return {Number} The requested slice.\r\n */\r\n extract: function (a, bstart, blength) {\r\n // FIXME: this Math.floor is not necessary at all, but for some reason\r\n // seems to suppress a bug in the Chromium JIT.\r\n var x,\r\n sh = Math.floor((-bstart - blength) & 31);\r\n if (((bstart + blength - 1) ^ bstart) & -32) {\r\n // it crosses a boundary\r\n x =\r\n (a[(bstart / 32) | 0] << (32 - sh)) ^ (a[(bstart / 32 + 1) | 0] >>> sh);\r\n } else {\r\n // within a single word\r\n x = a[(bstart / 32) | 0] >>> sh;\r\n }\r\n return x & ((1 << blength) - 1);\r\n },\r\n\r\n /**\r\n * Concatenate two bit arrays.\r\n * @param {bitArray} a1 The first array.\r\n * @param {bitArray} a2 The second array.\r\n * @return {bitArray} The concatenation of a1 and a2.\r\n */\r\n concat: function (a1, a2) {\r\n if (a1.length === 0 || a2.length === 0) {\r\n return a1.concat(a2);\r\n }\r\n\r\n var last = a1[a1.length - 1],\r\n shift = sjcl.bitArray.getPartial(last);\r\n if (shift === 32) {\r\n return a1.concat(a2);\r\n } else {\r\n return sjcl.bitArray._shiftRight(\r\n a2,\r\n shift,\r\n last | 0,\r\n a1.slice(0, a1.length - 1)\r\n );\r\n }\r\n },\r\n\r\n /**\r\n * Find the length of an array of bits.\r\n * @param {bitArray} a The array.\r\n * @return {Number} The length of a, in bits.\r\n */\r\n bitLength: function (a) {\r\n var l = a.length,\r\n x;\r\n if (l === 0) {\r\n return 0;\r\n }\r\n x = a[l - 1];\r\n return (l - 1) * 32 + sjcl.bitArray.getPartial(x);\r\n },\r\n\r\n /**\r\n * Truncate an array.\r\n * @param {bitArray} a The array.\r\n * @param {Number} len The length to truncate to, in bits.\r\n * @return {bitArray} A new array, truncated to len bits.\r\n */\r\n clamp: function (a, len) {\r\n if (a.length * 32 < len) {\r\n return a;\r\n }\r\n a = a.slice(0, Math.ceil(len / 32));\r\n var l = a.length;\r\n len = len & 31;\r\n if (l > 0 && len) {\r\n a[l - 1] = sjcl.bitArray.partial(\r\n len,\r\n a[l - 1] & (0x80000000 >> (len - 1)),\r\n 1\r\n );\r\n }\r\n return a;\r\n },\r\n\r\n /**\r\n * Make a partial word for a bit array.\r\n * @param {Number} len The number of bits in the word.\r\n * @param {Number} x The bits.\r\n * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.\r\n * @return {Number} The partial word.\r\n */\r\n partial: function (len, x, _end) {\r\n if (len === 32) {\r\n return x;\r\n }\r\n return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;\r\n },\r\n\r\n /**\r\n * Get the number of bits used by a partial word.\r\n * @param {Number} x The partial word.\r\n * @return {Number} The number of bits used by the partial word.\r\n */\r\n getPartial: function (x) {\r\n return Math.round(x / 0x10000000000) || 32;\r\n },\r\n\r\n /**\r\n * Compare two arrays for equality in a predictable amount of time.\r\n * @param {bitArray} a The first array.\r\n * @param {bitArray} b The second array.\r\n * @return {boolean} true if a == b; false otherwise.\r\n */\r\n equal: function (a, b) {\r\n if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) {\r\n return false;\r\n }\r\n var x = 0,\r\n i;\r\n for (i = 0; i < a.length; i++) {\r\n x |= a[i] ^ b[i];\r\n }\r\n return x === 0;\r\n },\r\n\r\n /** Shift an array right.\r\n * @param {bitArray} a The array to shift.\r\n * @param {Number} shift The number of bits to shift.\r\n * @param {Number} [carry=0] A byte to carry in\r\n * @param {bitArray} [out=[]] An array to prepend to the output.\r\n * @private\r\n */\r\n _shiftRight: function (a, shift, carry, out) {\r\n var i,\r\n last2 = 0,\r\n shift2;\r\n if (out === undefined) {\r\n out = [];\r\n }\r\n\r\n for (; shift >= 32; shift -= 32) {\r\n out.push(carry);\r\n carry = 0;\r\n }\r\n if (shift === 0) {\r\n return out.concat(a);\r\n }\r\n\r\n for (i = 0; i < a.length; i++) {\r\n out.push(carry | (a[i] >>> shift));\r\n carry = a[i] << (32 - shift);\r\n }\r\n last2 = a.length ? a[a.length - 1] : 0;\r\n shift2 = sjcl.bitArray.getPartial(last2);\r\n out.push(\r\n sjcl.bitArray.partial(\r\n (shift + shift2) & 31,\r\n shift + shift2 > 32 ? carry : out.pop(),\r\n 1\r\n )\r\n );\r\n return out;\r\n },\r\n\r\n /** xor a block of 4 words together.\r\n * @private\r\n */\r\n _xor4: function (x, y) {\r\n return [x[0] ^ y[0], x[1] ^ y[1], x[2] ^ y[2], x[3] ^ y[3]];\r\n },\r\n\r\n /** byteswap a word array inplace.\r\n * (does not handle partial words)\r\n * @param {sjcl.bitArray} a word array\r\n * @return {sjcl.bitArray} byteswapped array\r\n */\r\n byteswapM: function (a) {\r\n var i,\r\n v,\r\n m = 0xff00;\r\n for (i = 0; i < a.length; ++i) {\r\n v = a[i];\r\n a[i] = (v >>> 24) | ((v >>> 8) & m) | ((v & m) << 8) | (v << 24);\r\n }\r\n return a;\r\n }\r\n};\r\n// Thanks to Colin McRae and Jonathan Burns of ionic security\r\n// for reporting and fixing two bugs in this file!\r\n\r\n/**\r\n * Constructs a new bignum from another bignum, a number or a hex string.\r\n * @constructor\r\n */\r\nsjcl.bn = function (it) {\r\n this.initWith(it);\r\n};\r\n\r\nsjcl.bn.prototype = {\r\n radix: 24,\r\n maxMul: 8,\r\n _class: sjcl.bn,\r\n\r\n copy: function () {\r\n return new this._class(this);\r\n },\r\n\r\n /**\r\n * Initializes this with it, either as a bn, a number, or a hex string.\r\n */\r\n initWith: function (it) {\r\n var i = 0,\r\n k;\r\n switch (typeof it) {\r\n case \"object\":\r\n this.limbs = it.limbs.slice(0);\r\n break;\r\n\r\n case \"number\":\r\n this.limbs = [it];\r\n this.normalize();\r\n break;\r\n\r\n case \"string\":\r\n it = it.replace(/^0x/, \"\");\r\n this.limbs = [];\r\n // hack\r\n k = this.radix / 4;\r\n for (i = 0; i < it.length; i += k) {\r\n this.limbs.push(\r\n parseInt(\r\n it.substring(Math.max(it.length - i - k, 0), it.length - i),\r\n 16\r\n )\r\n );\r\n }\r\n break;\r\n\r\n default:\r\n this.limbs = [0];\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * Returns true if \"this\" and \"that\" are equal. Calls fullReduce().\r\n * Equality test is in constant time.\r\n */\r\n equals: function (that) {\r\n if (typeof that === \"number\") {\r\n that = new this._class(that);\r\n }\r\n var difference = 0,\r\n i;\r\n this.fullReduce();\r\n that.fullReduce();\r\n for (i = 0; i < this.limbs.length || i < that.limbs.length; i++) {\r\n difference |= this.getLimb(i) ^ that.getLimb(i);\r\n }\r\n return difference === 0;\r\n },\r\n\r\n /**\r\n * Get the i'th limb of this, zero if i is too large.\r\n */\r\n getLimb: function (i) {\r\n return i >= this.limbs.length ? 0 : this.limbs[i];\r\n },\r\n\r\n /**\r\n * Constant time comparison function.\r\n * Returns 1 if this >= that, or zero otherwise.\r\n */\r\n greaterEquals: function (that) {\r\n if (typeof that === \"number\") {\r\n that = new this._class(that);\r\n }\r\n var less = 0,\r\n greater = 0,\r\n i,\r\n a,\r\n b;\r\n i = Math.max(this.limbs.length, that.limbs.length) - 1;\r\n for (; i >= 0; i--) {\r\n a = this.getLimb(i);\r\n b = that.getLimb(i);\r\n greater |= (b - a) & ~less;\r\n less |= (a - b) & ~greater;\r\n }\r\n return (greater | ~less) >>> 31;\r\n },\r\n\r\n /**\r\n * Convert to a hex string.\r\n */\r\n toString: function () {\r\n this.fullReduce();\r\n var out = \"\",\r\n i,\r\n s,\r\n l = this.limbs;\r\n for (i = 0; i < this.limbs.length; i++) {\r\n s = l[i].toString(16);\r\n while (i < this.limbs.length - 1 && s.length < 6) {\r\n s = \"0\" + s;\r\n }\r\n out = s + out;\r\n }\r\n return \"0x\" + out;\r\n },\r\n\r\n /** this += that. Does not normalize. */\r\n addM: function (that) {\r\n if (typeof that !== \"object\") {\r\n that = new this._class(that);\r\n }\r\n var i,\r\n l = this.limbs,\r\n ll = that.limbs;\r\n for (i = l.length; i < ll.length; i++) {\r\n l[i] = 0;\r\n }\r\n for (i = 0; i < ll.length; i++) {\r\n l[i] += ll[i];\r\n }\r\n return this;\r\n },\r\n\r\n /** this *= 2. Requires normalized; ends up normalized. */\r\n doubleM: function () {\r\n var i,\r\n carry = 0,\r\n tmp,\r\n r = this.radix,\r\n m = this.radixMask,\r\n l = this.limbs;\r\n for (i = 0; i < l.length; i++) {\r\n tmp = l[i];\r\n tmp = tmp + tmp + carry;\r\n l[i] = tmp & m;\r\n carry = tmp >> r;\r\n }\r\n if (carry) {\r\n l.push(carry);\r\n }\r\n return this;\r\n },\r\n\r\n /** this /= 2, rounded down. Requires normalized; ends up normalized. */\r\n halveM: function () {\r\n var i,\r\n carry = 0,\r\n tmp,\r\n r = this.radix,\r\n l = this.limbs;\r\n for (i = l.length - 1; i >= 0; i--) {\r\n tmp = l[i];\r\n l[i] = (tmp + carry) >> 1;\r\n carry = (tmp & 1) << r;\r\n }\r\n if (!l[l.length - 1]) {\r\n l.pop();\r\n }\r\n return this;\r\n },\r\n\r\n /** this -= that. Does not normalize. */\r\n subM: function (that) {\r\n if (typeof that !== \"object\") {\r\n that = new this._class(that);\r\n }\r\n var i,\r\n l = this.limbs,\r\n ll = that.limbs;\r\n for (i = l.length; i < ll.length; i++) {\r\n l[i] = 0;\r\n }\r\n for (i = 0; i < ll.length; i++) {\r\n l[i] -= ll[i];\r\n }\r\n return this;\r\n },\r\n\r\n mod: function (that) {\r\n var neg = !this.greaterEquals(new sjcl.bn(0));\r\n\r\n that = new sjcl.bn(that).normalize(); // copy before we begin\r\n var out = new sjcl.bn(this).normalize(),\r\n ci = 0;\r\n\r\n if (neg) out = new sjcl.bn(0).subM(out).normalize();\r\n\r\n for (; out.greaterEquals(that); ci++) {\r\n that.doubleM();\r\n }\r\n\r\n if (neg) out = that.sub(out).normalize();\r\n\r\n for (; ci > 0; ci--) {\r\n that.halveM();\r\n if (out.greaterEquals(that)) {\r\n out.subM(that).normalize();\r\n }\r\n }\r\n return out.trim();\r\n },\r\n\r\n /** return inverse mod prime p. p must be odd. Binary extended Euclidean algorithm mod p. */\r\n inverseMod: function (p) {\r\n var a = new sjcl.bn(1),\r\n b = new sjcl.bn(0),\r\n x = new sjcl.bn(this),\r\n y = new sjcl.bn(p),\r\n tmp,\r\n i,\r\n nz = 1;\r\n\r\n if (!(p.limbs[0] & 1)) {\r\n throw new sjcl.exception.invalid(\"inverseMod: p must be odd\");\r\n }\r\n\r\n // invariant: y is odd\r\n do {\r\n if (x.limbs[0] & 1) {\r\n if (!x.greaterEquals(y)) {\r\n // x < y; swap everything\r\n tmp = x;\r\n x = y;\r\n y = tmp;\r\n tmp = a;\r\n a = b;\r\n b = tmp;\r\n }\r\n x.subM(y);\r\n x.normalize();\r\n\r\n if (!a.greaterEquals(b)) {\r\n a.addM(p);\r\n }\r\n a.subM(b);\r\n }\r\n\r\n // cut everything in half\r\n x.halveM();\r\n if (a.limbs[0] & 1) {\r\n a.addM(p);\r\n }\r\n a.normalize();\r\n a.halveM();\r\n\r\n // check for termination: x ?= 0\r\n for (i = nz = 0; i < x.limbs.length; i++) {\r\n nz |= x.limbs[i];\r\n }\r\n } while (nz);\r\n\r\n if (!y.equals(1)) {\r\n throw new sjcl.exception.invalid(\r\n \"inverseMod: p and x must be relatively prime\"\r\n );\r\n }\r\n\r\n return b;\r\n },\r\n\r\n /** this + that. Does not normalize. */\r\n add: function (that) {\r\n return this.copy().addM(that);\r\n },\r\n\r\n /** this - that. Does not normalize. */\r\n sub: function (that) {\r\n return this.copy().subM(that);\r\n },\r\n\r\n /** this * that. Normalizes and reduces. */\r\n mul: function (that) {\r\n if (typeof that === \"number\") {\r\n that = new this._class(that);\r\n } else {\r\n that.normalize();\r\n }\r\n this.normalize();\r\n var i,\r\n j,\r\n a = this.limbs,\r\n b = that.limbs,\r\n al = a.length,\r\n bl = b.length,\r\n out = new this._class(),\r\n c = out.limbs,\r\n ai,\r\n ii = this.maxMul;\r\n\r\n for (i = 0; i < this.limbs.length + that.limbs.length + 1; i++) {\r\n c[i] = 0;\r\n }\r\n for (i = 0; i < al; i++) {\r\n ai = a[i];\r\n for (j = 0; j < bl; j++) {\r\n c[i + j] += ai * b[j];\r\n }\r\n\r\n if (!--ii) {\r\n ii = this.maxMul;\r\n out.cnormalize();\r\n }\r\n }\r\n return out.cnormalize().reduce();\r\n },\r\n\r\n /** this ^ 2. Normalizes and reduces. */\r\n square: function () {\r\n return this.mul(this);\r\n },\r\n\r\n /** this ^ n. Uses square-and-multiply. Normalizes and reduces. */\r\n power: function (l) {\r\n l = new sjcl.bn(l).normalize().trim().limbs;\r\n var i,\r\n j,\r\n out = new this._class(1),\r\n pow = this;\r\n\r\n for (i = 0; i < l.length; i++) {\r\n for (j = 0; j < this.radix; j++) {\r\n if (l[i] & (1 << j)) {\r\n out = out.mul(pow);\r\n }\r\n if (i == l.length - 1 && l[i] >> (j + 1) == 0) {\r\n break;\r\n }\r\n\r\n pow = pow.square();\r\n }\r\n }\r\n\r\n return out;\r\n },\r\n\r\n /** this * that mod N */\r\n mulmod: function (that, N) {\r\n return this.mod(N).mul(that.mod(N)).mod(N);\r\n },\r\n\r\n /** this ^ x mod N */\r\n powermod: function (x, N) {\r\n x = new sjcl.bn(x);\r\n N = new sjcl.bn(N);\r\n\r\n // Jump to montpowermod if possible.\r\n if ((N.limbs[0] & 1) == 1) {\r\n var montOut = this.montpowermod(x, N);\r\n\r\n if (montOut != false) {\r\n return montOut;\r\n } // else go to slow powermod\r\n }\r\n\r\n var i,\r\n j,\r\n l = x.normalize().trim().limbs,\r\n out = new this._class(1),\r\n pow = this;\r\n\r\n for (i = 0; i < l.length; i++) {\r\n for (j = 0; j < this.radix; j++) {\r\n if (l[i] & (1 << j)) {\r\n out = out.mulmod(pow, N);\r\n }\r\n if (i == l.length - 1 && l[i] >> (j + 1) == 0) {\r\n break;\r\n }\r\n\r\n pow = pow.mulmod(pow, N);\r\n }\r\n }\r\n\r\n return out;\r\n },\r\n\r\n /** this ^ x mod N with Montomery reduction */\r\n montpowermod: function (x, N) {\r\n x = new sjcl.bn(x).normalize().trim();\r\n N = new sjcl.bn(N);\r\n\r\n var i,\r\n j,\r\n radix = this.radix,\r\n out = new this._class(1),\r\n pow = this.copy();\r\n\r\n // Generate R as a cap of N.\r\n var R,\r\n s,\r\n wind,\r\n bitsize = x.bitLength();\r\n\r\n R = new sjcl.bn({\r\n limbs: N.copy()\r\n .normalize()\r\n .trim()\r\n .limbs.map(function () {\r\n return 0;\r\n })\r\n });\r\n\r\n for (s = this.radix; s > 0; s--) {\r\n if (((N.limbs[N.limbs.length - 1] >> s) & 1) == 1) {\r\n R.limbs[R.limbs.length - 1] = 1 << s;\r\n break;\r\n }\r\n }\r\n\r\n // Calculate window size as a function of the exponent's size.\r\n if (bitsize == 0) {\r\n return this;\r\n } else if (bitsize < 18) {\r\n wind = 1;\r\n } else if (bitsize < 48) {\r\n wind = 3;\r\n } else if (bitsize < 144) {\r\n wind = 4;\r\n } else if (bitsize < 768) {\r\n wind = 5;\r\n } else {\r\n wind = 6;\r\n }\r\n\r\n // Find R' and N' such that R * R' - N * N' = 1.\r\n var RR = R.copy(),\r\n NN = N.copy(),\r\n RP = new sjcl.bn(1),\r\n NP = new sjcl.bn(0),\r\n RT = R.copy();\r\n\r\n while (RT.greaterEquals(1)) {\r\n RT.halveM();\r\n\r\n if ((RP.limbs[0] & 1) == 0) {\r\n RP.halveM();\r\n NP.halveM();\r\n } else {\r\n RP.addM(NN);\r\n RP.halveM();\r\n\r\n NP.halveM();\r\n NP.addM(RR);\r\n }\r\n }\r\n\r\n RP = RP.normalize();\r\n NP = NP.normalize();\r\n\r\n RR.doubleM();\r\n var R2 = RR.mulmod(RR, N);\r\n\r\n // Check whether the invariant holds.\r\n // If it doesn't, we can't use Montgomery reduction on this modulus.\r\n if (!RR.mul(RP).sub(N.mul(NP)).equals(1)) {\r\n return false;\r\n }\r\n\r\n var montIn = function (c) {\r\n return montMul(c, R2);\r\n },\r\n montMul = function (a, b) {\r\n // Standard Montgomery reduction\r\n var k,\r\n ab,\r\n right,\r\n abBar,\r\n mask = (1 << (s + 1)) - 1;\r\n\r\n ab = a.mul(b);\r\n\r\n right = ab.mul(NP);\r\n right.limbs = right.limbs.slice(0, R.limbs.length);\r\n\r\n if (right.limbs.length == R.limbs.length) {\r\n right.limbs[R.limbs.length - 1] &= mask;\r\n }\r\n\r\n right = right.mul(N);\r\n\r\n abBar = ab.add(right).normalize().trim();\r\n abBar.limbs = abBar.limbs.slice(R.limbs.length - 1);\r\n\r\n // Division. Equivelent to calling *.halveM() s times.\r\n for (k = 0; k < abBar.limbs.length; k++) {\r\n if (k > 0) {\r\n abBar.limbs[k - 1] |= (abBar.limbs[k] & mask) << (radix - s - 1);\r\n }\r\n\r\n abBar.limbs[k] = abBar.limbs[k] >> (s + 1);\r\n }\r\n\r\n if (abBar.greaterEquals(N)) {\r\n abBar.subM(N);\r\n }\r\n\r\n return abBar;\r\n },\r\n montOut = function (c) {\r\n return montMul(c, 1);\r\n };\r\n\r\n pow = montIn(pow);\r\n out = montIn(out);\r\n\r\n // Sliding-Window Exponentiation (HAC 14.85)\r\n var h,\r\n precomp = {},\r\n cap = (1 << (wind - 1)) - 1;\r\n\r\n precomp[1] = pow.copy();\r\n precomp[2] = montMul(pow, pow);\r\n\r\n for (h = 1; h <= cap; h++) {\r\n precomp[2 * h + 1] = montMul(precomp[2 * h - 1], precomp[2]);\r\n }\r\n\r\n var getBit = function (exp, i) {\r\n // Gets ith bit of exp.\r\n var off = i % exp.radix;\r\n\r\n return (exp.limbs[Math.floor(i / exp.radix)] & (1 << off)) >> off;\r\n };\r\n\r\n for (i = x.bitLength() - 1; i >= 0; ) {\r\n if (getBit(x, i) == 0) {\r\n // If the next bit is zero:\r\n // Square, move forward one bit.\r\n out = montMul(out, out);\r\n i = i - 1;\r\n } else {\r\n // If the next bit is one:\r\n // Find the longest sequence of bits after this one, less than `wind`\r\n // bits long, that ends with a 1. Convert the sequence into an\r\n // integer and look up the pre-computed value to add.\r\n var l = i - wind + 1;\r\n\r\n while (getBit(x, l) == 0) {\r\n l++;\r\n }\r\n\r\n var indx = 0;\r\n for (j = l; j <= i; j++) {\r\n indx += getBit(x, j) << (j - l);\r\n out = montMul(out, out);\r\n }\r\n\r\n out = montMul(out, precomp[indx]);\r\n\r\n i = l - 1;\r\n }\r\n }\r\n\r\n return montOut(out);\r\n },\r\n\r\n trim: function () {\r\n var l = this.limbs,\r\n p;\r\n do {\r\n p = l.pop();\r\n } while (l.length && p === 0);\r\n l.push(p);\r\n return this;\r\n },\r\n\r\n /** Reduce mod a modulus. Stubbed for subclassing. */\r\n reduce: function () {\r\n return this;\r\n },\r\n\r\n /** Reduce and normalize. */\r\n fullReduce: function () {\r\n return this.normalize();\r\n },\r\n\r\n /** Propagate carries. */\r\n normalize: function () {\r\n var carry = 0,\r\n i,\r\n pv = this.placeVal,\r\n ipv = this.ipv,\r\n l,\r\n m,\r\n limbs = this.limbs,\r\n ll = limbs.length,\r\n mask = this.radixMask;\r\n for (i = 0; i < ll || (carry !== 0 && carry !== -1); i++) {\r\n l = (limbs[i] || 0) + carry;\r\n m = limbs[i] = l & mask;\r\n carry = (l - m) * ipv;\r\n }\r\n if (carry === -1) {\r\n limbs[i - 1] -= pv;\r\n }\r\n this.trim();\r\n return this;\r\n },\r\n\r\n /** Constant-time normalize. Does not allocate additional space. */\r\n cnormalize: function () {\r\n var carry = 0,\r\n i,\r\n ipv = this.ipv,\r\n l,\r\n m,\r\n limbs = this.limbs,\r\n ll = limbs.length,\r\n mask = this.radixMask;\r\n for (i = 0; i < ll - 1; i++) {\r\n l = limbs[i] + carry;\r\n m = limbs[i] = l & mask;\r\n carry = (l - m) * ipv;\r\n }\r\n limbs[i] += carry;\r\n return this;\r\n },\r\n\r\n /** Serialize to a bit array */\r\n toBits: function (len) {\r\n this.fullReduce();\r\n len = len || this.exponent || this.bitLength();\r\n var i = Math.floor((len - 1) / 24),\r\n w = sjcl.bitArray,\r\n e = ((len + 7) & -8) % this.radix || this.radix,\r\n out = [w.partial(e, this.getLimb(i))];\r\n for (i--; i >= 0; i--) {\r\n out = w.concat(out, [\r\n w.partial(Math.min(this.radix, len), this.getLimb(i))\r\n ]);\r\n len -= this.radix;\r\n }\r\n return out;\r\n },\r\n\r\n /** Return the length in bits, rounded up to the nearest byte. */\r\n bitLength: function () {\r\n this.fullReduce();\r\n var out = this.radix * (this.limbs.length - 1),\r\n b = this.limbs[this.limbs.length - 1];\r\n for (; b; b >>>= 1) {\r\n out++;\r\n }\r\n return (out + 7) & -8;\r\n }\r\n};\r\n\r\n/** @memberOf sjcl.bn\r\n * @this { sjcl.bn }\r\n */\r\nsjcl.bn.fromBits = function (bits) {\r\n var Class = this,\r\n out = new Class(),\r\n words = [],\r\n w = sjcl.bitArray,\r\n t = this.prototype,\r\n l = Math.min(this.bitLength || 0x100000000, w.bitLength(bits)),\r\n e = l % t.radix || t.radix;\r\n\r\n words[0] = w.extract(bits, 0, e);\r\n for (; e < l; e += t.radix) {\r\n words.unshift(w.extract(bits, e, t.radix));\r\n }\r\n\r\n out.limbs = words;\r\n return out;\r\n};\r\n\r\nsjcl.bn.prototype.ipv =\r\n 1 / (sjcl.bn.prototype.placeVal = Math.pow(2, sjcl.bn.prototype.radix));\r\nsjcl.bn.prototype.radixMask = (1 << sjcl.bn.prototype.radix) - 1;\r\n\r\n/**\r\n * Creates a new subclass of bn, based on reduction modulo a pseudo-Mersenne prime,\r\n * i.e. a prime of the form 2^e + sum(a * 2^b),where the sum is negative and sparse.\r\n */\r\nsjcl.bn.pseudoMersennePrime = function (exponent, coeff) {\r\n /** @constructor\r\n * @private\r\n */\r\n function p(it) {\r\n this.initWith(it);\r\n /*if (this.limbs[this.modOffset]) {\r\n this.reduce();\r\n }*/\r\n }\r\n\r\n var ppr = (p.prototype = new sjcl.bn()),\r\n i,\r\n tmp,\r\n mo;\r\n mo = ppr.modOffset = Math.ceil((tmp = exponent / ppr.radix));\r\n ppr.exponent = exponent;\r\n ppr.offset = [];\r\n ppr.factor = [];\r\n ppr.minOffset = mo;\r\n ppr.fullMask = 0;\r\n ppr.fullOffset = [];\r\n ppr.fullFactor = [];\r\n ppr.modulus = p.modulus = new sjcl.bn(Math.pow(2, exponent));\r\n\r\n ppr.fullMask = 0 | -Math.pow(2, exponent % ppr.radix);\r\n\r\n for (i = 0; i < coeff.length; i++) {\r\n ppr.offset[i] = Math.floor(coeff[i][0] / ppr.radix - tmp);\r\n ppr.fullOffset[i] = Math.floor(coeff[i][0] / ppr.radix) - mo + 1;\r\n ppr.factor[i] =\r\n coeff[i][1] *\r\n Math.pow(1 / 2, exponent - coeff[i][0] + ppr.offset[i] * ppr.radix);\r\n ppr.fullFactor[i] =\r\n coeff[i][1] *\r\n Math.pow(1 / 2, exponent - coeff[i][0] + ppr.fullOffset[i] * ppr.radix);\r\n ppr.modulus.addM(new sjcl.bn(Math.pow(2, coeff[i][0]) * coeff[i][1]));\r\n ppr.minOffset = Math.min(ppr.minOffset, -ppr.offset[i]); // conservative\r\n }\r\n ppr._class = p;\r\n ppr.modulus.cnormalize();\r\n\r\n /** Approximate reduction mod p. May leave a number which is negative or slightly larger than p.\r\n * @memberof sjcl.bn\r\n * @this { sjcl.bn }\r\n */\r\n ppr.reduce = function () {\r\n var i,\r\n k,\r\n l,\r\n mo = this.modOffset,\r\n limbs = this.limbs,\r\n off = this.offset,\r\n ol = this.offset.length,\r\n fac = this.factor,\r\n ll;\r\n\r\n i = this.minOffset;\r\n while (limbs.length > mo) {\r\n l = limbs.pop();\r\n ll = limbs.length;\r\n for (k = 0; k < ol; k++) {\r\n limbs[ll + off[k]] -= fac[k] * l;\r\n }\r\n\r\n i--;\r\n if (!i) {\r\n limbs.push(0);\r\n this.cnormalize();\r\n i = this.minOffset;\r\n }\r\n }\r\n this.cnormalize();\r\n\r\n return this;\r\n };\r\n\r\n /** @memberof sjcl.bn\r\n * @this { sjcl.bn }\r\n */\r\n ppr._strongReduce =\r\n ppr.fullMask === -1\r\n ? ppr.reduce\r\n : function () {\r\n var limbs = this.limbs,\r\n i = limbs.length - 1,\r\n k,\r\n l;\r\n this.reduce();\r\n if (i === this.modOffset - 1) {\r\n l = limbs[i] & this.fullMask;\r\n limbs[i] -= l;\r\n for (k = 0; k < this.fullOffset.length; k++) {\r\n limbs[i + this.fullOffset[k]] -= this.fullFactor[k] * l;\r\n }\r\n this.normalize();\r\n }\r\n };\r\n\r\n /** mostly constant-time, very expensive full reduction.\r\n * @memberof sjcl.bn\r\n * @this { sjcl.bn }\r\n */\r\n ppr.fullReduce = function () {\r\n var greater, i;\r\n // massively above the modulus, may be negative\r\n\r\n this._strongReduce();\r\n // less than twice the modulus, may be negative\r\n\r\n this.addM(this.modulus);\r\n this.addM(this.modulus);\r\n this.normalize();\r\n // probably 2-3x the modulus\r\n\r\n this._strongReduce();\r\n // less than the power of 2. still may be more than\r\n // the modulus\r\n\r\n // HACK: pad out to this length\r\n for (i = this.limbs.length; i < this.modOffset; i++) {\r\n this.limbs[i] = 0;\r\n }\r\n\r\n // constant-time subtract modulus\r\n greater = this.greaterEquals(this.modulus);\r\n for (i = 0; i < this.limbs.length; i++) {\r\n this.limbs[i] -= this.modulus.limbs[i] * greater;\r\n }\r\n this.cnormalize();\r\n\r\n return this;\r\n };\r\n\r\n /** @memberof sjcl.bn\r\n * @this { sjcl.bn }\r\n */\r\n ppr.inverse = function () {\r\n return this.power(this.modulus.sub(2));\r\n };\r\n\r\n p.fromBits = sjcl.bn.fromBits;\r\n\r\n return p;\r\n};\r\n\r\n// a small Mersenne prime\r\nvar sbp = sjcl.bn.pseudoMersennePrime;\r\nsjcl.bn.prime = {\r\n p127: sbp(127, [[0, -1]]),\r\n\r\n // Bernstein's prime for Curve25519\r\n p25519: sbp(255, [[0, -19]]),\r\n\r\n // Koblitz primes\r\n p192k: sbp(192, [\r\n [32, -1],\r\n [12, -1],\r\n [8, -1],\r\n [7, -1],\r\n [6, -1],\r\n [3, -1],\r\n [0, -1]\r\n ]),\r\n p224k: sbp(224, [\r\n [32, -1],\r\n [12, -1],\r\n [11, -1],\r\n [9, -1],\r\n [7, -1],\r\n [4, -1],\r\n [1, -1],\r\n [0, -1]\r\n ]),\r\n p256k: sbp(256, [\r\n [32, -1],\r\n [9, -1],\r\n [8, -1],\r\n [7, -1],\r\n [6, -1],\r\n [4, -1],\r\n [0, -1]\r\n ]),\r\n\r\n // NIST primes\r\n p192: sbp(192, [\r\n [0, -1],\r\n [64, -1]\r\n ]),\r\n p224: sbp(224, [\r\n [0, 1],\r\n [96, -1]\r\n ]),\r\n p256: sbp(256, [\r\n [0, -1],\r\n [96, 1],\r\n [192, 1],\r\n [224, -1]\r\n ]),\r\n p384: sbp(384, [\r\n [0, -1],\r\n [32, 1],\r\n [96, -1],\r\n [128, -1]\r\n ]),\r\n p521: sbp(521, [[0, -1]])\r\n};\r\n\r\nsjcl.bn.random = function (modulus, paranoia) {\r\n if (typeof modulus !== \"object\") {\r\n modulus = new sjcl.bn(modulus);\r\n }\r\n var words,\r\n i,\r\n l = modulus.limbs.length,\r\n m = modulus.limbs[l - 1] + 1,\r\n out = new sjcl.bn();\r\n while (true) {\r\n // get a sequence whose first digits make sense\r\n do {\r\n words = sjcl.random.randomWords(l, paranoia);\r\n if (words[l - 1] < 0) {\r\n words[l - 1] += 0x100000000;\r\n }\r\n } while (Math.floor(words[l - 1] / m) === Math.floor(0x100000000 / m));\r\n words[l - 1] %= m;\r\n\r\n // mask off all the limbs\r\n for (i = 0; i < l - 1; i++) {\r\n words[i] &= modulus.radixMask;\r\n }\r\n\r\n // check the rest of the digitssj\r\n out.limbs = words;\r\n if (!out.greaterEquals(modulus)) {\r\n return out;\r\n }\r\n }\r\n};\r\n/** @fileOverview Really fast & small implementation of CCM using JS' array buffers\r\n *\r\n * @author Marco Munizaga\r\n */\r\n\r\n/**\r\n * CTR mode with CBC MAC.\r\n * @namespace\r\n */\r\nsjcl.arrayBuffer = sjcl.arrayBuffer || {};\r\n\r\n//patch arraybuffers if they don't exist\r\nif (typeof ArrayBuffer === \"undefined\") {\r\n (function (globals) {\r\n \"use strict\";\r\n globals.ArrayBuffer = function () {};\r\n globals.DataView = function () {};\r\n })(this);\r\n}\r\n\r\nsjcl.arrayBuffer.ccm = {\r\n mode: \"ccm\",\r\n\r\n defaults: {\r\n tlen: 128 //this is M in the NIST paper\r\n },\r\n\r\n /** Encrypt in CCM mode. Meant to return the same exact thing as the bitArray ccm to work as a drop in replacement\r\n * @static\r\n * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes.\r\n * @param {bitArray} plaintext The plaintext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} [adata=[]] The authenticated data.\r\n * @param {Number} [tlen=64] the desired tag length, in bits.\r\n * @return {bitArray} The encrypted data, an array of bytes.\r\n */\r\n compat_encrypt: function (prf, plaintext, iv, adata, tlen) {\r\n var plaintext_buffer = sjcl.codec.arrayBuffer.fromBits(plaintext, true, 16),\r\n ol = sjcl.bitArray.bitLength(plaintext) / 8,\r\n encrypted_obj,\r\n ct,\r\n tag;\r\n\r\n tlen = tlen || 64;\r\n adata = adata || [];\r\n\r\n encrypted_obj = sjcl.arrayBuffer.ccm.encrypt(\r\n prf,\r\n plaintext_buffer,\r\n iv,\r\n adata,\r\n tlen,\r\n ol\r\n );\r\n ct = sjcl.codec.arrayBuffer.toBits(encrypted_obj.ciphertext_buffer);\r\n\r\n ct = sjcl.bitArray.clamp(ct, ol * 8);\r\n\r\n return sjcl.bitArray.concat(ct, encrypted_obj.tag);\r\n },\r\n\r\n /** Decrypt in CCM mode. Meant to imitate the bitArray ccm\r\n * @static\r\n * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes.\r\n * @param {bitArray} ciphertext The ciphertext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} [adata=[]] adata The authenticated data.\r\n * @param {Number} [tlen=64] tlen the desired tag length, in bits.\r\n * @return {bitArray} The decrypted data.\r\n */\r\n compat_decrypt: function (prf, ciphertext, iv, adata, tlen) {\r\n tlen = tlen || 64;\r\n adata = adata || [];\r\n var L,\r\n i,\r\n w = sjcl.bitArray,\r\n ol = w.bitLength(ciphertext),\r\n out = w.clamp(ciphertext, ol - tlen),\r\n tag = w.bitSlice(ciphertext, ol - tlen),\r\n tag2,\r\n ciphertext_buffer = sjcl.codec.arrayBuffer.fromBits(out, true, 16);\r\n\r\n var plaintext_buffer = sjcl.arrayBuffer.ccm.decrypt(\r\n prf,\r\n ciphertext_buffer,\r\n iv,\r\n tag,\r\n adata,\r\n tlen,\r\n (ol - tlen) / 8\r\n );\r\n return sjcl.bitArray.clamp(\r\n sjcl.codec.arrayBuffer.toBits(plaintext_buffer),\r\n ol - tlen\r\n );\r\n },\r\n\r\n /** Really fast ccm encryption, uses arraybufer and mutates the plaintext buffer\r\n * @static\r\n * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes.\r\n * @param {ArrayBuffer} plaintext_buffer The plaintext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {ArrayBuffer} [adata=[]] The authenticated data.\r\n * @param {Number} [tlen=128] the desired tag length, in bits.\r\n * @return {ArrayBuffer} The encrypted data, in the same array buffer as the given plaintext, but given back anyways\r\n */\r\n encrypt: function (prf, plaintext_buffer, iv, adata, tlen, ol) {\r\n var auth_blocks,\r\n mac,\r\n L,\r\n w = sjcl.bitArray,\r\n ivl = w.bitLength(iv) / 8;\r\n\r\n //set up defaults\r\n adata = adata || [];\r\n tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen;\r\n ol = ol || plaintext_buffer.byteLength;\r\n tlen = Math.ceil(tlen / 8);\r\n\r\n for (L = 2; L < 4 && ol >>> (8 * L); L++) {}\r\n if (L < 15 - ivl) {\r\n L = 15 - ivl;\r\n }\r\n iv = w.clamp(iv, 8 * (15 - L));\r\n\r\n //prf should use a 256 bit key to make precomputation attacks infeasible\r\n\r\n mac = sjcl.arrayBuffer.ccm._computeTag(\r\n prf,\r\n plaintext_buffer,\r\n iv,\r\n adata,\r\n tlen,\r\n ol,\r\n L\r\n );\r\n\r\n //encrypt the plaintext and the mac\r\n //returns the mac since the plaintext will be left encrypted inside the buffer\r\n mac = sjcl.arrayBuffer.ccm._ctrMode(\r\n prf,\r\n plaintext_buffer,\r\n iv,\r\n mac,\r\n tlen,\r\n L\r\n );\r\n\r\n //the plaintext_buffer has been modified so it is now the ciphertext_buffer\r\n return { ciphertext_buffer: plaintext_buffer, tag: mac };\r\n },\r\n\r\n /** Really fast ccm decryption, uses arraybufer and mutates the given buffer\r\n * @static\r\n * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes.\r\n * @param {ArrayBuffer} ciphertext_buffer The Ciphertext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} The authentication tag for the ciphertext\r\n * @param {ArrayBuffer} [adata=[]] The authenticated data.\r\n * @param {Number} [tlen=128] the desired tag length, in bits.\r\n * @return {ArrayBuffer} The decrypted data, in the same array buffer as the given buffer, but given back anyways\r\n */\r\n decrypt: function (prf, ciphertext_buffer, iv, tag, adata, tlen, ol) {\r\n var mac,\r\n mac2,\r\n i,\r\n L,\r\n w = sjcl.bitArray,\r\n ivl = w.bitLength(iv) / 8;\r\n\r\n //set up defaults\r\n adata = adata || [];\r\n tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen;\r\n ol = ol || ciphertext_buffer.byteLength;\r\n tlen = Math.ceil(tlen / 8);\r\n\r\n for (L = 2; L < 4 && ol >>> (8 * L); L++) {}\r\n if (L < 15 - ivl) {\r\n L = 15 - ivl;\r\n }\r\n iv = w.clamp(iv, 8 * (15 - L));\r\n\r\n //prf should use a 256 bit key to make precomputation attacks infeasible\r\n\r\n //decrypt the buffer\r\n mac = sjcl.arrayBuffer.ccm._ctrMode(\r\n prf,\r\n ciphertext_buffer,\r\n iv,\r\n tag,\r\n tlen,\r\n L\r\n );\r\n\r\n mac2 = sjcl.arrayBuffer.ccm._computeTag(\r\n prf,\r\n ciphertext_buffer,\r\n iv,\r\n adata,\r\n tlen,\r\n ol,\r\n L\r\n );\r\n\r\n //check the tag\r\n if (!sjcl.bitArray.equal(mac, mac2)) {\r\n throw new sjcl.exception.corrupt(\"ccm: tag doesn't match\");\r\n }\r\n\r\n return ciphertext_buffer;\r\n },\r\n\r\n /* Compute the (unencrypted) authentication tag, according to the CCM specification\r\n * @param {Object} prf The pseudorandom function.\r\n * @param {ArrayBuffer} data_buffer The plaintext data in an arraybuffer.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} adata The authenticated data.\r\n * @param {Number} tlen the desired tag length, in bits.\r\n * @return {bitArray} The tag, but not yet encrypted.\r\n * @private\r\n */\r\n _computeTag: function (prf, data_buffer, iv, adata, tlen, ol, L) {\r\n var i,\r\n plaintext,\r\n mac,\r\n data,\r\n data_blocks_size,\r\n data_blocks,\r\n w = sjcl.bitArray,\r\n tmp,\r\n macData;\r\n\r\n mac = sjcl.mode.ccm._macAdditionalData(prf, adata, iv, tlen, ol, L);\r\n\r\n if (data_buffer.byteLength !== 0) {\r\n data = new DataView(data_buffer);\r\n //set padding bytes to 0\r\n for (i = ol; i < data_buffer.byteLength; i++) {\r\n data.setUint8(i, 0);\r\n }\r\n\r\n //now to mac the plaintext blocks\r\n for (i = 0; i < data.byteLength; i += 16) {\r\n mac[0] ^= data.getUint32(i);\r\n mac[1] ^= data.getUint32(i + 4);\r\n mac[2] ^= data.getUint32(i + 8);\r\n mac[3] ^= data.getUint32(i + 12);\r\n\r\n mac = prf.encrypt(mac);\r\n }\r\n }\r\n\r\n return sjcl.bitArray.clamp(mac, tlen * 8);\r\n },\r\n\r\n /** CCM CTR mode.\r\n * Encrypt or decrypt data and tag with the prf in CCM-style CTR mode.\r\n * Mutates given array buffer\r\n * @param {Object} prf The PRF.\r\n * @param {ArrayBuffer} data_buffer The data to be encrypted or decrypted.\r\n * @param {bitArray} iv The initialization vector.\r\n * @param {bitArray} tag The authentication tag.\r\n * @param {Number} tlen The length of th etag, in bits.\r\n * @return {Object} An object with data and tag, the en/decryption of data and tag values.\r\n * @private\r\n */\r\n _ctrMode: function (prf, data_buffer, iv, mac, tlen, L) {\r\n var data,\r\n ctr,\r\n word0,\r\n word1,\r\n word2,\r\n word3,\r\n keyblock,\r\n i,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n n = data_buffer.byteLength / 50,\r\n p = n;\r\n\r\n ctr = new DataView(new ArrayBuffer(16)); //create the first block for the counter\r\n\r\n //prf should use a 256 bit key to make precomputation attacks infeasible\r\n\r\n // start the ctr\r\n ctr = w\r\n .concat([w.partial(8, L - 1)], iv)\r\n .concat([0, 0, 0])\r\n .slice(0, 4);\r\n\r\n // en/decrypt the tag\r\n mac = w.bitSlice(xor(mac, prf.encrypt(ctr)), 0, tlen * 8);\r\n\r\n ctr[3]++;\r\n if (ctr[3] === 0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0\r\n\r\n if (data_buffer.byteLength !== 0) {\r\n data = new DataView(data_buffer);\r\n //now lets encrypt the message\r\n for (i = 0; i < data.byteLength; i += 16) {\r\n if (i > n) {\r\n sjcl.mode.ccm._callProgressListener(i / data_buffer.byteLength);\r\n n += p;\r\n }\r\n keyblock = prf.encrypt(ctr);\r\n\r\n word0 = data.getUint32(i);\r\n word1 = data.getUint32(i + 4);\r\n word2 = data.getUint32(i + 8);\r\n word3 = data.getUint32(i + 12);\r\n\r\n data.setUint32(i, word0 ^ keyblock[0]);\r\n data.setUint32(i + 4, word1 ^ keyblock[1]);\r\n data.setUint32(i + 8, word2 ^ keyblock[2]);\r\n data.setUint32(i + 12, word3 ^ keyblock[3]);\r\n\r\n ctr[3]++;\r\n if (ctr[3] === 0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0\r\n }\r\n }\r\n\r\n //return the mac, the ciphered data is available through the same data_buffer that was given\r\n return mac;\r\n }\r\n};\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Marco Munizaga\r\n */\r\n\r\n//patch arraybuffers if they don't exist\r\nif (typeof ArrayBuffer === \"undefined\") {\r\n (function (globals) {\r\n \"use strict\";\r\n globals.ArrayBuffer = function () {};\r\n globals.DataView = function () {};\r\n })(this);\r\n}\r\n\r\n/**\r\n * ArrayBuffer\r\n * @namespace\r\n */\r\nsjcl.codec.arrayBuffer = {\r\n /** Convert from a bitArray to an ArrayBuffer.\r\n * Will default to 8byte padding if padding is undefined*/\r\n fromBits: function (arr, padding, padding_count) {\r\n var out, i, ol, tmp, smallest;\r\n padding = padding == undefined ? true : padding;\r\n padding_count = padding_count || 8;\r\n\r\n if (arr.length === 0) {\r\n return new ArrayBuffer(0);\r\n }\r\n\r\n ol = sjcl.bitArray.bitLength(arr) / 8;\r\n\r\n //check to make sure the bitLength is divisible by 8, if it isn't\r\n //we can't do anything since arraybuffers work with bytes, not bits\r\n if (sjcl.bitArray.bitLength(arr) % 8 !== 0) {\r\n throw new sjcl.exception.invalid(\r\n \"Invalid bit size, must be divisble by 8 to fit in an arraybuffer correctly\"\r\n );\r\n }\r\n\r\n if (padding && ol % padding_count !== 0) {\r\n ol += padding_count - (ol % padding_count);\r\n }\r\n\r\n //padded temp for easy copying\r\n tmp = new DataView(new ArrayBuffer(arr.length * 4));\r\n for (i = 0; i < arr.length; i++) {\r\n tmp.setUint32(i * 4, arr[i] << 32); //get rid of the higher bits\r\n }\r\n\r\n //now copy the final message if we are not going to 0 pad\r\n out = new DataView(new ArrayBuffer(ol));\r\n\r\n //save a step when the tmp and out bytelength are ===\r\n if (out.byteLength === tmp.byteLength) {\r\n return tmp.buffer;\r\n }\r\n\r\n smallest =\r\n tmp.byteLength < out.byteLength ? tmp.byteLength : out.byteLength;\r\n for (i = 0; i < smallest; i++) {\r\n out.setUint8(i, tmp.getUint8(i));\r\n }\r\n\r\n return out.buffer;\r\n },\r\n /** Convert from an ArrayBuffer to a bitArray. */\r\n toBits: function (buffer) {\r\n var i,\r\n out = [],\r\n len,\r\n inView,\r\n tmp;\r\n\r\n if (buffer.byteLength === 0) {\r\n return [];\r\n }\r\n\r\n inView = new DataView(buffer);\r\n len = inView.byteLength - (inView.byteLength % 4);\r\n\r\n for (var i = 0; i < len; i += 4) {\r\n out.push(inView.getUint32(i));\r\n }\r\n\r\n if (inView.byteLength % 4 != 0) {\r\n tmp = new DataView(new ArrayBuffer(4));\r\n for (var i = 0, l = inView.byteLength % 4; i < l; i++) {\r\n //we want the data to the right, because partial slices off the starting bits\r\n tmp.setUint8(i + 4 - l, inView.getUint8(len + i)); // big-endian,\r\n }\r\n out.push(\r\n sjcl.bitArray.partial((inView.byteLength % 4) * 8, tmp.getUint32(0))\r\n );\r\n }\r\n return out;\r\n },\r\n\r\n /** Prints a hex output of the buffer contents, akin to hexdump **/\r\n hexDumpBuffer: function (buffer) {\r\n var stringBufferView = new DataView(buffer);\r\n var string = \"\";\r\n var pad = function (n, width) {\r\n n = n + \"\";\r\n return n.length >= width\r\n ? n\r\n : new Array(width - n.length + 1).join(\"0\") + n;\r\n };\r\n\r\n for (var i = 0; i < stringBufferView.byteLength; i += 2) {\r\n if (i % 16 == 0) string += \"\\n\" + i.toString(16) + \"\\t\";\r\n string += pad(stringBufferView.getUint16(i).toString(16), 4) + \" \";\r\n }\r\n\r\n if (typeof console === undefined) {\r\n console = console || { log: function () {} }; //fix for IE\r\n }\r\n console.log(string.toUpperCase());\r\n }\r\n};\r\n\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Nils Kenneweg\r\n */\r\n\r\n/**\r\n * Base32 encoding/decoding\r\n * @namespace\r\n */\r\nsjcl.codec.base32 = {\r\n /** The base32 alphabet.\r\n * @private\r\n */\r\n _chars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\",\r\n _hexChars: \"0123456789ABCDEFGHIJKLMNOPQRSTUV\",\r\n\r\n /* bits in an array */\r\n BITS: 32,\r\n /* base to encode at (2^x) */\r\n BASE: 5,\r\n /* bits - base */\r\n REMAINING: 27,\r\n\r\n /** Convert from a bitArray to a base32 string. */\r\n fromBits: function (arr, _noEquals, _hex) {\r\n var BITS = sjcl.codec.base32.BITS,\r\n BASE = sjcl.codec.base32.BASE,\r\n REMAINING = sjcl.codec.base32.REMAINING;\r\n var out = \"\",\r\n i,\r\n bits = 0,\r\n c = sjcl.codec.base32._chars,\r\n ta = 0,\r\n bl = sjcl.bitArray.bitLength(arr);\r\n\r\n if (_hex) {\r\n c = sjcl.codec.base32._hexChars;\r\n }\r\n\r\n for (i = 0; out.length * BASE < bl; ) {\r\n out += c.charAt((ta ^ (arr[i] >>> bits)) >>> REMAINING);\r\n if (bits < BASE) {\r\n ta = arr[i] << (BASE - bits);\r\n bits += REMAINING;\r\n i++;\r\n } else {\r\n ta <<= BASE;\r\n bits -= BASE;\r\n }\r\n }\r\n while (out.length & 7 && !_noEquals) {\r\n out += \"=\";\r\n }\r\n\r\n return out;\r\n },\r\n\r\n /** Convert from a base32 string to a bitArray */\r\n toBits: function (str, _hex) {\r\n str = str.replace(/\\s|=/g, \"\").toUpperCase();\r\n var BITS = sjcl.codec.base32.BITS,\r\n BASE = sjcl.codec.base32.BASE,\r\n REMAINING = sjcl.codec.base32.REMAINING;\r\n var out = [],\r\n i,\r\n bits = 0,\r\n c = sjcl.codec.base32._chars,\r\n ta = 0,\r\n x,\r\n format = \"base32\";\r\n\r\n if (_hex) {\r\n c = sjcl.codec.base32._hexChars;\r\n format = \"base32hex\";\r\n }\r\n\r\n for (i = 0; i < str.length; i++) {\r\n x = c.indexOf(str.charAt(i));\r\n if (x < 0) {\r\n // Invalid character, try hex format\r\n if (!_hex) {\r\n try {\r\n return sjcl.codec.base32hex.toBits(str);\r\n } catch (e) {}\r\n }\r\n throw new sjcl.exception.invalid(\"this isn't \" + format + \"!\");\r\n }\r\n if (bits > REMAINING) {\r\n bits -= REMAINING;\r\n out.push(ta ^ (x >>> bits));\r\n ta = x << (BITS - bits);\r\n } else {\r\n bits += BASE;\r\n ta ^= x << (BITS - bits);\r\n }\r\n }\r\n if (bits & 56) {\r\n out.push(sjcl.bitArray.partial(bits & 56, ta, 1));\r\n }\r\n return out;\r\n }\r\n};\r\n\r\nsjcl.codec.base32hex = {\r\n fromBits: function (arr, _noEquals) {\r\n return sjcl.codec.base32.fromBits(arr, _noEquals, 1);\r\n },\r\n toBits: function (str) {\r\n return sjcl.codec.base32.toBits(str, 1);\r\n }\r\n};\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Base64 encoding/decoding\r\n * @namespace\r\n */\r\nsjcl.codec.base64 = {\r\n /** The base64 alphabet.\r\n * @private\r\n */\r\n _chars: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\r\n\r\n /** Convert from a bitArray to a base64 string. */\r\n fromBits: function (arr, _noEquals, _url) {\r\n var out = \"\",\r\n i,\r\n bits = 0,\r\n c = sjcl.codec.base64._chars,\r\n ta = 0,\r\n bl = sjcl.bitArray.bitLength(arr);\r\n if (_url) {\r\n c = c.substr(0, 62) + \"-_\";\r\n }\r\n for (i = 0; out.length * 6 < bl; ) {\r\n out += c.charAt((ta ^ (arr[i] >>> bits)) >>> 26);\r\n if (bits < 6) {\r\n ta = arr[i] << (6 - bits);\r\n bits += 26;\r\n i++;\r\n } else {\r\n ta <<= 6;\r\n bits -= 6;\r\n }\r\n }\r\n while (out.length & 3 && !_noEquals) {\r\n out += \"=\";\r\n }\r\n return out;\r\n },\r\n\r\n /** Convert from a base64 string to a bitArray */\r\n toBits: function (str, _url) {\r\n str = str.replace(/\\s|=/g, \"\");\r\n var out = [],\r\n i,\r\n bits = 0,\r\n c = sjcl.codec.base64._chars,\r\n ta = 0,\r\n x;\r\n if (_url) {\r\n c = c.substr(0, 62) + \"-_\";\r\n }\r\n for (i = 0; i < str.length; i++) {\r\n x = c.indexOf(str.charAt(i));\r\n if (x < 0) {\r\n throw new sjcl.exception.invalid(\"this isn't base64!\");\r\n }\r\n if (bits > 26) {\r\n bits -= 26;\r\n out.push(ta ^ (x >>> bits));\r\n ta = x << (32 - bits);\r\n } else {\r\n bits += 6;\r\n ta ^= x << (32 - bits);\r\n }\r\n }\r\n if (bits & 56) {\r\n out.push(sjcl.bitArray.partial(bits & 56, ta, 1));\r\n }\r\n return out;\r\n }\r\n};\r\n\r\nsjcl.codec.base64url = {\r\n fromBits: function (arr) {\r\n return sjcl.codec.base64.fromBits(arr, 1, 1);\r\n },\r\n toBits: function (str) {\r\n return sjcl.codec.base64.toBits(str, 1);\r\n }\r\n};\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Arrays of bytes\r\n * @namespace\r\n */\r\nsjcl.codec.bytes = {\r\n /** Convert from a bitArray to an array of bytes. */\r\n fromBits: function (arr) {\r\n var out = [],\r\n bl = sjcl.bitArray.bitLength(arr),\r\n i,\r\n tmp;\r\n for (i = 0; i < bl / 8; i++) {\r\n if ((i & 3) === 0) {\r\n tmp = arr[i / 4];\r\n }\r\n out.push(tmp >>> 24);\r\n tmp <<= 8;\r\n }\r\n return out;\r\n },\r\n /** Convert from an array of bytes to a bitArray. */\r\n toBits: function (bytes) {\r\n var out = [],\r\n i,\r\n tmp = 0;\r\n for (i = 0; i < bytes.length; i++) {\r\n tmp = (tmp << 8) | bytes[i];\r\n if ((i & 3) === 3) {\r\n out.push(tmp);\r\n tmp = 0;\r\n }\r\n }\r\n if (i & 3) {\r\n out.push(sjcl.bitArray.partial(8 * (i & 3), tmp));\r\n }\r\n return out;\r\n }\r\n};\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Hexadecimal\r\n * @namespace\r\n */\r\nsjcl.codec.hex = {\r\n /** Convert from a bitArray to a hex string. */\r\n fromBits: function (arr) {\r\n var out = \"\",\r\n i;\r\n for (i = 0; i < arr.length; i++) {\r\n out += ((arr[i] | 0) + 0xf00000000000).toString(16).substr(4);\r\n }\r\n return out.substr(0, sjcl.bitArray.bitLength(arr) / 4); //.replace(/(.{8})/g, \"$1 \");\r\n },\r\n /** Convert from a hex string to a bitArray. */\r\n toBits: function (str) {\r\n var i,\r\n out = [],\r\n len;\r\n str = str.replace(/\\s|0x/g, \"\");\r\n len = str.length;\r\n str = str + \"00000000\";\r\n for (i = 0; i < str.length; i += 8) {\r\n out.push(parseInt(str.substr(i, 8), 16) ^ 0);\r\n }\r\n return sjcl.bitArray.clamp(out, len * 4);\r\n }\r\n};\r\n\r\n/** @fileOverview Bit array codec implementations.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * UTF-8 strings\r\n * @namespace\r\n */\r\nsjcl.codec.utf8String = {\r\n /** Convert from a bitArray to a UTF-8 string. */\r\n fromBits: function (arr) {\r\n var out = \"\",\r\n bl = sjcl.bitArray.bitLength(arr),\r\n i,\r\n tmp;\r\n for (i = 0; i < bl / 8; i++) {\r\n if ((i & 3) === 0) {\r\n tmp = arr[i / 4];\r\n }\r\n out += String.fromCharCode(((tmp >>> 8) >>> 8) >>> 8);\r\n tmp <<= 8;\r\n }\r\n return decodeURIComponent(escape(out));\r\n },\r\n\r\n /** Convert from a UTF-8 string to a bitArray. */\r\n toBits: function (str) {\r\n str = unescape(encodeURIComponent(str));\r\n var out = [],\r\n i,\r\n tmp = 0;\r\n for (i = 0; i < str.length; i++) {\r\n tmp = (tmp << 8) | str.charCodeAt(i);\r\n if ((i & 3) === 3) {\r\n out.push(tmp);\r\n tmp = 0;\r\n }\r\n }\r\n if (i & 3) {\r\n out.push(sjcl.bitArray.partial(8 * (i & 3), tmp));\r\n }\r\n return out;\r\n }\r\n};\r\n\r\n/** @fileOverview Convenience functions centered around JSON encapsulation.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * JSON encapsulation\r\n * @namespace\r\n */\r\nsjcl.json = {\r\n /** Default values for encryption */\r\n defaults: {\r\n v: 1,\r\n iter: 10000,\r\n ks: 128,\r\n ts: 64,\r\n mode: \"ccm\",\r\n adata: \"\",\r\n cipher: \"aes\"\r\n },\r\n\r\n /** Simple encryption function.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {String} plaintext The data to encrypt.\r\n * @param {Object} [params] The parameters including tag, iv and salt.\r\n * @param {Object} [rp] A returned version with filled-in parameters.\r\n * @return {Object} The cipher raw data.\r\n * @throws {sjcl.exception.invalid} if a parameter is invalid.\r\n */\r\n _encrypt: function (password, plaintext, params, rp) {\r\n params = params || {};\r\n rp = rp || {};\r\n\r\n var j = sjcl.json,\r\n p = j._add({ iv: sjcl.random.randomWords(4, 0) }, j.defaults),\r\n tmp,\r\n prp,\r\n adata;\r\n j._add(p, params);\r\n adata = p.adata;\r\n if (typeof p.salt === \"string\") {\r\n p.salt = sjcl.codec.base64.toBits(p.salt);\r\n }\r\n if (typeof p.iv === \"string\") {\r\n p.iv = sjcl.codec.base64.toBits(p.iv);\r\n }\r\n\r\n if (\r\n !sjcl.mode[p.mode] ||\r\n !sjcl.cipher[p.cipher] ||\r\n (typeof password === \"string\" && p.iter <= 100) ||\r\n (p.ts !== 64 && p.ts !== 96 && p.ts !== 128) ||\r\n (p.ks !== 128 && p.ks !== 192 && p.ks !== 256) ||\r\n p.iv.length < 2 ||\r\n p.iv.length > 4\r\n ) {\r\n throw new sjcl.exception.invalid(\"json encrypt: invalid parameters\");\r\n }\r\n\r\n if (typeof password === \"string\") {\r\n tmp = sjcl.misc.cachedPbkdf2(password, p);\r\n password = tmp.key.slice(0, p.ks / 32);\r\n p.salt = tmp.salt;\r\n } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.publicKey) {\r\n tmp = password.kem();\r\n p.kemtag = tmp.tag;\r\n password = tmp.key.slice(0, p.ks / 32);\r\n }\r\n if (typeof plaintext === \"string\") {\r\n plaintext = sjcl.codec.utf8String.toBits(plaintext);\r\n }\r\n if (typeof adata === \"string\") {\r\n p.adata = adata = sjcl.codec.utf8String.toBits(adata);\r\n }\r\n prp = new sjcl.cipher[p.cipher](password);\r\n\r\n /* return the json data */\r\n j._add(rp, p);\r\n rp.key = password;\r\n\r\n /* do the encryption */\r\n if (\r\n p.mode === \"ccm\" &&\r\n sjcl.arrayBuffer &&\r\n sjcl.arrayBuffer.ccm &&\r\n plaintext instanceof ArrayBuffer\r\n ) {\r\n p.ct = sjcl.arrayBuffer.ccm.encrypt(prp, plaintext, p.iv, adata, p.ts);\r\n } else {\r\n p.ct = sjcl.mode[p.mode].encrypt(prp, plaintext, p.iv, adata, p.ts);\r\n }\r\n\r\n //return j.encode(j._subtract(p, j.defaults));\r\n return p;\r\n },\r\n\r\n /** Simple encryption function.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {String} plaintext The data to encrypt.\r\n * @param {Object} [params] The parameters including tag, iv and salt.\r\n * @param {Object} [rp] A returned version with filled-in parameters.\r\n * @return {String} The ciphertext serialized data.\r\n * @throws {sjcl.exception.invalid} if a parameter is invalid.\r\n */\r\n encrypt: function (password, plaintext, params, rp) {\r\n var j = sjcl.json,\r\n p = j._encrypt.apply(j, arguments);\r\n return j.encode(p);\r\n },\r\n\r\n /** Simple decryption function.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {Object} ciphertext The cipher raw data to decrypt.\r\n * @param {Object} [params] Additional non-default parameters.\r\n * @param {Object} [rp] A returned object with filled parameters.\r\n * @return {String} The plaintext.\r\n * @throws {sjcl.exception.invalid} if a parameter is invalid.\r\n * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt.\r\n */\r\n _decrypt: function (password, ciphertext, params, rp) {\r\n params = params || {};\r\n rp = rp || {};\r\n\r\n var j = sjcl.json,\r\n p = j._add(j._add(j._add({}, j.defaults), ciphertext), params, true),\r\n ct,\r\n tmp,\r\n prp,\r\n adata = p.adata;\r\n if (typeof p.salt === \"string\") {\r\n p.salt = sjcl.codec.base64.toBits(p.salt);\r\n }\r\n if (typeof p.iv === \"string\") {\r\n p.iv = sjcl.codec.base64.toBits(p.iv);\r\n }\r\n\r\n if (\r\n !sjcl.mode[p.mode] ||\r\n !sjcl.cipher[p.cipher] ||\r\n (typeof password === \"string\" && p.iter <= 100) ||\r\n (p.ts !== 64 && p.ts !== 96 && p.ts !== 128) ||\r\n (p.ks !== 128 && p.ks !== 192 && p.ks !== 256) ||\r\n !p.iv ||\r\n p.iv.length < 2 ||\r\n p.iv.length > 4\r\n ) {\r\n throw new sjcl.exception.invalid(\"json decrypt: invalid parameters\");\r\n }\r\n\r\n if (typeof password === \"string\") {\r\n tmp = sjcl.misc.cachedPbkdf2(password, p);\r\n password = tmp.key.slice(0, p.ks / 32);\r\n p.salt = tmp.salt;\r\n } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.secretKey) {\r\n password = password\r\n .unkem(sjcl.codec.base64.toBits(p.kemtag))\r\n .slice(0, p.ks / 32);\r\n }\r\n if (typeof adata === \"string\") {\r\n adata = sjcl.codec.utf8String.toBits(adata);\r\n }\r\n prp = new sjcl.cipher[p.cipher](password);\r\n\r\n /* do the decryption */\r\n if (\r\n p.mode === \"ccm\" &&\r\n sjcl.arrayBuffer &&\r\n sjcl.arrayBuffer.ccm &&\r\n p.ct instanceof ArrayBuffer\r\n ) {\r\n ct = sjcl.arrayBuffer.ccm.decrypt(prp, p.ct, p.iv, p.tag, adata, p.ts);\r\n } else {\r\n ct = sjcl.mode[p.mode].decrypt(prp, p.ct, p.iv, adata, p.ts);\r\n }\r\n\r\n /* return the json data */\r\n j._add(rp, p);\r\n rp.key = password;\r\n\r\n if (params.raw === 1) {\r\n return ct;\r\n } else {\r\n return sjcl.codec.utf8String.fromBits(ct);\r\n }\r\n },\r\n\r\n /** Simple decryption function.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {String} ciphertext The ciphertext to decrypt.\r\n * @param {Object} [params] Additional non-default parameters.\r\n * @param {Object} [rp] A returned object with filled parameters.\r\n * @return {String} The plaintext.\r\n * @throws {sjcl.exception.invalid} if a parameter is invalid.\r\n * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt.\r\n */\r\n decrypt: function (password, ciphertext, params, rp) {\r\n var j = sjcl.json;\r\n return j._decrypt(password, j.decode(ciphertext), params, rp);\r\n },\r\n\r\n /** Encode a flat structure into a JSON string.\r\n * @param {Object} obj The structure to encode.\r\n * @return {String} A JSON string.\r\n * @throws {sjcl.exception.invalid} if obj has a non-alphanumeric property.\r\n * @throws {sjcl.exception.bug} if a parameter has an unsupported type.\r\n */\r\n encode: function (obj) {\r\n var i,\r\n out = \"{\",\r\n comma = \"\";\r\n for (i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n if (!i.match(/^[a-z0-9]+$/i)) {\r\n throw new sjcl.exception.invalid(\r\n \"json encode: invalid property name\"\r\n );\r\n }\r\n out += comma + '\"' + i + '\":';\r\n comma = \",\";\r\n\r\n switch (typeof obj[i]) {\r\n case \"number\":\r\n case \"boolean\":\r\n out += obj[i];\r\n break;\r\n\r\n case \"string\":\r\n out += '\"' + escape(obj[i]) + '\"';\r\n break;\r\n\r\n case \"object\":\r\n out += '\"' + sjcl.codec.base64.fromBits(obj[i], 0) + '\"';\r\n break;\r\n\r\n default:\r\n throw new sjcl.exception.bug(\"json encode: unsupported type\");\r\n }\r\n }\r\n }\r\n return out + \"}\";\r\n },\r\n\r\n /** Decode a simple (flat) JSON string into a structure. The ciphertext,\r\n * adata, salt and iv will be base64-decoded.\r\n * @param {String} str The string.\r\n * @return {Object} The decoded structure.\r\n * @throws {sjcl.exception.invalid} if str isn't (simple) JSON.\r\n */\r\n decode: function (str) {\r\n str = str.replace(/\\s/g, \"\");\r\n if (!str.match(/^\\{.*\\}$/)) {\r\n throw new sjcl.exception.invalid(\"json decode: this isn't json!\");\r\n }\r\n var a = str.replace(/^\\{|\\}$/g, \"\").split(/,/),\r\n out = {},\r\n i,\r\n m;\r\n for (i = 0; i < a.length; i++) {\r\n if (\r\n !(m = a[i].match(\r\n /^\\s*(?:([\"']?)([a-z][a-z0-9]*)\\1)\\s*:\\s*(?:(-?\\d+)|\"([a-z0-9+\\/%*_.@=\\-]*)\"|(true|false))$/i\r\n ))\r\n ) {\r\n throw new sjcl.exception.invalid(\"json decode: this isn't json!\");\r\n }\r\n if (m[3] != null) {\r\n out[m[2]] = parseInt(m[3], 10);\r\n } else if (m[4] != null) {\r\n out[m[2]] = m[2].match(/^(ct|adata|salt|iv)$/)\r\n ? sjcl.codec.base64.toBits(m[4])\r\n : unescape(m[4]);\r\n } else if (m[5] != null) {\r\n out[m[2]] = m[5] === \"true\";\r\n }\r\n }\r\n return out;\r\n },\r\n\r\n /** Insert all elements of src into target, modifying and returning target.\r\n * @param {Object} target The object to be modified.\r\n * @param {Object} src The object to pull data from.\r\n * @param {boolean} [requireSame=false] If true, throw an exception if any field of target differs from corresponding field of src.\r\n * @return {Object} target.\r\n * @private\r\n */\r\n _add: function (target, src, requireSame) {\r\n if (target === undefined) {\r\n target = {};\r\n }\r\n if (src === undefined) {\r\n return target;\r\n }\r\n var i;\r\n for (i in src) {\r\n if (src.hasOwnProperty(i)) {\r\n if (requireSame && target[i] !== undefined && target[i] !== src[i]) {\r\n throw new sjcl.exception.invalid(\"required parameter overridden\");\r\n }\r\n target[i] = src[i];\r\n }\r\n }\r\n return target;\r\n },\r\n\r\n /** Remove all elements of minus from plus. Does not modify plus.\r\n * @private\r\n */\r\n _subtract: function (plus, minus) {\r\n var out = {},\r\n i;\r\n\r\n for (i in plus) {\r\n if (plus.hasOwnProperty(i) && plus[i] !== minus[i]) {\r\n out[i] = plus[i];\r\n }\r\n }\r\n\r\n return out;\r\n },\r\n\r\n /** Return only the specified elements of src.\r\n * @private\r\n */\r\n _filter: function (src, filter) {\r\n var out = {},\r\n i;\r\n for (i = 0; i < filter.length; i++) {\r\n if (src[filter[i]] !== undefined) {\r\n out[filter[i]] = src[filter[i]];\r\n }\r\n }\r\n return out;\r\n }\r\n};\r\n\r\n/** Simple encryption function; convenient shorthand for sjcl.json.encrypt.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {String} plaintext The data to encrypt.\r\n * @param {Object} [params] The parameters including tag, iv and salt.\r\n * @param {Object} [rp] A returned version with filled-in parameters.\r\n * @return {String} The ciphertext.\r\n */\r\nsjcl.encrypt = sjcl.json.encrypt;\r\n\r\n/** Simple decryption function; convenient shorthand for sjcl.json.decrypt.\r\n * @param {String|bitArray} password The password or key.\r\n * @param {String} ciphertext The ciphertext to decrypt.\r\n * @param {Object} [params] Additional non-default parameters.\r\n * @param {Object} [rp] A returned object with filled parameters.\r\n * @return {String} The plaintext.\r\n */\r\nsjcl.decrypt = sjcl.json.decrypt;\r\n\r\n/** The cache for cachedPbkdf2.\r\n * @private\r\n */\r\nsjcl.misc._pbkdf2Cache = {};\r\n\r\n/** Cached PBKDF2 key derivation.\r\n * @param {String} password The password.\r\n * @param {Object} [obj] The derivation params (iteration count and optional salt).\r\n * @return {Object} The derived data in key, the salt in salt.\r\n */\r\nsjcl.misc.cachedPbkdf2 = function (password, obj) {\r\n var cache = sjcl.misc._pbkdf2Cache,\r\n c,\r\n cp,\r\n str,\r\n salt,\r\n iter;\r\n\r\n obj = obj || {};\r\n iter = obj.iter || 1000;\r\n\r\n /* open the cache for this password and iteration count */\r\n cp = cache[password] = cache[password] || {};\r\n c = cp[iter] = cp[iter] || {\r\n firstSalt:\r\n obj.salt && obj.salt.length\r\n ? obj.salt.slice(0)\r\n : sjcl.random.randomWords(2, 0)\r\n };\r\n\r\n salt = obj.salt === undefined ? c.firstSalt : obj.salt;\r\n\r\n c[salt] = c[salt] || sjcl.misc.pbkdf2(password, salt, obj.iter);\r\n return { key: c[salt].slice(0), salt: salt.slice(0) };\r\n};\r\n/**\r\n * base class for all ecc operations.\r\n * @namespace\r\n */\r\nsjcl.ecc = {};\r\n\r\n/**\r\n * Represents a point on a curve in affine coordinates.\r\n * @constructor\r\n * @param {sjcl.ecc.curve} curve The curve that this point lies on.\r\n * @param {bigInt} x The x coordinate.\r\n * @param {bigInt} y The y coordinate.\r\n */\r\nsjcl.ecc.point = function (curve, x, y) {\r\n if (x === undefined) {\r\n this.isIdentity = true;\r\n } else {\r\n if (x instanceof sjcl.bn) {\r\n x = new curve.field(x);\r\n }\r\n if (y instanceof sjcl.bn) {\r\n y = new curve.field(y);\r\n }\r\n\r\n this.x = x;\r\n this.y = y;\r\n\r\n this.isIdentity = false;\r\n }\r\n this.curve = curve;\r\n};\r\n\r\nsjcl.ecc.point.prototype = {\r\n toJac: function () {\r\n return new sjcl.ecc.pointJac(\r\n this.curve,\r\n this.x,\r\n this.y,\r\n new this.curve.field(1)\r\n );\r\n },\r\n\r\n mult: function (k) {\r\n return this.toJac().mult(k, this).toAffine();\r\n },\r\n\r\n /**\r\n * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates.\r\n * @param {bigInt} k The coefficient to multiply this by.\r\n * @param {bigInt} k2 The coefficient to multiply affine2 this by.\r\n * @param {sjcl.ecc.point} affine The other point in affine coordinates.\r\n * @return {sjcl.ecc.pointJac} The result of the multiplication and addition, in Jacobian coordinates.\r\n */\r\n mult2: function (k, k2, affine2) {\r\n return this.toJac().mult2(k, this, k2, affine2).toAffine();\r\n },\r\n\r\n multiples: function () {\r\n var m, i, j;\r\n if (this._multiples === undefined) {\r\n j = this.toJac().doubl();\r\n m = this._multiples = [\r\n new sjcl.ecc.point(this.curve),\r\n this,\r\n j.toAffine()\r\n ];\r\n for (i = 3; i < 16; i++) {\r\n j = j.add(this);\r\n m.push(j.toAffine());\r\n }\r\n }\r\n return this._multiples;\r\n },\r\n\r\n negate: function () {\r\n var newY = new this.curve.field(0).sub(this.y).normalize().reduce();\r\n return new sjcl.ecc.point(this.curve, this.x, newY);\r\n },\r\n\r\n isValid: function () {\r\n return this.y\r\n .square()\r\n .equals(this.curve.b.add(this.x.mul(this.curve.a.add(this.x.square()))));\r\n },\r\n\r\n toBits: function () {\r\n return sjcl.bitArray.concat(this.x.toBits(), this.y.toBits());\r\n }\r\n};\r\n\r\n/**\r\n * Represents a point on a curve in Jacobian coordinates. Coordinates can be specified as bigInts or strings (which\r\n * will be converted to bigInts).\r\n *\r\n * @constructor\r\n * @param {bigInt/string} x The x coordinate.\r\n * @param {bigInt/string} y The y coordinate.\r\n * @param {bigInt/string} z The z coordinate.\r\n * @param {sjcl.ecc.curve} curve The curve that this point lies on.\r\n */\r\nsjcl.ecc.pointJac = function (curve, x, y, z) {\r\n if (x === undefined) {\r\n this.isIdentity = true;\r\n } else {\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n this.isIdentity = false;\r\n }\r\n this.curve = curve;\r\n};\r\n\r\nsjcl.ecc.pointJac.prototype = {\r\n /**\r\n * Adds S and T and returns the result in Jacobian coordinates. Note that S must be in Jacobian coordinates and T must be in affine coordinates.\r\n * @param {sjcl.ecc.pointJac} S One of the points to add, in Jacobian coordinates.\r\n * @param {sjcl.ecc.point} T The other point to add, in affine coordinates.\r\n * @return {sjcl.ecc.pointJac} The sum of the two points, in Jacobian coordinates.\r\n */\r\n add: function (T) {\r\n var S = this,\r\n sz2,\r\n c,\r\n d,\r\n c2,\r\n x1,\r\n x2,\r\n x,\r\n y1,\r\n y2,\r\n y,\r\n z;\r\n if (S.curve !== T.curve) {\r\n throw new sjcl.exception.invalid(\r\n \"sjcl.ecc.add(): Points must be on the same curve to add them!\"\r\n );\r\n }\r\n\r\n if (S.isIdentity) {\r\n return T.toJac();\r\n } else if (T.isIdentity) {\r\n return S;\r\n }\r\n\r\n sz2 = S.z.square();\r\n c = T.x.mul(sz2).subM(S.x);\r\n\r\n if (c.equals(0)) {\r\n if (S.y.equals(T.y.mul(sz2.mul(S.z)))) {\r\n // same point\r\n return S.doubl();\r\n } else {\r\n // inverses\r\n return new sjcl.ecc.pointJac(S.curve);\r\n }\r\n }\r\n\r\n d = T.y.mul(sz2.mul(S.z)).subM(S.y);\r\n c2 = c.square();\r\n\r\n x1 = d.square();\r\n x2 = c.square().mul(c).addM(S.x.add(S.x).mul(c2));\r\n x = x1.subM(x2);\r\n\r\n y1 = S.x.mul(c2).subM(x).mul(d);\r\n y2 = S.y.mul(c.square().mul(c));\r\n y = y1.subM(y2);\r\n\r\n z = S.z.mul(c);\r\n\r\n return new sjcl.ecc.pointJac(this.curve, x, y, z);\r\n },\r\n\r\n /**\r\n * doubles this point.\r\n * @return {sjcl.ecc.pointJac} The doubled point.\r\n */\r\n doubl: function () {\r\n if (this.isIdentity) {\r\n return this;\r\n }\r\n\r\n var y2 = this.y.square(),\r\n a = y2.mul(this.x.mul(4)),\r\n b = y2.square().mul(8),\r\n z2 = this.z.square(),\r\n c =\r\n this.curve.a.toString() == new sjcl.bn(-3).toString()\r\n ? this.x.sub(z2).mul(3).mul(this.x.add(z2))\r\n : this.x.square().mul(3).add(z2.square().mul(this.curve.a)),\r\n x = c.square().subM(a).subM(a),\r\n y = a.sub(x).mul(c).subM(b),\r\n z = this.y.add(this.y).mul(this.z);\r\n return new sjcl.ecc.pointJac(this.curve, x, y, z);\r\n },\r\n\r\n /**\r\n * Returns a copy of this point converted to affine coordinates.\r\n * @return {sjcl.ecc.point} The converted point.\r\n */\r\n toAffine: function () {\r\n if (this.isIdentity || this.z.equals(0)) {\r\n return new sjcl.ecc.point(this.curve);\r\n }\r\n var zi = this.z.inverse(),\r\n zi2 = zi.square();\r\n return new sjcl.ecc.point(\r\n this.curve,\r\n this.x.mul(zi2).fullReduce(),\r\n this.y.mul(zi2.mul(zi)).fullReduce()\r\n );\r\n },\r\n\r\n /**\r\n * Multiply this point by k and return the answer in Jacobian coordinates.\r\n * @param {bigInt} k The coefficient to multiply by.\r\n * @param {sjcl.ecc.point} affine This point in affine coordinates.\r\n * @return {sjcl.ecc.pointJac} The result of the multiplication, in Jacobian coordinates.\r\n */\r\n mult: function (k, affine) {\r\n if (typeof k === \"number\") {\r\n k = [k];\r\n } else if (k.limbs !== undefined) {\r\n k = k.normalize().limbs;\r\n }\r\n\r\n var i,\r\n j,\r\n out = new sjcl.ecc.point(this.curve).toJac(),\r\n multiples = affine.multiples();\r\n\r\n for (i = k.length - 1; i >= 0; i--) {\r\n for (j = sjcl.bn.prototype.radix - 4; j >= 0; j -= 4) {\r\n out = out\r\n .doubl()\r\n .doubl()\r\n .doubl()\r\n .doubl()\r\n .add(multiples[(k[i] >> j) & 0xf]);\r\n }\r\n }\r\n\r\n return out;\r\n },\r\n\r\n /**\r\n * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates.\r\n * @param {bigInt} k The coefficient to multiply this by.\r\n * @param {sjcl.ecc.point} affine This point in affine coordinates.\r\n * @param {bigInt} k2 The coefficient to multiply affine2 this by.\r\n * @param {sjcl.ecc.point} affine The other point in affine coordinates.\r\n * @return {sjcl.ecc.pointJac} The result of the multiplication and addition, in Jacobian coordinates.\r\n */\r\n mult2: function (k1, affine, k2, affine2) {\r\n if (typeof k1 === \"number\") {\r\n k1 = [k1];\r\n } else if (k1.limbs !== undefined) {\r\n k1 = k1.normalize().limbs;\r\n }\r\n\r\n if (typeof k2 === \"number\") {\r\n k2 = [k2];\r\n } else if (k2.limbs !== undefined) {\r\n k2 = k2.normalize().limbs;\r\n }\r\n\r\n var i,\r\n j,\r\n out = new sjcl.ecc.point(this.curve).toJac(),\r\n m1 = affine.multiples(),\r\n m2 = affine2.multiples(),\r\n l1,\r\n l2;\r\n\r\n for (i = Math.max(k1.length, k2.length) - 1; i >= 0; i--) {\r\n l1 = k1[i] | 0;\r\n l2 = k2[i] | 0;\r\n for (j = sjcl.bn.prototype.radix - 4; j >= 0; j -= 4) {\r\n out = out\r\n .doubl()\r\n .doubl()\r\n .doubl()\r\n .doubl()\r\n .add(m1[(l1 >> j) & 0xf])\r\n .add(m2[(l2 >> j) & 0xf]);\r\n }\r\n }\r\n\r\n return out;\r\n },\r\n\r\n negate: function () {\r\n return this.toAffine().negate().toJac();\r\n },\r\n\r\n isValid: function () {\r\n var z2 = this.z.square(),\r\n z4 = z2.square(),\r\n z6 = z4.mul(z2);\r\n return this.y\r\n .square()\r\n .equals(\r\n this.curve.b\r\n .mul(z6)\r\n .add(this.x.mul(this.curve.a.mul(z4).add(this.x.square())))\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Construct an elliptic curve. Most users will not use this and instead start with one of the NIST curves defined below.\r\n *\r\n * @constructor\r\n * @param {bigInt} p The prime modulus.\r\n * @param {bigInt} r The prime order of the curve.\r\n * @param {bigInt} a The constant a in the equation of the curve y^2 = x^3 + ax + b (for NIST curves, a is always -3).\r\n * @param {bigInt} x The x coordinate of a base point of the curve.\r\n * @param {bigInt} y The y coordinate of a base point of the curve.\r\n */\r\nsjcl.ecc.curve = function (Field, r, a, b, x, y) {\r\n this.field = Field;\r\n this.r = new sjcl.bn(r);\r\n this.a = new Field(a);\r\n this.b = new Field(b);\r\n this.G = new sjcl.ecc.point(this, new Field(x), new Field(y));\r\n};\r\n\r\nsjcl.ecc.curve.prototype.fromBits = function (bits) {\r\n var w = sjcl.bitArray,\r\n l = (this.field.prototype.exponent + 7) & -8,\r\n p = new sjcl.ecc.point(\r\n this,\r\n this.field.fromBits(w.bitSlice(bits, 0, l)),\r\n this.field.fromBits(w.bitSlice(bits, l, 2 * l))\r\n );\r\n if (!p.isValid()) {\r\n throw new sjcl.exception.corrupt(\"not on the curve!\");\r\n }\r\n return p;\r\n};\r\n\r\nsjcl.ecc.curves = {\r\n c192: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p192,\r\n \"0xffffffffffffffffffffffff99def836146bc9b1b4d22831\",\r\n -3,\r\n \"0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1\",\r\n \"0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012\",\r\n \"0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811\"\r\n ),\r\n\r\n c224: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p224,\r\n \"0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\",\r\n -3,\r\n \"0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4\",\r\n \"0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21\",\r\n \"0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34\"\r\n ),\r\n\r\n c256: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p256,\r\n \"0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\",\r\n -3,\r\n \"0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b\",\r\n \"0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296\",\r\n \"0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5\"\r\n ),\r\n\r\n c384: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p384,\r\n \"0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\",\r\n -3,\r\n \"0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef\",\r\n \"0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7\",\r\n \"0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f\"\r\n ),\r\n\r\n c521: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p521,\r\n \"0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409\",\r\n -3,\r\n \"0x051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00\",\r\n \"0xC6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66\",\r\n \"0x11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650\"\r\n ),\r\n\r\n k192: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p192k,\r\n \"0xfffffffffffffffffffffffe26f2fc170f69466a74defd8d\",\r\n 0,\r\n 3,\r\n \"0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d\",\r\n \"0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d\"\r\n ),\r\n\r\n k224: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p224k,\r\n \"0x010000000000000000000000000001dce8d2ec6184caf0a971769fb1f7\",\r\n 0,\r\n 5,\r\n \"0xa1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45c\",\r\n \"0x7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5\"\r\n ),\r\n\r\n k256: new sjcl.ecc.curve(\r\n sjcl.bn.prime.p256k,\r\n \"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\",\r\n 0,\r\n 7,\r\n \"0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\r\n \"0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\"\r\n )\r\n};\r\n\r\nsjcl.ecc.curveName = function (curve) {\r\n var curcurve;\r\n for (curcurve in sjcl.ecc.curves) {\r\n if (sjcl.ecc.curves.hasOwnProperty(curcurve)) {\r\n if (sjcl.ecc.curves[curcurve] === curve) {\r\n return curcurve;\r\n }\r\n }\r\n }\r\n\r\n throw new sjcl.exception.invalid(\"no such curve\");\r\n};\r\n\r\nsjcl.ecc.deserialize = function (key) {\r\n var types = [\"elGamal\", \"ecdsa\"];\r\n\r\n if (!key || !key.curve || !sjcl.ecc.curves[key.curve]) {\r\n throw new sjcl.exception.invalid(\"invalid serialization\");\r\n }\r\n if (types.indexOf(key.type) === -1) {\r\n throw new sjcl.exception.invalid(\"invalid type\");\r\n }\r\n\r\n var curve = sjcl.ecc.curves[key.curve];\r\n\r\n if (key.secretKey) {\r\n if (!key.exponent) {\r\n throw new sjcl.exception.invalid(\"invalid exponent\");\r\n }\r\n var exponent = new sjcl.bn(key.exponent);\r\n return new sjcl.ecc[key.type].secretKey(curve, exponent);\r\n } else {\r\n if (!key.point) {\r\n throw new sjcl.exception.invalid(\"invalid point\");\r\n }\r\n\r\n var point = curve.fromBits(sjcl.codec.hex.toBits(key.point));\r\n return new sjcl.ecc[key.type].publicKey(curve, point);\r\n }\r\n};\r\n\r\n/** our basicKey classes\r\n */\r\nsjcl.ecc.basicKey = {\r\n /** ecc publicKey.\r\n * @constructor\r\n * @param {curve} curve the elliptic curve\r\n * @param {point} point the point on the curve\r\n */\r\n publicKey: function (curve, point) {\r\n this._curve = curve;\r\n this._curveBitLength = curve.r.bitLength();\r\n if (point instanceof Array) {\r\n this._point = curve.fromBits(point);\r\n } else {\r\n this._point = point;\r\n }\r\n\r\n this.serialize = function () {\r\n var curveName = sjcl.ecc.curveName(curve);\r\n return {\r\n type: this.getType(),\r\n secretKey: false,\r\n point: sjcl.codec.hex.fromBits(this._point.toBits()),\r\n curve: curveName\r\n };\r\n };\r\n\r\n /** get this keys point data\r\n * @return x and y as bitArrays\r\n */\r\n this.get = function () {\r\n var pointbits = this._point.toBits();\r\n var len = sjcl.bitArray.bitLength(pointbits);\r\n var x = sjcl.bitArray.bitSlice(pointbits, 0, len / 2);\r\n var y = sjcl.bitArray.bitSlice(pointbits, len / 2);\r\n return { x: x, y: y };\r\n };\r\n },\r\n\r\n /** ecc secretKey\r\n * @constructor\r\n * @param {curve} curve the elliptic curve\r\n * @param exponent\r\n */\r\n secretKey: function (curve, exponent) {\r\n this._curve = curve;\r\n this._curveBitLength = curve.r.bitLength();\r\n this._exponent = exponent;\r\n\r\n this.serialize = function () {\r\n var exponent = this.get();\r\n var curveName = sjcl.ecc.curveName(curve);\r\n return {\r\n type: this.getType(),\r\n secretKey: true,\r\n exponent: sjcl.codec.hex.fromBits(exponent),\r\n curve: curveName\r\n };\r\n };\r\n\r\n /** get this keys exponent data\r\n * @return {bitArray} exponent\r\n */\r\n this.get = function () {\r\n return this._exponent.toBits();\r\n };\r\n }\r\n};\r\n\r\n/** @private */\r\nsjcl.ecc.basicKey.generateKeys = function (cn) {\r\n return function generateKeys(curve, paranoia, sec) {\r\n curve = curve || 256;\r\n\r\n if (typeof curve === \"number\") {\r\n curve = sjcl.ecc.curves[\"c\" + curve];\r\n if (curve === undefined) {\r\n throw new sjcl.exception.invalid(\"no such curve\");\r\n }\r\n }\r\n sec = sec || sjcl.bn.random(curve.r, paranoia);\r\n\r\n var pub = curve.G.mult(sec);\r\n return {\r\n pub: new sjcl.ecc[cn].publicKey(curve, pub),\r\n sec: new sjcl.ecc[cn].secretKey(curve, sec)\r\n };\r\n };\r\n};\r\n\r\n/** elGamal keys */\r\nsjcl.ecc.elGamal = {\r\n /** generate keys\r\n * @function\r\n * @param curve\r\n * @param {int} paranoia Paranoia for generation (default 6)\r\n * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey\r\n */\r\n generateKeys: sjcl.ecc.basicKey.generateKeys(\"elGamal\"),\r\n /** elGamal publicKey.\r\n * @constructor\r\n * @augments sjcl.ecc.basicKey.publicKey\r\n */\r\n publicKey: function (curve, point) {\r\n sjcl.ecc.basicKey.publicKey.apply(this, arguments);\r\n },\r\n /** elGamal secretKey\r\n * @constructor\r\n * @augments sjcl.ecc.basicKey.secretKey\r\n */\r\n secretKey: function (curve, exponent) {\r\n sjcl.ecc.basicKey.secretKey.apply(this, arguments);\r\n }\r\n};\r\n\r\nsjcl.ecc.elGamal.publicKey.prototype = {\r\n /** Kem function of elGamal Public Key\r\n * @param paranoia paranoia to use for randomization.\r\n * @return {object} key and tag. unkem(tag) with the corresponding secret key results in the key returned.\r\n */\r\n kem: function (paranoia) {\r\n var sec = sjcl.bn.random(this._curve.r, paranoia),\r\n tag = this._curve.G.mult(sec).toBits(),\r\n key = sjcl.hash.sha256.hash(this._point.mult(sec).toBits());\r\n return { key: key, tag: tag };\r\n },\r\n\r\n getType: function () {\r\n return \"elGamal\";\r\n }\r\n};\r\n\r\nsjcl.ecc.elGamal.secretKey.prototype = {\r\n /** UnKem function of elGamal Secret Key\r\n * @param {bitArray} tag The Tag to decrypt.\r\n * @return {bitArray} decrypted key.\r\n */\r\n unkem: function (tag) {\r\n return sjcl.hash.sha256.hash(\r\n this._curve.fromBits(tag).mult(this._exponent).toBits()\r\n );\r\n },\r\n\r\n /** Diffie-Hellmann function\r\n * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with\r\n * @return {bitArray} diffie-hellmann result for this key combination.\r\n */\r\n dh: function (pk) {\r\n return sjcl.hash.sha256.hash(pk._point.mult(this._exponent).toBits());\r\n },\r\n\r\n /** Diffie-Hellmann function, compatible with Java generateSecret\r\n * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with\r\n * @return {bitArray} undigested X value, diffie-hellmann result for this key combination,\r\n * compatible with Java generateSecret().\r\n */\r\n dhJavaEc: function (pk) {\r\n return pk._point.mult(this._exponent).x.toBits();\r\n },\r\n\r\n getType: function () {\r\n return \"elGamal\";\r\n }\r\n};\r\n\r\n/** ecdsa keys */\r\nsjcl.ecc.ecdsa = {\r\n /** generate keys\r\n * @function\r\n * @param curve\r\n * @param {int} paranoia Paranoia for generation (default 6)\r\n * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey\r\n */\r\n generateKeys: sjcl.ecc.basicKey.generateKeys(\"ecdsa\")\r\n};\r\n\r\n/** ecdsa publicKey.\r\n * @constructor\r\n * @augments sjcl.ecc.basicKey.publicKey\r\n */\r\nsjcl.ecc.ecdsa.publicKey = function (curve, point) {\r\n sjcl.ecc.basicKey.publicKey.apply(this, arguments);\r\n};\r\n\r\n/** specific functions for ecdsa publicKey. */\r\nsjcl.ecc.ecdsa.publicKey.prototype = {\r\n /** Diffie-Hellmann function\r\n * @param {bitArray} hash hash to verify.\r\n * @param {bitArray} rs signature bitArray.\r\n * @param {boolean} fakeLegacyVersion use old legacy version\r\n */\r\n verify: function (hash, rs, fakeLegacyVersion) {\r\n if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) {\r\n hash = sjcl.bitArray.clamp(hash, this._curveBitLength);\r\n }\r\n var w = sjcl.bitArray,\r\n R = this._curve.r,\r\n l = this._curveBitLength,\r\n r = sjcl.bn.fromBits(w.bitSlice(rs, 0, l)),\r\n ss = sjcl.bn.fromBits(w.bitSlice(rs, l, 2 * l)),\r\n s = fakeLegacyVersion ? ss : ss.inverseMod(R),\r\n hG = sjcl.bn.fromBits(hash).mul(s).mod(R),\r\n hA = r.mul(s).mod(R),\r\n r2 = this._curve.G.mult2(hG, hA, this._point).x;\r\n if (\r\n r.equals(0) ||\r\n ss.equals(0) ||\r\n r.greaterEquals(R) ||\r\n ss.greaterEquals(R) ||\r\n !r2.equals(r)\r\n ) {\r\n if (fakeLegacyVersion === undefined) {\r\n return this.verify(hash, rs, true);\r\n } else {\r\n throw new sjcl.exception.corrupt(\"signature didn't check out\");\r\n }\r\n }\r\n return true;\r\n },\r\n\r\n getType: function () {\r\n return \"ecdsa\";\r\n }\r\n};\r\n\r\n/** ecdsa secretKey\r\n * @constructor\r\n * @augments sjcl.ecc.basicKey.publicKey\r\n */\r\nsjcl.ecc.ecdsa.secretKey = function (curve, exponent) {\r\n sjcl.ecc.basicKey.secretKey.apply(this, arguments);\r\n};\r\n\r\n/** specific functions for ecdsa secretKey. */\r\nsjcl.ecc.ecdsa.secretKey.prototype = {\r\n /** Diffie-Hellmann function\r\n * @param {bitArray} hash hash to sign.\r\n * @param {int} paranoia paranoia for random number generation\r\n * @param {boolean} fakeLegacyVersion use old legacy version\r\n */\r\n sign: function (hash, paranoia, fakeLegacyVersion, fixedKForTesting) {\r\n if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) {\r\n hash = sjcl.bitArray.clamp(hash, this._curveBitLength);\r\n }\r\n var R = this._curve.r,\r\n l = R.bitLength(),\r\n k = fixedKForTesting || sjcl.bn.random(R.sub(1), paranoia).add(1),\r\n r = this._curve.G.mult(k).x.mod(R),\r\n ss = sjcl.bn.fromBits(hash).add(r.mul(this._exponent)),\r\n s = fakeLegacyVersion\r\n ? ss.inverseMod(R).mul(k).mod(R)\r\n : ss.mul(k.inverseMod(R)).mod(R);\r\n return sjcl.bitArray.concat(r.toBits(l), s.toBits(l));\r\n },\r\n\r\n getType: function () {\r\n return \"ecdsa\";\r\n }\r\n};\r\nif (typeof module !== \"undefined\" && module.exports) {\r\n module.exports = sjcl;\r\n}\r\n\r\n/** @fileOverview HKDF implementation.\r\n *\r\n * @author Steve Thomas\r\n */\r\n\r\n/** HKDF with the specified hash function.\r\n * @param {bitArray} ikm The input keying material.\r\n * @param {Number} keyBitLength The output key length, in bits.\r\n * @param {String|bitArray} salt The salt for HKDF.\r\n * @param {String|bitArray} info The info for HKDF.\r\n * @param {Object} [Hash=sjcl.hash.sha256] The hash function to use.\r\n * @return {bitArray} derived key.\r\n */\r\nsjcl.misc.hkdf = function (ikm, keyBitLength, salt, info, Hash) {\r\n var hmac,\r\n key,\r\n i,\r\n hashLen,\r\n loops,\r\n curOut,\r\n ret = [];\r\n\r\n Hash = Hash || sjcl.hash.sha256;\r\n if (typeof info === \"string\") {\r\n info = sjcl.codec.utf8String.toBits(info);\r\n }\r\n if (typeof salt === \"string\") {\r\n salt = sjcl.codec.utf8String.toBits(salt);\r\n } else if (!salt) {\r\n salt = [];\r\n }\r\n\r\n hmac = new sjcl.misc.hmac(salt, Hash);\r\n key = hmac.mac(ikm);\r\n hashLen = sjcl.bitArray.bitLength(key);\r\n\r\n loops = Math.ceil(keyBitLength / hashLen);\r\n if (loops > 255) {\r\n throw new sjcl.exception.invalid(\"key bit length is too large for hkdf\");\r\n }\r\n\r\n hmac = new sjcl.misc.hmac(key, Hash);\r\n curOut = [];\r\n for (i = 1; i <= loops; i++) {\r\n hmac.update(curOut);\r\n hmac.update(info);\r\n hmac.update([sjcl.bitArray.partial(8, i)]);\r\n curOut = hmac.digest();\r\n ret = sjcl.bitArray.concat(ret, curOut);\r\n }\r\n return sjcl.bitArray.clamp(ret, keyBitLength);\r\n};\r\n/** @fileOverview HMAC implementation.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/** HMAC with the specified hash function.\r\n * @constructor\r\n * @param {bitArray} key the key for HMAC.\r\n * @param {Object} [Hash=sjcl.hash.sha256] The hash function to use.\r\n */\r\n\r\nsjcl.misc.hmacKeys = function (key, Hash) {\r\n this._hash = Hash = Hash || sjcl.hash.sha256;\r\n var exKey = [[], []],\r\n i,\r\n bs = Hash.prototype.blockSize / 32;\r\n this._baseHash = [new Hash(), new Hash()];\r\n\r\n if (key.length > bs) {\r\n key = Hash.hash(key);\r\n }\r\n\r\n for (i = 0; i < bs; i++) {\r\n exKey[0][i] = key[i] ^ 0x36363636;\r\n exKey[1][i] = key[i] ^ 0x5c5c5c5c;\r\n }\r\n\r\n return {\r\n serverKey: exKey[1],\r\n clientKey: exKey[0]\r\n };\r\n};\r\n\r\nsjcl.misc.hmac = function (key, Hash) {\r\n this._hash = Hash = Hash || sjcl.hash.sha256;\r\n var exKey = [[], []],\r\n i,\r\n bs = Hash.prototype.blockSize / 32;\r\n this._baseHash = [new Hash(), new Hash()];\r\n\r\n if (key.length > bs) {\r\n key = Hash.hash(key);\r\n }\r\n\r\n for (i = 0; i < bs; i++) {\r\n exKey[0][i] = key[i] ^ 0x36363636;\r\n exKey[1][i] = key[i] ^ 0x5c5c5c5c;\r\n }\r\n\r\n console.log(\"keys\", exKey);\r\n\r\n this._baseHash[0].update(exKey[0]);\r\n this._baseHash[1].update(exKey[1]);\r\n this._resultHash = new Hash(this._baseHash[0]);\r\n};\r\n\r\n/** HMAC with the specified hash function. Also called encrypt since it's a prf.\r\n * @param {bitArray|String} data The data to mac.\r\n */\r\nsjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (\r\n data\r\n) {\r\n if (!this._updated) {\r\n this.update(data);\r\n return this.digest(data);\r\n } else {\r\n throw new sjcl.exception.invalid(\"encrypt on already updated hmac called!\");\r\n }\r\n};\r\n\r\nsjcl.misc.hmac.prototype.reset = function () {\r\n this._resultHash = new this._hash(this._baseHash[0]);\r\n this._updated = false;\r\n};\r\n\r\nsjcl.misc.hmac.prototype.update = function (data) {\r\n this._updated = true;\r\n this._resultHash.update(data);\r\n};\r\n\r\nsjcl.misc.hmac.prototype.digest = function () {\r\n var w = this._resultHash.finalize(),\r\n result = new this._hash(this._baseHash[1]).update(w).finalize();\r\n\r\n this.reset();\r\n\r\n return result;\r\n};\r\n/** @fileOverview OCB 2.0 implementation\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Phil Rogaway's Offset CodeBook mode, version 2.0.\r\n * May be covered by US and international patents.\r\n *\r\n * @namespace\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\nsjcl.mode.ocb2 = {\r\n /** The name of the mode.\r\n * @constant\r\n */\r\n name: \"ocb2\",\r\n\r\n /** Encrypt in OCB mode, version 2.0.\r\n * @param {Object} prp The block cipher. It must have a block size of 16 bytes.\r\n * @param {bitArray} plaintext The plaintext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} [adata=[]] The authenticated data.\r\n * @param {Number} [tlen=64] the desired tag length, in bits.\r\n * @param {boolean} [premac=false] true if the authentication data is pre-macced with PMAC.\r\n * @return The encrypted data, an array of bytes.\r\n * @throws {sjcl.exception.invalid} if the IV isn't exactly 128 bits.\r\n */\r\n encrypt: function (prp, plaintext, iv, adata, tlen, premac) {\r\n if (sjcl.bitArray.bitLength(iv) !== 128) {\r\n throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");\r\n }\r\n var i,\r\n times2 = sjcl.mode.ocb2._times2,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n checksum = [0, 0, 0, 0],\r\n delta = times2(prp.encrypt(iv)),\r\n bi,\r\n bl,\r\n output = [],\r\n pad;\r\n\r\n adata = adata || [];\r\n tlen = tlen || 64;\r\n\r\n for (i = 0; i + 4 < plaintext.length; i += 4) {\r\n /* Encrypt a non-final block */\r\n bi = plaintext.slice(i, i + 4);\r\n checksum = xor(checksum, bi);\r\n output = output.concat(xor(delta, prp.encrypt(xor(delta, bi))));\r\n delta = times2(delta);\r\n }\r\n\r\n /* Chop out the final block */\r\n bi = plaintext.slice(i);\r\n bl = w.bitLength(bi);\r\n pad = prp.encrypt(xor(delta, [0, 0, 0, bl]));\r\n bi = w.clamp(xor(bi.concat([0, 0, 0]), pad), bl);\r\n\r\n /* Checksum the final block, and finalize the checksum */\r\n checksum = xor(checksum, xor(bi.concat([0, 0, 0]), pad));\r\n checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta))));\r\n\r\n /* MAC the header */\r\n if (adata.length) {\r\n checksum = xor(\r\n checksum,\r\n premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)\r\n );\r\n }\r\n\r\n return output.concat(w.concat(bi, w.clamp(checksum, tlen)));\r\n },\r\n\r\n /** Decrypt in OCB mode.\r\n * @param {Object} prp The block cipher. It must have a block size of 16 bytes.\r\n * @param {bitArray} ciphertext The ciphertext data.\r\n * @param {bitArray} iv The initialization value.\r\n * @param {bitArray} [adata=[]] The authenticated data.\r\n * @param {Number} [tlen=64] the desired tag length, in bits.\r\n * @param {boolean} [premac=false] true if the authentication data is pre-macced with PMAC.\r\n * @return The decrypted data, an array of bytes.\r\n * @throws {sjcl.exception.invalid} if the IV isn't exactly 128 bits.\r\n * @throws {sjcl.exception.corrupt} if if the message is corrupt.\r\n */\r\n decrypt: function (prp, ciphertext, iv, adata, tlen, premac) {\r\n if (sjcl.bitArray.bitLength(iv) !== 128) {\r\n throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");\r\n }\r\n tlen = tlen || 64;\r\n var i,\r\n times2 = sjcl.mode.ocb2._times2,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n checksum = [0, 0, 0, 0],\r\n delta = times2(prp.encrypt(iv)),\r\n bi,\r\n bl,\r\n len = sjcl.bitArray.bitLength(ciphertext) - tlen,\r\n output = [],\r\n pad;\r\n\r\n adata = adata || [];\r\n\r\n for (i = 0; i + 4 < len / 32; i += 4) {\r\n /* Decrypt a non-final block */\r\n bi = xor(delta, prp.decrypt(xor(delta, ciphertext.slice(i, i + 4))));\r\n checksum = xor(checksum, bi);\r\n output = output.concat(bi);\r\n delta = times2(delta);\r\n }\r\n\r\n /* Chop out and decrypt the final block */\r\n bl = len - i * 32;\r\n pad = prp.encrypt(xor(delta, [0, 0, 0, bl]));\r\n bi = xor(pad, w.clamp(ciphertext.slice(i), bl).concat([0, 0, 0]));\r\n\r\n /* Checksum the final block, and finalize the checksum */\r\n checksum = xor(checksum, bi);\r\n checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta))));\r\n\r\n /* MAC the header */\r\n if (adata.length) {\r\n checksum = xor(\r\n checksum,\r\n premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)\r\n );\r\n }\r\n\r\n if (!w.equal(w.clamp(checksum, tlen), w.bitSlice(ciphertext, len))) {\r\n throw new sjcl.exception.corrupt(\"ocb: tag doesn't match\");\r\n }\r\n\r\n return output.concat(w.clamp(bi, bl));\r\n },\r\n\r\n /** PMAC authentication for OCB associated data.\r\n * @param {Object} prp The block cipher. It must have a block size of 16 bytes.\r\n * @param {bitArray} adata The authenticated data.\r\n */\r\n pmac: function (prp, adata) {\r\n var i,\r\n times2 = sjcl.mode.ocb2._times2,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n checksum = [0, 0, 0, 0],\r\n delta = prp.encrypt([0, 0, 0, 0]),\r\n bi;\r\n\r\n delta = xor(delta, times2(times2(delta)));\r\n\r\n for (i = 0; i + 4 < adata.length; i += 4) {\r\n delta = times2(delta);\r\n checksum = xor(checksum, prp.encrypt(xor(delta, adata.slice(i, i + 4))));\r\n }\r\n\r\n bi = adata.slice(i);\r\n if (w.bitLength(bi) < 128) {\r\n delta = xor(delta, times2(delta));\r\n bi = w.concat(bi, [0x80000000 | 0, 0, 0, 0]);\r\n }\r\n checksum = xor(checksum, bi);\r\n return prp.encrypt(xor(times2(xor(delta, times2(delta))), checksum));\r\n },\r\n\r\n /** Double a block of words, OCB style.\r\n * @private\r\n */\r\n _times2: function (x) {\r\n return [\r\n (x[0] << 1) ^ (x[1] >>> 31),\r\n (x[1] << 1) ^ (x[2] >>> 31),\r\n (x[2] << 1) ^ (x[3] >>> 31),\r\n (x[3] << 1) ^ ((x[0] >>> 31) * 0x87)\r\n ];\r\n }\r\n};\r\n/**\r\n * OCB2.0 implementation slightly modified by Yifan Gu\r\n * to support progressive encryption\r\n * @author Yifan Gu\r\n */\r\n\r\n/** @fileOverview OCB 2.0 implementation\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Phil Rogaway's Offset CodeBook mode, version 2.0.\r\n * May be covered by US and international patents.\r\n *\r\n * @namespace\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\nsjcl.mode.ocb2progressive = {\r\n createEncryptor: function (prp, iv, adata, tlen, premac) {\r\n if (sjcl.bitArray.bitLength(iv) !== 128) {\r\n throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");\r\n }\r\n var i,\r\n times2 = sjcl.mode.ocb2._times2,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n checksum = [0, 0, 0, 0],\r\n delta = times2(prp.encrypt(iv)),\r\n bi,\r\n bl,\r\n datacache = [],\r\n pad;\r\n\r\n adata = adata || [];\r\n tlen = tlen || 64;\r\n\r\n return {\r\n process: function (data) {\r\n var datalen = sjcl.bitArray.bitLength(data);\r\n if (datalen == 0) {\r\n // empty input natrually gives empty output\r\n return [];\r\n }\r\n var output = [];\r\n datacache = datacache.concat(data);\r\n for (i = 0; i + 4 < datacache.length; i += 4) {\r\n /* Encrypt a non-final block */\r\n bi = datacache.slice(i, i + 4);\r\n checksum = xor(checksum, bi);\r\n output = output.concat(xor(delta, prp.encrypt(xor(delta, bi))));\r\n delta = times2(delta);\r\n }\r\n datacache = datacache.slice(i); // at end of each process we ensure size of datacache is smaller than 4\r\n return output; //spits out the result.\r\n },\r\n finalize: function () {\r\n // the final block\r\n bi = datacache;\r\n bl = w.bitLength(bi);\r\n pad = prp.encrypt(xor(delta, [0, 0, 0, bl]));\r\n bi = w.clamp(xor(bi.concat([0, 0, 0]), pad), bl);\r\n\r\n /* Checksum the final block, and finalize the checksum */\r\n checksum = xor(checksum, xor(bi.concat([0, 0, 0]), pad));\r\n checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta))));\r\n\r\n /* MAC the header */\r\n if (adata.length) {\r\n checksum = xor(\r\n checksum,\r\n premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)\r\n );\r\n }\r\n\r\n return w.concat(bi, w.clamp(checksum, tlen)); // spits out the last block\r\n }\r\n };\r\n },\r\n createDecryptor: function (prp, iv, adata, tlen, premac) {\r\n if (sjcl.bitArray.bitLength(iv) !== 128) {\r\n throw new sjcl.exception.invalid(\"ocb iv must be 128 bits\");\r\n }\r\n tlen = tlen || 64;\r\n var i,\r\n times2 = sjcl.mode.ocb2._times2,\r\n w = sjcl.bitArray,\r\n xor = w._xor4,\r\n checksum = [0, 0, 0, 0],\r\n delta = times2(prp.encrypt(iv)),\r\n bi,\r\n bl,\r\n datacache = [],\r\n pad;\r\n\r\n adata = adata || [];\r\n\r\n return {\r\n process: function (data) {\r\n if (data.length == 0) {\r\n // empty input natrually gives empty output\r\n return [];\r\n }\r\n var output = [];\r\n datacache = datacache.concat(data);\r\n var cachelen = sjcl.bitArray.bitLength(datacache);\r\n for (i = 0; i + 4 < (cachelen - tlen) / 32; i += 4) {\r\n /* Decrypt a non-final block */\r\n bi = xor(delta, prp.decrypt(xor(delta, datacache.slice(i, i + 4))));\r\n checksum = xor(checksum, bi);\r\n output = output.concat(bi);\r\n delta = times2(delta);\r\n }\r\n datacache = datacache.slice(i);\r\n return output;\r\n },\r\n finalize: function () {\r\n /* Chop out and decrypt the final block */\r\n bl = sjcl.bitArray.bitLength(datacache) - tlen;\r\n pad = prp.encrypt(xor(delta, [0, 0, 0, bl]));\r\n bi = xor(pad, w.clamp(datacache, bl).concat([0, 0, 0]));\r\n\r\n /* Checksum the final block, and finalize the checksum */\r\n checksum = xor(checksum, bi);\r\n checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta))));\r\n\r\n /* MAC the header */\r\n if (adata.length) {\r\n checksum = xor(\r\n checksum,\r\n premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)\r\n );\r\n }\r\n\r\n if (!w.equal(w.clamp(checksum, tlen), w.bitSlice(datacache, bl))) {\r\n throw new sjcl.exception.corrupt(\"ocb: tag doesn't match\");\r\n }\r\n\r\n return w.clamp(bi, bl);\r\n }\r\n };\r\n }\r\n};\r\n/** @fileOverview Password-based key-derivation function, version 2.0.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/** Password-Based Key-Derivation Function, version 2.0.\r\n *\r\n * Generate keys from passwords using PBKDF2-HMAC-SHA256.\r\n *\r\n * This is the method specified by RSA's PKCS #5 standard.\r\n *\r\n * @param {bitArray|String} password The password.\r\n * @param {bitArray|String} salt The salt. Should have lots of entropy.\r\n * @param {Number} [count=1000] The number of iterations. Higher numbers make the function slower but more secure.\r\n * @param {Number} [length] The length of the derived key. Defaults to the\r\n output size of the hash function.\r\n * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family.\r\n * @return {bitArray} the derived key.\r\n */\r\nsjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) {\r\n count = count || 10000;\r\n\r\n if (length < 0 || count < 0) {\r\n throw new sjcl.exception.invalid(\"invalid params to pbkdf2\");\r\n }\r\n\r\n if (typeof password === \"string\") {\r\n password = sjcl.codec.utf8String.toBits(password);\r\n }\r\n\r\n if (typeof salt === \"string\") {\r\n salt = sjcl.codec.utf8String.toBits(salt);\r\n }\r\n\r\n Prff = Prff || sjcl.misc.hmac;\r\n\r\n var prf = new Prff(password),\r\n u,\r\n ui,\r\n i,\r\n j,\r\n k,\r\n out = [],\r\n b = sjcl.bitArray;\r\n\r\n for (k = 1; 32 * out.length < (length || 1); k++) {\r\n u = ui = prf.encrypt(b.concat(salt, [k]));\r\n\r\n for (i = 1; i < count; i++) {\r\n ui = prf.encrypt(ui);\r\n for (j = 0; j < ui.length; j++) {\r\n u[j] ^= ui[j];\r\n }\r\n }\r\n\r\n out = out.concat(u);\r\n }\r\n\r\n if (length) {\r\n out = b.clamp(out, length);\r\n }\r\n\r\n return out;\r\n};\r\n/** @fileOverview Random number generator.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n * @author Michael Brooks\r\n * @author Steve Thomas\r\n */\r\n\r\n/**\r\n * @class Random number generator\r\n * @description\r\n * Use sjcl.random as a singleton for this class!\r\n *

\r\n * This random number generator is a derivative of Ferguson and Schneier's\r\n * generator Fortuna. It collects entropy from various events into several\r\n * pools, implemented by streaming SHA-256 instances. It differs from\r\n * ordinary Fortuna in a few ways, though.\r\n *

\r\n *\r\n *

\r\n * Most importantly, it has an entropy estimator. This is present because\r\n * there is a strong conflict here between making the generator available\r\n * as soon as possible, and making sure that it doesn't \"run on empty\".\r\n * In Fortuna, there is a saved state file, and the system is likely to have\r\n * time to warm up.\r\n *

\r\n *\r\n *

\r\n * Second, because users are unlikely to stay on the page for very long,\r\n * and to speed startup time, the number of pools increases logarithmically:\r\n * a new pool is created when the previous one is actually used for a reseed.\r\n * This gives the same asymptotic guarantees as Fortuna, but gives more\r\n * entropy to early reseeds.\r\n *

\r\n *\r\n *

\r\n * The entire mechanism here feels pretty klunky. Furthermore, there are\r\n * several improvements that should be made, including support for\r\n * dedicated cryptographic functions that may be present in some browsers;\r\n * state files in local storage; cookies containing randomness; etc. So\r\n * look for improvements in future versions.\r\n *

\r\n * @constructor\r\n */\r\nsjcl.prng = function (defaultParanoia) {\r\n /* private */\r\n this._pools = [new sjcl.hash.sha256()];\r\n this._poolEntropy = [0];\r\n this._reseedCount = 0;\r\n this._robins = {};\r\n this._eventId = 0;\r\n\r\n this._collectorIds = {};\r\n this._collectorIdNext = 0;\r\n\r\n this._strength = 0;\r\n this._poolStrength = 0;\r\n this._nextReseed = 0;\r\n this._key = [0, 0, 0, 0, 0, 0, 0, 0];\r\n this._counter = [0, 0, 0, 0];\r\n this._cipher = undefined;\r\n this._defaultParanoia = defaultParanoia;\r\n\r\n /* event listener stuff */\r\n this._collectorsStarted = false;\r\n this._callbacks = { progress: {}, seeded: {} };\r\n this._callbackI = 0;\r\n\r\n /* constants */\r\n this._NOT_READY = 0;\r\n this._READY = 1;\r\n this._REQUIRES_RESEED = 2;\r\n\r\n this._MAX_WORDS_PER_BURST = 65536;\r\n this._PARANOIA_LEVELS = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024];\r\n this._MILLISECONDS_PER_RESEED = 30000;\r\n this._BITS_PER_RESEED = 80;\r\n};\r\n\r\nsjcl.prng.prototype = {\r\n /** Generate several random words, and return them in an array.\r\n * A word consists of 32 bits (4 bytes)\r\n * @param {Number} nwords The number of words to generate.\r\n */\r\n randomWords: function (nwords, paranoia) {\r\n var out = [],\r\n i,\r\n readiness = this.isReady(paranoia),\r\n g;\r\n\r\n if (readiness === this._NOT_READY) {\r\n throw new sjcl.exception.notReady(\"generator isn't seeded\");\r\n } else if (readiness & this._REQUIRES_RESEED) {\r\n this._reseedFromPools(!(readiness & this._READY));\r\n }\r\n\r\n for (i = 0; i < nwords; i += 4) {\r\n if ((i + 1) % this._MAX_WORDS_PER_BURST === 0) {\r\n this._gate();\r\n }\r\n\r\n g = this._gen4words();\r\n out.push(g[0], g[1], g[2], g[3]);\r\n }\r\n this._gate();\r\n\r\n return out.slice(0, nwords);\r\n },\r\n\r\n setDefaultParanoia: function (paranoia, allowZeroParanoia) {\r\n if (\r\n paranoia === 0 &&\r\n allowZeroParanoia !==\r\n \"Setting paranoia=0 will ruin your security; use it only for testing\"\r\n ) {\r\n throw new sjcl.exception.invalid(\r\n \"Setting paranoia=0 will ruin your security; use it only for testing\"\r\n );\r\n }\r\n\r\n this._defaultParanoia = paranoia;\r\n },\r\n\r\n /**\r\n * Add entropy to the pools.\r\n * @param data The entropic value. Should be a 32-bit integer, array of 32-bit integers, or string\r\n * @param {Number} estimatedEntropy The estimated entropy of data, in bits\r\n * @param {String} source The source of the entropy, eg \"mouse\"\r\n */\r\n addEntropy: function (data, estimatedEntropy, source) {\r\n source = source || \"user\";\r\n\r\n var id,\r\n i,\r\n tmp,\r\n t = new Date().valueOf(),\r\n robin = this._robins[source],\r\n oldReady = this.isReady(),\r\n err = 0,\r\n objName;\r\n\r\n id = this._collectorIds[source];\r\n if (id === undefined) {\r\n id = this._collectorIds[source] = this._collectorIdNext++;\r\n }\r\n\r\n if (robin === undefined) {\r\n robin = this._robins[source] = 0;\r\n }\r\n this._robins[source] = (this._robins[source] + 1) % this._pools.length;\r\n\r\n switch (typeof data) {\r\n case \"number\":\r\n if (estimatedEntropy === undefined) {\r\n estimatedEntropy = 1;\r\n }\r\n this._pools[robin].update([\r\n id,\r\n this._eventId++,\r\n 1,\r\n estimatedEntropy,\r\n t,\r\n 1,\r\n data | 0\r\n ]);\r\n break;\r\n\r\n case \"object\":\r\n objName = Object.prototype.toString.call(data);\r\n if (objName === \"[object Uint32Array]\") {\r\n tmp = [];\r\n for (i = 0; i < data.length; i++) {\r\n tmp.push(data[i]);\r\n }\r\n data = tmp;\r\n } else {\r\n if (objName !== \"[object Array]\") {\r\n err = 1;\r\n }\r\n for (i = 0; i < data.length && !err; i++) {\r\n if (typeof data[i] !== \"number\") {\r\n err = 1;\r\n }\r\n }\r\n }\r\n if (!err) {\r\n if (estimatedEntropy === undefined) {\r\n /* horrible entropy estimator */\r\n estimatedEntropy = 0;\r\n for (i = 0; i < data.length; i++) {\r\n tmp = data[i];\r\n while (tmp > 0) {\r\n estimatedEntropy++;\r\n tmp = tmp >>> 1;\r\n }\r\n }\r\n }\r\n this._pools[robin].update(\r\n [id, this._eventId++, 2, estimatedEntropy, t, data.length].concat(\r\n data\r\n )\r\n );\r\n }\r\n break;\r\n\r\n case \"string\":\r\n if (estimatedEntropy === undefined) {\r\n /* English text has just over 1 bit per character of entropy.\r\n * But this might be HTML or something, and have far less\r\n * entropy than English... Oh well, let's just say one bit.\r\n */\r\n estimatedEntropy = data.length;\r\n }\r\n this._pools[robin].update([\r\n id,\r\n this._eventId++,\r\n 3,\r\n estimatedEntropy,\r\n t,\r\n data.length\r\n ]);\r\n this._pools[robin].update(data);\r\n break;\r\n\r\n default:\r\n err = 1;\r\n }\r\n if (err) {\r\n throw new sjcl.exception.bug(\r\n \"random: addEntropy only supports number, array of numbers or string\"\r\n );\r\n }\r\n\r\n /* record the new strength */\r\n this._poolEntropy[robin] += estimatedEntropy;\r\n this._poolStrength += estimatedEntropy;\r\n\r\n /* fire off events */\r\n if (oldReady === this._NOT_READY) {\r\n if (this.isReady() !== this._NOT_READY) {\r\n this._fireEvent(\"seeded\", Math.max(this._strength, this._poolStrength));\r\n }\r\n this._fireEvent(\"progress\", this.getProgress());\r\n }\r\n },\r\n\r\n /** Is the generator ready? */\r\n isReady: function (paranoia) {\r\n var entropyRequired = this._PARANOIA_LEVELS[\r\n paranoia !== undefined ? paranoia : this._defaultParanoia\r\n ];\r\n\r\n if (this._strength && this._strength >= entropyRequired) {\r\n return this._poolEntropy[0] > this._BITS_PER_RESEED &&\r\n new Date().valueOf() > this._nextReseed\r\n ? this._REQUIRES_RESEED | this._READY\r\n : this._READY;\r\n } else {\r\n return this._poolStrength >= entropyRequired\r\n ? this._REQUIRES_RESEED | this._NOT_READY\r\n : this._NOT_READY;\r\n }\r\n },\r\n\r\n /** Get the generator's progress toward readiness, as a fraction */\r\n getProgress: function (paranoia) {\r\n var entropyRequired = this._PARANOIA_LEVELS[\r\n paranoia ? paranoia : this._defaultParanoia\r\n ];\r\n\r\n if (this._strength >= entropyRequired) {\r\n return 1.0;\r\n } else {\r\n return this._poolStrength > entropyRequired\r\n ? 1.0\r\n : this._poolStrength / entropyRequired;\r\n }\r\n },\r\n\r\n /** start the built-in entropy collectors */\r\n startCollectors: function () {\r\n if (this._collectorsStarted) {\r\n return;\r\n }\r\n\r\n this._eventListener = {\r\n loadTimeCollector: this._bind(this._loadTimeCollector),\r\n mouseCollector: this._bind(this._mouseCollector),\r\n keyboardCollector: this._bind(this._keyboardCollector),\r\n accelerometerCollector: this._bind(this._accelerometerCollector),\r\n touchCollector: this._bind(this._touchCollector)\r\n };\r\n\r\n if (window.addEventListener) {\r\n window.addEventListener(\r\n \"load\",\r\n this._eventListener.loadTimeCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"mousemove\",\r\n this._eventListener.mouseCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"keypress\",\r\n this._eventListener.keyboardCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"devicemotion\",\r\n this._eventListener.accelerometerCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"touchmove\",\r\n this._eventListener.touchCollector,\r\n false\r\n );\r\n } else if (document.attachEvent) {\r\n document.attachEvent(\"onload\", this._eventListener.loadTimeCollector);\r\n document.attachEvent(\"onmousemove\", this._eventListener.mouseCollector);\r\n document.attachEvent(\"keypress\", this._eventListener.keyboardCollector);\r\n } else {\r\n throw new sjcl.exception.bug(\"can't attach event\");\r\n }\r\n\r\n this._collectorsStarted = true;\r\n },\r\n\r\n /** stop the built-in entropy collectors */\r\n stopCollectors: function () {\r\n if (!this._collectorsStarted) {\r\n return;\r\n }\r\n\r\n if (window.removeEventListener) {\r\n window.removeEventListener(\r\n \"load\",\r\n this._eventListener.loadTimeCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"mousemove\",\r\n this._eventListener.mouseCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"keypress\",\r\n this._eventListener.keyboardCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"devicemotion\",\r\n this._eventListener.accelerometerCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"touchmove\",\r\n this._eventListener.touchCollector,\r\n false\r\n );\r\n } else if (document.detachEvent) {\r\n document.detachEvent(\"onload\", this._eventListener.loadTimeCollector);\r\n document.detachEvent(\"onmousemove\", this._eventListener.mouseCollector);\r\n document.detachEvent(\"keypress\", this._eventListener.keyboardCollector);\r\n }\r\n\r\n this._collectorsStarted = false;\r\n },\r\n\r\n /* use a cookie to store entropy.\r\n useCookie: function (all_cookies) {\r\n throw new sjcl.exception.bug(\"random: useCookie is unimplemented\");\r\n },*/\r\n\r\n /** add an event listener for progress or seeded-ness. */\r\n addEventListener: function (name, callback) {\r\n this._callbacks[name][this._callbackI++] = callback;\r\n },\r\n\r\n /** remove an event listener for progress or seeded-ness */\r\n removeEventListener: function (name, cb) {\r\n var i,\r\n j,\r\n cbs = this._callbacks[name],\r\n jsTemp = [];\r\n\r\n /* I'm not sure if this is necessary; in C++, iterating over a\r\n * collection and modifying it at the same time is a no-no.\r\n */\r\n\r\n for (j in cbs) {\r\n if (cbs.hasOwnProperty(j) && cbs[j] === cb) {\r\n jsTemp.push(j);\r\n }\r\n }\r\n\r\n for (i = 0; i < jsTemp.length; i++) {\r\n j = jsTemp[i];\r\n delete cbs[j];\r\n }\r\n },\r\n\r\n _bind: function (func) {\r\n var that = this;\r\n return function () {\r\n func.apply(that, arguments);\r\n };\r\n },\r\n\r\n /** Generate 4 random words, no reseed, no gate.\r\n * @private\r\n */\r\n _gen4words: function () {\r\n for (var i = 0; i < 4; i++) {\r\n this._counter[i] = (this._counter[i] + 1) | 0;\r\n if (this._counter[i]) {\r\n break;\r\n }\r\n }\r\n return this._cipher.encrypt(this._counter);\r\n },\r\n\r\n /* Rekey the AES instance with itself after a request, or every _MAX_WORDS_PER_BURST words.\r\n * @private\r\n */\r\n _gate: function () {\r\n this._key = this._gen4words().concat(this._gen4words());\r\n this._cipher = new sjcl.cipher.aes(this._key);\r\n },\r\n\r\n /** Reseed the generator with the given words\r\n * @private\r\n */\r\n _reseed: function (seedWords) {\r\n this._key = sjcl.hash.sha256.hash(this._key.concat(seedWords));\r\n this._cipher = new sjcl.cipher.aes(this._key);\r\n for (var i = 0; i < 4; i++) {\r\n this._counter[i] = (this._counter[i] + 1) | 0;\r\n if (this._counter[i]) {\r\n break;\r\n }\r\n }\r\n },\r\n\r\n /** reseed the data from the entropy pools\r\n * @param full If set, use all the entropy pools in the reseed.\r\n */\r\n _reseedFromPools: function (full) {\r\n var reseedData = [],\r\n strength = 0,\r\n i;\r\n\r\n this._nextReseed = reseedData[0] =\r\n new Date().valueOf() + this._MILLISECONDS_PER_RESEED;\r\n\r\n for (i = 0; i < 16; i++) {\r\n /* On some browsers, this is cryptographically random. So we might\r\n * as well toss it in the pot and stir...\r\n */\r\n reseedData.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n for (i = 0; i < this._pools.length; i++) {\r\n reseedData = reseedData.concat(this._pools[i].finalize());\r\n strength += this._poolEntropy[i];\r\n this._poolEntropy[i] = 0;\r\n\r\n if (!full && this._reseedCount & (1 << i)) {\r\n break;\r\n }\r\n }\r\n\r\n /* if we used the last pool, push a new one onto the stack */\r\n if (this._reseedCount >= 1 << this._pools.length) {\r\n this._pools.push(new sjcl.hash.sha256());\r\n this._poolEntropy.push(0);\r\n }\r\n\r\n /* how strong was this reseed? */\r\n this._poolStrength -= strength;\r\n if (strength > this._strength) {\r\n this._strength = strength;\r\n }\r\n\r\n this._reseedCount++;\r\n this._reseed(reseedData);\r\n },\r\n\r\n _keyboardCollector: function () {\r\n this._addCurrentTimeToEntropy(1);\r\n },\r\n\r\n _mouseCollector: function (ev) {\r\n var x, y;\r\n\r\n try {\r\n x = ev.x || ev.clientX || ev.offsetX || 0;\r\n y = ev.y || ev.clientY || ev.offsetY || 0;\r\n } catch (err) {\r\n // Event originated from a secure element. No mouse position available.\r\n x = 0;\r\n y = 0;\r\n }\r\n\r\n if (x != 0 && y != 0) {\r\n this.addEntropy([x, y], 2, \"mouse\");\r\n }\r\n\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _touchCollector: function (ev) {\r\n var touch = ev.touches[0] || ev.changedTouches[0];\r\n var x = touch.pageX || touch.clientX,\r\n y = touch.pageY || touch.clientY;\r\n\r\n this.addEntropy([x, y], 1, \"touch\");\r\n\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _loadTimeCollector: function () {\r\n this._addCurrentTimeToEntropy(2);\r\n },\r\n\r\n _addCurrentTimeToEntropy: function (estimatedEntropy) {\r\n if (\r\n typeof window !== \"undefined\" &&\r\n window.performance &&\r\n typeof window.performance.now === \"function\"\r\n ) {\r\n //how much entropy do we want to add here?\r\n this.addEntropy(window.performance.now(), estimatedEntropy, \"loadtime\");\r\n } else {\r\n this.addEntropy(new Date().valueOf(), estimatedEntropy, \"loadtime\");\r\n }\r\n },\r\n _accelerometerCollector: function (ev) {\r\n var ac =\r\n ev.accelerationIncludingGravity.x ||\r\n ev.accelerationIncludingGravity.y ||\r\n ev.accelerationIncludingGravity.z;\r\n if (window.orientation) {\r\n var or = window.orientation;\r\n if (typeof or === \"number\") {\r\n this.addEntropy(or, 1, \"accelerometer\");\r\n }\r\n }\r\n if (ac) {\r\n this.addEntropy(ac, 2, \"accelerometer\");\r\n }\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _fireEvent: function (name, arg) {\r\n var j,\r\n cbs = sjcl.random._callbacks[name],\r\n cbsTemp = [];\r\n /* TODO: there is a race condition between removing collectors and firing them */\r\n\r\n /* I'm not sure if this is necessary; in C++, iterating over a\r\n * collection and modifying it at the same time is a no-no.\r\n */\r\n\r\n for (j in cbs) {\r\n if (cbs.hasOwnProperty(j)) {\r\n cbsTemp.push(cbs[j]);\r\n }\r\n }\r\n\r\n for (j = 0; j < cbsTemp.length; j++) {\r\n cbsTemp[j](arg);\r\n }\r\n }\r\n};\r\n\r\n/** @fileOverview Javascript RIPEMD-160 implementation.\r\n *\r\n * @author Artem S Vybornov \r\n */\r\n(function () {\r\n /**\r\n * Context for a RIPEMD-160 operation in progress.\r\n * @constructor\r\n */\r\n sjcl.hash.ripemd160 = function (hash) {\r\n if (hash) {\r\n this._h = hash._h.slice(0);\r\n this._buffer = hash._buffer.slice(0);\r\n this._length = hash._length;\r\n } else {\r\n this.reset();\r\n }\r\n };\r\n\r\n /**\r\n * Hash a string or an array of words.\r\n * @static\r\n * @param {bitArray|String} data the data to hash.\r\n * @return {bitArray} The hash value, an array of 5 big-endian words.\r\n */\r\n sjcl.hash.ripemd160.hash = function (data) {\r\n return new sjcl.hash.ripemd160().update(data).finalize();\r\n };\r\n\r\n sjcl.hash.ripemd160.prototype = {\r\n /**\r\n * Reset the hash state.\r\n * @return this\r\n */\r\n reset: function () {\r\n this._h = _h0.slice(0);\r\n this._buffer = [];\r\n this._length = 0;\r\n return this;\r\n },\r\n\r\n /**\r\n * Reset the hash state.\r\n * @param {bitArray|String} data the data to hash.\r\n * @return this\r\n */\r\n update: function (data) {\r\n if (typeof data === \"string\") data = sjcl.codec.utf8String.toBits(data);\r\n\r\n var i,\r\n b = (this._buffer = sjcl.bitArray.concat(this._buffer, data)),\r\n ol = this._length,\r\n nl = (this._length = ol + sjcl.bitArray.bitLength(data));\r\n if (nl > 9007199254740991) {\r\n throw new sjcl.exception.invalid(\"Cannot hash more than 2^53 - 1 bits\");\r\n }\r\n for (i = 512 + ol - ((512 + ol) & 511); i <= nl; i += 512) {\r\n var words = b.splice(0, 16);\r\n for (var w = 0; w < 16; ++w) words[w] = _cvt(words[w]);\r\n\r\n _block.call(this, words);\r\n }\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * Complete hashing and output the hash value.\r\n * @return {bitArray} The hash value, an array of 5 big-endian words.\r\n */\r\n finalize: function () {\r\n var b = sjcl.bitArray.concat(this._buffer, [sjcl.bitArray.partial(1, 1)]),\r\n l = (this._length + 1) % 512,\r\n z = (l > 448 ? 512 : 448) - (l % 448),\r\n zp = z % 32;\r\n\r\n if (zp > 0) b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(zp, 0)]);\r\n for (; z >= 32; z -= 32) b.push(0);\r\n\r\n b.push(_cvt(this._length | 0));\r\n b.push(_cvt(Math.floor(this._length / 0x100000000)));\r\n\r\n while (b.length) {\r\n var words = b.splice(0, 16);\r\n for (var w = 0; w < 16; ++w) words[w] = _cvt(words[w]);\r\n\r\n _block.call(this, words);\r\n }\r\n\r\n var h = this._h;\r\n this.reset();\r\n\r\n for (var w = 0; w < 5; ++w) h[w] = _cvt(h[w]);\r\n\r\n return h;\r\n }\r\n };\r\n\r\n var _h0 = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\r\n\r\n var _k1 = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e];\r\n var _k2 = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000];\r\n for (var i = 4; i >= 0; --i) {\r\n for (var j = 1; j < 16; ++j) {\r\n _k1.splice(i, 0, _k1[i]);\r\n _k2.splice(i, 0, _k2[i]);\r\n }\r\n }\r\n\r\n var _r1 = [\r\n 0,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6,\r\n 7,\r\n 8,\r\n 9,\r\n 10,\r\n 11,\r\n 12,\r\n 13,\r\n 14,\r\n 15,\r\n 7,\r\n 4,\r\n 13,\r\n 1,\r\n 10,\r\n 6,\r\n 15,\r\n 3,\r\n 12,\r\n 0,\r\n 9,\r\n 5,\r\n 2,\r\n 14,\r\n 11,\r\n 8,\r\n 3,\r\n 10,\r\n 14,\r\n 4,\r\n 9,\r\n 15,\r\n 8,\r\n 1,\r\n 2,\r\n 7,\r\n 0,\r\n 6,\r\n 13,\r\n 11,\r\n 5,\r\n 12,\r\n 1,\r\n 9,\r\n 11,\r\n 10,\r\n 0,\r\n 8,\r\n 12,\r\n 4,\r\n 13,\r\n 3,\r\n 7,\r\n 15,\r\n 14,\r\n 5,\r\n 6,\r\n 2,\r\n 4,\r\n 0,\r\n 5,\r\n 9,\r\n 7,\r\n 12,\r\n 2,\r\n 10,\r\n 14,\r\n 1,\r\n 3,\r\n 8,\r\n 11,\r\n 6,\r\n 15,\r\n 13\r\n ];\r\n var _r2 = [\r\n 5,\r\n 14,\r\n 7,\r\n 0,\r\n 9,\r\n 2,\r\n 11,\r\n 4,\r\n 13,\r\n 6,\r\n 15,\r\n 8,\r\n 1,\r\n 10,\r\n 3,\r\n 12,\r\n 6,\r\n 11,\r\n 3,\r\n 7,\r\n 0,\r\n 13,\r\n 5,\r\n 10,\r\n 14,\r\n 15,\r\n 8,\r\n 12,\r\n 4,\r\n 9,\r\n 1,\r\n 2,\r\n 15,\r\n 5,\r\n 1,\r\n 3,\r\n 7,\r\n 14,\r\n 6,\r\n 9,\r\n 11,\r\n 8,\r\n 12,\r\n 2,\r\n 10,\r\n 0,\r\n 4,\r\n 13,\r\n 8,\r\n 6,\r\n 4,\r\n 1,\r\n 3,\r\n 11,\r\n 15,\r\n 0,\r\n 5,\r\n 12,\r\n 2,\r\n 13,\r\n 9,\r\n 7,\r\n 10,\r\n 14,\r\n 12,\r\n 15,\r\n 10,\r\n 4,\r\n 1,\r\n 5,\r\n 8,\r\n 7,\r\n 6,\r\n 2,\r\n 13,\r\n 14,\r\n 0,\r\n 3,\r\n 9,\r\n 11\r\n ];\r\n\r\n var _s1 = [\r\n 11,\r\n 14,\r\n 15,\r\n 12,\r\n 5,\r\n 8,\r\n 7,\r\n 9,\r\n 11,\r\n 13,\r\n 14,\r\n 15,\r\n 6,\r\n 7,\r\n 9,\r\n 8,\r\n 7,\r\n 6,\r\n 8,\r\n 13,\r\n 11,\r\n 9,\r\n 7,\r\n 15,\r\n 7,\r\n 12,\r\n 15,\r\n 9,\r\n 11,\r\n 7,\r\n 13,\r\n 12,\r\n 11,\r\n 13,\r\n 6,\r\n 7,\r\n 14,\r\n 9,\r\n 13,\r\n 15,\r\n 14,\r\n 8,\r\n 13,\r\n 6,\r\n 5,\r\n 12,\r\n 7,\r\n 5,\r\n 11,\r\n 12,\r\n 14,\r\n 15,\r\n 14,\r\n 15,\r\n 9,\r\n 8,\r\n 9,\r\n 14,\r\n 5,\r\n 6,\r\n 8,\r\n 6,\r\n 5,\r\n 12,\r\n 9,\r\n 15,\r\n 5,\r\n 11,\r\n 6,\r\n 8,\r\n 13,\r\n 12,\r\n 5,\r\n 12,\r\n 13,\r\n 14,\r\n 11,\r\n 8,\r\n 5,\r\n 6\r\n ];\r\n var _s2 = [\r\n 8,\r\n 9,\r\n 9,\r\n 11,\r\n 13,\r\n 15,\r\n 15,\r\n 5,\r\n 7,\r\n 7,\r\n 8,\r\n 11,\r\n 14,\r\n 14,\r\n 12,\r\n 6,\r\n 9,\r\n 13,\r\n 15,\r\n 7,\r\n 12,\r\n 8,\r\n 9,\r\n 11,\r\n 7,\r\n 7,\r\n 12,\r\n 7,\r\n 6,\r\n 15,\r\n 13,\r\n 11,\r\n 9,\r\n 7,\r\n 15,\r\n 11,\r\n 8,\r\n 6,\r\n 6,\r\n 14,\r\n 12,\r\n 13,\r\n 5,\r\n 14,\r\n 13,\r\n 13,\r\n 7,\r\n 5,\r\n 15,\r\n 5,\r\n 8,\r\n 11,\r\n 14,\r\n 14,\r\n 6,\r\n 14,\r\n 6,\r\n 9,\r\n 12,\r\n 9,\r\n 12,\r\n 5,\r\n 15,\r\n 8,\r\n 8,\r\n 5,\r\n 12,\r\n 9,\r\n 12,\r\n 5,\r\n 14,\r\n 6,\r\n 8,\r\n 13,\r\n 6,\r\n 5,\r\n 15,\r\n 13,\r\n 11,\r\n 11\r\n ];\r\n\r\n function _f0(x, y, z) {\r\n return x ^ y ^ z;\r\n }\r\n\r\n function _f1(x, y, z) {\r\n return (x & y) | (~x & z);\r\n }\r\n\r\n function _f2(x, y, z) {\r\n return (x | ~y) ^ z;\r\n }\r\n\r\n function _f3(x, y, z) {\r\n return (x & z) | (y & ~z);\r\n }\r\n\r\n function _f4(x, y, z) {\r\n return x ^ (y | ~z);\r\n }\r\n\r\n function _rol(n, l) {\r\n return (n << l) | (n >>> (32 - l));\r\n }\r\n\r\n function _cvt(n) {\r\n return (\r\n ((n & (0xff << 0)) << 24) |\r\n ((n & (0xff << 8)) << 8) |\r\n ((n & (0xff << 16)) >>> 8) |\r\n ((n & (0xff << 24)) >>> 24)\r\n );\r\n }\r\n\r\n function _block(X) {\r\n var A1 = this._h[0],\r\n B1 = this._h[1],\r\n C1 = this._h[2],\r\n D1 = this._h[3],\r\n E1 = this._h[4],\r\n A2 = this._h[0],\r\n B2 = this._h[1],\r\n C2 = this._h[2],\r\n D2 = this._h[3],\r\n E2 = this._h[4];\r\n\r\n var j = 0,\r\n T;\r\n\r\n for (; j < 16; ++j) {\r\n T = _rol(A1 + _f0(B1, C1, D1) + X[_r1[j]] + _k1[j], _s1[j]) + E1;\r\n A1 = E1;\r\n E1 = D1;\r\n D1 = _rol(C1, 10);\r\n C1 = B1;\r\n B1 = T;\r\n T = _rol(A2 + _f4(B2, C2, D2) + X[_r2[j]] + _k2[j], _s2[j]) + E2;\r\n A2 = E2;\r\n E2 = D2;\r\n D2 = _rol(C2, 10);\r\n C2 = B2;\r\n B2 = T;\r\n }\r\n for (; j < 32; ++j) {\r\n T = _rol(A1 + _f1(B1, C1, D1) + X[_r1[j]] + _k1[j], _s1[j]) + E1;\r\n A1 = E1;\r\n E1 = D1;\r\n D1 = _rol(C1, 10);\r\n C1 = B1;\r\n B1 = T;\r\n T = _rol(A2 + _f3(B2, C2, D2) + X[_r2[j]] + _k2[j], _s2[j]) + E2;\r\n A2 = E2;\r\n E2 = D2;\r\n D2 = _rol(C2, 10);\r\n C2 = B2;\r\n B2 = T;\r\n }\r\n for (; j < 48; ++j) {\r\n T = _rol(A1 + _f2(B1, C1, D1) + X[_r1[j]] + _k1[j], _s1[j]) + E1;\r\n A1 = E1;\r\n E1 = D1;\r\n D1 = _rol(C1, 10);\r\n C1 = B1;\r\n B1 = T;\r\n T = _rol(A2 + _f2(B2, C2, D2) + X[_r2[j]] + _k2[j], _s2[j]) + E2;\r\n A2 = E2;\r\n E2 = D2;\r\n D2 = _rol(C2, 10);\r\n C2 = B2;\r\n B2 = T;\r\n }\r\n for (; j < 64; ++j) {\r\n T = _rol(A1 + _f3(B1, C1, D1) + X[_r1[j]] + _k1[j], _s1[j]) + E1;\r\n A1 = E1;\r\n E1 = D1;\r\n D1 = _rol(C1, 10);\r\n C1 = B1;\r\n B1 = T;\r\n T = _rol(A2 + _f1(B2, C2, D2) + X[_r2[j]] + _k2[j], _s2[j]) + E2;\r\n A2 = E2;\r\n E2 = D2;\r\n D2 = _rol(C2, 10);\r\n C2 = B2;\r\n B2 = T;\r\n }\r\n for (; j < 80; ++j) {\r\n T = _rol(A1 + _f4(B1, C1, D1) + X[_r1[j]] + _k1[j], _s1[j]) + E1;\r\n A1 = E1;\r\n E1 = D1;\r\n D1 = _rol(C1, 10);\r\n C1 = B1;\r\n B1 = T;\r\n T = _rol(A2 + _f0(B2, C2, D2) + X[_r2[j]] + _k2[j], _s2[j]) + E2;\r\n A2 = E2;\r\n E2 = D2;\r\n D2 = _rol(C2, 10);\r\n C2 = B2;\r\n B2 = T;\r\n }\r\n\r\n T = this._h[1] + C1 + D2;\r\n this._h[1] = this._h[2] + D1 + E2;\r\n this._h[2] = this._h[3] + E1 + A2;\r\n this._h[3] = this._h[4] + A1 + B2;\r\n this._h[4] = this._h[0] + B1 + C2;\r\n this._h[0] = T;\r\n }\r\n})();\r\n/** @fileOverview Javascript SHA-256 implementation.\r\n *\r\n * An older version of this implementation is available in the public\r\n * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,\r\n * Stanford University 2008-2010 and BSD-licensed for liability\r\n * reasons.\r\n *\r\n * Special thanks to Aldo Cortesi for pointing out several bugs in\r\n * this code.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n */\r\n\r\n/**\r\n * Context for a SHA-256 operation in progress.\r\n * @constructor\r\n */\r\nsjcl.hash.sha256 = function (hash) {\r\n if (!this._key[0]) {\r\n this._precompute();\r\n }\r\n if (hash) {\r\n this._h = hash._h.slice(0);\r\n this._buffer = hash._buffer.slice(0);\r\n this._length = hash._length;\r\n } else {\r\n this.reset();\r\n }\r\n};\r\n\r\n/**\r\n * Hash a string or an array of words.\r\n * @static\r\n * @param {bitArray|String} data the data to hash.\r\n * @return {bitArray} The hash value, an array of 16 big-endian words.\r\n */\r\nsjcl.hash.sha256.hash = function (data) {\r\n return new sjcl.hash.sha256().update(data).finalize();\r\n};\r\n\r\nsjcl.hash.sha256.prototype = {\r\n /**\r\n * The hash's block size, in bits.\r\n * @constant\r\n */\r\n blockSize: 512,\r\n\r\n /**\r\n * Reset the hash state.\r\n * @return this\r\n */\r\n reset: function () {\r\n this._h = this._init.slice(0);\r\n this._buffer = [];\r\n this._length = 0;\r\n return this;\r\n },\r\n\r\n export: function () {\r\n return JSON.stringify([this._h, this._buffer, this._length]);\r\n },\r\n\r\n import: function (data) {\r\n var _data = JSON.parse(data);\r\n this._h = _data[0];\r\n this._buffer = _data[1];\r\n this._length = _data[2];\r\n },\r\n\r\n /**\r\n * Input several words to the hash.\r\n * @param {bitArray|String} data the data to hash.\r\n * @return this\r\n */\r\n update: function (data) {\r\n if (typeof data === \"string\") {\r\n data = sjcl.codec.utf8String.toBits(data);\r\n }\r\n var i,\r\n b = (this._buffer = sjcl.bitArray.concat(this._buffer, data)),\r\n ol = this._length,\r\n nl = (this._length = ol + sjcl.bitArray.bitLength(data));\r\n if (nl > 9007199254740991) {\r\n throw new sjcl.exception.invalid(\"Cannot hash more than 2^53 - 1 bits\");\r\n }\r\n\r\n // (Yoni:) Every 512 characters this._h and this._length gets updated...\r\n if (typeof Uint32Array !== \"undefined\") {\r\n var c = new Uint32Array(b);\r\n var j = 0;\r\n for (i = 512 + ol - ((512 + ol) & 511); i <= nl; i += 512) {\r\n this._block(c.subarray(16 * j, 16 * (j + 1)));\r\n j += 1;\r\n }\r\n b.splice(0, 16 * j);\r\n } else {\r\n for (i = 512 + ol - ((512 + ol) & 511); i <= nl; i += 512) {\r\n this._block(b.splice(0, 16));\r\n }\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * Complete hashing and output the hash value.\r\n * @return {bitArray} The hash value, an array of 8 big-endian words.\r\n */\r\n finalize: function () {\r\n var i,\r\n b = this._buffer,\r\n h = this._h;\r\n\r\n // Round out and push the buffer\r\n b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1, 1)]);\r\n\r\n // Round out the buffer to a multiple of 16 words, less the 2 length words.\r\n for (i = b.length + 2; i & 15; i++) {\r\n b.push(0);\r\n }\r\n\r\n // append the length\r\n b.push(Math.floor(this._length / 0x100000000));\r\n b.push(this._length | 0);\r\n\r\n while (b.length) {\r\n this._block(b.splice(0, 16));\r\n }\r\n\r\n this.reset();\r\n return h;\r\n },\r\n\r\n /**\r\n * The SHA-256 initialization vector, to be precomputed.\r\n * @private\r\n */\r\n _init: [],\r\n /*\r\n _init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],\r\n */\r\n\r\n /**\r\n * The SHA-256 hash key, to be precomputed.\r\n * @private\r\n */\r\n _key: [],\r\n /*\r\n _key:\r\n [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2],\r\n */\r\n\r\n /**\r\n * Function to precompute _init and _key.\r\n * @private\r\n */\r\n _precompute: function () {\r\n var i = 0,\r\n prime = 2,\r\n factor,\r\n isPrime;\r\n\r\n function frac(x) {\r\n return ((x - Math.floor(x)) * 0x100000000) | 0;\r\n }\r\n\r\n for (; i < 64; prime++) {\r\n isPrime = true;\r\n for (factor = 2; factor * factor <= prime; factor++) {\r\n if (prime % factor === 0) {\r\n isPrime = false;\r\n break;\r\n }\r\n }\r\n if (isPrime) {\r\n if (i < 8) {\r\n this._init[i] = frac(Math.pow(prime, 1 / 2));\r\n }\r\n this._key[i] = frac(Math.pow(prime, 1 / 3));\r\n i++;\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Perform one cycle of SHA-256.\r\n * @param {Uint32Array|bitArray} w one block of words.\r\n * @private\r\n */\r\n _block: function (w) {\r\n var i,\r\n tmp,\r\n a,\r\n b,\r\n h = this._h,\r\n k = this._key,\r\n h0 = h[0],\r\n h1 = h[1],\r\n h2 = h[2],\r\n h3 = h[3],\r\n h4 = h[4],\r\n h5 = h[5],\r\n h6 = h[6],\r\n h7 = h[7];\r\n\r\n /* Rationale for placement of |0 :\r\n * If a value can overflow is original 32 bits by a factor of more than a few\r\n * million (2^23 ish), there is a possibility that it might overflow the\r\n * 53-bit mantissa and lose precision.\r\n *\r\n * To avoid this, we clamp back to 32 bits by |'ing with 0 on any value that\r\n * propagates around the loop, and on the hash state h[]. I don't believe\r\n * that the clamps on h4 and on h0 are strictly necessary, but it's close\r\n * (for h4 anyway), and better safe than sorry.\r\n *\r\n * The clamps on h[] are necessary for the output to be correct even in the\r\n * common case and for short inputs.\r\n */\r\n for (i = 0; i < 64; i++) {\r\n // load up the input word for this round\r\n if (i < 16) {\r\n tmp = w[i];\r\n } else {\r\n a = w[(i + 1) & 15];\r\n b = w[(i + 14) & 15];\r\n tmp = w[i & 15] =\r\n (((a >>> 7) ^ (a >>> 18) ^ (a >>> 3) ^ (a << 25) ^ (a << 14)) +\r\n ((b >>> 17) ^ (b >>> 19) ^ (b >>> 10) ^ (b << 15) ^ (b << 13)) +\r\n w[i & 15] +\r\n w[(i + 9) & 15]) |\r\n 0;\r\n }\r\n\r\n tmp =\r\n tmp +\r\n h7 +\r\n ((h4 >>> 6) ^\r\n (h4 >>> 11) ^\r\n (h4 >>> 25) ^\r\n (h4 << 26) ^\r\n (h4 << 21) ^\r\n (h4 << 7)) +\r\n (h6 ^ (h4 & (h5 ^ h6))) +\r\n k[i]; // | 0;\r\n\r\n // shift register\r\n h7 = h6;\r\n h6 = h5;\r\n h5 = h4;\r\n h4 = (h3 + tmp) | 0;\r\n h3 = h2;\r\n h2 = h1;\r\n h1 = h0;\r\n\r\n h0 =\r\n (tmp +\r\n ((h1 & h2) ^ (h3 & (h1 ^ h2))) +\r\n ((h1 >>> 2) ^\r\n (h1 >>> 13) ^\r\n (h1 >>> 22) ^\r\n (h1 << 30) ^\r\n (h1 << 19) ^\r\n (h1 << 10))) |\r\n 0;\r\n }\r\n\r\n h[0] = (h[0] + h0) | 0;\r\n h[1] = (h[1] + h1) | 0;\r\n h[2] = (h[2] + h2) | 0;\r\n h[3] = (h[3] + h3) | 0;\r\n h[4] = (h[4] + h4) | 0;\r\n h[5] = (h[5] + h5) | 0;\r\n h[6] = (h[6] + h6) | 0;\r\n h[7] = (h[7] + h7) | 0;\r\n\r\n //console.log(\"_block_h\", JSON.stringify([h, this._h]));\r\n }\r\n};\r\n\r\n/** @fileOverview Javascript SHA-1 implementation.\r\n *\r\n * Based on the implementation in RFC 3174, method 1, and on the SJCL\r\n * SHA-256 implementation.\r\n *\r\n * @author Quinn Slack\r\n */\r\n\r\n/**\r\n * Context for a SHA-1 operation in progress.\r\n * @constructor\r\n */\r\nsjcl.hash.sha1 = function (hash) {\r\n if (hash) {\r\n this._h = hash._h.slice(0);\r\n this._buffer = hash._buffer.slice(0);\r\n this._length = hash._length;\r\n } else {\r\n this.reset();\r\n }\r\n};\r\n\r\n/**\r\n * Hash a string or an array of words.\r\n * @static\r\n * @param {bitArray|String} data the data to hash.\r\n * @return {bitArray} The hash value, an array of 5 big-endian words.\r\n */\r\nsjcl.hash.sha1.hash = function (data) {\r\n return new sjcl.hash.sha1().update(data).finalize();\r\n};\r\n\r\nsjcl.hash.sha1.prototype = {\r\n /**\r\n * The hash's block size, in bits.\r\n * @constant\r\n */\r\n blockSize: 512,\r\n\r\n /**\r\n * Reset the hash state.\r\n * @return this\r\n */\r\n reset: function () {\r\n this._h = this._init.slice(0);\r\n this._buffer = [];\r\n this._length = 0;\r\n return this;\r\n },\r\n\r\n export: function () {\r\n return JSON.stringify([this._h, this._buffer, this._length]);\r\n },\r\n\r\n import: function (data) {\r\n var _data = JSON.parse(data);\r\n this._h = _data[0];\r\n this._buffer = _data[1];\r\n this._length = _data[2];\r\n },\r\n\r\n /**\r\n * Input several words to the hash.\r\n * @param {bitArray|String} data the data to hash.\r\n * @return this\r\n */\r\n update: function (data) {\r\n if (typeof data === \"string\") {\r\n data = sjcl.codec.utf8String.toBits(data);\r\n }\r\n var i,\r\n b = (this._buffer = sjcl.bitArray.concat(this._buffer, data)),\r\n ol = this._length,\r\n nl = (this._length = ol + sjcl.bitArray.bitLength(data));\r\n if (nl > 9007199254740991) {\r\n throw new sjcl.exception.invalid(\"Cannot hash more than 2^53 - 1 bits\");\r\n }\r\n\r\n if (typeof Uint32Array !== \"undefined\") {\r\n var c = new Uint32Array(b);\r\n var j = 0;\r\n for (\r\n i =\r\n this.blockSize + ol - ((this.blockSize + ol) & (this.blockSize - 1));\r\n i <= nl;\r\n i += this.blockSize\r\n ) {\r\n this._block(c.subarray(16 * j, 16 * (j + 1)));\r\n j += 1;\r\n }\r\n b.splice(0, 16 * j);\r\n } else {\r\n for (\r\n i =\r\n this.blockSize + ol - ((this.blockSize + ol) & (this.blockSize - 1));\r\n i <= nl;\r\n i += this.blockSize\r\n ) {\r\n this._block(b.splice(0, 16));\r\n }\r\n }\r\n return this;\r\n },\r\n\r\n /**\r\n * Complete hashing and output the hash value.\r\n * @return {bitArray} The hash value, an array of 5 big-endian words. TODO\r\n */\r\n finalize: function () {\r\n var i,\r\n b = this._buffer,\r\n h = this._h;\r\n\r\n // Round out and push the buffer\r\n b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1, 1)]);\r\n // Round out the buffer to a multiple of 16 words, less the 2 length words.\r\n for (i = b.length + 2; i & 15; i++) {\r\n b.push(0);\r\n }\r\n\r\n // append the length\r\n b.push(Math.floor(this._length / 0x100000000));\r\n b.push(this._length | 0);\r\n\r\n while (b.length) {\r\n this._block(b.splice(0, 16));\r\n }\r\n\r\n this.reset();\r\n return h;\r\n },\r\n\r\n /**\r\n * The SHA-1 initialization vector.\r\n * @private\r\n */\r\n _init: [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0],\r\n\r\n /**\r\n * The SHA-1 hash key.\r\n * @private\r\n */\r\n _key: [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6],\r\n\r\n /**\r\n * The SHA-1 logical functions f(0), f(1), ..., f(79).\r\n * @private\r\n */\r\n _f: function (t, b, c, d) {\r\n if (t <= 19) {\r\n return (b & c) | (~b & d);\r\n } else if (t <= 39) {\r\n return b ^ c ^ d;\r\n } else if (t <= 59) {\r\n return (b & c) | (b & d) | (c & d);\r\n } else if (t <= 79) {\r\n return b ^ c ^ d;\r\n }\r\n },\r\n\r\n /**\r\n * Circular left-shift operator.\r\n * @private\r\n */\r\n _S: function (n, x) {\r\n return (x << n) | (x >>> (32 - n));\r\n },\r\n\r\n /**\r\n * Perform one cycle of SHA-1.\r\n * @param {Uint32Array|bitArray} words one block of words.\r\n * @private\r\n */\r\n _block: function (words) {\r\n var t,\r\n tmp,\r\n a,\r\n b,\r\n c,\r\n d,\r\n e,\r\n h = this._h;\r\n var w;\r\n if (typeof Uint32Array !== \"undefined\") {\r\n // When words is passed to _block, it has 16 elements. SHA1 _block\r\n // function extends words with new elements (at the end there are 80 elements).\r\n // The problem is that if we use Uint32Array instead of Array,\r\n // the length of Uint32Array cannot be changed. Thus, we replace words with a\r\n // normal Array here.\r\n w = Array(80); // do not use Uint32Array here as the instantiation is slower\r\n for (var j = 0; j < 16; j++) {\r\n w[j] = words[j];\r\n }\r\n } else {\r\n w = words;\r\n }\r\n\r\n a = h[0];\r\n b = h[1];\r\n c = h[2];\r\n d = h[3];\r\n e = h[4];\r\n\r\n for (t = 0; t <= 79; t++) {\r\n if (t >= 16) {\r\n w[t] = this._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);\r\n }\r\n tmp =\r\n (this._S(5, a) +\r\n this._f(t, b, c, d) +\r\n e +\r\n w[t] +\r\n this._key[Math.floor(t / 20)]) |\r\n 0;\r\n e = d;\r\n d = c;\r\n c = this._S(30, b);\r\n b = a;\r\n a = tmp;\r\n }\r\n\r\n h[0] = (h[0] + a) | 0;\r\n h[1] = (h[1] + b) | 0;\r\n h[2] = (h[2] + c) | 0;\r\n h[3] = (h[3] + d) | 0;\r\n h[4] = (h[4] + e) | 0;\r\n }\r\n};\r\n\r\n/** @fileOverview Javascript SRP implementation.\r\n *\r\n * This file contains a partial implementation of the SRP (Secure Remote\r\n * Password) password-authenticated key exchange protocol. Given a user\r\n * identity, salt, and SRP group, it generates the SRP verifier that may\r\n * be sent to a remote server to establish and SRP account.\r\n *\r\n * For more information, see http://srp.stanford.edu/.\r\n *\r\n * @author Quinn Slack\r\n */\r\n\r\n/**\r\n * Compute the SRP verifier from the username, password, salt, and group.\r\n * @namespace\r\n */\r\nsjcl.keyexchange.srp = {\r\n /**\r\n * Calculates SRP v, the verifier.\r\n * v = g^x mod N [RFC 5054]\r\n * @param {String} I The username.\r\n * @param {String} P The password.\r\n * @param {Object} s A bitArray of the salt.\r\n * @param {Object} group The SRP group. Use sjcl.keyexchange.srp.knownGroup\r\n to obtain this object.\r\n * @return {Object} A bitArray of SRP v.\r\n */\r\n makeVerifier: function (I, P, s, group) {\r\n var x;\r\n x = sjcl.keyexchange.srp.makeX(I, P, s);\r\n x = sjcl.bn.fromBits(x);\r\n return group.g.powermod(x, group.N);\r\n },\r\n\r\n /**\r\n * Calculates SRP x.\r\n * x = SHA1( | SHA( | \":\" | )) [RFC 2945]\r\n * @param {String} I The username.\r\n * @param {String} P The password.\r\n * @param {Object} s A bitArray of the salt.\r\n * @return {Object} A bitArray of SRP x.\r\n */\r\n makeX: function (I, P, s) {\r\n var inner = sjcl.hash.sha1.hash(I + \":\" + P);\r\n return sjcl.hash.sha1.hash(sjcl.bitArray.concat(s, inner));\r\n },\r\n\r\n /**\r\n * Returns the known SRP group with the given size (in bits).\r\n * @param {String} i The size of the known SRP group.\r\n * @return {Object} An object with \"N\" and \"g\" properties.\r\n */\r\n knownGroup: function (i) {\r\n if (typeof i !== \"string\") {\r\n i = i.toString();\r\n }\r\n if (!sjcl.keyexchange.srp._didInitKnownGroups) {\r\n sjcl.keyexchange.srp._initKnownGroups();\r\n }\r\n return sjcl.keyexchange.srp._knownGroups[i];\r\n },\r\n\r\n /**\r\n * Initializes bignum objects for known group parameters.\r\n * @private\r\n */\r\n _didInitKnownGroups: false,\r\n _initKnownGroups: function () {\r\n var i, size, group;\r\n for (i = 0; i < sjcl.keyexchange.srp._knownGroupSizes.length; i++) {\r\n size = sjcl.keyexchange.srp._knownGroupSizes[i].toString();\r\n group = sjcl.keyexchange.srp._knownGroups[size];\r\n group.N = new sjcl.bn(group.N);\r\n group.g = new sjcl.bn(group.g);\r\n }\r\n sjcl.keyexchange.srp._didInitKnownGroups = true;\r\n },\r\n\r\n _knownGroupSizes: [1024, 1536, 2048, 3072, 4096, 6144, 8192],\r\n _knownGroups: {\r\n 1024: {\r\n N:\r\n \"EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C\" +\r\n \"9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE4\" +\r\n \"8E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B29\" +\r\n \"7BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9A\" +\r\n \"FD5138FE8376435B9FC61D2FC0EB06E3\",\r\n g: 2\r\n },\r\n\r\n 1536: {\r\n N:\r\n \"9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA961\" +\r\n \"4B19CC4D5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F843\" +\r\n \"80B655BB9A22E8DCDF028A7CEC67F0D08134B1C8B97989149B609E0B\" +\r\n \"E3BAB63D47548381DBC5B1FC764E3F4B53DD9DA1158BFD3E2B9C8CF5\" +\r\n \"6EDF019539349627DB2FD53D24B7C48665772E437D6C7F8CE442734A\" +\r\n \"F7CCB7AE837C264AE3A9BEB87F8A2FE9B8B5292E5A021FFF5E91479E\" +\r\n \"8CE7A28C2442C6F315180F93499A234DCF76E3FED135F9BB\",\r\n g: 2\r\n },\r\n\r\n 2048: {\r\n N:\r\n \"AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC319294\" +\r\n \"3DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310D\" +\r\n \"CD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FB\" +\r\n \"D5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF74\" +\r\n \"7359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A\" +\r\n \"436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D\" +\r\n \"5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E73\" +\r\n \"03CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB6\" +\r\n \"94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F\" +\r\n \"9E4AFF73\",\r\n g: 2\r\n },\r\n\r\n 3072: {\r\n N:\r\n \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\" +\r\n \"8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\" +\r\n \"302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\" +\r\n \"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\" +\r\n \"49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\" +\r\n \"FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\" +\r\n \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\" +\r\n \"180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\" +\r\n \"3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\" +\r\n \"04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\" +\r\n \"B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\" +\r\n \"1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" +\r\n \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\" +\r\n \"E0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF\",\r\n g: 5\r\n },\r\n\r\n 4096: {\r\n N:\r\n \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\" +\r\n \"8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\" +\r\n \"302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\" +\r\n \"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\" +\r\n \"49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\" +\r\n \"FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\" +\r\n \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\" +\r\n \"180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\" +\r\n \"3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\" +\r\n \"04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\" +\r\n \"B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\" +\r\n \"1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" +\r\n \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\" +\r\n \"E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\" +\r\n \"99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB\" +\r\n \"04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2\" +\r\n \"233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\" +\r\n \"D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\" +\r\n \"FFFFFFFFFFFFFFFF\",\r\n g: 5\r\n },\r\n\r\n 6144: {\r\n N:\r\n \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\" +\r\n \"8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\" +\r\n \"302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\" +\r\n \"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\" +\r\n \"49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\" +\r\n \"FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\" +\r\n \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\" +\r\n \"180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\" +\r\n \"3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\" +\r\n \"04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\" +\r\n \"B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\" +\r\n \"1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" +\r\n \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\" +\r\n \"E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\" +\r\n \"99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB\" +\r\n \"04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2\" +\r\n \"233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\" +\r\n \"D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492\" +\r\n \"36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406\" +\r\n \"AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918\" +\r\n \"DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151\" +\r\n \"2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03\" +\r\n \"F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F\" +\r\n \"BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA\" +\r\n \"CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B\" +\r\n \"B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\" +\r\n \"387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\" +\r\n \"6DCC4024FFFFFFFFFFFFFFFF\",\r\n g: 5\r\n },\r\n\r\n 8192: {\r\n N:\r\n \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\" +\r\n \"8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\" +\r\n \"302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\" +\r\n \"A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\" +\r\n \"49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\" +\r\n \"FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\" +\r\n \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\" +\r\n \"180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\" +\r\n \"3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\" +\r\n \"04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\" +\r\n \"B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\" +\r\n \"1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" +\r\n \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\" +\r\n \"E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\" +\r\n \"99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB\" +\r\n \"04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2\" +\r\n \"233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\" +\r\n \"D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492\" +\r\n \"36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406\" +\r\n \"AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918\" +\r\n \"DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151\" +\r\n \"2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03\" +\r\n \"F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F\" +\r\n \"BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA\" +\r\n \"CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B\" +\r\n \"B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\" +\r\n \"387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\" +\r\n \"6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA\" +\r\n \"3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C\" +\r\n \"5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9\" +\r\n \"22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886\" +\r\n \"2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6\" +\r\n \"6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5\" +\r\n \"0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268\" +\r\n \"359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6\" +\r\n \"FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71\" +\r\n \"60C980DD98EDD3DFFFFFFFFFFFFFFFFF\",\r\n g: 19\r\n }\r\n }\r\n};\r\n\r\n/** @fileOverview Random number generator.\r\n *\r\n * @author Emily Stark\r\n * @author Mike Hamburg\r\n * @author Dan Boneh\r\n * @author Michael Brooks\r\n * @author Steve Thomas\r\n */\r\n\r\n/**\r\n * @class Random number generator\r\n * @description\r\n * Use sjcl.random as a singleton for this class!\r\n *

\r\n * This random number generator is a derivative of Ferguson and Schneier's\r\n * generator Fortuna. It collects entropy from various events into several\r\n * pools, implemented by streaming SHA-256 instances. It differs from\r\n * ordinary Fortuna in a few ways, though.\r\n *

\r\n *\r\n *

\r\n * Most importantly, it has an entropy estimator. This is present because\r\n * there is a strong conflict here between making the generator available\r\n * as soon as possible, and making sure that it doesn't \"run on empty\".\r\n * In Fortuna, there is a saved state file, and the system is likely to have\r\n * time to warm up.\r\n *

\r\n *\r\n *

\r\n * Second, because users are unlikely to stay on the page for very long,\r\n * and to speed startup time, the number of pools increases logarithmically:\r\n * a new pool is created when the previous one is actually used for a reseed.\r\n * This gives the same asymptotic guarantees as Fortuna, but gives more\r\n * entropy to early reseeds.\r\n *

\r\n *\r\n *

\r\n * The entire mechanism here feels pretty klunky. Furthermore, there are\r\n * several improvements that should be made, including support for\r\n * dedicated cryptographic functions that may be present in some browsers;\r\n * state files in local storage; cookies containing randomness; etc. So\r\n * look for improvements in future versions.\r\n *

\r\n * @constructor\r\n */\r\nsjcl.prng = function (defaultParanoia) {\r\n /* private */\r\n this._pools = [new sjcl.hash.sha256()];\r\n this._poolEntropy = [0];\r\n this._reseedCount = 0;\r\n this._robins = {};\r\n this._eventId = 0;\r\n\r\n this._collectorIds = {};\r\n this._collectorIdNext = 0;\r\n\r\n this._strength = 0;\r\n this._poolStrength = 0;\r\n this._nextReseed = 0;\r\n this._key = [0, 0, 0, 0, 0, 0, 0, 0];\r\n this._counter = [0, 0, 0, 0];\r\n this._cipher = undefined;\r\n this._defaultParanoia = defaultParanoia;\r\n\r\n /* event listener stuff */\r\n this._collectorsStarted = false;\r\n this._callbacks = { progress: {}, seeded: {} };\r\n this._callbackI = 0;\r\n\r\n /* constants */\r\n this._NOT_READY = 0;\r\n this._READY = 1;\r\n this._REQUIRES_RESEED = 2;\r\n\r\n this._MAX_WORDS_PER_BURST = 65536;\r\n this._PARANOIA_LEVELS = [0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024];\r\n this._MILLISECONDS_PER_RESEED = 30000;\r\n this._BITS_PER_RESEED = 80;\r\n};\r\n\r\nsjcl.prng.prototype = {\r\n /** Generate several random words, and return them in an array.\r\n * A word consists of 32 bits (4 bytes)\r\n * @param {Number} nwords The number of words to generate.\r\n */\r\n randomWords: function (nwords, paranoia) {\r\n var out = [],\r\n i,\r\n readiness = this.isReady(paranoia),\r\n g;\r\n\r\n if (readiness === this._NOT_READY) {\r\n throw new sjcl.exception.notReady(\"generator isn't seeded\");\r\n } else if (readiness & this._REQUIRES_RESEED) {\r\n this._reseedFromPools(!(readiness & this._READY));\r\n }\r\n\r\n for (i = 0; i < nwords; i += 4) {\r\n if ((i + 1) % this._MAX_WORDS_PER_BURST === 0) {\r\n this._gate();\r\n }\r\n\r\n g = this._gen4words();\r\n out.push(g[0], g[1], g[2], g[3]);\r\n }\r\n this._gate();\r\n\r\n return out.slice(0, nwords);\r\n },\r\n\r\n setDefaultParanoia: function (paranoia, allowZeroParanoia) {\r\n if (\r\n paranoia === 0 &&\r\n allowZeroParanoia !==\r\n \"Setting paranoia=0 will ruin your security; use it only for testing\"\r\n ) {\r\n throw new sjcl.exception.invalid(\r\n \"Setting paranoia=0 will ruin your security; use it only for testing\"\r\n );\r\n }\r\n\r\n this._defaultParanoia = paranoia;\r\n },\r\n\r\n /**\r\n * Add entropy to the pools.\r\n * @param data The entropic value. Should be a 32-bit integer, array of 32-bit integers, or string\r\n * @param {Number} estimatedEntropy The estimated entropy of data, in bits\r\n * @param {String} source The source of the entropy, eg \"mouse\"\r\n */\r\n addEntropy: function (data, estimatedEntropy, source) {\r\n source = source || \"user\";\r\n\r\n var id,\r\n i,\r\n tmp,\r\n t = new Date().valueOf(),\r\n robin = this._robins[source],\r\n oldReady = this.isReady(),\r\n err = 0,\r\n objName;\r\n\r\n id = this._collectorIds[source];\r\n if (id === undefined) {\r\n id = this._collectorIds[source] = this._collectorIdNext++;\r\n }\r\n\r\n if (robin === undefined) {\r\n robin = this._robins[source] = 0;\r\n }\r\n this._robins[source] = (this._robins[source] + 1) % this._pools.length;\r\n\r\n switch (typeof data) {\r\n case \"number\":\r\n if (estimatedEntropy === undefined) {\r\n estimatedEntropy = 1;\r\n }\r\n this._pools[robin].update([\r\n id,\r\n this._eventId++,\r\n 1,\r\n estimatedEntropy,\r\n t,\r\n 1,\r\n data | 0\r\n ]);\r\n break;\r\n\r\n case \"object\":\r\n objName = Object.prototype.toString.call(data);\r\n if (objName === \"[object Uint32Array]\") {\r\n tmp = [];\r\n for (i = 0; i < data.length; i++) {\r\n tmp.push(data[i]);\r\n }\r\n data = tmp;\r\n } else {\r\n if (objName !== \"[object Array]\") {\r\n err = 1;\r\n }\r\n for (i = 0; i < data.length && !err; i++) {\r\n if (typeof data[i] !== \"number\") {\r\n err = 1;\r\n }\r\n }\r\n }\r\n if (!err) {\r\n if (estimatedEntropy === undefined) {\r\n /* horrible entropy estimator */\r\n estimatedEntropy = 0;\r\n for (i = 0; i < data.length; i++) {\r\n tmp = data[i];\r\n while (tmp > 0) {\r\n estimatedEntropy++;\r\n tmp = tmp >>> 1;\r\n }\r\n }\r\n }\r\n this._pools[robin].update(\r\n [id, this._eventId++, 2, estimatedEntropy, t, data.length].concat(\r\n data\r\n )\r\n );\r\n }\r\n break;\r\n\r\n case \"string\":\r\n if (estimatedEntropy === undefined) {\r\n /* English text has just over 1 bit per character of entropy.\r\n * But this might be HTML or something, and have far less\r\n * entropy than English... Oh well, let's just say one bit.\r\n */\r\n estimatedEntropy = data.length;\r\n }\r\n this._pools[robin].update([\r\n id,\r\n this._eventId++,\r\n 3,\r\n estimatedEntropy,\r\n t,\r\n data.length\r\n ]);\r\n this._pools[robin].update(data);\r\n break;\r\n\r\n default:\r\n err = 1;\r\n }\r\n if (err) {\r\n throw new sjcl.exception.bug(\r\n \"random: addEntropy only supports number, array of numbers or string\"\r\n );\r\n }\r\n\r\n /* record the new strength */\r\n this._poolEntropy[robin] += estimatedEntropy;\r\n this._poolStrength += estimatedEntropy;\r\n\r\n /* fire off events */\r\n if (oldReady === this._NOT_READY) {\r\n if (this.isReady() !== this._NOT_READY) {\r\n this._fireEvent(\"seeded\", Math.max(this._strength, this._poolStrength));\r\n }\r\n this._fireEvent(\"progress\", this.getProgress());\r\n }\r\n },\r\n\r\n /** Is the generator ready? */\r\n isReady: function (paranoia) {\r\n var entropyRequired = this._PARANOIA_LEVELS[\r\n paranoia !== undefined ? paranoia : this._defaultParanoia\r\n ];\r\n\r\n if (this._strength && this._strength >= entropyRequired) {\r\n return this._poolEntropy[0] > this._BITS_PER_RESEED &&\r\n new Date().valueOf() > this._nextReseed\r\n ? this._REQUIRES_RESEED | this._READY\r\n : this._READY;\r\n } else {\r\n return this._poolStrength >= entropyRequired\r\n ? this._REQUIRES_RESEED | this._NOT_READY\r\n : this._NOT_READY;\r\n }\r\n },\r\n\r\n /** Get the generator's progress toward readiness, as a fraction */\r\n getProgress: function (paranoia) {\r\n var entropyRequired = this._PARANOIA_LEVELS[\r\n paranoia ? paranoia : this._defaultParanoia\r\n ];\r\n\r\n if (this._strength >= entropyRequired) {\r\n return 1.0;\r\n } else {\r\n return this._poolStrength > entropyRequired\r\n ? 1.0\r\n : this._poolStrength / entropyRequired;\r\n }\r\n },\r\n\r\n /** start the built-in entropy collectors */\r\n startCollectors: function () {\r\n if (this._collectorsStarted) {\r\n return;\r\n }\r\n\r\n this._eventListener = {\r\n loadTimeCollector: this._bind(this._loadTimeCollector),\r\n mouseCollector: this._bind(this._mouseCollector),\r\n keyboardCollector: this._bind(this._keyboardCollector),\r\n accelerometerCollector: this._bind(this._accelerometerCollector),\r\n touchCollector: this._bind(this._touchCollector)\r\n };\r\n\r\n if (window.addEventListener) {\r\n window.addEventListener(\r\n \"load\",\r\n this._eventListener.loadTimeCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"mousemove\",\r\n this._eventListener.mouseCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"keypress\",\r\n this._eventListener.keyboardCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"devicemotion\",\r\n this._eventListener.accelerometerCollector,\r\n false\r\n );\r\n window.addEventListener(\r\n \"touchmove\",\r\n this._eventListener.touchCollector,\r\n false\r\n );\r\n } else if (document.attachEvent) {\r\n document.attachEvent(\"onload\", this._eventListener.loadTimeCollector);\r\n document.attachEvent(\"onmousemove\", this._eventListener.mouseCollector);\r\n document.attachEvent(\"keypress\", this._eventListener.keyboardCollector);\r\n } else {\r\n throw new sjcl.exception.bug(\"can't attach event\");\r\n }\r\n\r\n this._collectorsStarted = true;\r\n },\r\n\r\n /** stop the built-in entropy collectors */\r\n stopCollectors: function () {\r\n if (!this._collectorsStarted) {\r\n return;\r\n }\r\n\r\n if (window.removeEventListener) {\r\n window.removeEventListener(\r\n \"load\",\r\n this._eventListener.loadTimeCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"mousemove\",\r\n this._eventListener.mouseCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"keypress\",\r\n this._eventListener.keyboardCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"devicemotion\",\r\n this._eventListener.accelerometerCollector,\r\n false\r\n );\r\n window.removeEventListener(\r\n \"touchmove\",\r\n this._eventListener.touchCollector,\r\n false\r\n );\r\n } else if (document.detachEvent) {\r\n document.detachEvent(\"onload\", this._eventListener.loadTimeCollector);\r\n document.detachEvent(\"onmousemove\", this._eventListener.mouseCollector);\r\n document.detachEvent(\"keypress\", this._eventListener.keyboardCollector);\r\n }\r\n\r\n this._collectorsStarted = false;\r\n },\r\n\r\n /* use a cookie to store entropy.\r\n useCookie: function (all_cookies) {\r\n throw new sjcl.exception.bug(\"random: useCookie is unimplemented\");\r\n },*/\r\n\r\n /** add an event listener for progress or seeded-ness. */\r\n addEventListener: function (name, callback) {\r\n this._callbacks[name][this._callbackI++] = callback;\r\n },\r\n\r\n /** remove an event listener for progress or seeded-ness */\r\n removeEventListener: function (name, cb) {\r\n var i,\r\n j,\r\n cbs = this._callbacks[name],\r\n jsTemp = [];\r\n\r\n /* I'm not sure if this is necessary; in C++, iterating over a\r\n * collection and modifying it at the same time is a no-no.\r\n */\r\n\r\n for (j in cbs) {\r\n if (cbs.hasOwnProperty(j) && cbs[j] === cb) {\r\n jsTemp.push(j);\r\n }\r\n }\r\n\r\n for (i = 0; i < jsTemp.length; i++) {\r\n j = jsTemp[i];\r\n delete cbs[j];\r\n }\r\n },\r\n\r\n _bind: function (func) {\r\n var that = this;\r\n return function () {\r\n func.apply(that, arguments);\r\n };\r\n },\r\n\r\n /** Generate 4 random words, no reseed, no gate.\r\n * @private\r\n */\r\n _gen4words: function () {\r\n for (var i = 0; i < 4; i++) {\r\n this._counter[i] = (this._counter[i] + 1) | 0;\r\n if (this._counter[i]) {\r\n break;\r\n }\r\n }\r\n return this._cipher.encrypt(this._counter);\r\n },\r\n\r\n /* Rekey the AES instance with itself after a request, or every _MAX_WORDS_PER_BURST words.\r\n * @private\r\n */\r\n _gate: function () {\r\n this._key = this._gen4words().concat(this._gen4words());\r\n this._cipher = new sjcl.cipher.aes(this._key);\r\n },\r\n\r\n /** Reseed the generator with the given words\r\n * @private\r\n */\r\n _reseed: function (seedWords) {\r\n this._key = sjcl.hash.sha256.hash(this._key.concat(seedWords));\r\n this._cipher = new sjcl.cipher.aes(this._key);\r\n for (var i = 0; i < 4; i++) {\r\n this._counter[i] = (this._counter[i] + 1) | 0;\r\n if (this._counter[i]) {\r\n break;\r\n }\r\n }\r\n },\r\n\r\n /** reseed the data from the entropy pools\r\n * @param full If set, use all the entropy pools in the reseed.\r\n */\r\n _reseedFromPools: function (full) {\r\n var reseedData = [],\r\n strength = 0,\r\n i;\r\n\r\n this._nextReseed = reseedData[0] =\r\n new Date().valueOf() + this._MILLISECONDS_PER_RESEED;\r\n\r\n for (i = 0; i < 16; i++) {\r\n /* On some browsers, this is cryptographically random. So we might\r\n * as well toss it in the pot and stir...\r\n */\r\n reseedData.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n for (i = 0; i < this._pools.length; i++) {\r\n reseedData = reseedData.concat(this._pools[i].finalize());\r\n strength += this._poolEntropy[i];\r\n this._poolEntropy[i] = 0;\r\n\r\n if (!full && this._reseedCount & (1 << i)) {\r\n break;\r\n }\r\n }\r\n\r\n /* if we used the last pool, push a new one onto the stack */\r\n if (this._reseedCount >= 1 << this._pools.length) {\r\n this._pools.push(new sjcl.hash.sha256());\r\n this._poolEntropy.push(0);\r\n }\r\n\r\n /* how strong was this reseed? */\r\n this._poolStrength -= strength;\r\n if (strength > this._strength) {\r\n this._strength = strength;\r\n }\r\n\r\n this._reseedCount++;\r\n this._reseed(reseedData);\r\n },\r\n\r\n _keyboardCollector: function () {\r\n this._addCurrentTimeToEntropy(1);\r\n },\r\n\r\n _mouseCollector: function (ev) {\r\n var x, y;\r\n\r\n try {\r\n x = ev.x || ev.clientX || ev.offsetX || 0;\r\n y = ev.y || ev.clientY || ev.offsetY || 0;\r\n } catch (err) {\r\n // Event originated from a secure element. No mouse position available.\r\n x = 0;\r\n y = 0;\r\n }\r\n\r\n if (x != 0 && y != 0) {\r\n this.addEntropy([x, y], 2, \"mouse\");\r\n }\r\n\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _touchCollector: function (ev) {\r\n var touch = ev.touches[0] || ev.changedTouches[0];\r\n var x = touch.pageX || touch.clientX,\r\n y = touch.pageY || touch.clientY;\r\n\r\n this.addEntropy([x, y], 1, \"touch\");\r\n\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _loadTimeCollector: function () {\r\n this._addCurrentTimeToEntropy(2);\r\n },\r\n\r\n _addCurrentTimeToEntropy: function (estimatedEntropy) {\r\n if (\r\n typeof window !== \"undefined\" &&\r\n window.performance &&\r\n typeof window.performance.now === \"function\"\r\n ) {\r\n //how much entropy do we want to add here?\r\n this.addEntropy(window.performance.now(), estimatedEntropy, \"loadtime\");\r\n } else {\r\n this.addEntropy(new Date().valueOf(), estimatedEntropy, \"loadtime\");\r\n }\r\n },\r\n _accelerometerCollector: function (ev) {\r\n var ac =\r\n ev.accelerationIncludingGravity.x ||\r\n ev.accelerationIncludingGravity.y ||\r\n ev.accelerationIncludingGravity.z;\r\n if (window.orientation) {\r\n var or = window.orientation;\r\n if (typeof or === \"number\") {\r\n this.addEntropy(or, 1, \"accelerometer\");\r\n }\r\n }\r\n if (ac) {\r\n this.addEntropy(ac, 2, \"accelerometer\");\r\n }\r\n this._addCurrentTimeToEntropy(0);\r\n },\r\n\r\n _fireEvent: function (name, arg) {\r\n var j,\r\n cbs = sjcl.random._callbacks[name],\r\n cbsTemp = [];\r\n /* TODO: there is a race condition between removing collectors and firing them */\r\n\r\n /* I'm not sure if this is necessary; in C++, iterating over a\r\n * collection and modifying it at the same time is a no-no.\r\n */\r\n\r\n for (j in cbs) {\r\n if (cbs.hasOwnProperty(j)) {\r\n cbsTemp.push(cbs[j]);\r\n }\r\n }\r\n\r\n for (j = 0; j < cbsTemp.length; j++) {\r\n cbsTemp[j](arg);\r\n }\r\n }\r\n};\r\n\r\n/** an instance for the prng.\r\n * @see sjcl.prng\r\n */\r\nsjcl.random = new sjcl.prng(6);\r\n\r\n(function () {\r\n // function for getting nodejs crypto module. catches and ignores errors.\r\n function getCryptoModule() {\r\n try {\r\n return require(\"crypto\");\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n try {\r\n var buf, crypt, ab;\r\n\r\n // get cryptographically strong entropy depending on runtime environment\r\n if (\r\n typeof module !== \"undefined\" &&\r\n module.exports &&\r\n (crypt = getCryptoModule()) &&\r\n crypt.randomBytes\r\n ) {\r\n buf = crypt.randomBytes(1024 / 8);\r\n buf = new Uint32Array(new Uint8Array(buf).buffer);\r\n sjcl.random.addEntropy(buf, 1024, \"crypto.randomBytes\");\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof Uint32Array !== \"undefined\"\r\n ) {\r\n ab = new Uint32Array(32);\r\n if (window.crypto && window.crypto.getRandomValues) {\r\n window.crypto.getRandomValues(ab);\r\n } else if (window.msCrypto && window.msCrypto.getRandomValues) {\r\n window.msCrypto.getRandomValues(ab);\r\n } else {\r\n return;\r\n }\r\n\r\n // get cryptographically strong entropy in Webkit\r\n sjcl.random.addEntropy(ab, 1024, \"crypto.getRandomValues\");\r\n } else {\r\n // no getRandomValues :-(\r\n }\r\n } catch (e) {\r\n if (typeof window !== \"undefined\" && window.console) {\r\n console.log(\"There was an error collecting entropy from the browser:\");\r\n console.log(e);\r\n //we do not want the library to fail due to randomness not being maintained.\r\n }\r\n }\r\n})();\r\n\r\n(function () {\r\n // function for getting nodejs crypto module. catches and ignores errors.\r\n function getCryptoModule() {\r\n try {\r\n return require(\"crypto\");\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n try {\r\n var buf, crypt, ab;\r\n\r\n // get cryptographically strong entropy depending on runtime environment\r\n if (\r\n typeof module !== \"undefined\" &&\r\n module.exports &&\r\n (crypt = getCryptoModule()) &&\r\n crypt.randomBytes\r\n ) {\r\n buf = crypt.randomBytes(1024 / 8);\r\n buf = new Uint32Array(new Uint8Array(buf).buffer);\r\n sjcl.random.addEntropy(buf, 1024, \"crypto.randomBytes\");\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof Uint32Array !== \"undefined\"\r\n ) {\r\n ab = new Uint32Array(32);\r\n if (window.crypto && window.crypto.getRandomValues) {\r\n window.crypto.getRandomValues(ab);\r\n } else if (window.msCrypto && window.msCrypto.getRandomValues) {\r\n window.msCrypto.getRandomValues(ab);\r\n } else {\r\n return;\r\n }\r\n\r\n // get cryptographically strong entropy in Webkit\r\n sjcl.random.addEntropy(ab, 1024, \"crypto.getRandomValues\");\r\n } else {\r\n // no getRandomValues :-(\r\n }\r\n } catch (e) {\r\n if (typeof window !== \"undefined\" && window.console) {\r\n console.log(\"There was an error collecting entropy from the browser:\");\r\n console.log(e);\r\n //we do not want the library to fail due to randomness not being maintained.\r\n }\r\n }\r\n})();\r\n\r\n/** an instance for the prng.\r\n * @see sjcl.prng\r\n */\r\nsjcl.random = new sjcl.prng(6);\r\n\r\nmodule.exports = sjcl;\r\n","export const logo =\r\n \"data:image/png;base64,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\";\r\n","import React, { useEffect } from \"react\";\r\nimport { Layout, Button, Switch } from \"antd\";\r\n\r\ntype Theme = \"light\" | \"dark\";\r\n\r\nconst stylesheets = {\r\n light: \"https://cdnjs.cloudflare.com/ajax/libs/antd/4.9.4/antd.min.css\",\r\n dark: \"https://cdnjs.cloudflare.com/ajax/libs/antd/4.9.4/antd.dark.min.css\"\r\n};\r\n\r\nconst createStylesheetLink = (): HTMLLinkElement => {\r\n const link = document.createElement(\"link\");\r\n link.rel = \"stylesheet\";\r\n link.id = \"antd-stylesheet\";\r\n document.head.appendChild(link);\r\n return link;\r\n};\r\n\r\nconst getStylesheetLink = (): HTMLLinkElement =>\r\n document.head.querySelector(\"#antd-stylesheet\") || createStylesheetLink();\r\n\r\nconst systemTheme = () =>\r\n window.matchMedia && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n ? \"dark\"\r\n : \"light\";\r\n\r\nexport const getTheme = () =>\r\n (localStorage.getItem(\"theme\") as Theme) || systemTheme();\r\n\r\nexport const setTheme = (t: Theme) => {\r\n localStorage.setItem(\"theme\", t);\r\n getStylesheetLink().href = stylesheets[t];\r\n};\r\n\r\nexport const toggleTheme = () =>\r\n setTheme(getTheme() === \"dark\" ? \"light\" : \"dark\");\r\n\r\nexport function ToggleDarkMode() {\r\n const [theme, setStrTheme] = React.useState(getTheme() as Theme);\r\n useEffect(() => {\r\n if (theme === \"dark\") setTheme(\"dark\");\r\n }, []);\r\n return (\r\n {\r\n toggleTheme();\r\n setStrTheme(getTheme());\r\n }}\r\n />\r\n );\r\n}\r\n/* const App: React.FC = () => {\r\n // Set the default theme when the component is mounted\r\n React.useEffect(() => setTheme(getTheme()), []);\r\n\r\n return (\r\n \r\n Header goes here...\r\n \r\n \r\n \r\n \r\n );\r\n}; */\r\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\r\n\r\nexport type TempStartInfo = {\r\n from: number;\r\n tempproof: string;\r\n token: string;\r\n salt: string;\r\n};\r\n\r\nexport type KeyDef = {\r\n id: string;\r\n keySalt: string;\r\n keyProof: string; // User can forget this.\r\n};\r\n\r\nexport type LockedDataDef = {\r\n desc: string;\r\n encData: string;\r\n availablePass: {\r\n encPass: string;\r\n keySalt: string;\r\n }[];\r\n};\r\n\r\nexport type UnlockDef = {\r\n desc: string;\r\n encData: string;\r\n encPass: string;\r\n\r\n keySalt: string;\r\n keyID: string;\r\n\r\n from: number;\r\n to: number;\r\n\r\n unlockProof: string;\r\n};\r\n\r\nexport type MainSliceDef = {\r\n keys: KeyDef[];\r\n lockedData: LockedDataDef[];\r\n unlocks: UnlockDef[];\r\n temps: TempStartInfo[];\r\n};\r\n\r\nexport type delUnlockDef = [string, number, number];\r\n\r\nexport const MainSliceStorageKey = \"redux_main_store_cache\";\r\nexport const MainSliceTypePrefix = \"main\";\r\n\r\nconst initialState: MainSliceDef = {\r\n keys: [],\r\n lockedData: [],\r\n unlocks: [],\r\n temps: [],\r\n ...(localStorage.getItem(MainSliceStorageKey)\r\n ? JSON.parse(localStorage.getItem(MainSliceStorageKey))\r\n : {})\r\n};\r\n\r\nexport const mainSlice = createSlice({\r\n name: MainSliceTypePrefix,\r\n initialState,\r\n reducers: {\r\n addKey: {\r\n reducer(state, action: PayloadAction) {\r\n state.keys.push(action.payload);\r\n },\r\n prepare(data: KeyDef) {\r\n return { payload: data };\r\n }\r\n },\r\n addLockedData: {\r\n reducer(state, action: PayloadAction) {\r\n state.lockedData.push(action.payload);\r\n },\r\n prepare(data: LockedDataDef) {\r\n return { payload: data };\r\n }\r\n },\r\n addUnLockedData: {\r\n reducer(state, action: PayloadAction) {\r\n state.unlocks.push(action.payload);\r\n },\r\n prepare(data: UnlockDef) {\r\n return { payload: data };\r\n }\r\n },\r\n delKey: {\r\n reducer(state, action: PayloadAction) {\r\n state.keys = state.keys.filter((e) => e.id !== action.payload);\r\n },\r\n prepare(id: string) {\r\n return { payload: id };\r\n }\r\n },\r\n forgetKey: {\r\n reducer(state, action: PayloadAction) {\r\n state.keys = state.keys.map((e) =>\r\n e.id !== action.payload\r\n ? e\r\n : { id: e.id, keySalt: e.keySalt, keyProof: \"token forgotten!\" }\r\n );\r\n },\r\n prepare(id: string) {\r\n return { payload: id };\r\n }\r\n },\r\n delLockedData: {\r\n reducer(state, action: PayloadAction) {\r\n state.lockedData = state.lockedData.filter(\r\n (e) => e.desc !== action.payload\r\n );\r\n },\r\n prepare(desc: string) {\r\n return { payload: desc };\r\n }\r\n },\r\n delUnLockedData: {\r\n reducer(state, action: PayloadAction) {\r\n state.unlocks = state.unlocks.filter(\r\n (e) =>\r\n !(\r\n e.keySalt === action.payload[0] &&\r\n e.from === action.payload[1] &&\r\n e.to === action.payload[2]\r\n )\r\n );\r\n },\r\n prepare(\r\n salt: string,\r\n from: number,\r\n to: number\r\n ): { payload: delUnlockDef } {\r\n return { payload: [salt, from, to] };\r\n }\r\n },\r\n clearAll: (state, action) => {\r\n state.keys = [];\r\n state.lockedData = [];\r\n state.unlocks = [];\r\n },\r\n addTempInfo: {\r\n reducer(state, action: PayloadAction) {\r\n state.temps = state.temps.filter(\r\n (e) => e.token !== action.payload.token\r\n );\r\n state.temps.push(action.payload);\r\n },\r\n prepare(data: TempStartInfo) {\r\n return { payload: data };\r\n }\r\n },\r\n delTempInfo: {\r\n reducer(state, action: PayloadAction) {\r\n state.temps = state.temps.filter((e) => e.tempproof !== action.payload);\r\n },\r\n prepare(proof: string) {\r\n return { payload: proof };\r\n }\r\n }\r\n }\r\n});\r\n\r\n/* Creating Async functions like data:\r\nhttps://redux-toolkit.js.org/usage/usage-with-typescript#createasyncthunk\r\nwith\r\n type from `mainSlice.actions.addKey.type`\r\n*/\r\n\r\nexport const {\r\n addKey,\r\n addLockedData,\r\n addUnLockedData,\r\n delKey,\r\n delLockedData,\r\n delUnLockedData,\r\n clearAll,\r\n forgetKey,\r\n addTempInfo,\r\n delTempInfo\r\n} = mainSlice.actions;\r\nexport default mainSlice.reducer;\r\n","import { Action, configureStore, Middleware } from \"@reduxjs/toolkit\";\r\nimport { TypedUseSelectorHook, useDispatch, useSelector } from \"react-redux\";\r\nimport throttle from \"lodash/throttle\";\r\n\r\nimport mainSliceReducer, {\r\n MainSliceStorageKey,\r\n MainSliceTypePrefix\r\n} from \"./main-slice\";\r\n\r\nconst _store = configureStore({\r\n reducer: {\r\n [MainSliceTypePrefix]: mainSliceReducer\r\n },\r\n middleware: (getDefaultMiddleware) => getDefaultMiddleware()\r\n /*.prepend(\r\n localStorageSave(MainSliceTypePrefix, MainSliceStorageKey)\r\n )*/\r\n});\r\n\r\nexport const store = _store;\r\n\r\nstore.subscribe(\r\n throttle(() => {\r\n let dataToSave = JSON.stringify(store.getState()[MainSliceTypePrefix]);\r\n console.log(\r\n \"Saving to storage.. kB:\" +\r\n Math.round((dataToSave.length / 1024) * 100) / 100 +\r\n \" out of 5120\"\r\n );\r\n localStorage.setItem(MainSliceStorageKey, dataToSave);\r\n }, 1000 /* ignore more than 1 event in ms timespan*/)\r\n);\r\n\r\nexport type RootState = ReturnType;\r\n// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}\r\nexport type AppDispatch = typeof _store.dispatch;\r\n\r\nexport const useAppDispatch = () => useDispatch();\r\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\r\n","import * as React from \"react\";\r\n\r\n// ============= Types ==============\r\n\r\nexport type TimeToken = {\r\n // = \"delayed key\"\r\n name: string;\r\n proof: string;\r\n salt: string;\r\n};\r\n\r\nexport type LockedData = {\r\n name: string;\r\n enc_data: string;\r\n enc_pass: string;\r\n};\r\n\r\nexport type UnLockedData = {\r\n name: string; // name of unlocked data\r\n from: number;\r\n to: number;\r\n unlockproof: string;\r\n token: TimeToken;\r\n};\r\n\r\nexport type Group = {\r\n name: string;\r\n salt: string;\r\n tokens: Array;\r\n locked: Array;\r\n unlocked: Array;\r\n};\r\n\r\n// ============= API ==============\r\nconst safeB64Pairs: [string, RegExp][][] = [\r\n // Including premaid regexes\r\n [\r\n [\"+\", /\\+/g],\r\n [\"-\", /-/g]\r\n ],\r\n [\r\n [\"/\", /\\//g],\r\n [\"_\", /_/g]\r\n ],\r\n [\r\n [\"=\", /=/g],\r\n [\".\", /\\./g]\r\n ]\r\n];\r\n\r\nexport function makeSafeB64_32(b64string: string) {\r\n let result = b64string || \"\";\r\n safeB64Pairs.forEach((p) => {\r\n result = result.replace(p[0][1], p[1][0]);\r\n });\r\n return result;\r\n}\r\nexport function undoSafeB64_32(b64string: string) {\r\n let result = b64string || \"\";\r\n safeB64Pairs.forEach((p) => {\r\n result = result.replace(p[1][1], p[0][0]);\r\n });\r\n return result;\r\n}\r\n\r\nconst SERVER_BASE =\r\n localStorage.getItem(\"SERVER_URL\") ||\r\n \"https://timelock-back-ga.my123.app/api\";\r\nconst fastFetch = async (\r\n path: string,\r\n params: { [key: string]: string | string[] }\r\n) => {\r\n let url = SERVER_BASE + path + \"?rnd=\" + Date.now() + \".\" + Math.random();\r\n let reqBody = \"_ignore=0\"; // so we can append others with '&'\r\n Object.keys(params).forEach((k) => {\r\n const v = params[k];\r\n if (!Array.isArray(v)) {\r\n reqBody += `&${k}=${encodeURIComponent(v)}`;\r\n } else {\r\n v.forEach((val) => {\r\n reqBody += `&${k}=${encodeURIComponent(val)}`;\r\n });\r\n }\r\n });\r\n const result = { err: null, data: null };\r\n try {\r\n const response = await fetch(url, {\r\n method: \"POST\",\r\n headers: { \"Content-type\": \"application/x-www-form-urlencoded\" },\r\n body: reqBody\r\n });\r\n const json = await response.json();\r\n result.data = json;\r\n if (result.data.err) {\r\n result.err = result.data.err;\r\n }\r\n } catch (error) {\r\n result.err = error;\r\n }\r\n return result;\r\n};\r\n\r\nexport const fetchNewGroup = async (times: Array) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n salt: string;\r\n tokens: Array;\r\n };\r\n } = await fastFetch(\"/setup\", { time: times });\r\n console.log(\"/setup\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchEncPass = async (salts: string[], pass: string) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n enckey: string[];\r\n };\r\n } = await fastFetch(\"/enc\", { salts, pass });\r\n console.log(\"/enc\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchEncHash = async (hashparts: string[], pass: string) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n encparts: string[];\r\n };\r\n } = await fastFetch(\"/enchash\", { hashparts, pass });\r\n console.log(\"/enchash\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchStartUnlock = async (\r\n encPass: string,\r\n keySalt: string,\r\n keyId: string,\r\n keyProof: string,\r\n offsetMin = 0,\r\n durationMin = 15\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n from: number;\r\n to: number;\r\n proof: string;\r\n };\r\n } = await fastFetch(\"/unlock/begin\", {\r\n enckey: encPass,\r\n salt: keySalt,\r\n token: keyId,\r\n tokenproof: keyProof,\r\n offsetstartmin: offsetMin.toString(),\r\n duration: durationMin.toString()\r\n });\r\n console.log(\"/unlock/begin\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchFinishUnlockSimple = async (\r\n encPass: string,\r\n from: number,\r\n to: number,\r\n salt: string,\r\n proof: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n pass: string;\r\n timeLeftOpen: string;\r\n };\r\n } = await fastFetch(\"/unlock/finish\", {\r\n enckey: encPass,\r\n from: from.toString(),\r\n to: to.toString(),\r\n proof,\r\n salt\r\n });\r\n console.log(\"/unlock/finish (simple)\", {\r\n // redact pass\r\n err: result.err,\r\n data: result?.data?.timeLeftOpen\r\n });\r\n return result;\r\n};\r\n\r\nexport const fetchFinishUnlockSha = async (\r\n encPass: string,\r\n from: number,\r\n to: number,\r\n salt: string,\r\n proof: string,\r\n hashtype: string,\r\n hashstate: string,\r\n hashsecret: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n hashstep: string;\r\n };\r\n } = await fastFetch(\"/unlock/finish\", {\r\n enckey: encPass,\r\n from: from.toString(),\r\n to: to.toString(),\r\n proof,\r\n salt,\r\n mode: \"sha-step\",\r\n hashtype,\r\n hashstate,\r\n hashsecret\r\n });\r\n console.log(\"/unlock/finish (sha-step)\", {\r\n // redact pass\r\n err: result.err,\r\n data: result?.data?.hashstep\r\n });\r\n return result;\r\n};\r\n\r\nexport const fetchFinishUnlockOTP = async (\r\n encPass: string,\r\n from: number,\r\n to: number,\r\n salt: string,\r\n proof: string,\r\n hashtype: string,\r\n hashsecret: string,\r\n hashextra: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n hashstep: string;\r\n };\r\n } = await fastFetch(\"/unlock/finish\", {\r\n enckey: encPass,\r\n from: from.toString(),\r\n to: to.toString(),\r\n proof,\r\n salt,\r\n mode: \"otp-step\",\r\n hashtype,\r\n hashsecret: makeSafeB64_32(hashsecret),\r\n hashextra\r\n });\r\n console.log(\"/unlock/finish (otp-step)\", {\r\n // redact pass\r\n err: result.err,\r\n data: result?.data?.hashstep\r\n });\r\n return result;\r\n};\r\n\r\nexport const fetchCreateTemp = async (\r\n token: string,\r\n tokenproof: string,\r\n salt: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n from: number;\r\n tempproof: string;\r\n };\r\n } = await fastFetch(\"/temp/begin\", {\r\n token,\r\n tokenproof,\r\n salt\r\n });\r\n console.log(\"/temp/begin\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchConvertFastTemp = async (\r\n token: string,\r\n tempproof: string,\r\n from: number,\r\n salt: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n mindiff: string;\r\n fastproof: string;\r\n };\r\n } = await fastFetch(\"/temp/fastcopy\", {\r\n token,\r\n tempproof,\r\n from: from.toString(),\r\n salt\r\n });\r\n console.log(\"/temp/fastcopy\", result);\r\n return result;\r\n};\r\n\r\nexport const fetchUnloackWithFast = async (\r\n token: string,\r\n salt: string,\r\n mindiff: string,\r\n fastproof: string,\r\n enckey: string\r\n) => {\r\n const result: {\r\n err?: string;\r\n data: {\r\n from: number;\r\n to: number;\r\n proof: string;\r\n };\r\n } = await fastFetch(\"/temp/unlock\", {\r\n token,\r\n salt,\r\n mindiff,\r\n fastproof,\r\n enckey\r\n });\r\n console.log(\"/temp/unlock\", result);\r\n return result;\r\n};\r\n","import * as React from \"react\";\r\nimport { Alert } from \"antd\";\r\n\r\nexport type AlertType = \"success\" | \"info\" | \"warning\" | \"error\";\r\nexport function ResultAlert(props: { type: AlertType; msg: string }) {\r\n return ;\r\n}\r\n","import * as React from \"react\";\r\nimport {\r\n CaretUpOutlined,\r\n CaretDownOutlined,\r\n EditOutlined\r\n} from \"@ant-design/icons\";\r\n\r\nimport { Modal, Button } from \"antd\";\r\n\r\nexport type minOffsetArr = [number, number, number]; // day, hour, min\r\nexport function TimeDelayShowAndEdit(\r\n props: {\r\n value: minOffsetArr;\r\n onChange: (val: minOffsetArr) => void;\r\n } = { value: [0, 0, 0], onChange: (e) => {} }\r\n) {\r\n const [visible, setVisible] = React.useState(false);\r\n const fastChange = (index, delta) => {\r\n let current = props.value;\r\n current[index] = Math.max(0, current[index] + delta);\r\n if (JSON.stringify(current) === \"[0,0,0]\") {\r\n current = [0, 0, 1]; // min 1 minute\r\n }\r\n props.onChange(current);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Days: {props.value[0]} \r\n \r\n \r\n Hours: {props.value[1]} {\" \"}\r\n \r\n \r\n Minutes: {props.value[2]} \r\n \r\n \r\n }\r\n footer={}\r\n >\r\n
    \r\n
  • \r\n Days: {props.value[0]}
    \r\n \r\n  \r\n \r\n  \r\n \r\n  \r\n \r\n
  • \r\n
  • \r\n Hours: {props.value[1]}
    \r\n \r\n  \r\n \r\n  \r\n \r\n  \r\n \r\n
  • \r\n
  • \r\n Minutes: {props.value[2]}
    \r\n \r\n  \r\n \r\n  \r\n \r\n  \r\n \r\n
  • \r\n
\r\n \r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { DeleteOutlined } from \"@ant-design/icons\";\r\n\r\nimport { removeDup, removeIndInxState } from \"../utils/utils\";\r\n\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport { addKey } from \"../redux/main-slice\";\r\n\r\nimport { Button, Space } from \"antd\";\r\nimport { fetchNewGroup } from \"../api/api-def\";\r\n\r\nimport { AlertType, ResultAlert } from \"./ResultAlert\";\r\nimport { minOffsetArr, TimeDelayShowAndEdit } from \"./TimeDelayShowAndEdit\";\r\n\r\nconst timesToStrings = (items: Array) => {\r\n // works because parse-duration on server\r\n return items.map((e) => `${e[0]}d ${e[1]}hr ${e[2]}min`);\r\n};\r\n\r\nexport function CreateNewKeys() {\r\n const dispath = useAppDispatch();\r\n const groups = useAppSelector((s) => s.main.keys);\r\n\r\n const [times, setTimes] = React.useState([] as Array);\r\n const [alertList, setAlertList] = React.useState(\r\n [] as Array<[AlertType, string]>\r\n );\r\n\r\n // Local variables will get reset every render upon mutation whereas state will update\r\n const [clearOldTimeout, setClearOldTimeout] = React.useState(-1);\r\n\r\n const updateTime = (index: number, value: minOffsetArr) => {\r\n setTimes((old) => {\r\n let arr = [...old];\r\n arr[index] = value;\r\n return arr;\r\n });\r\n };\r\n\r\n const resetClearTimeout = () => {\r\n if (clearOldTimeout > -1) {\r\n clearTimeout(clearOldTimeout);\r\n }\r\n setClearOldTimeout(setTimeout(() => setAlertList([]), 5 * 1000));\r\n };\r\n\r\n const addAlert = (type: AlertType, msg: string) => {\r\n setAlertList((old) => [[type, msg], ...old]);\r\n resetClearTimeout();\r\n };\r\n\r\n const startNewKeyProcess = () => {\r\n const timeStrings = removeDup(timesToStrings(times));\r\n\r\n let existing = timeStrings.filter(\r\n (t) => groups.filter((g) => g.id === t).length > 0\r\n );\r\n\r\n if (existing.length > 0) {\r\n addAlert(\"info\", `Key ${existing[0]} already exists!`);\r\n return;\r\n }\r\n\r\n fetchNewGroup(timeStrings)\r\n .then((result) => {\r\n if (!!result.err) {\r\n addAlert(\"error\", `${result.err || \"\"}`);\r\n return;\r\n } else {\r\n //addGroup(name, result.data.salt, result.data.tokens);\r\n //message.success(`\"${name}\" was added!`);\r\n\r\n result.data.tokens.forEach((t) => {\r\n dispath(addKey({ id: t.name, keySalt: t.salt, keyProof: t.proof }));\r\n });\r\n\r\n addAlert(\r\n \"success\",\r\n `Added ${result.data.tokens.length} tokens sucessfully!`\r\n );\r\n }\r\n })\r\n .catch((e) => {\r\n addAlert(\"error\", `Error fetching: ${e}`);\r\n });\r\n };\r\n\r\n return (\r\n \r\n Choose the delay each key will have: \r\n
    \r\n {times.map((e, i) => (\r\n
  • \r\n {\r\n removeIndInxState(i, setTimes);\r\n }}\r\n >\r\n \r\n \r\n  \r\n {\r\n updateTime(i, newvalue);\r\n }}\r\n />\r\n  \r\n
  • \r\n ))}\r\n
\r\n\r\n
\r\n \r\n {alertList.map((e) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n \r\n  \r\n {\r\n startNewKeyProcess();\r\n }}\r\n >\r\n 2. Create !\r\n \r\n
\r\n
\r\n );\r\n}\r\n","export function removeDup(arr: any[]): any[] {\r\n return arr.filter(function (value, index, array) {\r\n return array.indexOf(value) === index;\r\n });\r\n}\r\n\r\nexport const removeIndInxState = (\r\n index: number,\r\n setfunc: (callback: (old: any[]) => any[]) => void\r\n) => {\r\n setfunc((old) => {\r\n let aclone = [...old];\r\n aclone.splice(index, 1);\r\n return aclone;\r\n });\r\n};\r\n\r\nexport function imageUrlBlob(base64Image) {\r\n // Split into two parts\r\n const parts = base64Image.split(\";base64,\");\r\n\r\n // Hold the content type\r\n const imageType = parts[0].split(\":\")[1];\r\n\r\n // Decode Base64 string\r\n const decodedData = window.atob(parts[1]);\r\n\r\n // Create UNIT8ARRAY of size same as row data length\r\n const uInt8Array = new Uint8Array(decodedData.length);\r\n\r\n // Insert all character code into uInt8Array\r\n for (let i = 0; i < decodedData.length; ++i) {\r\n uInt8Array[i] = decodedData.charCodeAt(i);\r\n }\r\n\r\n // Return BLOB image after conversion\r\n return URL.createObjectURL(new Blob([uInt8Array], { type: imageType }));\r\n}\r\n\r\nexport function base64ToArrayBuffer(base64) {\r\n var binary_string = window.atob(base64);\r\n var len = binary_string.length;\r\n var bytes = new Uint8Array(len);\r\n for (var i = 0; i < len; i++) {\r\n bytes[i] = binary_string.charCodeAt(i);\r\n }\r\n return bytes.buffer;\r\n}\r\n\r\nexport function uuidv4(): string {\r\n return ([1e7].toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(\r\n /[018]/g,\r\n (c) =>\r\n (\r\n parseInt(c) ^\r\n (crypto.getRandomValues(new Uint8Array(1))[0] &\r\n (15 >> (parseInt(c) / 4)))\r\n ).toString(16)\r\n );\r\n}\r\n","import { Tag } from \"antd\";\r\nimport * as React from \"react\";\r\n\r\nexport function BoldTime(props: { time: string }) {\r\n let times = props.time.split(/[^0-9]+/); // [\"0\", \"0\", \"1\", \"\"]\r\n let texts = props.time.split(/[0-9]+/); // [\"\", \"d \", \"hr \", \"min\"]\r\n\r\n return (\r\n <>\r\n {/* {[0, 1, 2].map((i) => (\r\n \r\n {i === 0 ? (\r\n {times[i]}\r\n ) : i === 1 ? (\r\n {times[i]}\r\n ) : (\r\n {times[i]}\r\n )}\r\n {texts[i + 1]} \r\n \r\n ))} */}\r\n \r\n {times[0]}d {times[1]}hr {times[2]}min\r\n \r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { PDFDownloadLink } from \"@react-pdf/renderer\";\r\n\r\nexport interface PdfDocumentProps {\r\n title: string;\r\n document: JSX.Element;\r\n}\r\n\r\nconst PdfDocument: React.FC = ({ title, document }) => {\r\n const { useState, useEffect } = React;\r\n const [ready, setReady] = useState(false);\r\n\r\n // this is hacky but helps set the render to the back of event queue https://github.com/diegomura/react-pdf/issues/420\r\n useEffect(() => {\r\n setTimeout(() => {\r\n setReady(true);\r\n }, 0);\r\n }, []);\r\n // end of hacky stuff\r\n\r\n if (!ready) {\r\n return null;\r\n } else {\r\n return (\r\n \r\n {({ url, loading, error }) =>\r\n loading ? \"Loading document...\" : \"Download now!\"\r\n }\r\n \r\n );\r\n }\r\n};\r\n\r\nexport default PdfDocument;\r\n","import * as React from \"react\";\r\n\r\nimport { Button, Space, Typography } from \"antd\";\r\n\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport { addKey, delKey, KeyDef, forgetKey } from \"../redux/main-slice\";\r\n\r\nimport { MobileDataHelperModal } from \"../components/MobileDataHelperModal\";\r\nimport { BoldTime } from \"./BoldTime\";\r\n\r\nimport {\r\n Document,\r\n Font,\r\n Page,\r\n StyleSheet,\r\n Text,\r\n Svg,\r\n View,\r\n Image\r\n} from \"@react-pdf/renderer\";\r\nimport PdfDocument from \"../utils/PdfDocument\";\r\n\r\nimport * as QRCode from \"qrcode\";\r\nimport { logo } from \"../img/logo\";\r\nimport Title from \"antd/lib/typography/Title\";\r\nimport {\r\n CheckOutlined,\r\n CopyOutlined,\r\n QrcodeOutlined,\r\n UnlockOutlined\r\n} from \"@ant-design/icons\";\r\nimport Checkbox from \"antd/lib/checkbox/Checkbox\";\r\nimport Modal from \"antd/lib/modal/Modal\";\r\n\r\nconst { Paragraph } = Typography;\r\n\r\nexport const styles = StyleSheet.create({\r\n txt: {\r\n textAlign: \"right\",\r\n right: \"2\",\r\n fontSize: \"10px\",\r\n padding: \"5px\",\r\n backgroundColor: \"#FEFEFE\"\r\n },\r\n img: { height: \"100%\", width: \"50%\" },\r\n section: {\r\n textAlign: \"center\",\r\n width: \"47%\",\r\n margin: \"1.5%\",\r\n border: \"3px solid black\",\r\n flexDirection: \"row\",\r\n padding: \"0px\"\r\n },\r\n header: {\r\n fontSize: 12,\r\n margin: 20,\r\n textAlign: \"center\",\r\n color: \"grey\"\r\n },\r\n pageNumber: {\r\n position: \"absolute\",\r\n fontSize: 12,\r\n bottom: 15,\r\n left: 0,\r\n right: 0,\r\n textAlign: \"center\",\r\n color: \"grey\",\r\n backgroundColor: \"#FEFEFE\"\r\n }\r\n});\r\n\r\nconst TestDocument = (props: { keys: KeyDef[]; images: string[] }) => {\r\n return (\r\n \r\n \r\n \r\n 123timelock Keys Export {new Date().toDateString()}\r\n \r\n \r\n {props.keys.map((k, i) => (\r\n \r\n \r\n \r\n {/*Fit text trick, viewbox based on width of text (aprox):*/}\r\n \r\n \r\n {k.id}\r\n \r\n \r\n \r\n {k.keySalt}\r\n {k.keyProof}\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n `[ Page ${pageNumber} / ${totalPages} ]`\r\n }\r\n fixed\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport const getQR = (data: string) => {\r\n return new Promise((ok, bad) => {\r\n QRCode.toDataURL(data, (err, url) => {\r\n if (err) return bad(err);\r\n ok(url);\r\n });\r\n });\r\n};\r\n\r\nexport function ShareForgetKeys() {\r\n const dispatch = useAppDispatch();\r\n const keys = useAppSelector((state) => state.main.keys);\r\n const [keysQR, setKeysQr] = React.useState([] as string[]);\r\n const [modifyKey, setModifyKey] = React.useState(\"\");\r\n\r\n const [singleModalVisible, setSingleModalVisible] = React.useState(false);\r\n\r\n const [selQR, setSelQR] = React.useState(\"\");\r\n const [selID, setSelID] = React.useState(\"\");\r\n\r\n const addKey_ = (name: string) => {\r\n dispatch(\r\n addKey({ id: \"key\" + Math.random(), keySalt: \"1\", keyProof: \"2\" })\r\n );\r\n };\r\n const delKey_ = (name: string) => {\r\n dispatch(delKey(name));\r\n };\r\n const forgetKey_ = (name: string) => {\r\n dispatch(forgetKey(name));\r\n };\r\n\r\n const renderPdf = () => {\r\n Promise.all(keys.map((k) => getQR(JSON.stringify(k))))\r\n .then((result) => setKeysQr(result))\r\n .catch((e) => {\r\n setKeysQr([]);\r\n console.log(e);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n {/**/}\r\n
    \r\n {keys.map((e) => (\r\n
  • \r\n \r\n ,\r\n \r\n ],\r\n tooltips: \"Copy\"\r\n }}\r\n >\r\n {e.keyProof.startsWith(\"token_\") && (\r\n {\r\n setSelID(e.id);\r\n setSelQR(await getQR(JSON.stringify(e)));\r\n setSingleModalVisible(true);\r\n }}\r\n style={{ fontSize: \"2em\" }}\r\n key=\"copy-icon\"\r\n />\r\n )}\r\n
      \r\n
    • \r\n Random numbers (salt): {e.keySalt}\r\n
    • \r\n
    • \r\n Proof (token): {e.keyProof ? e.keyProof : \"No Proof!\"}{\" \"}\r\n
    • \r\n
    • \r\n {\r\n if (ev.target.checked) {\r\n setModifyKey(`${e.id}_${e.keySalt}`);\r\n } else {\r\n setModifyKey(\"\");\r\n }\r\n }}\r\n >\r\n Check to modify {\">>\"}\r\n \r\n
        \r\n
      • \r\n \r\n delKey_(e.id)}\r\n >\r\n Delete\r\n \r\n\r\n forgetKey_(e.id)}\r\n >\r\n Forget\r\n \r\n \r\n
      • \r\n
      \r\n
    • \r\n
    \r\n
  • \r\n ))}\r\n
\r\n {\">> \"}\r\n {keys.length === keysQR.length && (\r\n }\r\n />\r\n )}\r\n setSingleModalVisible(false)}>\r\n Close\r\n \r\n }\r\n closable={false}\r\n >\r\n
\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n/*\r\nOld erros when used useLocalStorage()..\r\n // This sub-componenet was created to use new hooks on new group creating\r\n // because the map() made a 1 more call to createPersistedState(groupName)\r\n // using them in a callback arrow func made an error : \"Rendered more hooks than the previous render.\"\r\n // But a new call to hook because a new React component is acceptible...\r\n*/\r\n","import * as sjcl from \"./custom_sjcl_1.0.8\";\r\n\r\nexport function hashSyncExample(text: string, type = \"sha256\"): string {\r\n let hash = type === \"sha256\" ? new sjcl.hash.sha256() : new sjcl.hash.sha1();\r\n hash.update(text);\r\n let uint32_arr = hash.finalize() as Array;\r\n return sjcl.codec.hex.fromBits(uint32_arr);\r\n}\r\n\r\nexport function hashStep(text, type = \"sha256\", state = null) {\r\n let hash = type === \"sha256\" ? new sjcl.hash.sha256() : new sjcl.hash.sha1();\r\n if (state) {\r\n hash.import(state);\r\n }\r\n hash.update(text);\r\n return hash.export();\r\n}\r\n\r\nfunction hashFinalStepBytes(\r\n text: string | number[] | null,\r\n type: string,\r\n state: string\r\n) {\r\n let hash = type === \"sha256\" ? new sjcl.hash.sha256() : new sjcl.hash.sha1();\r\n if (state) {\r\n hash.import(state);\r\n }\r\n if (text) hash.update(text);\r\n let uint32_arr = hash.finalize() as Array;\r\n return uint32_arr;\r\n}\r\n\r\nexport function hashFinalStep(\r\n text: string | number[] | null,\r\n type = \"sha256\",\r\n state?: string\r\n): string {\r\n let uint32_arr = hashFinalStepBytes(text, type, state);\r\n return sjcl.codec.hex.fromBits(uint32_arr);\r\n}\r\n\r\nexport function TOTP2Keys(secretBase32: string, type = \"sha256\") {\r\n try {\r\n console.log(\"originalkey: \" + sjcl.codec.base32.toBits(secretBase32));\r\n let hashAlgo = type === \"sha256\" ? sjcl.hash.sha256 : sjcl.hash.sha1;\r\n let keys = sjcl.misc.hmacKeys(\r\n sjcl.codec.base32.toBits(secretBase32),\r\n hashAlgo\r\n ) as {\r\n serverKey: number[];\r\n clientKey: number[];\r\n };\r\n return keys;\r\n } catch (error) {\r\n return { serverKey: [], clientKey: [] };\r\n }\r\n}\r\n\r\nconst hex2FFarr = (text: string) => {\r\n let finalHashBytesArray = [];\r\n text.split(\"\").forEach((_, i) => {\r\n if (i % 2 === 0)\r\n finalHashBytesArray.push(parseInt(text[i] + text[i + 1], 16));\r\n });\r\n return finalHashBytesArray;\r\n};\r\n\r\nexport async function twoStepSha1Hmac(\r\n getKeyOut_server: (digest: number[]) => Promise,\r\n keyIn_client,\r\n code_int_arr: number[]\r\n): Promise {\r\n //\r\n // Hash (client_key (inner) + counter bytes (sjcl need 32int))\r\n let counterUint32Arr = sjcl.codec.bytes.toBits(code_int_arr);\r\n\r\n let innerState = null;\r\n innerState = hashStep(keyIn_client, \"sha1\", innerState);\r\n let innerDigest = hashFinalStepBytes(counterUint32Arr, \"sha1\", innerState);\r\n\r\n // Sha1 5 numbers (32bit?)\r\n let innerDigestLeft = innerDigest.slice(0, innerDigest.length / 2);\r\n let innerDigestRight = innerDigest.slice(innerDigest.length / 2);\r\n\r\n // Server side of hash(server_key (outer) + digest first bytes)\r\n let serverOutState = await getKeyOut_server(innerDigestLeft);\r\n\r\n // Client side again to finish:\r\n let finalHash = hashFinalStep(innerDigestRight, \"sha1\", serverOutState);\r\n let finalHashBytesArray = hex2FFarr(finalHash);\r\n\r\n return finalHashBytesArray;\r\n}\r\n","// Thanks:\r\n// Chris Miceli / https://github.com/chrismiceli\r\n// http://chris-miceli.blogspot.com/2014/04/google-authenticator-in-html5-with.html\r\n\r\nfunction padDigits(number, digits) {\r\n return (\r\n Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number\r\n );\r\n}\r\n\r\nfunction NumericToUint8Array(counter) {\r\n const hexCounter = padDigits(counter.toString(16), 16);\r\n let bytesArr = [];\r\n for (let i = 0; i < 16; i += 2) {\r\n bytesArr.push(hexCounter[i] + hexCounter[i + 1]);\r\n }\r\n return new Uint8Array(bytesArr.map((e) => parseInt(e, 16)));\r\n}\r\n\r\nexport function getTimeDataNumArray(steps = 30): number[] {\r\n var time = Math.floor(Date.now() / (steps * 1000));\r\n var data = Array.from(NumericToUint8Array(time));\r\n return data;\r\n}\r\n\r\nexport function GenerateTOTPWithSign(signature) {\r\n try {\r\n if (signature) {\r\n var signatureArray = new Uint8Array(signature);\r\n var offset = signatureArray[signatureArray.length - 1] & 0xf;\r\n\r\n var binary =\r\n ((signatureArray[offset] & 0x7f) << 24) |\r\n ((signatureArray[offset + 1] & 0xff) << 16) |\r\n ((signatureArray[offset + 2] & 0xff) << 8) |\r\n (signatureArray[offset + 3] & 0xff);\r\n\r\n return binary % 1000000;\r\n } else {\r\n console.error(\"Sign with HMAC - SHA-1: FAIL\");\r\n return 0;\r\n }\r\n } catch (error) {\r\n console.error(`Sign with HMAC - SHA-1: FAIL, ${error}`);\r\n return 0;\r\n }\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport {\r\n Button,\r\n Divider,\r\n Modal,\r\n Typography,\r\n Space,\r\n Input,\r\n Row,\r\n Col\r\n} from \"antd\";\r\n\r\nimport { CheckOutlined, CopyOutlined, DeleteOutlined } from \"@ant-design/icons\";\r\nimport { fetchFinishUnlockOTP, fetchFinishUnlockSha } from \"../api/api-def\";\r\n\r\nimport { delUnLockedData, UnlockDef } from \"../redux/main-slice\";\r\nimport { authenticator } from \"otplib\";\r\n\r\nimport { getQR } from \"./ShareOrForget\";\r\nimport {\r\n hashFinalStep,\r\n hashStep,\r\n twoStepSha1Hmac\r\n} from \"../crypto/cryptoUtils\";\r\nimport { MAC_DELIM, SHA_DELIM } from \"./AddLockData\";\r\nimport { GenerateTOTPWithSign, getTimeDataNumArray } from \"../crypto/otp_parts\";\r\nconst { Title, Text, Paragraph } = Typography;\r\n\r\nconst isLink = (e) => e.startsWith(\"http://\") || e.startsWith(\"https://\");\r\nconst isImage = (e) => e.startsWith(\"[img]\") && e.endsWith(\"[/img]\");\r\nconst isTOTP = (e) => e.startsWith(\"[totp]\") && e.endsWith(\"[/totp]\");\r\nconst isQR = (e) => e.startsWith(\"[qr]\") && e.endsWith(\"[/qr]\");\r\nconst isHASH256 = (e) => e.startsWith(\"[sha256]\") && e.endsWith(\"[/sha256]\");\r\nconst isHASH256Parts = (e) =>\r\n e.startsWith(\"[sha256p]\") && e.endsWith(\"[/sha256p]\");\r\nconst isHASH1Parts = (e) => e.startsWith(\"[sha1p]\") && e.endsWith(\"[/sha1p]\");\r\nconst isTotpParts = (e) => e.startsWith(\"[totp2]\") && e.endsWith(\"[/totp2]\");\r\n\r\nasync function sha256_simple(message: string): Promise {\r\n // encode as UTF-8\r\n const msgBuffer = new TextEncoder().encode(message);\r\n\r\n // hash the message\r\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgBuffer);\r\n\r\n // convert ArrayBuffer to Array\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n\r\n // convert bytes to hex string\r\n const hashHex = hashArray\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n return hashHex;\r\n}\r\n\r\nexport const redactCopy = (txt) => {\r\n // not really stopping anyone, just to avoid copy secret on mistake\r\n return txt\r\n .replace(/\\[img\\].*?\\[\\/img\\]/g, \"\")\r\n .replace(/\\[totp\\].*?\\[\\/totp\\]/g, \"\")\r\n .replace(/\\[qr\\].*?\\[\\/qr\\]/g, \"\")\r\n .replace(/\\[sha256\\].*?\\[\\/sha256\\]/g, \"\")\r\n .replace(/\\[sha256p\\].*?\\[\\/sha256p\\]/g, \"\")\r\n .replace(/\\[sha1p\\].*?\\[\\/sha1p\\]/g, \"\")\r\n .replace(/\\[totp2\\].*?\\[\\/totp2\\]/g, \"\");\r\n};\r\n\r\nexport const isRedacted = (txt) => {\r\n return redactCopy(txt) == txt;\r\n};\r\n\r\nconst AsyncImage = (props: { getSrc: Promise }) => {\r\n const [src, setSrc] = React.useState(\"\");\r\n React.useEffect(() => {\r\n props.getSrc.then((e) => setSrc(e));\r\n });\r\n return (\r\n \"qr-code\"\r\n );\r\n};\r\n\r\nconst SecretMessage = (props: {\r\n sharedSecret: string;\r\n cb: (string) => Promise;\r\n}) => {\r\n const [result, setResult] = React.useState(\"FFFF\");\r\n const [input, setInput] = React.useState(\"\");\r\n return (\r\n <>\r\n Enter code:
\r\n
    \r\n
  • \r\n {\r\n let txt = e.target.value;\r\n setInput(txt);\r\n props\r\n .cb(txt + props.sharedSecret)\r\n .then((e) => setResult(e))\r\n .catch((e) => setResult(`Error: ${e}`));\r\n }}\r\n />\r\n
  • \r\n
  • \r\n ,\r\n \r\n ],\r\n text: result\r\n }}\r\n style={{ wordBreak: \"break-all\" }}\r\n >\r\n {result}\r\n \r\n
  • \r\n
\r\n \r\n );\r\n};\r\n\r\nconst SecretMessageParts = (props: {\r\n hashType: string;\r\n sharedSecret: string;\r\n unlock: UnlockDef;\r\n}) => {\r\n const CalculateHash = async (code: string) => {\r\n const u = props.unlock;\r\n\r\n let dataparts = code.split(SHA_DELIM);\r\n // Splitting text where prefix=postfix, we can just use odd,even\r\n let state = undefined;\r\n for (let i = 0; i < dataparts.length; i++) {\r\n const part = dataparts[i];\r\n if (part.length === 0) continue;\r\n if (i % 2 === 0) {\r\n // client side:\r\n state = hashStep(part, props.hashType, state);\r\n } else {\r\n let result = await fetchFinishUnlockSha(\r\n u.encPass,\r\n u.from,\r\n u.to,\r\n u.keySalt,\r\n u.unlockProof,\r\n props.hashType,\r\n state,\r\n part\r\n );\r\n if (result.err) throw new Error(result.err);\r\n state = result.data.hashstep;\r\n }\r\n }\r\n let hashresult = hashFinalStep(null, props.hashType, state);\r\n return hashresult;\r\n };\r\n\r\n const [result, setResult] = React.useState(\"FFFF\");\r\n const [input, setInput] = React.useState(\"\");\r\n return (\r\n <>\r\n Enter code:\r\n
    \r\n
  • \r\n \r\n {\r\n let txt = e.target.value;\r\n setInput(txt);\r\n }}\r\n />\r\n {\r\n CalculateHash(input + props.sharedSecret)\r\n .then((e) => setResult(e))\r\n .catch((e) => setResult(`Error: ${e}`));\r\n }}\r\n >\r\n Hash!\r\n \r\n \r\n
  • \r\n
  • \r\n ,\r\n \r\n ],\r\n text: result\r\n }}\r\n style={{ wordBreak: \"break-all\" }}\r\n >\r\n {result}\r\n \r\n
  • \r\n
\r\n \r\n );\r\n};\r\n\r\nconst TOTPParts = (props: {\r\n hashType: string;\r\n sharedSecret: string;\r\n unlock: UnlockDef;\r\n}) => {\r\n //totp2\r\n const CalculateTOTPHashCode = async (innerText: string) => {\r\n const u = props.unlock;\r\n\r\n let dataparts = innerText.split(MAC_DELIM);\r\n if (dataparts.length !== 2)\r\n return \"Bad Format, \" + dataparts.length + \"parts (!=2)\";\r\n\r\n let keys = {\r\n serverKey_enc: dataparts[0],\r\n clientKey: JSON.parse(dataparts[1])\r\n };\r\n\r\n let totp_signature = await twoStepSha1Hmac(\r\n async (digest) => {\r\n return (\r\n await fetchFinishUnlockOTP(\r\n u.encPass,\r\n u.from,\r\n u.to,\r\n u.keySalt,\r\n u.unlockProof,\r\n \"sha1\",\r\n keys.serverKey_enc,\r\n JSON.stringify(digest)\r\n )\r\n ).data.hashstep;\r\n },\r\n keys.clientKey,\r\n getTimeDataNumArray()\r\n );\r\n\r\n return GenerateTOTPWithSign(totp_signature).toString();\r\n };\r\n\r\n const [result, setResult] = React.useState(\"000000\");\r\n return (\r\n <>\r\n Enter code:\r\n
    \r\n
  • \r\n \r\n {\r\n CalculateTOTPHashCode(props.sharedSecret)\r\n .then((e) => setResult(e || \"ERRERR\"))\r\n .catch((e) => setResult(`Error: ${e}`));\r\n }}\r\n >\r\n Get Code!\r\n \r\n \r\n
  • \r\n
  • \r\n {result.split(\"\").join(\" \")}{\" \"}\r\n ,\r\n \r\n ],\r\n text: result\r\n }}\r\n style={{ wordBreak: \"break-all\" }}\r\n >\r\n
  • \r\n
\r\n \r\n );\r\n};\r\n\r\nexport function TextEffects(props: { text: string; unlock: UnlockDef }) {\r\n return (\r\n <>\r\n {props.text.split(\" \").map((e, i) => {\r\n if (isLink(e)) {\r\n return (\r\n \r\n {e}{\" \"}\r\n \r\n );\r\n } else if (isImage(e)) {\r\n let link = encodeURI(e.match(/\\[img\\](.*?)\\[\\/img\\]/)[1]);\r\n if (!isLink(link)) {\r\n return <>Invalid Image link ;\r\n }\r\n return (\r\n \r\n );\r\n } else if (isTotpParts(e)) {\r\n let totpStr = e.match(/\\[totp2\\]([\\S]+?)\\[\\/totp2\\]/)[1];\r\n return (\r\n \r\n );\r\n } else if (isTOTP(e)) {\r\n let totpStr = e.match(/\\[totp\\]([a-zA-Z0-9]+?)\\[\\/totp\\]/)[1];\r\n return (\r\n <>\r\n \r\n {authenticator.generate(totpStr).split(\"\").join(\" \")}\r\n {\" \"}\r\n \r\n );\r\n } else if (isHASH256Parts(e)) {\r\n let hashSahredSecret = (e.match(\r\n /\\[sha256p\\]([^\\s]+?)\\[\\/sha256p\\]/\r\n ) || [\"\", \"\"])[1];\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else if (isHASH1Parts(e)) {\r\n let hashSahredSecret = (e.match(/\\[sha1p\\]([^\\s]+?)\\[\\/sha1p\\]/) || [\r\n \"\",\r\n \"\"\r\n ])[1];\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else if (isHASH256(e)) {\r\n let hashSahredSecret = (e.match(\r\n /\\[sha256\\]([^\\s]+?)\\[\\/sha256\\]/\r\n ) || [\"\", \"\"])[1];\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else if (isQR(e)) {\r\n let qrData = e.match(/\\[qr\\](.+?)\\[\\/qr\\]/)[1];\r\n\r\n return (\r\n <>\r\n \r\n \r\n );\r\n } else {\r\n return <>{e} ;\r\n }\r\n })}\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\n\n// Made for emojis since one day they became black&white\n// in 17.11.21 it was because they has custom font-weight\n// but allso possible:\n// https://www.tjvantoll.com/2016/06/15/emoji-on-windows/\n\nexport function CEmoji(props: { text: string }) {\n return {props.text};\n}\n","import * as React from \"react\";\r\n\r\nimport {\r\n Button,\r\n Divider,\r\n Modal,\r\n Typography,\r\n Space,\r\n Input,\r\n Row,\r\n Col\r\n} from \"antd\";\r\n\r\nimport { CheckOutlined, CopyOutlined, DeleteOutlined } from \"@ant-design/icons\";\r\n\r\nimport * as encryptor from \"simple-encryptor\";\r\n\r\nimport { AlertType, ResultAlert } from \"../components/ResultAlert\";\r\n\r\nimport { fetchFinishUnlockSimple } from \"../api/api-def\";\r\n\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport { delUnLockedData, UnlockDef } from \"../redux/main-slice\";\r\nimport { authenticator } from \"otplib\";\r\n\r\nimport { TextEffects, redactCopy, isRedacted } from \"./DataTextEffects\";\r\n\r\nimport { default as prettyms } from \"pretty-ms\";\r\nimport { CEmoji } from \"./CEmoji\";\r\nimport { getQR } from \"./ShareOrForget\";\r\nconst { Title, Text, Paragraph } = Typography;\r\n\r\nexport function SimpleEmpty() {\r\n return (\r\n
\r\n - Empty - \r\n
\r\n );\r\n}\r\n\r\ntype simpleCB = () => void;\r\ntype AlertMessage = [AlertType, string];\r\ntype setReact = (alert: AlertMessage, data: string, deleteCB: simpleCB) => void;\r\n\r\nexport function ShowOrDelete(props: {\r\n deleteOnly: boolean;\r\n unlocksArray: UnlockDef[];\r\n timeprefix: string;\r\n timecalc: (u: UnlockDef) => number;\r\n callback: (u: UnlockDef, setMsg: setReact) => void;\r\n btnType: \"text\" | \"link\" | \"ghost\" | \"primary\" | \"default\" | \"dashed\";\r\n btnDanger: boolean;\r\n}) {\r\n const [deleteFunc, setDeleteFunc] = React.useState({ cb: () => {} });\r\n const [modalVisible, setModalVisible] = React.useState(false);\r\n const [alertMsg, setAlertMsg] = React.useState([\"error\", \"\"] as AlertMessage);\r\n const [modalData, setModalData] = React.useState(\"\");\r\n\r\n const [closeTimeout, setCloseTimeout] = React.useState(-1);\r\n\r\n const [selectedUnlock, setSelectedUnlock] = React.useState(null as UnlockDef);\r\n\r\n const customCallback = (\r\n alert: AlertMessage,\r\n data: string = \"\",\r\n deleteCB: simpleCB\r\n ) => {\r\n setDeleteFunc({ cb: deleteCB });\r\n if (data === \"\") {\r\n setModalData(\"\");\r\n setAlertMsg(alert);\r\n } else {\r\n setModalData(data);\r\n setAlertMsg([\"error\", \"\"]);\r\n }\r\n\r\n setCloseTimeout(\r\n (setTimeout(() => {\r\n setModalData(\"\");\r\n setAlertMsg([\"error\", \"\"]);\r\n setModalVisible(false);\r\n }, 25 * 1000) as unknown) as number\r\n );\r\n setModalVisible(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setModalData(\"\");\r\n setModalVisible(false);\r\n if (closeTimeout > -1) clearTimeout(closeTimeout);\r\n };\r\n\r\n return (\r\n <>\r\n {/*-------- Data models ----------------*/}\r\n \r\n \r\n {\r\n if (deleteFunc.cb) {\r\n deleteFunc.cb();\r\n setModalData(\"\");\r\n setAlertMsg([\"error\", \"\"]);\r\n setModalVisible(false);\r\n }\r\n }}\r\n >\r\n Forget Unlock{\" \"}\r\n \r\n ,\r\n \r\n ],\r\n text: redactCopy(modalData + alertMsg[1])\r\n }}\r\n >\r\n Copy All Text\r\n \r\n \r\n \r\n {alertMsg[1].length > 0 && (\r\n <>\r\n \r\n
\r\n \r\n )}\r\n {alertMsg[1].length === 0 && (\r\n <>\r\n {modalData\r\n .split(\"\\n\")\r\n .filter((e) => !!e)\r\n .map((l, i) => (\r\n <>\r\n \r\n \r\n\r\n {!isRedacted(l) ? (\r\n <>\r\n ) : (\r\n ,\r\n \r\n ]\r\n }}\r\n >\r\n )}\r\n \r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n {/*-------- Buttons ----------------*/}\r\n {props.unlocksArray.length > 0 ? (\r\n \r\n {props.unlocksArray.map((u, i) => (\r\n {\r\n setSelectedUnlock(u);\r\n props.callback(u, customCallback);\r\n }}\r\n >\r\n {\" \"}\r\n {props.btnDanger && }\r\n {u.desc}, {props.timeprefix}: {\" \"}\r\n {prettyms(props.timecalc(u), { secondsDecimalDigits: 0 })}\r\n \r\n ))}\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport function AvailableData() {\r\n const dispatch = useAppDispatch();\r\n const unlocks = useAppSelector((state) => state.main.unlocks);\r\n const [nowTime, setNowTime] = React.useState(Date.now());\r\n\r\n React.useEffect(() => {\r\n let id = setInterval(() => setNowTime(Date.now()), 2000);\r\n return () => {\r\n clearInterval(id);\r\n };\r\n }, []);\r\n\r\n const deleteUnlock = (u: UnlockDef) => {\r\n dispatch(delUnLockedData(u.keySalt, u.from, u.to));\r\n };\r\n\r\n const unlockFinishProcess = (u: UnlockDef, setAlert: setReact) => {\r\n const delCB = () => deleteUnlock(u);\r\n fetchFinishUnlockSimple(u.encPass, u.from, u.to, u.keySalt, u.unlockProof)\r\n .then((result) => {\r\n if (!!result.err) {\r\n setAlert([\"error\", `${result.err || \"\"}`], \"\", delCB);\r\n return;\r\n } else {\r\n try {\r\n let data = encryptor\r\n .createEncryptor(result.data.pass)\r\n .decrypt(u.encData);\r\n setAlert(null, data, delCB);\r\n } catch (error) {\r\n setAlert([\"error\", `Error decrypting: ${error}`], \"\", delCB);\r\n }\r\n }\r\n })\r\n .catch((e) => {\r\n setAlert([\"error\", `Error fetching: ${e}`], \"\", delCB);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {\" \"}\r\n \r\n <CEmoji text=\"✅\" /> Unlocked now\r\n \r\n \r\n u.from < nowTime && u.to > nowTime)}\r\n deleteOnly={false}\r\n timeprefix=\"left\"\r\n timecalc={(u) => u.to - Date.now()}\r\n callback={(u, s) => unlockFinishProcess(u, s)}\r\n btnType={\"primary\"}\r\n btnDanger={false}\r\n />\r\n \r\n \r\n <CEmoji text=\"⏳\" /> Upcoming...\r\n \r\n \r\n u.from > nowTime)}\r\n deleteOnly={false}\r\n timeprefix=\"wait\"\r\n timecalc={(u) => u.from - Date.now()}\r\n callback={(u, s) => unlockFinishProcess(u, s)}\r\n btnType={\"default\"}\r\n btnDanger={false}\r\n />\r\n \r\n \r\n {\" \"}\r\n <CEmoji text=\"🐌\" /> Too late{\" \"}\r\n \r\n \r\n u.to < nowTime)}\r\n deleteOnly={true}\r\n timeprefix=\"expired\"\r\n timecalc={(u) => Date.now() - u.to}\r\n callback={(u) => deleteUnlock(u)}\r\n btnType={\"default\"}\r\n btnDanger={true}\r\n />\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport * as encryptor from \"simple-encryptor\";\r\nimport {\r\n Alert,\r\n Button,\r\n Checkbox,\r\n Collapse,\r\n Input,\r\n Space,\r\n Typography\r\n} from \"antd\";\r\n\r\nimport { uuidv4 } from \"../utils/utils\";\r\nimport { Group, fetchEncPass, fetchEncHash } from \"../api/api-def\";\r\n\r\nimport { AlertType, ResultAlert } from \"./ResultAlert\";\r\nimport { MobileDataHelperModal } from \"../components/MobileDataHelperModal\";\r\n\r\nimport { addLockedData, KeyDef } from \"../redux/main-slice\";\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport { BoldTime } from \"./BoldTime\";\r\nimport { ShowOrDelete } from \"./AvailData\";\r\nimport { TOTP2Keys } from \"../crypto/cryptoUtils\";\r\n\r\nconst { Panel } = Collapse;\r\nconst { Text } = Typography;\r\nconst { TextArea } = Input;\r\n\r\nexport const SHA_DELIM = \"`~SHA~`\";\r\nexport const MAC_DELIM = \"`~MAC~`\";\r\n\r\nexport function AddLockData() {\r\n const dispath = useAppDispatch();\r\n const keys = useAppSelector((s) => s.main.keys);\r\n const locked = useAppSelector((s) => s.main.lockedData);\r\n\r\n const [alertList, setAlertList] = React.useState(\r\n [] as Array<[AlertType, string]>\r\n );\r\n\r\n const [selectedKeysSalt, setSelectedKeysSalt] = React.useState(\r\n [] as string[]\r\n );\r\n const [data, setData] = React.useState(\"\");\r\n const [name, setName] = React.useState(\"\");\r\n\r\n // Local variables will get reset every render upon mutation whereas state will update\r\n const [clearOldTimeout, setClearOldTimeout] = React.useState(-1);\r\n\r\n const resetClearTimeout = () => {\r\n if (clearOldTimeout > -1) {\r\n clearTimeout(clearOldTimeout);\r\n }\r\n setClearOldTimeout(\r\n (setTimeout(() => setAlertList([]), 5 * 1000) as unknown) as number\r\n );\r\n };\r\n\r\n const addAlert = (type: AlertType, msg: string) => {\r\n setAlertList((old) => [[type, msg], ...old]);\r\n resetClearTimeout();\r\n };\r\n\r\n let key2value = (k: KeyDef) => k.keySalt + \"|\" + k.id;\r\n let value2salt = (v: string) => v.split(\"|\")[0];\r\n\r\n const convertMacParts = async (\r\n data: string,\r\n randomPass: string,\r\n addAlert: (type: AlertType, msg: string) => void\r\n ) => {\r\n let dataparts = data.split(MAC_DELIM);\r\n // Splitting text where prefix=postfix, we can just use odd,even\r\n let dataStripped = dataparts.filter((e, i) => i % 2 === 0);\r\n let MACparts = dataparts.filter((e, i) => i % 2 === 1);\r\n let MACKeyPairs = MACparts.map((e) => TOTP2Keys(e, \"sha1\"));\r\n\r\n if (MACparts.length === 0) return data;\r\n\r\n let encrHashParts = (await fetchEncHash(\r\n MACKeyPairs.map((e) => JSON.stringify(e.serverKey)),\r\n randomPass\r\n ).catch((e) => {\r\n addAlert(\"error\", `Error fetching hashparts (otp): ${e}`);\r\n })) || { err: \"void fetchEncHash\", data: { encparts: [] } };\r\n\r\n if (!!encrHashParts.err)\r\n throw new Error(\"Fetch hashparts (otp), \" + encrHashParts.err);\r\n\r\n let dataWithHashparts = dataStripped\r\n .map((e, i) =>\r\n i !== dataStripped.length - 1\r\n ? e +\r\n (MACparts[i].length > 0 // real hash and not end\\start element\r\n ? encrHashParts.data.encparts[i] +\r\n MAC_DELIM +\r\n JSON.stringify(MACKeyPairs[i].clientKey)\r\n : \"\")\r\n : e\r\n )\r\n .join(\"\");\r\n return dataWithHashparts;\r\n };\r\n\r\n const convertHashParts = async (\r\n data: string,\r\n randomPass: string,\r\n addAlert: (type: AlertType, msg: string) => void\r\n ) => {\r\n let dataparts = data.split(SHA_DELIM);\r\n // Splitting text where prefix=postfix, we can just use odd,even\r\n let dataStripped = dataparts.filter((e, i) => i % 2 === 0);\r\n let hashparts = dataparts.filter((e, i) => i % 2 === 1);\r\n\r\n if (hashparts.length === 0) return data;\r\n\r\n let encrHashParts = (await fetchEncHash(hashparts, randomPass).catch(\r\n (e) => {\r\n addAlert(\"error\", `Error fetching hashparts (hash): ${e}`);\r\n }\r\n )) || { err: \"void fetchEncHash\", data: { encparts: [] } };\r\n if (!!encrHashParts.err)\r\n throw new Error(\"Fetch hashparts (hash), \" + encrHashParts.err);\r\n\r\n let dataWithHashparts = dataStripped\r\n .map((e, i) =>\r\n i !== dataStripped.length - 1\r\n ? e +\r\n (hashparts[i].length > 0 // real hash and not end\\start element\r\n ? SHA_DELIM + encrHashParts.data.encparts[i] + SHA_DELIM\r\n : \"\")\r\n : e\r\n )\r\n .join(\"\");\r\n return dataWithHashparts;\r\n };\r\n\r\n const startLockDataProcess = async () => {\r\n if (locked.filter((e) => e.desc === name).length > 0) {\r\n addAlert(\"info\", `Entry with '${name}' already exist!`);\r\n return;\r\n }\r\n\r\n let randomPass = uuidv4();\r\n let encRandomPass = (await fetchEncPass(\r\n selectedKeysSalt.map((e) => value2salt(e)),\r\n randomPass\r\n ).catch((e) => {\r\n addAlert(\"error\", `Error fetching: ${e}`);\r\n })) || { err: \"void fetchEncPass\", data: { enckey: \"\" } };\r\n\r\n if (!!encRandomPass.err) {\r\n addAlert(\"error\", `${encRandomPass.err || \"\"}`);\r\n return;\r\n }\r\n\r\n try {\r\n let dataWithEncHashParts = await convertMacParts(\r\n data,\r\n randomPass,\r\n addAlert\r\n );\r\n\r\n dataWithEncHashParts = await convertHashParts(\r\n dataWithEncHashParts,\r\n randomPass,\r\n addAlert\r\n );\r\n\r\n const dataEncrypted = encryptor\r\n .createEncryptor(randomPass)\r\n .encrypt(dataWithEncHashParts);\r\n\r\n if (\r\n !encRandomPass ||\r\n !encRandomPass.data ||\r\n !encRandomPass.data.enckey ||\r\n encRandomPass.data.enckey.length !== selectedKeysSalt.length\r\n ) {\r\n addAlert(\"error\", \"Can't read encryption result\");\r\n } else {\r\n dispath(\r\n addLockedData({\r\n desc: name,\r\n encData: dataEncrypted,\r\n availablePass: selectedKeysSalt.map((salt, i) => ({\r\n encPass: encRandomPass.data.enckey[i],\r\n keySalt: value2salt(salt)\r\n }))\r\n })\r\n );\r\n // clear data of this\r\n setData(\"\");\r\n setName(\"\");\r\n\r\n addAlert(\r\n \"success\",\r\n `Data was saved sucessfully! (${encRandomPass.data.enckey.length} keys)`\r\n );\r\n }\r\n } catch (error) {\r\n addAlert(\"error\", `Error encrypting: '${error}'`);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n Always save a copy of the original in a safe place. All data is\r\n saved purely on the device and can be deleted unexpectedly {\" \"}\r\n by the browser.\r\n \r\n }\r\n type=\"warning\"\r\n showIcon\r\n closable\r\n />\r\n \r\n 1. Choose what keys can be used:{\" \"}\r\n \r\n \r\n \r\n setSelectedKeysSalt([...keys].map((e) => key2value(e)))\r\n }\r\n >\r\n Select all\r\n \r\n \r\n \r\n ({\r\n label: ,\r\n value: key2value(k)\r\n }))}\r\n value={selectedKeysSalt}\r\n onChange={(values) => {\r\n console.log(values);\r\n setSelectedKeysSalt(values as string[]);\r\n }}\r\n />\r\n \r\n 2. Enter data here:
\r\n \r\n \r\n
    \r\n
  • \r\n You can copy row by row after.{\" \"}\r\n
  • \r\n
  • \r\n Links works out of the box - http(s)://.../\r\n
  • \r\n
  • \r\n You can use [img] [totp] [qr] and [sha256] with\r\n ending tag [/...]\r\n
  • \r\n
  • \r\n Multi step, server backed, hash - [sha256p], [sha1p] {\" \"}\r\n like:\r\n \r\n [sha256p]aaaa\r\n \r\n `~SHA~`bbbb`~SHA~`\r\n \r\n cccc[/sha256p]\r\n {\" \"}\r\n where bbbb will be used only on the server\r\n side\r\n
  • \r\n
  • \r\n Multi step, Server backed, totp\r\n [totp2] tags with:\r\n \r\n [totp2]\r\n \r\n `~MAC~`TOTP_CODE`~MAC~`\r\n \r\n [/totp2]\r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n {\r\n setData(e.target.value);\r\n }}\r\n />\r\n 0}\r\n callback={(u, set) => {\r\n set([\"error\", \"\"], data, () => {});\r\n }}\r\n btnType=\"primary\"\r\n btnDanger={false}\r\n />\r\n \r\n 3. Enter a nickname for this data:{\" \"}\r\n \r\n setName(e.target.value)}\r\n />\r\n {alertList.map((e) => (\r\n \r\n ))}\r\n {\r\n startLockDataProcess();\r\n }}\r\n >\r\n 4. Add encrypted data\r\n \r\n
\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport { Button, Modal, Input, Alert, Space } from \"antd\";\r\n\r\nimport { CopyOutlined, QrcodeOutlined } from \"@ant-design/icons\";\r\n\r\nimport { KeyDef } from \"../redux/main-slice\";\r\n\r\nimport * as QrReaderAll from \"react-qr-reader\";\r\nconst QrReader = QrReaderAll.default;\r\n\r\nconst { TextArea } = Input;\r\n\r\nfunction trimf(t: string | null) {\r\n if (!t) return \"\";\r\n return t.trim();\r\n}\r\n\r\ntype modalAlertMsg = {\r\n type: \"success\" | \"info\" | \"warning\" | \"error\";\r\n msg: string;\r\n};\r\n\r\nexport function KeyInput(props: {\r\n onSubmit: (key: KeyDef) => boolean;\r\n buttonText: string;\r\n extraChecks?: () => boolean;\r\n}) {\r\n const [id, setId] = React.useState(\"\");\r\n const [salt, setSalt] = React.useState(\"\");\r\n const [proof, setProof] = React.useState(\"\");\r\n\r\n const [pasteVisible, setPasteVisible] = React.useState(false);\r\n const [pasteData, setPasteData] = React.useState(\"\");\r\n\r\n const [qrVisible, setQrVisible] = React.useState(false);\r\n const [qrData, setQrData] = React.useState(\"\");\r\n\r\n const modalMsgs: {\r\n [key: string]: modalAlertMsg;\r\n } = {\r\n paste: { type: \"info\", msg: \"Please paste info\" },\r\n scan: { type: \"info\", msg: \"Please scan a QR\" },\r\n valid: { type: \"success\", msg: \"Structure is valid! \" },\r\n error: { type: \"error\", msg: \"Error: %\" }\r\n };\r\n\r\n const [pasteValidMsg, setPasteValidMsg] = React.useState(modalMsgs.paste);\r\n const [qrValidMsg, setQrValidMsg] = React.useState(modalMsgs.scan);\r\n\r\n const errorValidMsg = (text: string): modalAlertMsg => ({\r\n type: \"error\",\r\n msg: modalMsgs.error.msg.replace(\"%\", text)\r\n });\r\n\r\n const validateKeyObj = (\r\n data: string,\r\n infoMsg: modalAlertMsg,\r\n callback: React.Dispatch>\r\n ) => {\r\n if (!data || data === \"\") {\r\n callback(infoMsg);\r\n } else {\r\n try {\r\n let obj = JSON.parse(data) as KeyDef;\r\n if (typeof obj !== \"object\") {\r\n callback(errorValidMsg(\"Can't find an object\"));\r\n } else {\r\n if (!obj.id) {\r\n callback(errorValidMsg(\"Can't find key.id\"));\r\n } else if (!obj.keyProof) {\r\n callback(errorValidMsg(\"Can't find key.keyProof\"));\r\n } else if (!obj.keySalt) {\r\n callback(errorValidMsg(\"Can't find key.keySalt\"));\r\n } else {\r\n callback(modalMsgs.valid);\r\n }\r\n }\r\n } catch (error) {\r\n callback(errorValidMsg(`${error}`));\r\n }\r\n }\r\n };\r\n\r\n const clearPasteModal = () => {\r\n setPasteData(\"\");\r\n setPasteVisible(false);\r\n setPasteValidMsg(modalMsgs.paste);\r\n };\r\n\r\n const [qrKey, setQrKey] = React.useState(0);\r\n\r\n const clearQrModal = () => {\r\n setQrKey(qrKey + 1);\r\n setQrData(\"\");\r\n setQrVisible(false);\r\n setQrValidMsg(modalMsgs.scan);\r\n };\r\n\r\n const clearInputs = () => {\r\n setId(\"\");\r\n setSalt(\"\");\r\n setProof(\"\");\r\n };\r\n\r\n // {\"id\":\"0d 0hr 4min\",\"keySalt\":\"salt_16248_229_82391\",\"keyProof\":\"token_9e16e_1575d_66456\"}\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n \r\n Quick fill with:\r\n \r\n
{\" \"}\r\n \r\n setQrVisible(true)}\r\n >\r\n {\" \"}\r\n
\r\n QR Code\r\n \r\n setPasteVisible(true)}\r\n >\r\n {\" \"}\r\n
\r\n From Copy\r\n \r\n \r\n \r\n
\r\n Name:\r\n setId(trimf(e.target.value))}\r\n />\r\n
\r\n
\r\n \r\n Random (salt):\r\n \r\n setSalt(trimf(e.target.value))}\r\n />\r\n
\r\n
\r\n \r\n Proof (token):\r\n \r\n setProof(trimf(e.target.value))}\r\n />\r\n
\r\n
\r\n \r\n {\r\n let key: KeyDef = {\r\n id: id,\r\n keySalt: salt,\r\n keyProof: proof\r\n };\r\n if (props.onSubmit) {\r\n if (props.onSubmit(key)) {\r\n clearInputs();\r\n }\r\n }\r\n }}\r\n >\r\n {props.buttonText}\r\n \r\n
\r\n
\r\n {\r\n let key: KeyDef = JSON.parse(pasteData);\r\n setId(key.id);\r\n setProof(key.keyProof);\r\n setSalt(key.keySalt);\r\n clearPasteModal();\r\n }}\r\n onCancel={() => {\r\n setPasteVisible(false);\r\n clearPasteModal();\r\n }}\r\n closable={false}\r\n >\r\n \r\n \r\n {\r\n setPasteData(e.target.value);\r\n validateKeyObj(e.target.value, modalMsgs.paste, setPasteValidMsg);\r\n }}\r\n style={{ height: \"100%\", marginTop: \"10px\" }}\r\n />\r\n \r\n \r\n {\r\n let key: KeyDef = JSON.parse(qrData);\r\n setId(key.id);\r\n setProof(key.keyProof);\r\n setSalt(key.keySalt);\r\n clearQrModal();\r\n }}\r\n onCancel={() => {\r\n setQrVisible(false);\r\n clearQrModal();\r\n }}\r\n closable={false}\r\n >\r\n {\" \"}\r\n \r\n \r\n {qrVisible ? (\r\n {\r\n setQrData(\"\");\r\n setQrValidMsg(errorValidMsg(`${err}`));\r\n }}\r\n onScan={(data) => {\r\n // Called for each Instance\r\n if (data && qrVisible) {\r\n // \"&& qrReadOpen\" => Check if our instance\r\n validateKeyObj(data, modalMsgs.scan, setQrValidMsg);\r\n setQrData(data);\r\n console.log(data);\r\n }\r\n }}\r\n facingMode={\"environment\"}\r\n />\r\n ) : (\r\n <>\r\n )}\r\n \r\n \r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport {\r\n Button,\r\n Divider,\r\n Modal,\r\n Radio,\r\n Input,\r\n List,\r\n message,\r\n Alert,\r\n Steps,\r\n Typography,\r\n Space,\r\n DatePicker,\r\n Collapse,\r\n Tag,\r\n Select,\r\n TimePicker,\r\n InputNumber\r\n} from \"antd\";\r\n\r\nimport { AlertType, ResultAlert } from \"../components/ResultAlert\";\r\n\r\nimport { fetchStartUnlock } from \"../api/api-def\";\r\n\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport { addUnLockedData, KeyDef, LockedDataDef } from \"../redux/main-slice\";\r\nimport { KeyInput } from \"./KeyInput\";\r\n\r\nconst { Option } = Select;\r\n\r\nexport function StartUnlock() {\r\n const dispath = useAppDispatch();\r\n const keys = useAppSelector((s) => s.main.keys);\r\n const locked = useAppSelector((s) => s.main.lockedData);\r\n\r\n const [alertList, setAlertList] = React.useState(\r\n [] as Array<[AlertType, string]>\r\n );\r\n // Local variables will get reset every render upon mutation whereas state will update\r\n const [clearOldTimeout, setClearOldTimeout] = React.useState(-1);\r\n\r\n const resetClearTimeout = () => {\r\n if (clearOldTimeout > -1) {\r\n clearTimeout(clearOldTimeout);\r\n }\r\n setClearOldTimeout(setTimeout(() => setAlertList([]), 5 * 1000));\r\n };\r\n\r\n const addAlert = (type: AlertType, msg: string) => {\r\n setAlertList((old) => [[type, msg], ...old]);\r\n resetClearTimeout();\r\n };\r\n\r\n /* const [keyId, setKeyId] = React.useState(\"\");\r\n const [keyProof, setKeyProof] = React.useState(\"\"); */\r\n\r\n const [sLocked, setSLocked] = React.useState({\r\n desc: \"\",\r\n encData: \"\",\r\n availablePass: []\r\n } as LockedDataDef);\r\n\r\n const [offset, setOffset] = React.useState(0);\r\n\r\n let startUnlockProcess = (cbKey: KeyDef) => {\r\n let key = keys.filter((k) => k.id === cbKey.id)[0];\r\n let encPass = sLocked.availablePass.filter(\r\n (e) => e.keySalt === key.keySalt\r\n )[0].encPass;\r\n fetchStartUnlock(encPass, key.keySalt, key.id, cbKey.keyProof, offset)\r\n .then((result) => {\r\n if (!!result.err) {\r\n addAlert(\"error\", `${result.err || \"\"}`);\r\n return;\r\n } else {\r\n try {\r\n dispath(\r\n addUnLockedData({\r\n desc: sLocked.desc,\r\n encData: sLocked.encData,\r\n encPass: encPass,\r\n\r\n keySalt: key.keySalt,\r\n keyID: key.id,\r\n\r\n from: result.data.from,\r\n to: result.data.to,\r\n\r\n unlockProof: result.data.proof\r\n })\r\n );\r\n addAlert(\r\n \"success\",\r\n `Data \"${sLocked.desc}\" is now in unlock queue!`\r\n );\r\n setOffset(0);\r\n } catch (error) {}\r\n }\r\n })\r\n .catch((e) => {\r\n addAlert(\"error\", `Error fetching: ${e}`);\r\n });\r\n return true;\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Choose the data to unlock: \r\n
\r\n {\r\n setSLocked(locked.filter((l) => l.desc === e.target.value)[0]);\r\n }}\r\n value={sLocked && sLocked.desc}\r\n >\r\n {locked.map((l) => (\r\n \r\n {l.desc}\r\n \r\n ))}\r\n \r\n
\r\n \r\n Add lock time, for schedule: (min)\r\n \r\n setOffset(parseInt(e.currentTarget.value, 10) || 0)}\r\n onChange={(e) => setOffset(parseInt(e, 10) || 0)}\r\n />\r\n Enter key info to unlock: \r\n !!sLocked.desc}\r\n onSubmit={startUnlockProcess}\r\n buttonText=\"Add to unlock queue!\"\r\n />\r\n {alertList.map((e) => (\r\n \r\n ))}\r\n
\r\n\r\n {/* \r\n \r\n
\r\n startUnlockProcess()}\r\n >\r\n Add to unlock queue!\r\n \r\n
\r\n \r\n
\r\n \r\n Enter the key ID and salt:\r\n \r\n setKeyId(e)}\r\n >\r\n {sLocked &&\r\n keys\r\n .filter(\r\n (k) =>\r\n sLocked.availablePass.findIndex(\r\n (p) => p.keySalt === k.keySalt\r\n ) > -1\r\n )\r\n .map((k) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n \r\n Enter token\\proof:\r\n \r\n setKeyProof(e.target.value)}\r\n />\r\n
*/}\r\n\r\n {/* When should we start counting down the time? \r\n setStartNow(e.target.checked)}\r\n >\r\n Now\r\n \r\n \r\n {\r\n let disabled = d.toDate().getTime() < Date.now();\r\n if (disabled) {\r\n if (\r\n d.toDate().toISOString().split(\"T\")[0] ===\r\n new Date().toISOString().split(\"T\")[0]\r\n )\r\n disabled = false;\r\n }\r\n return disabled;\r\n }}\r\n />\r\n d.toDate().getTime() < Date.now() + 60 * 1000}\r\n />\r\n \r\n \r\n {\"(\"} + The time delay from the key {\")\"}{\" \"}\r\n \r\n How long will the data be available after unlock (min)? \r\n \r\n */}\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport {\r\n Avatar,\r\n Button,\r\n Divider,\r\n Modal,\r\n Radio,\r\n Input,\r\n List,\r\n message,\r\n Alert,\r\n Steps,\r\n Typography,\r\n Space,\r\n DatePicker,\r\n Collapse,\r\n Tag,\r\n Select,\r\n TimePicker\r\n} from \"antd\";\r\n\r\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\r\nimport {\r\n addKey,\r\n delKey,\r\n delLockedData,\r\n delUnLockedData\r\n} from \"../redux/main-slice\";\r\n\r\nexport function DebugData() {\r\n const dispatch = useAppDispatch();\r\n const keys = useAppSelector((state) => state.main.keys);\r\n const locked = useAppSelector((state) => state.main.lockedData);\r\n const unlocks = useAppSelector((state) => state.main.unlocks);\r\n const temps = useAppSelector((state) => state.main.temps);\r\n\r\n const [url, setUrl] = React.useState(\r\n localStorage.getItem(\"SERVER_URL\") || \"\"\r\n );\r\n\r\n const addKey_ = (name: string) => {\r\n dispatch(\r\n addKey({\r\n id: \"key\" + Math.random(),\r\n keySalt: Math.random() + \"_\" + Math.random(),\r\n keyProof: Math.random() + \"_\" + Math.random()\r\n })\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n Keys\r\n {keys.map((e) => (\r\n
  • \r\n {e.id} {\" \"}\r\n
    \r\n salt: {e.keySalt}\r\n
    \r\n proof: {e.keyProof}\r\n
  • \r\n ))}\r\n
\r\n
    \r\n Locked\r\n\r\n {locked.map((e) => (\r\n
  • \r\n {e.desc} ({e.availablePass.length} keys){\" \"}\r\n {\" \"}\r\n
      \r\n {e.availablePass.map((k, i) => (\r\n <>\r\n
    • \r\n {k.keySalt}, pass len: {k.encPass.length}\r\n
    • \r\n \r\n ))}\r\n
    \r\n
  • \r\n ))}\r\n
\r\n
    \r\n Unlocks\r\n\r\n {unlocks.map((e) => (\r\n
  • \r\n {e.desc}: {e.from} - {e.to}\r\n dispatch(delUnLockedData(e.keySalt, e.from, e.to))}\r\n >\r\n Del\r\n {\" \"}\r\n
  • \r\n ))}\r\n
\r\n
    \r\n Temps\r\n\r\n {temps.map((e) => (\r\n
  • \r\n {e.token}: {e.from} - {e.tempproof}\r\n
  • \r\n ))}\r\n
\r\n

\r\n Change API URL:{\" \"}\r\n setUrl(e.target.value)} />{\" \"}\r\n {\r\n localStorage.setItem(\"SERVER_URL\", url);\r\n window.location.reload();\r\n }}\r\n >\r\n Change!\r\n \r\n

\r\n \r\n );\r\n}\r\n","import * as React from \"react\";\n\nimport { Space } from \"antd\";\n\nimport { AlertType, ResultAlert } from \"./ResultAlert\";\n\nexport function AddToAlertList(listName: string, type: AlertType, msg: string) {\n document.dispatchEvent(\n new CustomEvent(\"alert-list-\" + listName, { detail: { type, msg } })\n );\n}\n\nexport function AlertList(props: { listName: string }) {\n const [alertList, setAlertList] = React.useState(\n [] as Array<[AlertType, string]>\n );\n // Local variables will get reset every render upon mutation whereas state will update\n const [clearOldTimeout, setClearOldTimeout] = React.useState(-1);\n\n const eventHandler = (e: CustomEvent<{ type: AlertType; msg: string }>) => {\n const { type, msg } = e.detail;\n addAlert(type, msg);\n };\n\n const addAlert = (type: AlertType, msg: string) => {\n setAlertList((old) => [[type, msg], ...old]);\n resetClearTimeout();\n };\n\n const resetClearTimeout = () => {\n if (clearOldTimeout > -1) {\n clearTimeout(clearOldTimeout);\n }\n setClearOldTimeout(\n setTimeout(() => setAlertList([]), 5 * 1000) as unknown as number\n );\n };\n\n React.useEffect(() => {\n document.addEventListener(\"alert-list-\" + props.listName, eventHandler);\n\n return function cleanup() {\n document.removeEventListener(\n \"alert-list-\" + props.listName,\n eventHandler\n );\n };\n }, []);\n\n return (\n
\n \n {alertList.map((e) => (\n \n ))}\n \n
\n );\n}\n","import * as React from \"react\";\n\nimport { Space } from \"antd\";\n\nimport { AlertList, AddToAlertList } from \"./AlertList\";\n\nimport { fetchCreateTemp } from \"../api/api-def\";\n\nimport { useAppDispatch } from \"../redux/store\";\nimport { addTempInfo, KeyDef } from \"../redux/main-slice\";\nimport { KeyInput } from \"./KeyInput\";\n\nexport function StoreForTemp() {\n const dispath = useAppDispatch();\n //const temps = useAppSelector((s) => s.main.temps);\n const ALERT_LIST_NAME = \"StoreForTemp\";\n\n let startSaveTempProcess = (key: KeyDef) => {\n fetchCreateTemp(key.id, key.keyProof, key.keySalt)\n .then((result) => {\n if (!!result.err) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `${result.err || \"\"}`\n );\n return;\n } else {\n try {\n dispath(\n addTempInfo({\n from: result.data.from,\n tempproof: result.data.tempproof,\n salt: key.keySalt,\n token: key.id\n })\n );\n AddToAlertList(\n ALERT_LIST_NAME,\n \"success\",\n `Stored key ${key.id} for later!`\n );\n } catch (error) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `Error storing key for later: ${error}`\n );\n }\n }\n })\n .catch((e) =>\n AddToAlertList(ALERT_LIST_NAME, \"error\", `Error fetching: ${e}`)\n );\n\n return true;\n };\n\n return (\n <>\n \n Enter key info to store: \n true}\n onSubmit={(key) => startSaveTempProcess(key)}\n buttonText=\"Remember it!\"\n />\n \n \n \n );\n}\n","import * as React from \"react\";\n\nimport {\n Alert,\n Button,\n Card,\n Descriptions,\n Modal,\n Progress,\n Radio,\n Result,\n Space,\n Typography\n} from \"antd\";\n\nimport { AlertList, AddToAlertList } from \"./AlertList\";\n\nimport { fetchCreateTemp, fetchConvertFastTemp } from \"../api/api-def\";\n\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\nimport {\n addTempInfo,\n delTempInfo,\n KeyDef,\n TempStartInfo\n} from \"../redux/main-slice\";\nimport { KeyInput } from \"./KeyInput\";\nimport { BoldTime } from \"./BoldTime\";\n\nimport { default as prettyms } from \"pretty-ms\";\n\nconst { Text } = Typography;\n\nexport function ShowCode(props: { code: string }) {\n return (\n
\n {props.code.split(\"\").map((c) => (\n \n {c}\n \n ))}\n
\n );\n}\n\nexport function ShareTemp() {\n const dispath = useAppDispatch();\n const temps = useAppSelector((s) => s.main.temps);\n const ALERT_LIST_NAME = \"SHARE_TEMP_LIST\";\n\n const [myNow, setMyNow] = React.useState(Date.now());\n React.useEffect(() => {\n let updateTime = () => setMyNow(Date.now());\n let id = setInterval(updateTime, 2 * 1000);\n\n return () => {\n clearInterval(id);\n };\n });\n\n const [selectedTemp, setSelectedTemp] = React.useState(null as TempStartInfo);\n\n const VALID_TIME: number = 3 * 60 * 1000; // 3 min\n const [tempCodeStart, setTempCodeStart] = React.useState(Date.now());\n const [tempCode, setTempCode] = React.useState([\"0000\", \"0000\"]);\n const [shareVisible, setVisibleShare] = React.useState(false);\n\n const showTempCode = (code, time) => {\n setTempCode([code, time]);\n setTempCodeStart(Date.now());\n setVisibleShare(true);\n };\n\n let startShareTemp = (tempinfo: TempStartInfo) => {\n fetchConvertFastTemp(\n tempinfo.token,\n tempinfo.tempproof,\n tempinfo.from,\n tempinfo.salt\n )\n .then((result) => {\n if (!!result.err) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `${result.err || \"\"}`\n );\n return;\n } else {\n try {\n dispath(delTempInfo(tempinfo.tempproof));\n showTempCode(result.data.fastproof, result.data.mindiff);\n } catch (error) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `Error gettign a share code: ${error}`\n );\n }\n }\n })\n .catch((e) =>\n AddToAlertList(ALERT_LIST_NAME, \"error\", `Error fetching: ${e}`)\n );\n\n return true;\n };\n\n const closeShowTemp = () => {\n setSelectedTemp(null);\n setVisibleShare(false);\n };\n\n return (\n <>\n \n \n Any shared code will be valid for 3 minutes and gone\n forever\n \n }\n type=\"warning\"\n showIcon\n closable={false}\n />\n {\n setSelectedTemp(\n temps.filter((l) => l.tempproof === e.target.value)[0]\n );\n }}\n value={selectedTemp && selectedTemp.tempproof}\n >\n {temps.map((e) => (\n \n \n \n Time passed: \n {prettyms(myNow - e.from, { secondsDecimalDigits: 0 })}\n \n    \n \n ))}\n \n \n startShareTemp(selectedTemp)}\n >\n Share Selected\n \n }\n onOk={closeShowTemp}\n onCancel={closeShowTemp}\n >\n \n \n \n \n \n \n \n \n \n \n \n }\n />\n Time Left until expire:{\" \"}\n \n {prettyms(Math.max(0, tempCodeStart + VALID_TIME - myNow), {\n secondsDecimalDigits: 0\n })}\n \n \n \n \n \n );\n}\n","import * as React from \"react\";\n\nimport { Radio, Space, Input, Button } from \"antd\";\n\nimport { AlertList, AddToAlertList } from \"./AlertList\";\n\nimport { fetchCreateTemp, fetchUnloackWithFast } from \"../api/api-def\";\n\nimport { useAppDispatch, useAppSelector } from \"../redux/store\";\nimport {\n addTempInfo,\n addUnLockedData,\n KeyDef,\n LockedDataDef\n} from \"../redux/main-slice\";\nimport { KeyInput } from \"./KeyInput\";\nimport { BoldTime } from \"./BoldTime\";\n\nexport function UseSharedCode() {\n const dispath = useAppDispatch();\n const keys = useAppSelector((s) => s.main.keys);\n const locks = useAppSelector((s) => s.main.lockedData);\n const ALERT_LIST_NAME = \"USE_SHARED_CODE\";\n\n let startUnlockWithSharedCode = (\n locked: LockedDataDef,\n key: KeyDef,\n code: string,\n time: string\n ) => {\n let encPassObj = locked.availablePass.filter(\n (e) => e.keySalt === key.keySalt\n )[0];\n\n fetchUnloackWithFast(key.id, key.keySalt, time, code, encPassObj.encPass)\n .then((result) => {\n if (!!result.err) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `${result.err || \"\"}`\n );\n return;\n } else {\n try {\n dispath(\n addUnLockedData({\n desc: locked.desc,\n encPass: encPassObj.encPass,\n encData: locked.encData,\n from: result.data.from,\n to: result.data.to,\n unlockProof: result.data.proof,\n keyID: key.id,\n keySalt: key.keySalt\n })\n );\n AddToAlertList(\n ALERT_LIST_NAME,\n \"success\",\n `Added ${locked.desc} to the unlocked queue1`\n );\n setSelectedLocked(null);\n setSelectedSaltKey(null);\n setTimeCode(\"\");\n setShareCode(\"\");\n } catch (error) {\n AddToAlertList(\n ALERT_LIST_NAME,\n \"error\",\n `Error unlocking using share: ${error}`\n );\n }\n }\n })\n .catch((e) =>\n AddToAlertList(ALERT_LIST_NAME, \"error\", `Error fetching: ${e}`)\n );\n };\n\n const [selectedLocked, setSelectedLocked] = React.useState(\n null as LockedDataDef\n );\n const [selectedSaltKey, setSelectedSaltKey] = React.useState(null as KeyDef);\n const [shareCode, setShareCode] = React.useState(\"\");\n const [timeCode, setTimeCode] = React.useState(\"\");\n\n return (\n <>\n \n Choose Locked Item:\n {\n setSelectedLocked(\n locks.filter((l) => l.encData === e.target.value)[0]\n );\n setSelectedSaltKey(null);\n }}\n value={selectedLocked && selectedLocked.encData}\n >\n {locks.map((e) => (\n \n {e.desc}\n \n ))}\n \n Choose Key to Unlock:\n {\n setSelectedSaltKey(\n keys.filter((l) => l.keySalt === e.target.value)[0]\n );\n }}\n value={selectedSaltKey && selectedSaltKey.keySalt}\n >\n {!!selectedLocked &&\n keys\n .filter(\n (e) =>\n selectedLocked.availablePass.findIndex(\n (j) => j.keySalt === e.keySalt\n ) > -1\n )\n .map((e) => (\n \n \n \n ))}\n \n Enter the shared code:\n
\n Code:\n \n setShareCode(\n ((e.target.value || \"\").match(/[a-zA-Z0-9]+/) || [\"\"])[0]\n .toUpperCase()\n .trim()\n .substring(0, 6)\n )\n }\n />\n
\n
\n Time:\n \n setTimeCode(\n ((e.target.value || \"\").match(/[0-9]+/) || [\"\"])[0]\n .toUpperCase()\n .trim()\n .substring(0, 4)\n )\n }\n />\n
\n \n \n startUnlockWithSharedCode(\n selectedLocked,\n selectedSaltKey,\n shareCode,\n timeCode\n )\n }\n >\n Add to unlock queue!\n \n
\n \n );\n}\n","import * as React from \"react\";\nimport \"./styles.css\";\nimport \"antd/dist/antd.css\";\n\nimport { logo } from \"./img/logo\";\nimport keysvg from \"./img/key.svg\";\n\nimport {\n Avatar,\n Button,\n Divider,\n Modal,\n Radio,\n Input,\n List,\n message,\n Alert,\n Steps,\n Typography,\n Space,\n DatePicker,\n Collapse,\n Tag,\n Select,\n TimePicker,\n Empty\n} from \"antd\";\n\nimport {\n CaretUpOutlined,\n CheckOutlined,\n CopyOutlined,\n DeleteOutlined,\n QrcodeOutlined,\n SmileFilled,\n SmileOutlined\n} from \"@ant-design/icons\";\n\nimport * as encryptor from \"simple-encryptor\";\n\nimport { setTheme, getTheme, ToggleDarkMode } from \"./layout/darkmode\";\n\nimport { CreateNewKeys } from \"./components/CreateNewKeys\";\nimport { AddLockData } from \"./components/AddLockData\";\nimport { ShareForgetKeys } from \"./components/ShareOrForget\";\nimport { MobileDataHelperModal } from \"./components/MobileDataHelperModal\";\nimport { AlertType, ResultAlert } from \"./components/ResultAlert\";\nimport { StartUnlock } from \"./components/StartUnlock\";\nimport { DebugData } from \"./components/DebugData\";\nimport { AvailableData } from \"./components/AvailData\";\nimport { KeyInput } from \"./components/KeyInput\";\n\nimport throttle from \"lodash/throttle\";\n\nimport {\n fetchNewGroup,\n Group,\n fetchEncPass,\n fetchStartUnlock,\n fetchFinishUnlock\n} from \"./api/api-def\";\n\nimport { Provider } from \"react-redux\";\nimport { store, useAppDispatch, useAppSelector } from \"./redux/store\";\nimport {\n addKey,\n addUnLockedData,\n delKey,\n delLockedData,\n delUnLockedData,\n KeyDef,\n LockedDataDef,\n UnlockDef,\n clearAll\n} from \"./redux/main-slice\";\n\nimport { default as prettyms } from \"pretty-ms\";\n\nimport * as QrReaderAll from \"react-qr-reader\";\nimport * as QRCodeALL from \"qrcode.react\";\nimport { StoreForTemp } from \"./components/StoreForTemp\";\nimport { CEmoji } from \"./components/CEmoji\";\nimport { ShareTemp } from \"./components/ShareTemp\";\nimport { UseSharedCode } from \"./components/UseSharedCode\";\nconst QrReader = QrReaderAll.default;\nconst QrCode = QRCodeALL.default;\n\nconst { TextArea } = Input;\nconst { Option } = Select;\nconst { Panel } = Collapse;\nconst { Title, Text, Paragraph } = Typography;\nconst { RangePicker } = DatePicker;\nconst { Step } = Steps;\n\n/*\nUnlocked data :\n (never save unlocked local)\n If open, click to Read Data (copy per line)\n timer until unlocking and then locked again \n\nDecrypt with token -> read salt,token, and show matched encrypted data that can be decrypted\n\nAdd data -> Choose token (Group->token = salt->token)\n Or from camera\n\nAdd tokens-> name group -> Save group,salt,[tokens]\nShare\\Copy Tokens \\ QR images\n\nForget tokens -> only token! not salt+name, salt is needed to dec\n\nGroup, Delayed Key(s), Locked Data, Available Data\n\n\nLater:\n- 2fa tool to show on link enter (with temporal redirect to avoid bookmark?)\n- add warning about making locks for long time and that you waver all responsibolity\n- warning about trying to open first before using locks\n closeable only (no save in localStorage)\n- export\\import unlocked data with share 1 min link\\8 num code\n from mobile to pc, and not native copy paste\n- google ads?\ncloudflare pages?\n\nhttps://usexd.sse.codesandbox.io/redirect?url=https://0nek1.csb.app/\n\n\n\n20 * log(256)/log(20000*10) = 9.085 (10 words with ending 1...10)\n*/\n\nexport function ImportKeys() {\n const dispatch = useAppDispatch();\n const keys = useAppSelector((s) => s.main.keys);\n\n const [msg, setMsg] = React.useState(\"\");\n\n const callback = (final: KeyDef) => {\n let existLength = keys.filter(\n (k) => k.id === final.id && k.keyProof === final.keyProof\n ).length;\n if (existLength === 0) {\n dispatch(addKey(final));\n setMsg(\"\");\n return true;\n } else {\n setMsg(`Key '${final.id}' already exists`);\n return false;\n }\n };\n return (\n \n \n {!!msg && }\n \n );\n}\n\nexport function ManageData() {\n const dispatch = useAppDispatch();\n const locked = useAppSelector((s) => s.main.lockedData);\n const [dataName, setDataName] = React.useState(\"\");\n\n const deleteSelected = () => {\n dispatch(delLockedData(dataName));\n setDataName(\"\");\n };\n\n return (\n <>\n \n {\n setDataName(e.target.value);\n }}\n value={dataName}\n >\n {locked.map((l) => (\n \n {l.desc}\n \n ))}\n \n \n \n \n \n );\n}\n\n// ==================================================\n// =========== MAIN CODE =========\n// ==================================================\n\nexport function ClearAll(props: { style?: React.CSSProperties }) {\n const dispatch = useAppDispatch();\n return (\n {\n dispatch(clearAll(\"\"));\n }}\n >\n Clear All Data\n \n );\n}\n\nexport default function App() {\n const [showDebug, setShowDebug] = React.useState(false);\n\n const [scrollTimeout, setScrollTimeout] = React.useState(0);\n const onCollapse = (e: Element) => {\n clearTimeout(scrollTimeout);\n setScrollTimeout(\n (setTimeout(() => {\n (e as HTMLElement).scrollIntoView({\n block: \"start\",\n behavior: \"smooth\"\n });\n }, 450) as unknown) as number\n );\n };\n\n React.useEffect(() => {\n const throttleFunc = throttle((e) => onCollapse(e), 1000);\n\n document.querySelectorAll(\".ant-collapse-header\").forEach((e) =>\n e.addEventListener(\"click\", (h) => {\n throttleFunc(e);\n })\n );\n\n return () => {\n document.querySelectorAll(\".ant-collapse-header\").forEach((e) =>\n e.removeEventListener(\"click\", (h) => {\n throttleFunc(e);\n })\n );\n };\n }, []);\n\n const [mainKeys, setMainKeys] = React.useState(\"1\");\n\n return (\n \n
\n
\n
\n \n
\n <>\n \n \n {\" \"}\n <CEmoji text=\"\" /> Available Data:\n {\" \"}\n \n \n \n \n {\" \"}\n <CEmoji text=\"⚔\" /> Everyday use:\n {\" \"}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {\" \"}\n \n {\" \"}\n <CEmoji text=\"1️⃣\" /> Once in a while:\n {\" \"}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {showDebug && (\n <>\n
\n \n {\" \"}\n \n {\" \"}\n <CEmoji text=\"🔌\" /> Debug\n {\" \"}\n \n \n \n \n \n \n \n \n )}\n \n \n
\n Free trial provided with no cost,\n
\n thanks to the free resources from Vercel.com + CodeSandbox.io 💘{\" \"}\n
\n Copyright 2021-2022 (c) timelock.my123.app (c) 123timelock
\n Version 3 - 20/03/22 7:00 PM
\n {\" \"}\n
\n
\n
\n );\n}\n","import * as React from \"react\";\r\nimport { render } from \"react-dom\";\r\n\r\nimport App from \"./App\";\r\n\r\nconst rootElement = document.getElementById(\"root\");\r\nrender(, rootElement);\r\n"],"sourceRoot":""}