Skip to content

Commit f98b0d4

Browse files
committed
Core,TL,Gen: Transport layer rewrite
- Upgrade .NET to 4.7.2 to use .NET Standard dependency Reason: https://docs.microsoft.com/en-us/dotnet/standard/net-standard - Uses obfuscated WebSocket transport instead of TCP - Adds asynchronous response handling
1 parent 1909961 commit f98b0d4

File tree

357 files changed

+1769
-1671
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

357 files changed

+1769
-1671
lines changed
Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,60 @@
1+
using System;
12
using System.Threading;
23
using System.Threading.Tasks;
34
using TgSharp.Core.Network;
45

56
namespace TgSharp.Core.Auth
67
{
7-
public static class Authenticator
8+
public class Authenticator
89
{
9-
public static async Task<Step3_Response> DoAuthentication(TcpTransport transport, CancellationToken token = default(CancellationToken))
10+
private readonly MtProtoPlainSender sender;
11+
private TaskCompletionSource<Step3_Response> completionSource;
12+
public Authenticator(WSTransport transport)
1013
{
11-
token.ThrowIfCancellationRequested();
14+
sender = new MtProtoPlainSender(transport);
15+
completionSource = new TaskCompletionSource<Step3_Response>();
16+
}
1217

13-
var sender = new MtProtoPlainSender(transport);
18+
public Task<Step3_Response> DoAuthentication()
19+
{
1420
var step1 = new Step1_PQRequest();
1521

16-
await sender.Send(step1.ToBytes(), token).ConfigureAwait(false);
17-
var step1Response = step1.FromBytes(await sender.Receive(token)
18-
.ConfigureAwait(false));
22+
sender.OnResponseReceived = (step1Message) => Sender_OnStep1ResponseReceived(step1, step1Message);
23+
sender.Send(step1.ToBytes());
24+
25+
return completionSource.Task;
26+
}
27+
28+
private void Sender_OnStep1ResponseReceived(Step1_PQRequest step1, byte[] step1Message)
29+
{
30+
var step1Response = step1.FromBytes(step1Message);
1931

2032
var step2 = new Step2_DHExchange();
21-
await sender.Send(step2.ToBytes(
33+
sender.OnResponseReceived = (step2message) => Sender_OnStep2ResponseReceived(step2, step2message);
34+
sender.Send(step2.ToBytes(
2235
step1Response.Nonce,
2336
step1Response.ServerNonce,
2437
step1Response.Fingerprints,
25-
step1Response.Pq), token)
26-
.ConfigureAwait(false);
38+
step1Response.Pq));
39+
}
40+
41+
private void Sender_OnStep2ResponseReceived(Step2_DHExchange step2, byte[] step2message)
42+
{
43+
var step2Response = step2.FromBytes(step2message);
2744

28-
var step2Response = step2.FromBytes(await sender.Receive(token)
29-
.ConfigureAwait(false));
3045

3146
var step3 = new Step3_CompleteDHExchange();
32-
await sender.Send(step3.ToBytes(
47+
sender.OnResponseReceived = (step3Message) => Sender_OnStep3ResponseReceived(step3, step3Message);
48+
sender.Send(step3.ToBytes(
3349
step2Response.Nonce,
3450
step2Response.ServerNonce,
3551
step2Response.NewNonce,
36-
step2Response.EncryptedAnswer), token)
37-
.ConfigureAwait(false);
38-
39-
var step3Response = step3.FromBytes(await sender.Receive(token)
40-
.ConfigureAwait(false));
52+
step2Response.EncryptedAnswer));
53+
}
4154

42-
return step3Response;
55+
private void Sender_OnStep3ResponseReceived(Step3_CompleteDHExchange step3, byte[] response)
56+
{
57+
completionSource.SetResult(step3.FromBytes(response));
4358
}
4459
}
4560
}

src/TgSharp.Core/Network/Message.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.IO;
3+
using System.Linq;
4+
using TgSharp.Core.MTProto.Crypto;
5+
6+
namespace TgSharp.Core.Network
7+
{
8+
public class Message
9+
{
10+
public byte[] Body { get; private set; }
11+
12+
public Message(byte[] body)
13+
{
14+
if (body == null)
15+
throw new ArgumentNullException(nameof(body));
16+
17+
Body = body;
18+
}
19+
20+
public static Message Decode(byte[] body)
21+
{
22+
using (var memoryStream = new MemoryStream(body))
23+
{
24+
using (var binaryReader = new BinaryReader(memoryStream))
25+
{
26+
int length = binaryReader.ReadInt32();
27+
return new Message(binaryReader.ReadBytes(length));
28+
}
29+
}
30+
}
31+
32+
public byte[] Encode()
33+
{
34+
using (var memoryStream = new MemoryStream())
35+
{
36+
using (var binaryWriter = new BinaryWriter(memoryStream))
37+
{
38+
binaryWriter.Write(Body.Length);
39+
binaryWriter.Write(Body);
40+
return memoryStream.ToArray();
41+
}
42+
}
43+
}
44+
45+
}
46+
}

src/TgSharp.Core/Network/MtProtoPlainSender.cs

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,37 @@ namespace TgSharp.Core.Network
77
{
88
public class MtProtoPlainSender
99
{
10+
public Action<byte[]> OnResponseReceived;
11+
1012
private int timeOffset;
1113
private long lastMessageId;
1214
private Random random;
13-
private TcpTransport transport;
15+
private WSTransport transport;
1416

15-
public MtProtoPlainSender(TcpTransport transport)
17+
public MtProtoPlainSender(WSTransport transport)
1618
{
1719
this.transport = transport;
20+
transport.OnUnencryptedMessage += Transport_OnUnencryptedMessage;
1821
random = new Random();
1922
}
2023

21-
public async Task Send(byte[] data, CancellationToken token = default(CancellationToken))
24+
private void Transport_OnUnencryptedMessage(Message message)
2225
{
23-
token.ThrowIfCancellationRequested();
26+
using (var memoryStream = new MemoryStream(message.Body))
27+
using (var binaryReader = new BinaryReader(memoryStream))
28+
{
29+
long authKeyid = binaryReader.ReadInt64();
30+
long messageId = binaryReader.ReadInt64();
31+
int messageLength = binaryReader.ReadInt32();
32+
33+
byte[] response = binaryReader.ReadBytes(messageLength);
2434

35+
OnResponseReceived?.Invoke(response);
36+
}
37+
}
38+
39+
public void Send(byte[] data)
40+
{
2541
using (var memoryStream = new MemoryStream())
2642
{
2743
using (var binaryWriter = new BinaryWriter(memoryStream))
@@ -33,28 +49,7 @@ public MtProtoPlainSender(TcpTransport transport)
3349

3450
byte[] packet = memoryStream.ToArray();
3551

36-
await transport.Send(packet, token).ConfigureAwait(false);
37-
}
38-
}
39-
}
40-
41-
public async Task<byte[]> Receive(CancellationToken token = default(CancellationToken))
42-
{
43-
token.ThrowIfCancellationRequested();
44-
45-
var result = await transport.Receive(token).ConfigureAwait(false);
46-
47-
using (var memoryStream = new MemoryStream(result.Body))
48-
{
49-
using (BinaryReader binaryReader = new BinaryReader(memoryStream))
50-
{
51-
long authKeyid = binaryReader.ReadInt64();
52-
long messageId = binaryReader.ReadInt64();
53-
int messageLength = binaryReader.ReadInt32();
54-
55-
byte[] response = binaryReader.ReadBytes(messageLength);
56-
57-
return response;
52+
transport.Send(packet);
5853
}
5954
}
6055
}

0 commit comments

Comments
 (0)