From e3453e9f34fed161aaee96f85ea4a0fce13d6c28 Mon Sep 17 00:00:00 2001 From: Zdravko Iliev <zdravko.iliev@vereign.com> Date: Thu, 2 Jun 2022 16:18:09 +0300 Subject: [PATCH] fix cryptoService interface --- .../CryptoService/CryptoServiceWeb.js | 22 +++++++++---- .../CryptoService/ICryptoService.d.ts | 3 +- .../CryptoService/CryptoServiceNode.ts | 2 +- .../CryptoService/CryptoServiceWeb.ts | 33 +++++++++++++------ src/services/CryptoService/ICryptoService.ts | 2 +- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/dist/services/CryptoService/CryptoServiceWeb.js b/dist/services/CryptoService/CryptoServiceWeb.js index be96a6e..04fd945 100644 --- a/dist/services/CryptoService/CryptoServiceWeb.js +++ b/dist/services/CryptoService/CryptoServiceWeb.js @@ -48,12 +48,23 @@ const getBytes = (value, encoding) => { return bytes; }; class CryptoServiceWeb { - encryptAESGCM(data) { + encryptAESGCM(data, key, iv) { return __awaiter(this, void 0, void 0, function* () { - const key = yield crypto.subtle.generateKey({ - name: "AES-GCM", - length: 256, - }, true, ["encrypt", "decrypt"]); + if (!key && !iv) { + key = yield crypto.subtle.generateKey({ + name: "AES-GCM", + length: 256, + }, true, ["encrypt", "decrypt"]); + iv = crypto.getRandomValues(new Buffer(12)); + } + else { + if (key instanceof Buffer) { + key = yield crypto.subtle.importKey("raw", key, "AES-GCM", true, [ + "encrypt", + "decrypt", + ]); + } + } let encoded; if (typeof data === "string") { encoded = new TextEncoder().encode(data); @@ -61,7 +72,6 @@ class CryptoServiceWeb { else { encoded = data; } - const iv = crypto.getRandomValues(new Buffer(12)); const encrypted = yield crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, key, encoded); return { data: encrypted, key: yield exportKey(key), iv }; }); diff --git a/dist/services/CryptoService/ICryptoService.d.ts b/dist/services/CryptoService/ICryptoService.d.ts index 24dfcd1..9bbea01 100644 --- a/dist/services/CryptoService/ICryptoService.d.ts +++ b/dist/services/CryptoService/ICryptoService.d.ts @@ -1,3 +1,4 @@ +/// <reference types="node" /> export interface AESGCMOutput { data: ArrayBuffer; key: ArrayBuffer; @@ -10,7 +11,7 @@ export interface RSAKeys { export interface ICryptoService { encryptAESGCM: { (data: string): Promise<AESGCMOutput>; - (data: ArrayBuffer): Promise<AESGCMOutput>; + (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>; }; decryptAESGCM: { (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>; diff --git a/src/services/CryptoService/CryptoServiceNode.ts b/src/services/CryptoService/CryptoServiceNode.ts index 1af2cca..5f5163d 100644 --- a/src/services/CryptoService/CryptoServiceNode.ts +++ b/src/services/CryptoService/CryptoServiceNode.ts @@ -4,7 +4,7 @@ import md5 from "js-md5"; import * as crypto from "crypto"; import { AESGCMOutput, RSAKeys, ICryptoService } from "./ICryptoService"; -import { ensureUint8Array, arrayBufferToBase64 } from "../../utils/common"; +import { ensureUint8Array } from "../../utils/common"; const AES_GCM_ALGO = "aes-256-gcm"; diff --git a/src/services/CryptoService/CryptoServiceWeb.ts b/src/services/CryptoService/CryptoServiceWeb.ts index 06534df..831e038 100644 --- a/src/services/CryptoService/CryptoServiceWeb.ts +++ b/src/services/CryptoService/CryptoServiceWeb.ts @@ -42,16 +42,29 @@ class CryptoServiceWeb implements ICryptoService { public async encryptAESGCM(data: string): Promise<AESGCMOutput>; public async encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>; public async encryptAESGCM( - data: string | ArrayBuffer + data: string | ArrayBuffer, + key?: Buffer | CryptoKey, + iv?: Buffer ): Promise<AESGCMOutput> { - const key = await crypto.subtle.generateKey( - { - name: "AES-GCM", - length: 256, - }, - true, - ["encrypt", "decrypt"] - ); + if (!key && !iv) { + key = await crypto.subtle.generateKey( + { + name: "AES-GCM", + length: 256, + }, + true, + ["encrypt", "decrypt"] + ); + + iv = crypto.getRandomValues(new Buffer(12)); + } else { + if (key instanceof Buffer) { + key = await crypto.subtle.importKey("raw", key, "AES-GCM", true, [ + "encrypt", + "decrypt", + ]); + } + } let encoded; if (typeof data === "string") { @@ -59,7 +72,7 @@ class CryptoServiceWeb implements ICryptoService { } else { encoded = data; } - const iv = crypto.getRandomValues(new Buffer(12)); + const encrypted = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, key, diff --git a/src/services/CryptoService/ICryptoService.ts b/src/services/CryptoService/ICryptoService.ts index 0dfd66a..0867a3b 100644 --- a/src/services/CryptoService/ICryptoService.ts +++ b/src/services/CryptoService/ICryptoService.ts @@ -12,7 +12,7 @@ export interface RSAKeys { export interface ICryptoService { encryptAESGCM: { (data: string): Promise<AESGCMOutput>; - (data: ArrayBuffer): Promise<AESGCMOutput>; + (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>; }; decryptAESGCM: { (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>; -- GitLab