|
|
/* global expect */
|
|
|
|
|
|
function getRandomValues(arr){
|
|
|
for(let i=0;i<arr.length;i++){
|
|
|
arr[i]=Math.floor(Math.random()*256);
|
|
|
function getRandomValues(arr) {
|
|
|
for (let i = 0; i < arr.length; i++) {
|
|
|
arr[i] = Math.floor(Math.random()*256);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
window={
|
|
|
window = {
|
|
|
crypto: {
|
|
|
getRandomValues: getRandomValues
|
|
|
}
|
|
|
};
|
|
|
|
|
|
describe("Chacha",function(){
|
|
|
let cryptoJS=require("../../dist/main.js");
|
|
|
let util=cryptoJS.util;
|
|
|
let Chacha20=cryptoJS.Chacha20;
|
|
|
let encrypt=cryptoJS.encrypt;
|
|
|
let decrypt=cryptoJS.decrypt;
|
|
|
let str2utf8=util.str2utf8;
|
|
|
|
|
|
let key=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];
|
|
|
let nonce1=[0,0,0,9,0,0,0,74,0,0,0,0];
|
|
|
let nonce2=[0,0,0,0,0,0,0,74,0,0,0,0];
|
|
|
let plaintext="Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.";
|
|
|
|
|
|
describe("Chacha20",function(){
|
|
|
it("should return a correct test vector",function(){
|
|
|
let cipher=new Chacha20(key,nonce1);
|
|
|
let output=cipher._computeBlock().map(x=>x>>>0);
|
|
|
let expected=[0xe4e7f110,0x15593bd1,0x1fdd0f50,0xc47120a3,0xc7f4d1c7,0x0368c033,0x9aaa2204,0x4e6cd4c3,0x466482d2,0x09aa9f07,0x05d7c214,0xa2028bd9,0xd19c12b5,0xb94e16de,0xe883d0cb,0x4e3c50a2];
|
|
|
describe("Chacha", function() {
|
|
|
let cryptoJS = require("../../dist/main.js");
|
|
|
let util = cryptoJS.util;
|
|
|
let Chacha20 = cryptoJS.Chacha20;
|
|
|
let encrypt = cryptoJS.encrypt;
|
|
|
let decrypt = cryptoJS.decrypt;
|
|
|
let str2utf8 = util.str2utf8;
|
|
|
|
|
|
let key = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
|
|
|
let nonce1 = [0, 0, 0, 9, 0, 0, 0, 74, 0, 0, 0, 0];
|
|
|
let nonce2 = [0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0];
|
|
|
let plaintext = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it.";
|
|
|
|
|
|
describe("Chacha20", function() {
|
|
|
it("should return a correct test vector", function() {
|
|
|
let cipher = new Chacha20(key, nonce1);
|
|
|
let output = cipher._computeBlock().map(x => x >>> 0);
|
|
|
let expected = [0xe4e7f110, 0x15593bd1, 0x1fdd0f50, 0xc47120a3, 0xc7f4d1c7, 0x0368c033, 0x9aaa2204, 0x4e6cd4c3, 0x466482d2, 0x09aa9f07, 0x05d7c214, 0xa2028bd9, 0xd19c12b5, 0xb94e16de, 0xe883d0cb, 0x4e3c50a2];
|
|
|
expect(output).toEqual(expected);
|
|
|
});
|
|
|
|
|
|
it("should output a correct key stream",function(){
|
|
|
let cipher=new Chacha20(key,nonce2);
|
|
|
let expected=[34,79,81,243,64,27,217,225,47,222,39,111,184,99,29,237,140,19,31,130,61,44,6, 226,126,79,202,236,158,243,207,120,138,59,10,163,114,96,10,146,181,121,116,205,237,43,147,52,121, 76,186,64,198,62,52,205,234,33,44,76,240,125,65,183,105,166,116,159,63,99,15,65,34,202,254,40,236, 77,196,126,38,212,52,109,112,185,140,115,243,233,197,58,196,12,89,69,57,139,110,218,26,131,44,137, 193,103,234,205,144,29,126,43,243,99];
|
|
|
expected.forEach(b=>{
|
|
|
|
|
|
it("should output a correct key stream", function() {
|
|
|
let cipher = new Chacha20(key, nonce2);
|
|
|
let expected = [34, 79, 81, 243, 64, 27, 217, 225, 47, 222, 39, 111, 184, 99, 29, 237, 140, 19, 31, 130, 61, 44, 6, 226, 126, 79, 202, 236, 158, 243, 207, 120, 138, 59, 10, 163, 114, 96, 10, 146, 181, 121, 116, 205, 237, 43, 147, 52, 121, 76, 186, 64, 198, 62, 52, 205, 234, 33, 44, 76, 240, 125, 65, 183, 105, 166, 116, 159, 63, 99, 15, 65, 34, 202, 254, 40, 236, 77, 196, 126, 38, 212, 52, 109, 112, 185, 140, 115, 243, 233, 197, 58, 196, 12, 89, 69, 57, 139, 110, 218, 26, 131, 44, 137, 193, 103, 234, 205, 144, 29, 126, 43, 243, 99];
|
|
|
expected.forEach(b => {
|
|
|
expect(cipher.getByte()).toEqual(b);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
describe("encrypt",function(){
|
|
|
it("should correctly encrypt an example text",function(){
|
|
|
let ciphertext=[110,46,53,154,37,104,249,128,65,186,7,40,221,13,105,129,233,126,122,236,29, 67,96,194,10,39,175,204,253,159,174,11,249,27,101,197,82,71,51,171,143,89,61,171,205,98,179,87,22, 57,214,36,230,81,82,171,143,83,12,53,159,8,97,216,7,202,13,191,80,13,106,97,86,163,142,8,138,34, 182,94,82,188,81,77,22,204,248,6,129,140,233,26,183,121,55,54,90,249,11,191,116,163,91,230,180,11, 142,237,242,120,94,66,135,77];
|
|
|
expect(encrypt(str2utf8(plaintext),key,nonce2)).toEqual([nonce2,ciphertext]);
|
|
|
|
|
|
describe("encrypt", function() {
|
|
|
it("should correctly encrypt an example text", function() {
|
|
|
let ciphertext = [110, 46, 53, 154, 37, 104, 249, 128, 65, 186, 7, 40, 221, 13, 105, 129, 233, 126, 122, 236, 29, 67, 96, 194, 10, 39, 175, 204, 253, 159, 174, 11, 249, 27, 101, 197, 82, 71, 51, 171, 143, 89, 61, 171, 205, 98, 179, 87, 22, 57, 214, 36, 230, 81, 82, 171, 143, 83, 12, 53, 159, 8, 97, 216, 7, 202, 13, 191, 80, 13, 106, 97, 86, 163, 142, 8, 138, 34, 182, 94, 82, 188, 81, 77, 22, 204, 248, 6, 129, 140, 233, 26, 183, 121, 55, 54, 90, 249, 11, 191, 116, 163, 91, 230, 180, 11, 142, 237, 242, 120, 94, 66, 135, 77];
|
|
|
expect(encrypt(str2utf8(plaintext), key, nonce2)).toEqual([nonce2, ciphertext]);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
describe("decrypt",function(){
|
|
|
it("should be able to decrypt a Chacha20 encrypted text",function(){
|
|
|
let text=str2utf8(plaintext);
|
|
|
let key=[];
|
|
|
for(let i=0;i<16;i++){key.push(Math.floor(Math.random()*256));}
|
|
|
let [nonce,ciphertext]=encrypt(text,key);
|
|
|
expect(decrypt(ciphertext,key,nonce)).toEqual(text);
|
|
|
|
|
|
describe("decrypt", function() {
|
|
|
it("should be able to decrypt a Chacha20 encrypted text", function() {
|
|
|
let text = str2utf8(plaintext);
|
|
|
let key = [];
|
|
|
for (let i = 0; i < 16; i++) {key.push(Math.floor(Math.random() * 256));}
|
|
|
let [nonce, ciphertext] = encrypt(text, key);
|
|
|
expect(decrypt(ciphertext, key, nonce)).toEqual(text);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
});
|