UNPKG

2.89 kBJavaScriptView Raw
1import { default as sodium } from "chloride";
2import { Buffer } from "buffer";
3import { concatBytes, identifyBufOrBytes } from "../util/bytes.js";
4import { bufferToBytes, bytesToBuffer, stringToBuffer } from "../util/buffers.js";
5//--------------------------------------------------
6import { Logger, LogLevel, setLogLevel } from "../util/log.js";
7let logger = new Logger("crypto-driver-chloride", "cyan");
8setLogLevel("crypto-driver-chloride", LogLevel.Info);
9//================================================================================
10/*
11export let waitUntilChlorideIsReady = async () => {
12 logger.info('waiting for chloride to become ready...');
13 // TODO: how to do this properly?
14 // https://github.com/jedisct1/libsodium.js#usage-as-a-module
15 await sleep(2000);
16}
17*/
18/**
19 * A verison of the ILowLevelCrypto interface backed by Chloride.
20 * Works in the browser.
21 */
22export const CryptoDriverChloride = class {
23 static async sha256(input) {
24 if (typeof input === "string")
25 input = stringToBuffer(input);
26 if (identifyBufOrBytes(input) === "bytes")
27 input = bytesToBuffer(input);
28 let resultBuf = sodium.crypto_hash_sha256(input);
29 return bufferToBytes(resultBuf);
30 }
31 static async generateKeypairBytes(seed) {
32 // If provided, the seed is used as the secret key.
33 // If omitted, a random secret key is generated.
34 logger.debug("generateKeypairBytes");
35 let seedBuf = seed === undefined ? undefined : bytesToBuffer(seed);
36 if (!seedBuf) {
37 seedBuf = Buffer.alloc(32);
38 sodium.randombytes(seedBuf);
39 }
40 let keys = sodium.crypto_sign_seed_keypair(seedBuf);
41 return {
42 //curve: 'ed25519',
43 pubkey: bufferToBytes(keys.publicKey),
44 // so that this works with either sodium or libsodium-wrappers (in browser):
45 secret: bufferToBytes((keys.secretKey).slice(0, 32)),
46 };
47 }
48 static async sign(keypairBytes, msg) {
49 logger.debug("sign");
50 let secretBuf = bytesToBuffer(concatBytes(keypairBytes.secret, keypairBytes.pubkey));
51 if (typeof msg === "string")
52 msg = stringToBuffer(msg);
53 if (msg instanceof Uint8Array)
54 msg = bytesToBuffer(msg);
55 return bufferToBytes(
56 // this returns a Buffer
57 sodium.crypto_sign_detached(msg, secretBuf));
58 }
59 static async verify(publicKey, sig, msg) {
60 logger.debug("verify");
61 try {
62 if (typeof msg === "string")
63 msg = stringToBuffer(msg);
64 if (msg instanceof Uint8Array)
65 msg = bytesToBuffer(msg);
66 return sodium.crypto_sign_verify_detached(bytesToBuffer(sig), msg, publicKey);
67 }
68 catch (e) {
69 /* istanbul ignore next */
70 return false;
71 }
72 }
73};