Use browser (subtle) implementation for all env

This commit is contained in:
Franck Royer 2022-03-07 07:48:02 +11:00
parent 2e816918c3
commit 9dae5168fc
No known key found for this signature in database
GPG Key ID: A82ED75A8DFC50A4
2 changed files with 34 additions and 35 deletions

View File

@ -1,38 +1,37 @@
export const SymmetricKeySize = 32; import { randomBytes, subtle } from "../../crypto";
export const KeySize = 32;
export const IvSize = 12; export const IvSize = 12;
export const TagSize = 16; export const TagSize = 16;
export interface Symmetric { const Algorithm = { name: "AES-GCM", length: 128 };
/**
* Proceed with symmetric encryption of `clearText` value. export async function encrypt(
*/ iv: Buffer | Uint8Array,
encrypt: ( key: Buffer,
iv: Buffer | Uint8Array, clearText: Buffer
key: Buffer, ): Promise<Buffer> {
clearText: Buffer return subtle
) => Promise<Buffer>; .importKey("raw", key, Algorithm, false, ["encrypt"])
/** .then((cryptoKey) =>
* Proceed with symmetric decryption of `cipherText` value. subtle.encrypt({ iv, ...Algorithm }, cryptoKey, clearText)
*/ )
decrypt: (iv: Buffer, key: Buffer, cipherText: Buffer) => Promise<Buffer>; .then(Buffer.from);
/**
* Generate an Initialization Vector (iv) for for Symmetric encryption purposes.
*/
generateIv: () => Uint8Array;
} }
export let symmetric: Symmetric = {} as unknown as Symmetric; export async function decrypt(
iv: Buffer,
key: Buffer,
cipherText: Buffer
): Promise<Buffer> {
return subtle
.importKey("raw", key, Algorithm, false, ["decrypt"])
.then((cryptoKey) =>
subtle.decrypt({ iv, ...Algorithm }, cryptoKey, cipherText)
)
.then(Buffer.from);
}
import("./browser") export function generateIv(): Uint8Array {
.then((mod) => { return randomBytes(IvSize);
symmetric = mod; }
})
.catch((eBrowser) => {
import("./node")
.then((mod) => {
symmetric = mod;
})
.catch((eNode) => {
throw `Could not load any symmetric crypto modules: ${eBrowser}, ${eNode}`;
});
});

View File

@ -7,7 +7,7 @@ import * as secp256k1 from "secp256k1";
import { hexToBytes } from "../utils"; import { hexToBytes } from "../utils";
import * as ecies from "./ecies"; import * as ecies from "./ecies";
import { IvSize, symmetric, SymmetricKeySize } from "./symmetric"; import * as symmetric from "./symmetric";
const FlagsLength = 1; const FlagsLength = 1;
const FlagMask = 3; // 0011 const FlagMask = 3; // 0011
@ -170,7 +170,7 @@ export async function decryptSymmetric(
key: Uint8Array | Buffer | string key: Uint8Array | Buffer | string
): Promise<Uint8Array> { ): Promise<Uint8Array> {
const data = Buffer.from(payload); const data = Buffer.from(payload);
const ivStart = data.length - IvSize; const ivStart = data.length - symmetric.IvSize;
const cipher = data.slice(0, ivStart); const cipher = data.slice(0, ivStart);
const iv = data.slice(ivStart); const iv = data.slice(ivStart);
@ -190,7 +190,7 @@ export function generatePrivateKey(): Uint8Array {
* Generate a new symmetric key to be used for symmetric encryption. * Generate a new symmetric key to be used for symmetric encryption.
*/ */
export function generateSymmetricKey(): Uint8Array { export function generateSymmetricKey(): Uint8Array {
return randomBytes(SymmetricKeySize); return randomBytes(symmetric.KeySize);
} }
/** /**