diff --git a/dist/services/CryptoService/CryptoServiceWeb.js b/dist/services/CryptoService/CryptoServiceWeb.js index be96a6ee078c2a019054b85e3bf832e26ede3620..04fd945b66b6f3637c493600d63b1d7983f42c98 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 24dfcd1294c69e9cb0ef9035e48651b8936c8d28..9bbea01ae3b7796f6eeda8329a49eb082af2c685 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 1af2cca563ccbb8f960d1159f35762c743aa45a9..5f5163d15807e8debfab33706e807ebb66b19352 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 06534df3aa1ac55180bc501d73b5ee30718fc55d..831e038306a39eb403591c5775480f77b16555e0 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 0dfd66a86ab28a6a4fe1a2138a78628f18c20a06..0867a3b80ce04f260f99ddd5dca1d652596e578e 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>;