Path: blob/main/components/gitpod-protocol/src/encryption/encryption-service.ts
2500 views
/**1* Copyright (c) 2020 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { injectable, inject } from "inversify";78import { EncryptedData, EncryptionEngine } from "./encryption-engine";9import { KeyProvider, KeyMetadata } from "./key-provider";1011export interface Encrypted<_T> extends EncryptedData {12keyMetadata: KeyMetadata;13}1415export const EncryptionService = Symbol("EncryptionService");16export interface EncryptionService {17encrypt<T>(data: T): Encrypted<T>;18decrypt<T>(encrypted: Encrypted<T>): T;19}2021@injectable()22export class EncryptionServiceImpl implements EncryptionService {23@inject(EncryptionEngine) protected readonly engine: EncryptionEngine;24@inject(KeyProvider) protected readonly keyProvider: KeyProvider;2526encrypt<T>(data: T): Encrypted<T> {27const dataStr = this.serialize(data);28const key = this.keyProvider.getPrimaryKey();2930const encryptedData = this.engine.encrypt(dataStr, key.material);31return {32...encryptedData,33keyMetadata: key.metadata,34};35}3637decrypt<T>(encrypted: Encrypted<T>): T {38const key = this.keyProvider.getKeyFor(encrypted.keyMetadata);39const serializedData = this.engine.decrypt(encrypted, key.material);40return this.deserialize(serializedData);41}4243protected serialize(data: any): string {44return JSON.stringify(data);45}4647protected deserialize<T>(data: string): T {48return JSON.parse(data) as T;49}50}5152/** HACK ahead: Some entities - namely DBTokenEntry for now - need access to an EncryptionService so we publish it here */53export namespace GlobalEncryptionService {54export let encryptionService: EncryptionService;55}5657export function getGlobalEncryptionService() {58return GlobalEncryptionService.encryptionService;59}606162