Files
VRCX/src/security.js
Natsumi 938fff63d0 Electron support for Linux (#1074)
* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Fix UI var

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* init

* SQLite changes

* Move html folder, edit build scripts

* AppApi interface

* Build flags

* AppApi inheritance

* Finishing touches

* Merge upstream changes

* Test CI

* Fix class inits

* Rename AppApi

* Merge upstream changes

* Fix SQLiteLegacy on Linux, Add Linux interop, build tools

* Linux specific localisation strings

* Make it run

* Bring back most of Linux functionality

* Clean up

* Fix TTS voices

* Changes

* Electron minimise to tray

* Remove separate toggle for WlxOverlay

* Fixes

* Touchups

* Move csproj

* Window zoom, Desktop Notifications, VR check on Linux

* Fix desktop notifications, VR check spam

* Fix building on Linux

* Clean up

* Fix WebApi headers

* Rewrite VRCX updater

* Clean up

* Linux updater

* Add Linux to build action

* Test updater

* Rebase and handle merge conflicts

* Fix Linux updater

* Fix Linux app restart

* Fix friend order

* Handle AppImageInstaller, show an install message on Linux

* Updates to the AppImage installer

* Fix Linux updater, fix set version, check for .NET, copy wine prefix

* Handle random errors

* Rotate tall prints

* try fix Linux restart bug

* Final

---------

Co-authored-by: rs189 <35667100+rs189@users.noreply.github.com>
2025-01-11 13:09:44 +13:00

68 lines
1.8 KiB
JavaScript

const defaultAESKey = new TextEncoder().encode(
'https://github.com/pypy-vrc/VRCX'
);
const hexToUint8Array = (hexStr) => {
const r = hexStr.match(/.{1,2}/g);
if (!r) return null;
return new Uint8Array(r.map((b) => parseInt(b, 16)));
};
const uint8ArrayToHex = (arr) =>
arr.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
function stdAESKey(key) {
const tKey = new TextEncoder().encode(key);
let sk = tKey;
if (key.length < 32) {
sk = new Uint8Array(32);
sk.set(tKey);
sk.set(defaultAESKey.slice(key.length, 32), key.length);
}
return sk.slice(0, 32);
}
async function encrypt(plaintext, key) {
let iv = window.crypto.getRandomValues(new Uint8Array(12));
let sharedKey = await window.crypto.subtle.importKey(
'raw',
stdAESKey(key),
{ name: 'AES-GCM', length: 256 },
true,
['encrypt']
);
let cipher = await window.crypto.subtle.encrypt(
{ name: 'AES-GCM', iv },
sharedKey,
new TextEncoder().encode(plaintext)
);
let ciphertext = new Uint8Array(cipher);
let encrypted = new Uint8Array(iv.length + ciphertext.byteLength);
encrypted.set(iv, 0);
encrypted.set(ciphertext, iv.length);
return uint8ArrayToHex(encrypted);
}
async function decrypt(ciphertext, key) {
let text = hexToUint8Array(ciphertext);
if (!text) return '';
let sharedKey = await window.crypto.subtle.importKey(
'raw',
stdAESKey(key),
{ name: 'AES-GCM', length: 256 },
true,
['decrypt']
);
let plaintext = await window.crypto.subtle.decrypt(
{ name: 'AES-GCM', iv: text.slice(0, 12) },
sharedKey,
text.slice(12)
);
return new TextDecoder().decode(new Uint8Array(plaintext));
}
export default {
decrypt,
encrypt
};