1.1.2-1.5.3 #20

Merged
Royce59 merged 13 commits from dev into main 2026-03-21 19:37:21 +00:00
Showing only changes of commit 0d70824d77 - Show all commits

View File

@@ -21,24 +21,23 @@ function toUint8Array(input: KeyInput): Uint8Array {
} }
function createFrameProcessor(key: Uint8Array) { function createFrameProcessor(key: Uint8Array) {
// Переиспользуемый nonce буфер — нет аллокаций на каждый фрейм // Выделяем nonce один раз — переиспользуем на каждый фрейм
const nonce = new Uint8Array(sodium.crypto_stream_chacha20_NONCEBYTES); // 8 bytes const nonce = new Uint8Array(sodium.crypto_stream_chacha20_NONCEBYTES); // 8 bytes
const nonceView = new DataView(nonce.buffer, 0, nonce.byteLength);
return function processFrame(data: ArrayBuffer): ArrayBuffer { return function processFrame(data: ArrayBuffer, timestamp: number): ArrayBuffer {
const input = new Uint8Array(data); const input = new Uint8Array(data);
// Обновляем nonce из длины и byteOffset фрейма — уникально и без аллокаций // Безопасно записываем nonce через отдельный DataView
nonce.fill(0); nonceView.setUint32(0, (timestamp >>> 0) & 0xffffffff, false);
new DataView(nonce.buffer).setUint32(0, input.byteLength ^ 0xdeadbeef, false); nonceView.setUint32(4, ((timestamp / 0x100000000) >>> 0) & 0xffffffff, false);
new DataView(nonce.buffer).setUint32(4, input[0] ^ input[input.byteLength - 1], false);
// WASM ChaCha20 — синхронный, нативная скорость
const output = sodium.crypto_stream_chacha20_xor(input, nonce, key); const output = sodium.crypto_stream_chacha20_xor(input, nonce, key);
return output.buffer as ArrayBuffer; return output.buffer as ArrayBuffer;
}; };
} }
function createTransform(processFrame: (data: ArrayBuffer) => ArrayBuffer) { function createTransform(processFrame: (data: ArrayBuffer, timestamp: number) => ArrayBuffer) {
let frames = 0; let frames = 0;
let slowFrames = 0; let slowFrames = 0;
let total = 0; let total = 0;
@@ -49,7 +48,9 @@ function createTransform(processFrame: (data: ArrayBuffer) => ArrayBuffer) {
const started = performance.now(); const started = performance.now();
try { try {
frame.data = processFrame(frame.data); // Передаём timestamp фрейма как nonce
const ts = typeof frame.timestamp === "number" ? frame.timestamp : 0;
frame.data = processFrame(frame.data, ts);
} catch (e) { } catch (e) {
console.error("[E2EE] frame error:", e); console.error("[E2EE] frame error:", e);
controller.enqueue(frame); controller.enqueue(frame);