@mojsoski/server-crypto
Version:
Asymmetric key-exchange cryptography library
57 lines • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Server = void 0;
const async_stream_1 = require("@mojsoski/async-stream");
const base_1 = require("./base");
class Server {
_provider;
constructor(crypto) {
this._provider = crypto;
}
async verifyJwt(jwt) {
return (await this._provider.jwt.verifyRS256(jwt, this.publicKey));
}
async createContext() {
const key = await this._provider.crypto.randomBytes(base_1.AES_KEY_LEN);
const iv = await this._provider.crypto.randomBytes(base_1.IV_LEN);
const encryptedKey = await this._provider.crypto.publicEncrypt(key, this.publicKey);
return {
header: {
key: encryptedKey.toString("base64"),
iv: iv.toString("base64"),
},
key,
iv,
};
}
static async decrypt({ key, iv }, content, provider) {
const authTag = Buffer.from(content.authTag, "base64");
const encrypted = Buffer.from(content.content, "base64");
return await provider.crypto.decrypt(encrypted, authTag, key, iv);
}
encryptStream(stream) {
return async_stream_1.AsyncTransform.from(this.createContext().then((context) => async_stream_1.AsyncTransform.from([
context.header,
]).concat(stream
.transform()
.map((item) => Server.encrypt(context, item, this._provider))))).stream();
}
static async encrypt({ key, iv }, content, provider) {
const { content: encrypted, authTag } = await provider.crypto.encrypt(content, key, iv);
return {
content: encrypted.toString("base64"),
authTag: authTag.toString("base64"),
};
}
async encryptBase64(obj) {
const json = Buffer.from(JSON.stringify(obj), "utf-8");
const context = await this.createContext();
const base64Object = {
...context.header,
...(await Server.encrypt(context, json, this._provider)),
};
return Buffer.from(JSON.stringify(base64Object), "utf-8").toString("base64");
}
}
exports.Server = Server;
//# sourceMappingURL=server.js.map