Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.4 KiB
106 lines
3.4 KiB
4 years ago
|
//import aesjs from 'aes-js';
|
||
|
import { CTR } from "@cryptography/aes";
|
||
|
import { bytesFromWordss } from "../../bin_utils";
|
||
|
import { Codec } from "./codec";
|
||
|
|
||
|
/*
|
||
|
@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged
|
||
|
*/
|
||
|
export default class Obfuscation {
|
||
|
/* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;
|
||
|
public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */
|
||
|
|
||
|
public encNew: CTR;
|
||
|
public decNew: CTR;
|
||
|
|
||
|
public init(codec: Codec) {
|
||
|
const initPayload = new Uint8Array(64);
|
||
|
initPayload.randomize();
|
||
|
|
||
|
while(true) {
|
||
|
let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);
|
||
|
let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);
|
||
|
if(initPayload[0] != 0xef &&
|
||
|
val != 0x44414548 &&
|
||
|
val != 0x54534f50 &&
|
||
|
val != 0x20544547 &&
|
||
|
val != 0x4954504f &&
|
||
|
val != 0xeeeeeeee &&
|
||
|
val != 0xdddddddd &&
|
||
|
val2 != 0x00000000) {
|
||
|
//initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;
|
||
|
break;
|
||
|
}
|
||
|
initPayload.randomize();
|
||
|
}
|
||
|
|
||
|
////////////////////////initPayload.subarray(60, 62).hex = dcID;
|
||
|
|
||
|
const reversedPayload = initPayload.slice().reverse();
|
||
|
|
||
|
let encKey = initPayload.slice(8, 40);
|
||
|
let encIv = initPayload.slice(40, 56);
|
||
|
let decKey = reversedPayload.slice(8, 40);
|
||
|
let decIv = reversedPayload.slice(40, 56);
|
||
|
|
||
|
/* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));
|
||
|
this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */
|
||
|
|
||
|
this.encNew = new CTR(encKey, encIv);
|
||
|
this.decNew = new CTR(decKey, decIv);
|
||
|
|
||
|
initPayload.set(codec.obfuscateTag, 56);
|
||
|
const encrypted = this.encode(initPayload);
|
||
|
|
||
|
initPayload.set(encrypted.slice(56, 64), 56);
|
||
|
|
||
|
return initPayload;
|
||
|
}
|
||
|
|
||
|
/* public encode(payload: Uint8Array) {
|
||
|
let startTime = performance.now();
|
||
|
let res = this.enc.encrypt(payload);
|
||
|
let time = performance.now() - startTime;
|
||
|
|
||
|
try {
|
||
|
startTime = performance.now();
|
||
|
let arr = this.encNew.encrypt(payload);
|
||
|
//let resNew = bytesFromWords({words: arr, sigBytes: arr.length});
|
||
|
let resNew = new Uint8Array(bytesFromWordss(arr));
|
||
|
let time2 = performance.now() - startTime;
|
||
|
console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex == resNew.hex, time2 < time);
|
||
|
} catch(err) {
|
||
|
console.error('Obfuscation: error:', err);
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public decode(payload: Uint8Array) {
|
||
|
let res = this.dec.encrypt(payload);
|
||
|
|
||
|
try {
|
||
|
let arr = this.decNew.decrypt(payload);
|
||
|
//let resNew = bytesFromWords({words: arr, sigBytes: arr.length});
|
||
|
let resNew = new Uint8Array(bytesFromWordss(arr));
|
||
|
console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex == resNew.hex);
|
||
|
} catch(err) {
|
||
|
console.error('Obfuscation: error:', err);
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
} */
|
||
|
public encode(payload: Uint8Array) {
|
||
|
let res = this.encNew.encrypt(payload);
|
||
|
let bytes = new Uint8Array(bytesFromWordss(res));
|
||
|
|
||
|
return bytes;
|
||
|
}
|
||
|
|
||
|
public decode(payload: Uint8Array) {
|
||
|
let res = this.decNew.decrypt(payload);
|
||
|
let bytes = new Uint8Array(bytesFromWordss(res));
|
||
|
|
||
|
return bytes;
|
||
|
}
|
||
|
}
|