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 {
|
||||
var raw = new Uint8Array(event.data);
|
||||
var msg = Packet.fromBytes(raw);
|
||||
console.log(msg);
|
||||
var msg: Packet;
|
||||
try {
|
||||
msg = !Cipher.ready ? Packet.fromBytes(raw)
|
||||
: Packet.fromBytes(Cipher.parse(raw));
|
||||
} catch(e) {
|
||||
close();
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(msg);
|
||||
switch(msg.id) {
|
||||
case kPacketId.KeyExchange:
|
||||
var response = Key.generateResponsePacket(msg);
|
||||
if(Key.succeeded) {
|
||||
Cipher.init(Key.privateKey);
|
||||
Connection.send(response);
|
||||
console.log(response);
|
||||
} else
|
||||
CriticalStop.redirect("Could not establish an encrypted connection with the server.");
|
||||
break;
|
||||
case kPacketId.LoginAttempt:
|
||||
|
||||
|
@ -54,6 +64,7 @@ class Connection {
|
|||
|
||||
private static onClose(event: any): void {
|
||||
Connection._isOpen = false;
|
||||
Cipher.close();
|
||||
|
||||
if(Connection.onCloseFunc)
|
||||
Connection.onCloseFunc();
|
|
@ -1,7 +1,7 @@
|
|||
class Key {
|
||||
private static secret: bigInt;
|
||||
private static _privateKey: bigInt = new bigInt(0);
|
||||
private static get privateKey(): bigInt {
|
||||
public static get privateKey(): bigInt {
|
||||
return Key._privateKey;
|
||||
}
|
||||
|
||||
|
@ -17,9 +17,10 @@ class Key {
|
|||
var generator = new bigInt(request[0].toString(), 16);
|
||||
var modulus = new bigInt(request[1].toString(), 16);
|
||||
var serverKey = new bigInt(request[2].toString(), 16);
|
||||
var clientKey = generator.modPow(Key.secret, modulus);
|
||||
|
||||
Key._privateKey = serverKey.modPow(serverKey, modulus);
|
||||
return Packet.create(kPacketId.KeyExchange, [generator.modPow(Key.secret, modulus).toString(16)]);
|
||||
Key._privateKey = serverKey.modPow(Key.secret, modulus);
|
||||
return Packet.create(kPacketId.KeyExchange, [clientKey.toString(16)]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,12 +28,17 @@ class Cipher {
|
|||
private static key: Uint8Array;
|
||||
private static state: Uint8Array;
|
||||
|
||||
private static _ready: boolean = false;
|
||||
public static get ready(): boolean {
|
||||
return Cipher._ready;
|
||||
}
|
||||
|
||||
public static init(key: bigInt) {
|
||||
Cipher.key = key.toByteArray(512 / 8);
|
||||
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;
|
||||
for(i = 0; i < 256; ++i) {
|
||||
|
@ -44,6 +50,7 @@ class Cipher {
|
|||
}
|
||||
|
||||
Cipher.generateStream(1024);
|
||||
Cipher._ready = true;
|
||||
}
|
||||
|
||||
private static generateStream(length: number): Uint8Array {
|
||||
|
@ -65,10 +72,17 @@ class Cipher {
|
|||
}
|
||||
|
||||
public static parse(data: Uint8Array): Uint8Array {
|
||||
if(!Cipher._ready)
|
||||
return null;
|
||||
|
||||
var stream = Cipher.generateStream(data.length);
|
||||
for(var i = 0; i < data.length; ++i)
|
||||
data[i] = data[i] ^ stream[i];
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public static close(): void {
|
||||
Cipher._ready = false;
|
||||
}
|
||||
}
|
|
@ -5,6 +5,7 @@ using System.Text;
|
|||
using System.Threading.Tasks;
|
||||
using System.Numerics;
|
||||
using Square;
|
||||
using System.Globalization;
|
||||
|
||||
namespace CircleScape.Encryption {
|
||||
class Key {
|
||||
|
@ -31,10 +32,10 @@ namespace CircleScape.Encryption {
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
if(!BigInteger.TryParse(packet[0], out BigInteger ClientKey))
|
||||
if(!BigInteger.TryParse(packet[0], NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out BigInteger ClientKey))
|
||||
return -1;
|
||||
|
||||
return (PrivateKey = BigInteger.ModPow(ClientKey, Secret, Modulus));
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace Square {
|
|||
=> Convert.ToBase64String(bytes);
|
||||
|
||||
public static string ToHexString(this byte[] bytes)
|
||||
=> BitConverter.ToString(bytes).Replace("-", "");
|
||||
=> BitConverter.ToString(bytes).Replace("-", " ");
|
||||
|
||||
public static string GetString(this byte[] bytes, bool isUtf8 = true)
|
||||
=> isUtf8 ? Encoding.UTF8.GetString(bytes)
|
||||
|
|
|
@ -4,9 +4,17 @@ using System.Linq;
|
|||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Kneesocks;
|
||||
using CircleScape.Encryption;
|
||||
|
||||
namespace CircleScape {
|
||||
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 {
|
||||
private DateTime ConnectionOpened;
|
||||
private Key Key;
|
||||
private Cipher Encryptor;
|
||||
public Cipher Encryptor { get; private set; } = null;
|
||||
|
||||
protected override void OnOpen() {
|
||||
ConnectionOpened = DateTime.UtcNow;
|
||||
|
@ -28,7 +28,10 @@ namespace CircleScape {
|
|||
}
|
||||
|
||||
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) {
|
||||
Disconnect(Frame.kClosingReason.ProtocolError, "Packet received was not legal.");
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue