aboutsummaryrefslogtreecommitdiff
path: root/frontend/decryptor.js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/decryptor.js')
-rw-r--r--frontend/decryptor.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/frontend/decryptor.js b/frontend/decryptor.js
new file mode 100644
index 0000000..c37aa42
--- /dev/null
+++ b/frontend/decryptor.js
@@ -0,0 +1,84 @@
+//License: Expat(MIT)
+//Chrisoft Xiong 2017-2018
+var decid;
+function decryptui(id)
+{
+ document.getElementById("decryptui").style.display="block";
+ document.getElementById("keyinp").focus();
+ setTimeout(function(){document.getElementById("decryptui").style.opacity="1";},20);
+ decid=id;
+ document.getElementById("keyhint").innerHTML="Hint: "+document.querySelector(`encrypted[enid="${id}"]`).getAttribute("hint");
+ document.getElementById("keyinp").onkeypress=function(e){if(e.keyCode==13)document.getElementById('btndecrypt').click();}
+}
+function hidedecryptui()
+{
+ document.getElementById("decryptui").style.opacity="0";
+ setTimeout(function(){
+ document.getElementById("decryptui").style.display="none";
+ document.getElementById("keyinp").value="";
+ },500);
+}
+function _decrypt(id,ctr)
+{
+ const aes=aesjs,sha256=Sha256;
+ const e=document.querySelector(`encrypted[enid="${id}"]`);
+ const cont=e.getAttribute("encont");
+ const bc=atob(cont);
+ const b=new Array(bc.length);
+ for(var i=0;i<bc.length;++i)b[i]=bc.charCodeAt(i);
+ const deccont=ctr.decrypt(b);
+ const hash=sha256.hash(aes.utils.hex.fromBytes(deccont),{msgFormat:'hex-bytes'})
+ if(hash!=e.getAttribute("hash"))return false;
+ e.innerHTML=aes.utils.utf8.fromBytes(deccont);
+ e.removeAttribute("encont");
+ return true;
+}
+function _memokey(id,enk)
+{
+ try
+ {
+ const os=localStorage.getItem(`blogkeys${window.location.pathname}`);
+ const o=os&&os.length?JSON.parse(os):[];
+ o[Number(id)]=enk;
+ localStorage.setItem(`blogkeys${window.location.pathname}`,JSON.stringify(o));
+ }catch(e){console.warn(`local storage failed: ${e}`);}
+}
+async function decryptor(id,key)
+{
+ const aes=aesjs,sha256=Sha256;
+ const keyu8=aes.utils.utf8.toBytes(document.getElementById("keyinp").value);
+ const saltu8=aes.utils.utf8.toBytes('hellwhymustiaddsalttothiscrap');
+ const enckey=await new Promise(
+ (resolv,rej)=>
+ {scrypt(keyu8,saltu8,1024,16,2,32,(e,p,k)=>{e?rej(e):k?resolv(k):undefined;});}
+ );
+ const ctr=new aes.ModeOfOperation.ctr(enckey);
+ if(!_decrypt(id,ctr))
+ {
+ alert("The decryption key you have entered could be wrong, please try again.");
+ return;
+ }
+ _memokey(id,enckey);
+ for(let i of document.querySelectorAll('encrypted[encont]'))
+ if(_decrypt(i.getAttribute('enid'),ctr))_memokey(i.getAttribute('enid'),enckey);
+ footnoter();document.getElementById('purgep').style.display='';
+ hidedecryptui();
+}
+function _purgep()
+{
+ try{localStorage.removeItem(`blogkeys${window.location.pathname}`);}
+ catch(e){}
+ location.reload(true);
+}
+function _decryptonload()
+{
+ let o;
+ try
+ {
+ const os=localStorage.getItem(`blogkeys${window.location.pathname}`);
+ o=os&&os.length?JSON.parse(os):[];
+ }catch(e){console.warn(`local storage failed: ${e}`);}
+ for(let i of o.entries())
+ if(i[1]&&i[1].length)_decrypt(Number(i[0]).toString(),new aesjs.ModeOfOperation.ctr(i[1]));
+ if(o.length){footnoter();document.getElementById('purgep').style.display='';}
+}