diff --git a/dist/crypto.html b/dist/crypto.html
--- a/dist/crypto.html
+++ b/dist/crypto.html
@@ -2,11 +2,19 @@
+ Chacha20
+
diff --git a/src/chacha.js b/src/chacha.js
--- a/src/chacha.js
+++ b/src/chacha.js
@@ -8,7 +8,7 @@ function lrot(x,shift){
function createNonce(){
let nonce=new Uint8Array(12);
window.crypto.getRandomValues(nonce);
- return nonce;
+ return Array.from(nonce);
}
/**
diff --git a/src/main.js b/src/main.js
--- a/src/main.js
+++ b/src/main.js
@@ -1,7 +1,31 @@
import * as util from "./util.js";
import {blake2s} from "./blake.js";
import {pbkdf2} from "./pbkdf2.js";
-import {Chacha20,encrypt,decrypt} from "./chacha.js";
+import {Chacha20,encrypt as _encrypt,decrypt as _decrypt} from "./chacha.js";
+
+const VERSION=1;
+
+function encrypt(s,password){
+ let bs=util.str2utf8(s);
+ let pass=util.str2utf8(password);
+ let noncedCiphertext=_encrypt(bs,pass);
+ let signature=blake2s([VERSION].concat(noncedCiphertext),16,pass);
+ let arr=[VERSION].concat(signature,noncedCiphertext);
+ return util.bytes2base64(arr);
+}
+
+function decrypt(s,password){
+ let pass=util.str2utf8(password);
+ let arr=util.base642bytes(s);
+ let version=arr[0];
+ let signature=arr.slice(1,17);
+ let noncedCiphertext=arr.slice(17);
+ let check=blake2s([version].concat(noncedCiphertext),16,pass);
+ if(!signature.every((b,i)=>b===check[i])){return false;}
+ if(version>VERSION){return false;}
+ let plainbytes=_decrypt(noncedCiphertext,pass);
+ return util.utf82str(plainbytes);
+}
export default {util,blake2s,pbkdf2,Chacha20,encrypt,decrypt};
@@ -11,6 +35,6 @@ if(typeof module!=='undefined'&&module.h
module.exports.blake2s=blake2s;
module.exports.pbkdf2=pbkdf2;
module.exports.Chacha20=Chacha20;
- module.exports.encrypt=encrypt;
- module.exports.decrypt=decrypt;
+ module.exports.encrypt=_encrypt;
+ module.exports.decrypt=_decrypt;
}