public async Task Send(byte[] data, CancellationToken token = default(CancellationToken)) { token.ThrowIfCancellationRequested(); using (var memoryStream = new MemoryStream()) { using (var binaryWriter = new BinaryWriter(memoryStream)) { binaryWriter.Write((long)0); binaryWriter.Write(GetNewMessageId()); binaryWriter.Write(data.Length); binaryWriter.Write(data); byte[] packet = memoryStream.ToArray(); await transport.Send(packet, token).ConfigureAwait(false); } } }
public async Task Send(byte[] packet, TLMethod request, CancellationToken token = default(CancellationToken)) { token.ThrowIfCancellationRequested(); request.MessageId = session.GetNewMessageId(); byte[] msgKey; byte[] ciphertext; using (MemoryStream plaintextPacket = makeMemory(8 + 8 + 8 + 4 + 4 + packet.Length)) { using (BinaryWriter plaintextWriter = new BinaryWriter(plaintextPacket)) { plaintextWriter.Write(session.Salt); plaintextWriter.Write(session.Id); plaintextWriter.Write(request.MessageId); plaintextWriter.Write(GenerateSequence(request.Confirmed)); plaintextWriter.Write(packet.Length); plaintextWriter.Write(packet); msgKey = Helpers.CalcMsgKey(plaintextPacket.GetBuffer()); ciphertext = AES.EncryptAES(Helpers.CalcKey(session.AuthKey.Data, msgKey, true), plaintextPacket.GetBuffer()); } } using (MemoryStream ciphertextPacket = makeMemory(8 + 16 + ciphertext.Length)) { using (BinaryWriter writer = new BinaryWriter(ciphertextPacket)) { writer.Write(session.AuthKey.Id); writer.Write(msgKey); writer.Write(ciphertext); await transport.Send(ciphertextPacket.GetBuffer(), token).ConfigureAwait(false); } } }