rc4 done also client restructure
woom oom om m
This commit is contained in:
parent
88714ec13a
commit
8960453143
10 changed files with 53 additions and 16 deletions
|
@ -34,14 +34,24 @@ class Connection {
|
||||||
|
|
||||||
private static onMessage(event: any): void {
|
private static onMessage(event: any): void {
|
||||||
var raw = new Uint8Array(event.data);
|
var raw = new Uint8Array(event.data);
|
||||||
var msg = Packet.fromBytes(raw);
|
var msg: Packet;
|
||||||
console.log(msg);
|
try {
|
||||||
|
msg = !Cipher.ready ? Packet.fromBytes(raw)
|
||||||
|
: Packet.fromBytes(Cipher.parse(raw));
|
||||||
|
} catch(e) {
|
||||||
|
close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(msg);
|
||||||
switch(msg.id) {
|
switch(msg.id) {
|
||||||
case kPacketId.KeyExchange:
|
case kPacketId.KeyExchange:
|
||||||
var response = Key.generateResponsePacket(msg);
|
var response = Key.generateResponsePacket(msg);
|
||||||
|
if(Key.succeeded) {
|
||||||
|
Cipher.init(Key.privateKey);
|
||||||
Connection.send(response);
|
Connection.send(response);
|
||||||
console.log(response);
|
} else
|
||||||
|
CriticalStop.redirect("Could not establish an encrypted connection with the server.");
|
||||||
break;
|
break;
|
||||||
case kPacketId.LoginAttempt:
|
case kPacketId.LoginAttempt:
|
||||||
|
|
||||||
|
@ -54,6 +64,7 @@ class Connection {
|
||||||
|
|
||||||
private static onClose(event: any): void {
|
private static onClose(event: any): void {
|
||||||
Connection._isOpen = false;
|
Connection._isOpen = false;
|
||||||
|
Cipher.close();
|
||||||
|
|
||||||
if(Connection.onCloseFunc)
|
if(Connection.onCloseFunc)
|
||||||
Connection.onCloseFunc();
|
Connection.onCloseFunc();
|
|
@ -1,7 +1,7 @@
|
||||||
class Key {
|
class Key {
|
||||||
private static secret: bigInt;
|
private static secret: bigInt;
|
||||||
private static _privateKey: bigInt = new bigInt(0);
|
private static _privateKey: bigInt = new bigInt(0);
|
||||||
private static get privateKey(): bigInt {
|
public static get privateKey(): bigInt {
|
||||||
return Key._privateKey;
|
return Key._privateKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,9 +17,10 @@ class Key {
|
||||||
var generator = new bigInt(request[0].toString(), 16);
|
var generator = new bigInt(request[0].toString(), 16);
|
||||||
var modulus = new bigInt(request[1].toString(), 16);
|
var modulus = new bigInt(request[1].toString(), 16);
|
||||||
var serverKey = new bigInt(request[2].toString(), 16);
|
var serverKey = new bigInt(request[2].toString(), 16);
|
||||||
|
var clientKey = generator.modPow(Key.secret, modulus);
|
||||||
|
|
||||||
Key._privateKey = serverKey.modPow(serverKey, modulus);
|
Key._privateKey = serverKey.modPow(Key.secret, modulus);
|
||||||
return Packet.create(kPacketId.KeyExchange, [generator.modPow(Key.secret, modulus).toString(16)]);
|
return Packet.create(kPacketId.KeyExchange, [clientKey.toString(16)]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,12 +28,17 @@ class Cipher {
|
||||||
private static key: Uint8Array;
|
private static key: Uint8Array;
|
||||||
private static state: Uint8Array;
|
private static state: Uint8Array;
|
||||||
|
|
||||||
|
private static _ready: boolean = false;
|
||||||
|
public static get ready(): boolean {
|
||||||
|
return Cipher._ready;
|
||||||
|
}
|
||||||
|
|
||||||
public static init(key: bigInt) {
|
public static init(key: bigInt) {
|
||||||
Cipher.key = key.toByteArray(512 / 8);
|
Cipher.key = key.toByteArray(512 / 8);
|
||||||
Cipher.state = new Uint8Array(256);
|
Cipher.state = new Uint8Array(256);
|
||||||
Cipher.state.map((value: number, index: number): number => {
|
|
||||||
return index;
|
for(var stateIndex = 0; stateIndex < Cipher.state.length; ++stateIndex)
|
||||||
});
|
Cipher.state[stateIndex] = stateIndex;
|
||||||
|
|
||||||
var i, j = 0, t;
|
var i, j = 0, t;
|
||||||
for(i = 0; i < 256; ++i) {
|
for(i = 0; i < 256; ++i) {
|
||||||
|
@ -44,6 +50,7 @@ class Cipher {
|
||||||
}
|
}
|
||||||
|
|
||||||
Cipher.generateStream(1024);
|
Cipher.generateStream(1024);
|
||||||
|
Cipher._ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static generateStream(length: number): Uint8Array {
|
private static generateStream(length: number): Uint8Array {
|
||||||
|
@ -65,10 +72,17 @@ class Cipher {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static parse(data: Uint8Array): Uint8Array {
|
public static parse(data: Uint8Array): Uint8Array {
|
||||||
|
if(!Cipher._ready)
|
||||||
|
return null;
|
||||||
|
|
||||||
var stream = Cipher.generateStream(data.length);
|
var stream = Cipher.generateStream(data.length);
|
||||||
for(var i = 0; i < data.length; ++i)
|
for(var i = 0; i < data.length; ++i)
|
||||||
data[i] = data[i] ^ stream[i];
|
data[i] = data[i] ^ stream[i];
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static close(): void {
|
||||||
|
Cipher._ready = false;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -5,6 +5,7 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Square;
|
using Square;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace CircleScape.Encryption {
|
namespace CircleScape.Encryption {
|
||||||
class Key {
|
class Key {
|
||||||
|
@ -31,10 +32,10 @@ namespace CircleScape.Encryption {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger ParseResponsePacket(Packet packet) {
|
public BigInteger ParseResponsePacket(Packet packet) {
|
||||||
if(packet.Id == Packet.kId.KeyExchange && packet.RegionCount != 1)
|
if(packet.Id != Packet.kId.KeyExchange || packet.RegionCount != 1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if(!BigInteger.TryParse(packet[0], out BigInteger ClientKey))
|
if(!BigInteger.TryParse(packet[0], NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out BigInteger ClientKey))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return (PrivateKey = BigInteger.ModPow(ClientKey, Secret, Modulus));
|
return (PrivateKey = BigInteger.ModPow(ClientKey, Secret, Modulus));
|
||||||
|
|
|
@ -4,9 +4,17 @@ using System.Linq;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Kneesocks;
|
||||||
|
using CircleScape.Encryption;
|
||||||
|
|
||||||
namespace CircleScape {
|
namespace CircleScape {
|
||||||
class ActiveConnection : Kneesocks.Connection {
|
class ActiveConnection : Kneesocks.Connection {
|
||||||
|
private Cipher Encryptor;
|
||||||
|
|
||||||
|
public void Initialize(PendingConnection conn) {
|
||||||
|
Initialize(conn, false);
|
||||||
|
Encryptor = conn.Encryptor;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace CircleScape {
|
||||||
class PendingConnection : Connection {
|
class PendingConnection : Connection {
|
||||||
private DateTime ConnectionOpened;
|
private DateTime ConnectionOpened;
|
||||||
private Key Key;
|
private Key Key;
|
||||||
private Cipher Encryptor;
|
public Cipher Encryptor { get; private set; } = null;
|
||||||
|
|
||||||
protected override void OnOpen() {
|
protected override void OnOpen() {
|
||||||
ConnectionOpened = DateTime.UtcNow;
|
ConnectionOpened = DateTime.UtcNow;
|
||||||
|
@ -28,7 +28,10 @@ namespace CircleScape {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnReceive(byte[] data) {
|
protected override void OnReceive(byte[] data) {
|
||||||
var packet = Packet.FromBytes(data);
|
Packet packet =
|
||||||
|
Encryptor == null ? Packet.FromBytes(data)
|
||||||
|
: Packet.FromBytes(Encryptor.Parse(data));
|
||||||
|
|
||||||
if(!packet.IsLegal) {
|
if(!packet.IsLegal) {
|
||||||
Disconnect(Frame.kClosingReason.ProtocolError, "Packet received was not legal.");
|
Disconnect(Frame.kClosingReason.ProtocolError, "Packet received was not legal.");
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue