Files
notesnook/packages/sodium/tests/utils.ts

156 lines
3.8 KiB
TypeScript
Raw Normal View History

/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2024-09-23 12:24:22 +05:00
import * as browser from "../src/browser.js";
import * as node from "../src/node.js";
export async function streamingEncrypt(
crypto: typeof node | typeof browser,
key: Uint8Array
) {
await crypto.initialize();
const { state, header } =
crypto.crypto_secretstream_xchacha20poly1305_init_push(key, "base64");
return {
header,
chunks: [
crypto.crypto_secretstream_xchacha20poly1305_push(
state,
"chunk1",
null,
crypto.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE,
"base64"
),
crypto.crypto_secretstream_xchacha20poly1305_push(
state,
"chunk2",
null,
crypto.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE,
"base64"
),
crypto.crypto_secretstream_xchacha20poly1305_push(
state,
"chunk3",
null,
crypto.crypto_secretstream_xchacha20poly1305_TAG_FINAL,
"base64"
)
]
};
}
export async function streamingDecrypt(
crypto: typeof node | typeof browser,
key: Uint8Array,
cipher: { header: string; chunks: string[] }
) {
await crypto.initialize();
const state = crypto.crypto_secretstream_xchacha20poly1305_init_pull(
crypto.from_base64(cipher.header),
key
);
return [
crypto.crypto_secretstream_xchacha20poly1305_pull(
state,
crypto.from_base64(cipher.chunks[0]),
null,
"text"
),
crypto.crypto_secretstream_xchacha20poly1305_pull(
state,
crypto.from_base64(cipher.chunks[1]),
null,
"text"
),
crypto.crypto_secretstream_xchacha20poly1305_pull(
state,
crypto.from_base64(cipher.chunks[2]),
null,
"text"
)
];
}
export async function decrypt(
crypto: typeof node | typeof browser,
cipher: Uint8Array,
nonce: Uint8Array,
key: Uint8Array
) {
await crypto.initialize();
return crypto.crypto_aead_xchacha20poly1305_ietf_decrypt(
null,
cipher,
null,
nonce,
key,
"text"
);
}
export async function encrypt(
crypto: typeof node | typeof browser,
nonce: Uint8Array,
key: Uint8Array
) {
await crypto.initialize();
return crypto.crypto_aead_xchacha20poly1305_ietf_encrypt(
"mystring",
null,
null,
nonce,
key,
"base64"
);
}
export async function getKey(crypto: typeof node | typeof browser) {
await crypto.initialize();
const saltBytes: Uint8Array = crypto.randombytes_buf(
crypto.crypto_pwhash_SALTBYTES
);
const key = crypto.crypto_pwhash(
crypto.crypto_aead_xchacha20poly1305_ietf_KEYBYTES,
"mypassword",
saltBytes,
3, // operations limit
1024 * 1024 * 8, // memory limit (8MB)
crypto.crypto_pwhash_ALG_ARGON2I13
);
return { key, salt: saltBytes };
}
export async function hash(crypto: typeof node | typeof browser) {
await crypto.initialize();
const saltBytes = crypto.crypto_generichash(
node.crypto_pwhash_SALTBYTES,
"mysalt"
);
return crypto.crypto_pwhash(
32,
"mypassword",
saltBytes,
3, // operations limit
1024 * 1024 * 64, // memory limit (8MB)
browser.crypto_pwhash_ALG_ARGON2ID13,
"base64"
);
}