UNPKG

@wordpress/sync

Version:
107 lines (101 loc) 4.32 kB
/* wp:polyfill */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.encryptJson = exports.encrypt = exports.deriveKey = exports.decryptJson = exports.decrypt = void 0; var encoding = _interopRequireWildcard(require("lib0/encoding")); var decoding = _interopRequireWildcard(require("lib0/decoding")); var promise = _interopRequireWildcard(require("lib0/promise")); var error = _interopRequireWildcard(require("lib0/error")); var string = _interopRequireWildcard(require("lib0/string")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } // File copied as is from the y-webrtc package. /* eslint-disable eslint-comments/disable-enable-pair */ /* eslint-disable eslint-comments/no-unlimited-disable */ /* eslint-disable */ // @ts-nocheck /* eslint-env browser */ /** * @param {string} secret * @param {string} roomName * @return {PromiseLike<CryptoKey>} */ const 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: 100000, hash: 'SHA-256' }, keyMaterial, { name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'])); }; /** * @param {Uint8Array} data data to be encrypted * @param {CryptoKey?} key * @return {PromiseLike<Uint8Array>} encrypted, base64 encoded message */ exports.deriveKey = deriveKey; const 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); }); }; /** * @param {Object} data data to be encrypted * @param {CryptoKey?} key * @return {PromiseLike<Uint8Array>} encrypted data, if key is provided */ exports.encrypt = encrypt; const encryptJson = (data, key) => { const dataEncoder = encoding.createEncoder(); encoding.writeAny(dataEncoder, data); return encrypt(encoding.toUint8Array(dataEncoder), key); }; /** * @param {Uint8Array} data * @param {CryptoKey?} key * @return {PromiseLike<Uint8Array>} decrypted buffer */ exports.encryptJson = encryptJson; const 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(data => new Uint8Array(data)); }; /** * @param {Uint8Array} data * @param {CryptoKey?} key * @return {PromiseLike<Object>} decrypted object */ exports.decrypt = decrypt; const decryptJson = (data, key) => decrypt(data, key).then(decryptedValue => decoding.readAny(decoding.createDecoder(new Uint8Array(decryptedValue)))); exports.decryptJson = decryptJson; //# sourceMappingURL=crypto.js.map