mirror of
https://github.com/bringout/oca-server-auth.git
synced 2026-04-18 15:32:05 +02:00
209 lines
7.7 KiB
JavaScript
209 lines
7.7 KiB
JavaScript
// © 2021 Florian Kantelberg - initOS GmbH
|
|
// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
/* global QUnit */
|
|
|
|
odoo.define("vault.tests", function (require) {
|
|
"use strict";
|
|
|
|
var utils = require("vault.utils");
|
|
|
|
QUnit.module(
|
|
"vault",
|
|
{
|
|
before: function () {
|
|
utils.askpass = async function () {
|
|
return {
|
|
password: "test",
|
|
keyfile: "",
|
|
};
|
|
};
|
|
},
|
|
},
|
|
function () {
|
|
function is_keypair(keys, assert) {
|
|
assert.equal(keys.publicKey instanceof CryptoKey, true);
|
|
assert.equal(keys.publicKey.type, "public");
|
|
assert.equal(keys.privateKey instanceof CryptoKey, true);
|
|
assert.equal(keys.privateKey.type, "private");
|
|
}
|
|
|
|
QUnit.test("vault: Test conversion utils", async function (assert) {
|
|
assert.expect(7);
|
|
|
|
let text = "hello world";
|
|
let buf = utils.fromBinary(text);
|
|
assert.equal(true, buf instanceof ArrayBuffer);
|
|
assert.equal(text, utils.toBinary(buf));
|
|
assert.equal("", utils.toBinary(false));
|
|
|
|
text = "ImhlbGxvIHdvcmxkIg==";
|
|
buf = utils.fromBase64(text);
|
|
assert.equal(true, buf instanceof ArrayBuffer);
|
|
assert.equal(text, utils.toBase64(buf));
|
|
assert.equal("", utils.toBase64(false));
|
|
|
|
assert.equal("Hello World", utils.capitalize("hello world"));
|
|
});
|
|
|
|
QUnit.test("vault: Test generation utils", async function (assert) {
|
|
assert.expect(12);
|
|
|
|
let data = utils.generate_bytes(5);
|
|
assert.equal(true, data instanceof Uint8Array);
|
|
assert.equal(data.length, 5);
|
|
data = utils.generate_bytes(10);
|
|
assert.equal(data.length, 10);
|
|
|
|
data = utils.generate_iv_base64();
|
|
assert.equal(typeof data, "string");
|
|
assert.notEqual(data, utils.generate_iv_base64());
|
|
|
|
data = await utils.generate_key();
|
|
assert.equal(true, data instanceof CryptoKey);
|
|
|
|
data = await utils.generate_key_pair();
|
|
is_keypair(data, assert);
|
|
|
|
data = utils.generate_secret(10, "01");
|
|
assert.equal(data.length, 10);
|
|
let valid = true;
|
|
for (const c of data) if ("01".indexOf(c) < 0) valid = false;
|
|
assert.equal(valid, true);
|
|
});
|
|
|
|
QUnit.test("vault: Test asymmetric encryption", async function (assert) {
|
|
assert.expect(2);
|
|
const text = "hello world";
|
|
const key = await utils.generate_key_pair();
|
|
|
|
const crypted = await utils.asym_encrypt(key.publicKey, text);
|
|
assert.equal("string", typeof crypted);
|
|
assert.strictEqual(
|
|
text,
|
|
await utils.asym_decrypt(key.privateKey, crypted)
|
|
);
|
|
});
|
|
|
|
QUnit.test("vault: Test symmetric encryption", async function (assert) {
|
|
assert.expect(2);
|
|
const text = "hello world";
|
|
const key = await utils.generate_key();
|
|
const iv = utils.generate_iv_base64();
|
|
|
|
const crypted = await utils.sym_encrypt(key, text, iv);
|
|
assert.equal("string", typeof crypted);
|
|
assert.strictEqual(text, await utils.sym_decrypt(key, crypted, iv));
|
|
});
|
|
|
|
QUnit.test("vault: Test import/export", async function (assert) {
|
|
assert.expect(3);
|
|
|
|
const key = await utils.generate_key_pair();
|
|
let exported = await utils.export_public_key(key.publicKey);
|
|
let tmp = await utils.load_public_key(exported);
|
|
assert.deepEqual(key.publicKey, tmp);
|
|
|
|
const iv = utils.generate_bytes(10);
|
|
const salt = utils.generate_bytes(10);
|
|
const wrapper = await utils.derive_key("test", salt, 4000);
|
|
exported = await utils.export_private_key(key.privateKey, wrapper, iv);
|
|
tmp = await utils.load_private_key(
|
|
exported,
|
|
wrapper,
|
|
utils.toBase64(iv)
|
|
);
|
|
assert.deepEqual(key.privateKey, tmp);
|
|
|
|
const master_key = await utils.generate_key();
|
|
exported = await utils.wrap(master_key, key.publicKey);
|
|
tmp = await utils.unwrap(exported, key.privateKey);
|
|
assert.deepEqual(master_key, tmp);
|
|
});
|
|
|
|
QUnit.test("vault: Test vault class", async function (assert) {
|
|
assert.expect(12);
|
|
|
|
var vault = require("vault");
|
|
|
|
await vault._initialize_keys();
|
|
is_keypair(vault.keys, assert);
|
|
|
|
vault.keys = undefined;
|
|
await vault._import_from_store();
|
|
is_keypair(vault.keys, assert);
|
|
|
|
vault.keys = undefined;
|
|
await vault._import_from_database();
|
|
is_keypair(vault.keys, assert);
|
|
});
|
|
|
|
QUnit.test("vault: Importer/exporter", async function (assert) {
|
|
// The exporter won't skip empty keys
|
|
const child = {
|
|
uuid: "42a",
|
|
note: "test note child",
|
|
name: "test child",
|
|
url: "child.example.org",
|
|
fields: [],
|
|
files: [],
|
|
childs: [],
|
|
};
|
|
|
|
const data = {
|
|
type: "raw",
|
|
data: [
|
|
child,
|
|
{
|
|
uuid: "42",
|
|
note: "test note",
|
|
name: "test name",
|
|
url: "test.example.org",
|
|
fields: [
|
|
{name: "a", value: "Hello World"},
|
|
{name: "secret", value: "dlrow olleh"},
|
|
],
|
|
files: [],
|
|
childs: [child, child],
|
|
},
|
|
child,
|
|
],
|
|
};
|
|
|
|
assert.expect(2);
|
|
|
|
var Exporter = require("vault.export");
|
|
var Importer = require("vault.import");
|
|
var vault = require("vault");
|
|
await vault._initialize_keys();
|
|
|
|
const master_key = await utils.generate_key();
|
|
const importer = new Importer();
|
|
const imported = await importer.import(
|
|
master_key,
|
|
"test.json",
|
|
JSON.stringify(data)
|
|
);
|
|
|
|
const exporter = new Exporter();
|
|
const exported = await exporter.export(
|
|
master_key,
|
|
"test.json",
|
|
JSON.stringify(imported)
|
|
);
|
|
assert.equal(exported.type, "encrypted");
|
|
|
|
const pass = await utils.derive_key(
|
|
"test",
|
|
utils.fromBase64(exported.salt),
|
|
exported.iterations
|
|
);
|
|
|
|
const tmp = JSON.parse(
|
|
await utils.sym_decrypt(pass, exported.data, exported.iv)
|
|
);
|
|
assert.deepEqual(tmp, data.data);
|
|
});
|
|
}
|
|
);
|
|
});
|