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; }