From f0d0242c76a455bb7a5ea7bd95ca62907c7e9d62 Mon Sep 17 00:00:00 2001 From: Josh Wee Date: Tue, 12 Apr 2022 08:20:30 -0700 Subject: [PATCH] feat: support sodium-native lib for voice (#7698) * chore: add sodium-native * feat: wrap sodium-native methods * chore: update dep listings * chore: update dep report * revert: "chore: add sodium-native" This reverts commit 6a64db85d055cff5fc4056f8bb82e195f5630ded. * chore: consolidate buffer alloc Co-authored-by: Vitor * chore: conslidate sodium.random * chore: explicit param typing * refactor: truthy style maintenance Co-authored-by: Vitor --- packages/voice/README.md | 1 + packages/voice/src/util/Secretbox.ts | 38 +++++++++++++++---- .../src/util/generateDependencyReport.ts | 1 + 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/voice/README.md b/packages/voice/README.md index 2ee32f129..ef6d534e4 100644 --- a/packages/voice/README.md +++ b/packages/voice/README.md @@ -47,6 +47,7 @@ try installing another. **Encryption Libraries (npm install):** +- `sodium-native`: ^3.3.0 - `sodium`: ^3.0.2 - `tweetnacl`: ^1.0.3 - `libsodium-wrappers`: ^0.7.9 diff --git a/packages/voice/src/util/Secretbox.ts b/packages/voice/src/util/Secretbox.ts index 5169cc3b2..435606957 100644 --- a/packages/voice/src/util/Secretbox.ts +++ b/packages/voice/src/util/Secretbox.ts @@ -5,14 +5,38 @@ interface Methods { } const libs = { + 'sodium-native': (sodium: any): Methods => ({ + open: (buffer: Buffer, nonce: Buffer, secretKey: Uint8Array) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (buffer) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + const output = Buffer.allocUnsafe(buffer.length - sodium.crypto_box_MACBYTES); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + if (sodium.crypto_secretbox_open_easy(output, buffer, nonce, secretKey)) return output; + } + return null; + }, + close: (opusPacket: Buffer, nonce: Buffer, secretKey: Uint8Array) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/restrict-plus-operands + const output = Buffer.allocUnsafe(opusPacket.length + sodium.crypto_box_MACBYTES); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + sodium.crypto_secretbox_easy(output, opusPacket, nonce, secretKey); + return output; + }, + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + random: (n: number, buffer: Buffer = Buffer.allocUnsafe(n)) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + sodium.randombytes_buf(buffer); + return buffer; + }, + }), sodium: (sodium: any): Methods => ({ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access open: sodium.api.crypto_secretbox_open_easy, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access close: sodium.api.crypto_secretbox_easy, - random: (n: any, buffer?: Buffer) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - if (!buffer) buffer = Buffer.allocUnsafe(n); + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + random: (n: number, buffer: Buffer = Buffer.allocUnsafe(n)) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call sodium.api.randombytes_buf(buffer); return buffer; @@ -23,16 +47,16 @@ const libs = { open: sodium.crypto_secretbox_open_easy, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access close: sodium.crypto_secretbox_easy, - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - random: (n: any) => sodium.randombytes_buf(n), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + random: sodium.randombytes_buf, }), tweetnacl: (tweetnacl: any): Methods => ({ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access open: tweetnacl.secretbox.open, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access close: tweetnacl.secretbox, - // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - random: (n: any) => tweetnacl.randomBytes(n), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + random: tweetnacl.randomBytes, }), } as const; diff --git a/packages/voice/src/util/generateDependencyReport.ts b/packages/voice/src/util/generateDependencyReport.ts index 71817b89f..edb31c611 100644 --- a/packages/voice/src/util/generateDependencyReport.ts +++ b/packages/voice/src/util/generateDependencyReport.ts @@ -69,6 +69,7 @@ export function generateDependencyReport() { // encryption report.push('Encryption Libraries'); + addVersion('sodium-native'); addVersion('sodium'); addVersion('libsodium-wrappers'); addVersion('tweetnacl');