|
@@ -4,6 +4,7 @@ import {pbkdf2} from "./pbkdf2.js";
|
|
|
import {Chacha20,encrypt as _encrypt,decrypt as _decrypt} from "./chacha.js";
|
|
|
|
|
|
const VERSION=1;
|
|
|
const MAX_ITERS=24;
|
|
|
|
|
|
function encrypt(s,password){
|
|
|
let bs=util.str2utf8(s);
|
|
@@ -25,10 +26,12 @@ function decrypt(s,password){
|
|
|
let salt=arr.slice(18,30);
|
|
|
let ciphertext=arr.slice(30);
|
|
|
|
|
|
if(ciphertext.length==0){return 4;}
|
|
|
if(version>VERSION){return 2;}
|
|
|
if(iters>MAX_ITERS){return 3;}
|
|
|
let key=pbkdf2(pass,salt,1<<iters,32);
|
|
|
let check=blake2s([version,iters].concat(salt,ciphertext),16,key);
|
|
|
if(!signature.every((b,i)=>b===check[i])){return 1;}
|
|
|
if(version>VERSION){return 2;}
|
|
|
let plainbytes=_decrypt(ciphertext,key,salt);
|
|
|
return util.utf82str(plainbytes);
|
|
|
}
|
|
@@ -36,7 +39,7 @@ function decrypt(s,password){
|
|
|
function stretchKey(password,salt){
|
|
|
let start=Date.now(); // ms
|
|
|
let i,key;
|
|
|
for(i=0;i<52;i++){
|
|
|
for(i=0;i<=MAX_ITERS;i++){
|
|
|
key=pbkdf2(password,salt,1<<i,32);
|
|
|
if(Date.now()-start>=500){break;}
|
|
|
}
|