@wordpress/sync
Version:
107 lines (101 loc) • 4.32 kB
JavaScript
/* wp:polyfill */
;
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