You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
7.0 KiB
1 lines
7.0 KiB
(()=>{var h=class{};var T="%%\u{1F510}\u03B2 ",F="\u{1F510}\u03B2 ",v="%%\u{1F510}\u03B1 ",D="\u{1F510}\u03B1 ",B="%%\u{1F510} ",S="\u{1F510} ";var f=[T,F,v,D,B,S],C=" \u{1F510}%%",O=" \u{1F510}",b=[C,O],y="\u{1F4A1}";var g=class{constructor(e){this.process(e)}process(e){var r,t;if(this.processedText=e,this.isEmpty=e.length===0,this.prefix=(r=f.find(n=>e.startsWith(n)))!=null?r:"",this.suffix=(t=b.find(n=>e.endsWith(n)))!=null?t:"",this.hasEncryptedPrefix=this.prefix.length>0,this.hasEncryptedSuffix=this.suffix.length>0,this.hasObsoleteEncryptedPrefix=this.prefix===B||this.prefix===S,this.containsEncryptedMarkers=[...f,...b].some(n=>e.includes(n)),this.canDecrypt=this.hasEncryptedPrefix&&this.hasEncryptedSuffix,this.canEncrypt=!this.hasEncryptedPrefix&&!this.containsEncryptedMarkers,this.canDecrypt){let n=this.parseDecryptableContent(e);n!=null?this.decryptable=n:this.canDecrypt=!1}}parseDecryptableContent(e){let r=new h;if(!this.hasEncryptedPrefix||!this.hasEncryptedSuffix)return null;this.hasObsoleteEncryptedPrefix?r.version=0:this.prefix==T||this.prefix==F?r.version=2:(this.prefix==v||this.prefix==D)&&(r.version=1);let t=e.substring(this.prefix.length,e.length-this.suffix.length);if([...f,...b].some(n=>t.includes(n)))return null;if(t.substring(0,y.length)==y){let n=t.indexOf(y,y.length);if(n<0)return null;r.hint=t.substring(y.length,n),r.base64CipherText=t.substring(n+y.length)}else r.base64CipherText=t;return r.showInReadingView=!this.prefix.includes("%%"),r}};var I=new TextEncoder,U=new TextDecoder,K=1e3,L=I.encode("XHWnDAT6ehMVY2zD"),d=class{async deriveKey(e){let r=I.encode(e),t=await crypto.subtle.importKey("raw",r,{name:"PBKDF2"},!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",hash:{name:"SHA-256"},iterations:K,salt:L},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async encryptToBytes(e,r){let t=await this.deriveKey(r),n=I.encode(e),o=crypto.getRandomValues(new Uint8Array(16)),s=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o},t,n)),i=new Uint8Array(o.byteLength+s.byteLength);return i.set(o,0),i.set(s,o.byteLength),i}convertToString(e){let r="";for(let t=0;t<e.length;t++)r+=String.fromCharCode(e[t]);return r}async encryptToBase64(e,r){let t=await this.encryptToBytes(e,r);return btoa(this.convertToString(t))}stringToArray(e){let r=[];for(let t=0;t<e.length;t++)r.push(e.charCodeAt(t));return new Uint8Array(r)}async decryptFromBytes(e,r){try{let t=e.slice(0,16),n=e.slice(16),o=await this.deriveKey(r),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},o,n);return U.decode(s)}catch(t){return null}}async decryptFromBase64(e,r){try{let t=this.stringToArray(atob(e));return await this.decryptFromBytes(t,r)}catch(t){return null}}};var u=class{constructor(e,r,t){this.vectorSize=e,this.saltSize=r,this.iterations=t}async deriveKey(e,r){let n=new TextEncoder().encode(e),o=await crypto.subtle.importKey("raw",n,"PBKDF2",!1,["deriveKey"]);return await crypto.subtle.deriveKey({name:"PBKDF2",hash:"SHA-512",salt:r,iterations:this.iterations},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async encryptToBytes(e,r){let t=crypto.getRandomValues(new Uint8Array(this.saltSize)),n=await this.deriveKey(r,t),s=new TextEncoder().encode(e),i=crypto.getRandomValues(new Uint8Array(this.vectorSize)),c=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:i},n,s)),p=new Uint8Array(i.byteLength+t.byteLength+c.byteLength);return p.set(i,0),p.set(t,i.byteLength),p.set(c,i.byteLength+t.byteLength),p}convertToString(e){let r="";for(let t=0;t<e.length;t++)r+=String.fromCharCode(e[t]);return r}async encryptToBase64(e,r){let t=await this.encryptToBytes(e,r);return btoa(this.convertToString(t))}stringToArray(e){let r=[];for(let t=0;t<e.length;t++)r.push(e.charCodeAt(t));return new Uint8Array(r)}async decryptFromBytes(e,r){try{let t,n;t=0,n=t+this.vectorSize;let o=e.slice(t,n);t=n,n=t+this.saltSize;let s=e.slice(t,n);t=n,n=void 0;let i=e.slice(t),c=await this.deriveKey(r,s),p=await crypto.subtle.decrypt({name:"AES-GCM",iv:o},c,i);return new TextDecoder().decode(p)}catch(t){return null}}async decryptFromBase64(e,r){try{let t=this.stringToArray(atob(e));return await this.decryptFromBytes(t,r)}catch(t){return null}}};var A={name:"AES-GCM",iv:new Uint8Array([196,190,240,190,188,78,41,132,15,220,84,211]),tagLength:128},m=class{async buildKey(e){let t=new TextEncoder().encode(e),n=await crypto.subtle.digest({name:"SHA-256"},t);return await crypto.subtle.importKey("raw",n,A,!1,["encrypt","decrypt"])}async encryptToBase64(e,r){let t=await this.buildKey(r),o=new TextEncoder().encode(e),s=new Uint8Array(await crypto.subtle.encrypt(A,t,o));return btoa(String.fromCharCode(...s))}stringToArray(e){let r=[];for(let t=0;t<e.length;t++)r.push(e.charCodeAt(t));return new Uint8Array(r)}async decryptFromBase64(e,r){try{let t=this.stringToArray(atob(e)),n=await this.buildKey(r),o=await crypto.subtle.decrypt(A,n,t);return new TextDecoder().decode(o)}catch(t){return null}}};var l=class a{static BuildDefault(){return new u(16,16,21e4)}static BuildFromFileDataOrThrow(e){let r=a.BuildFromFileDataOrNull(e);if(r!=null)return r;throw new Error(`Unable to determine ICryptoHelper for File ver ${e.version}`)}static BuildFromFileDataOrNull(e){return e.version=="1.0"?new d:e.version=="2.0"?new u(16,16,21e4):null}static BuildFromDecryptableOrThrow(e){let r=a.BuildFromDecryptableOrNull(e);if(r!=null)return r;throw new Error(`Unable to determine ICryptoHelper for Decryptable ver ${e.version}`)}static BuildFromDecryptableOrNull(e){return e.version==0?new m:e.version==1?new d:e.version==2?new u(16,16,21e4):null}};var E=class{constructor(e,r,t){this.version="1.0";this.version=e,this.hint=r,this.encodedData=t}},w=class w{static async encrypt(e,r,t){let o=await l.BuildDefault().encryptToBase64(t,e);return new E(w.DEFAULT_VERSION,r,o)}static async decrypt(e,r){return e.encodedData==""?"":await l.BuildFromFileDataOrThrow(e).decryptFromBase64(e.encodedData,r)}};w.DEFAULT_VERSION="2.0";var _=w,x=class{static encode(e){return JSON.stringify(e,null,2)}static isEncoded(e){try{return JSON.parse(e),!0}catch(r){return!1}}static decode(e){return e===""?new E(_.DEFAULT_VERSION,"",""):JSON.parse(e)}};var P=class{async decrypt(e,r){console.info("Trying the default decryption");let n=await l.BuildDefault().decryptFromBase64(e,r);if(n!=null)return n;console.info("Trying marked inplace feature decryption");let o=new g(e);if(o.decryptable!=null){let s=l.BuildFromDecryptableOrNull(o.decryptable);if(s!=null){let i=await s.decryptFromBase64(o.decryptable.base64CipherText,r);if(i!=null)return i}}for(let s=10;s>=0;s--){console.info("Trying non-marked inplace feature decryption","ver",s);let i={version:s,base64CipherText:e,hint:"",showInReadingView:!1},c=l.BuildFromDecryptableOrNull(i),p=await(c==null?void 0:c.decryptFromBase64(i.base64CipherText,r));if(p!=null)return p}console.info("Trying whole note feature decryption");try{let s=x.decode(e);console.debug(s);let i=l.BuildFromFileDataOrNull(s),c=await(i==null?void 0:i.decryptFromBase64(s.encodedData,r));if(c!=null)return c}catch(s){console.info(s)}return null}};window.$=new P;})();
|
|
|