@experteam-mx/ngx-services
Version:
Angular common services for Experteam apps
93 lines • 12.6 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class CryptoService {
environments;
constructor(environments) {
this.environments = environments;
}
async encryptAES(plaintext) {
const cryptoKey = await this.loadKey();
// Convert the plaintext in Uint8Array
const encoder = new TextEncoder();
const encoded = encoder.encode(plaintext);
// Generate a random Initialization Vector (IV)
const iv = crypto.getRandomValues(new Uint8Array(12));
// Encrypt the plaintext
const ciphertext = await crypto.subtle.encrypt({
name: 'AES-GCM',
iv,
}, cryptoKey, encoded);
return `${this.uint8ArrayToBase64(iv)}:${this.arrayBufferToBase64(ciphertext)}`;
}
async decryptAES(payload) {
// Extract the Initialization Vector (IV), and the cypher text
const [base64IV, base64Ciphertext] = payload.split(':');
if (!base64IV || !base64Ciphertext) {
throw new Error('The payload must contain the IV and the cipher text.');
}
const cryptoKey = await this.loadKey();
const iv = this.base64ToUint8Array(base64IV);
const cipherText = this.base64ToArrayBuffer(base64Ciphertext);
// Decrypt the cypher text
const decrypted = await crypto.subtle.decrypt({
name: 'AES-GCM',
iv,
}, cryptoKey, cipherText);
// Decode the decrypted text
const decoder = new TextDecoder();
return decoder.decode(decrypted);
}
async loadKey() {
// Decode the base64 key to Uint8Array
const rawKey = this.base64ToUint8Array(this.environments.secretKey);
// Import the key to API Crypto
return await crypto.subtle.importKey('raw', rawKey, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt']);
}
uint8ArrayToBase64(data) {
let binary = '';
const len = data.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(data[i]);
}
return btoa(binary);
}
base64ToUint8Array(base64) {
const binaryString = atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes;
}
arrayBufferToBase64(buffer) {
let binary = '';
const bytes = new Uint8Array(buffer);
const len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
base64ToArrayBuffer(base64) {
const binaryString = atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CryptoService, deps: [{ token: 'env' }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CryptoService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CryptoService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: ['env']
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHBlcnRlYW0tbXgvbmd4LXNlcnZpY2VzL3NyYy9saWIvY3lwaGVyL2NyeXB0by5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBOztBQU1sRCxNQUFNLE9BQU8sYUFBYTtJQUVDO0lBRHpCLFlBQ3lCLFlBQXlCO1FBQXpCLGlCQUFZLEdBQVosWUFBWSxDQUFhO0lBRWxELENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFFLFNBQWlCO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRXRDLHNDQUFzQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFekMsK0NBQStDO1FBQy9DLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUVyRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDNUM7WUFDRSxJQUFJLEVBQUUsU0FBUztZQUNmLEVBQUU7U0FDSCxFQUNELFNBQVMsRUFDVCxPQUFPLENBQ1IsQ0FBQTtRQUVELE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUE7SUFDakYsQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUUsT0FBZTtRQUN0Qyw4REFBOEQ7UUFDOUQsTUFBTSxDQUFDLFFBQVEsRUFB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TUFBTSxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUVPLG1CQUFtQixDQUFFLE1BQWM7UUFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDckIsQ0FBQzt3R0FoSFUsYUFBYSxrQkFFZCxLQUFLOzRHQUZKLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR0ksTUFBTTsyQkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9uZ3gtc2VydmljZXMubW9kZWxzJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3J5cHRvU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50XHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZW5jcnlwdEFFUyAocGxhaW50ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgY3J5cHRvS2V5ID0gYXdhaXQgdGhpcy5sb2FkS2V5KClcclxuXHJcbiAgICAvLyBDb252ZXJ0IHRoZSBwbGFpbnRleHQgaW4gVWludDhBcnJheVxyXG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXHJcbiAgICBjb25zdCBlbmNvZGVkID0gZW5jb2Rlci5lbmNvZGUocGxhaW50ZXh0KVxyXG5cclxuICAgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIEluaXRpYWxpemF0aW9uIFZlY3RvciAoSVYpXHJcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKVxyXG5cclxuICAgIC8vIEVuY3J5cHQgdGhlIHBsYWludGV4dFxyXG4gICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdBRVMtR0NNJyxcclxuICAgICAgICBpdixcclxuICAgICAgfSxcclxuICAgICAgY3J5cHRvS2V5LFxyXG4gICAgICBlbmNvZGVkXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIGAke3RoaXMudWludDhBcnJheVRvQmFzZTY0KGl2KX06JHt0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoY2lwaGVydGV4dCl9YFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlY3J5cHRBRVMgKHBheWxvYWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAvLyBFeHRyYWN0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSwgYW5kIHRoZSBjeXBoZXIgdGV4dFxyXG4gICAgY29uc3QgW2Jhc2U2NElWLCBiYXNlNjRDaXBoZXJ0ZXh0XSA9IHBheWxvYWQuc3BsaXQoJzonKVxyXG5cclxuICAgIGlmICghYmFzZTY0SVYgfHwgIWJhc2U2NENpcGhlcnRleHQpIHsgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGF5bG9hZCBtdXN0IGNvbnRhaW4gdGhlIElWIGFuZCB0aGUgY2lwaGVyIHRleHQuJykgfVxyXG5cclxuICAgIGNvbnN0IGNyeXB0b0tleSA9IGF3YWl0IHRoaXMubG9hZEtleSgpXHJcblxyXG4gICAgY29uc3QgaXYgPSB0aGlzLmJhc2U2NFRvVWludDhBcnJheShiYXNlNjRJVilcclxuICAgIGNvbnN0IGNpcGhlclRleHQgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0Q2lwaGVydGV4dClcclxuXHJcbiAgICAvLyBEZWNyeXB0IHRoZSBjeXBoZXIgdGV4dFxyXG4gICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0FFUy1HQ00nLFxyXG4gICAgICAgIGl2LFxyXG4gICAgICB9LFxyXG4gICAgICBjcnlwdG9LZXksXHJcbiAgICAgIGNpcGhlclRleHRcclxuICAgIClcclxuXHJcbiAgICAvLyBEZWNvZGUgdGhlIGRlY3J5cHRlZCB0ZXh0XHJcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKClcclxuICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShkZWNyeXB0ZWQpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvYWRLZXkgKCkge1xyXG4gICAgLy8gRGVjb2RlIHRoZSBiYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXlcclxuICAgIGNvbnN0IHJhd0tleSA9IHRoaXMuYmFzZTY0VG9VaW50OEFycmF5KHRoaXMuZW52aXJvbm1lbnRzLnNlY3JldEtleSlcclxuXHJcbiAgICAvLyBJbXBvcnQgdGhlIGtleSB0byBBUEkgQ3J5cHRvXHJcbiAgICByZXR1cm4gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXHJcbiAgICAgICdyYXcnLFxyXG4gICAgICByYXdLZXksXHJcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nIH0sXHJcbiAgICAgIHRydWUsXHJcbiAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J11cclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdWludDhBcnJheVRvQmFzZTY0IChkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcclxuICAgIGxldCBiaW5hcnkgPSAnJ1xyXG4gICAgY29uc3QgbGVuID0gZGF0YS5ieXRlTGVuZ3RoXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBidG9hKGJpbmFyeSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmFzZTY0VG9VaW50OEFycmF5IChiYXNlNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xyXG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpXHJcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoXHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbilcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ5dGVzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFycmF5QnVmZmVyVG9CYXNlNjQgKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJpbmFyeSA9ICcnXHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcclxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGhcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBidG9hKGJpbmFyeSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmFzZTY0VG9BcnJheUJ1ZmZlciAoYmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XHJcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NClcclxuICAgIGNvbnN0IGxlbiA9IGJpbmFyeVN0cmluZy5sZW5ndGhcclxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBieXRlcy5idWZmZXJcclxuICB9XHJcbn1cclxuIl19