UNPKG

@mojsoski/server-crypto

Version:

Asymmetric key-exchange cryptography library

70 lines 3.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CurrentServer = void 0; const assert_1 = require("@mojsoski/assert"); const async_stream_1 = require("@mojsoski/async-stream"); const index_1 = require("./index"); class CurrentServer extends index_1.Server { #publicKey; #privateKey; #name; static async fromEnvironment(provider) { (0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_NAME, "CURRENT_SERVER_NAME"); (0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_PUBLIC_KEY, "CURRENT_SERVER_PUBLIC_KEY"); (0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_PRIVATE_KEY, "CURRENT_SERVER_PRIVATE_KEY"); return new CurrentServer(process.env.CURRENT_SERVER_NAME, await provider.crypto.parsePublicKey(process.env.CURRENT_SERVER_PUBLIC_KEY), await provider.crypto.parsePrivateKey(process.env.CURRENT_SERVER_PRIVATE_KEY), provider); } constructor(name, publicKey, privateKey, provider) { super(provider); this.#publicKey = publicKey; this.#privateKey = privateKey; this.#name = name.toLocaleLowerCase(); } get name() { return this.#name; } get publicKey() { return this.#publicKey; } get privateKey() { return this.#privateKey; } signJwt(obj, expiresIn) { return this._provider.jwt.signRS256(obj, this.privateKey, expiresIn); } decryptStream(stream) { const provider = this._provider; const ref = this; return { async *read(signal) { let context = undefined; for await (const item of stream.read(signal)) { if ("content" in item) { (0, assert_1.assertNonNull)(context, "Received the first message before receiving the key."); yield await index_1.Server.decrypt(context, item, provider); } else { context = await ref.decryptContext(item); } } }, transform() { return new async_stream_1.AsyncTransform(this); }, }; } async decryptContext(header) { const iv = Buffer.from(header.iv, "base64"); const encryptedKey = Buffer.from(header.key, "base64"); const key = await this._provider.crypto.privateDecrypt(encryptedKey, this.privateKey); return { key, iv, header }; } async decryptBase64(payloadB64) { const payloadJson = Buffer.from(payloadB64, "base64"); const encrypted = JSON.parse(payloadJson.toString("utf-8")); const decrypted = await index_1.Server.decrypt(await this.decryptContext({ key: encrypted.key, iv: encrypted.iv }), { content: encrypted.content, authTag: encrypted.authTag }, this._provider); return JSON.parse(decrypted.toString("utf-8")); } } exports.CurrentServer = CurrentServer; //# sourceMappingURL=current-server.js.map