Skip to content
Snippets Groups Projects
Commit e3453e9f authored by Zdravko Iliev's avatar Zdravko Iliev
Browse files

fix cryptoService interface

parent 580c7e5c
No related branches found
No related tags found
1 merge request!85Resolve "[Document Sealing] Add document proto buffers"
Pipeline #51036 passed
......@@ -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 };
});
......
/// <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>;
......
......@@ -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";
......
......@@ -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,
......
......@@ -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>;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment