UNPKG

@wordpress/sync

Version:
134 lines (132 loc) 4.27 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // packages/sync/src/providers/y-webrtc/crypto.js var crypto_exports = {}; __export(crypto_exports, { decrypt: () => decrypt, decryptJson: () => decryptJson, deriveKey: () => deriveKey, encrypt: () => encrypt, encryptJson: () => encryptJson }); module.exports = __toCommonJS(crypto_exports); var encoding = __toESM(require("lib0/encoding")); var decoding = __toESM(require("lib0/decoding")); var promise = __toESM(require("lib0/promise")); var error = __toESM(require("lib0/error")); var string = __toESM(require("lib0/string")); var deriveKey = (secret, roomName) => { const secretBuffer = string.encodeUtf8(secret).buffer; const salt = string.encodeUtf8(roomName).buffer; return crypto.subtle.importKey("raw", secretBuffer, "PBKDF2", false, ["deriveKey"]).then( (keyMaterial) => crypto.subtle.deriveKey( { name: "PBKDF2", salt, iterations: 1e5, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"] ) ); }; var encrypt = (data, key) => { if (!key) { return ( /** @type {PromiseLike<Uint8Array>} */ promise.resolve(data) ); } const iv = crypto.getRandomValues(new Uint8Array(12)); return crypto.subtle.encrypt( { name: "AES-GCM", iv }, key, data ).then((cipher) => { const encryptedDataEncoder = encoding.createEncoder(); encoding.writeVarString(encryptedDataEncoder, "AES-GCM"); encoding.writeVarUint8Array(encryptedDataEncoder, iv); encoding.writeVarUint8Array( encryptedDataEncoder, new Uint8Array(cipher) ); return encoding.toUint8Array(encryptedDataEncoder); }); }; var encryptJson = (data, key) => { const dataEncoder = encoding.createEncoder(); encoding.writeAny(dataEncoder, data); return encrypt(encoding.toUint8Array(dataEncoder), key); }; var decrypt = (data, key) => { if (!key) { return ( /** @type {PromiseLike<Uint8Array>} */ promise.resolve(data) ); } const dataDecoder = decoding.createDecoder(data); const algorithm = decoding.readVarString(dataDecoder); if (algorithm !== "AES-GCM") { promise.reject(error.create("Unknown encryption algorithm")); } const iv = decoding.readVarUint8Array(dataDecoder); const cipher = decoding.readVarUint8Array(dataDecoder); return crypto.subtle.decrypt( { name: "AES-GCM", iv }, key, cipher ).then((data2) => new Uint8Array(data2)); }; var decryptJson = (data, key) => decrypt(data, key).then( (decryptedValue) => decoding.readAny( decoding.createDecoder(new Uint8Array(decryptedValue)) ) ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { decrypt, decryptJson, deriveKey, encrypt, encryptJson }); //# sourceMappingURL=crypto.js.map