Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public byte[] CreatePayload(Command command, string data)
- {
- byte[] payload = Encoding.UTF8.GetBytes(data);
- if (Version == ProtocolVersion.V33)
- {
- payload = Encrypt(payload); // Encrypt
- // Add protocol 3.3 header
- if ((command != Command.DP_QUERY) && (command != Command.UPDATED_PS))
- payload = Enumerable.Concat(PROTOCOL_33_HEADER, payload).ToArray();
- }
- else if (command == Command.CONTROL)
- {
- // Encrypt
- payload = Encrypt(payload);
- // Encode to base64
- string data64 = Convert.ToBase64String(payload);
- // Make string
- payload = Encoding.UTF8.GetBytes($"data={data64}||lpv=3.1||");
- using (var md5 = MD5.Create())
- using (var ms = new MemoryStream())
- {
- // Calculate MD5 of data
- ms.Write(payload, 0, payload.Length);
- // ...and encryption key
- var binaryKey = Encoding.UTF8.GetBytes(LocalKey);
- ms.Write(binaryKey, 0, binaryKey.Length);
- string md5s =
- BitConverter.ToString( // Make string from MD5
- md5.ComputeHash(ms.ToArray()) // Calculate MD5
- )
- .Replace("-", string.Empty) // Remove '-'
- .Substring(8, 16) // Get part of it
- .ToLower(); // Lowercase
- // Data with version & MD5 hash/signature
- payload = Encoding.UTF8.GetBytes($"3.1{md5s}{data64}");
- }
- }
- using (var ms = new MemoryStream())
- {
- byte[] seqNo = BitConverter.GetBytes(SeqNo++);
- if (BitConverter.IsLittleEndian) Array.Reverse(seqNo); // Make big-endian
- byte[] dataLength = BitConverter.GetBytes(payload.Length + 8);
- if (BitConverter.IsLittleEndian) Array.Reverse(dataLength); // Make big-endian
- ms.Write(PREFIX_VALUE, 0, 4); // Prefix
- ms.Write(seqNo, 0, 4); // Packet number
- ms.Write(new byte[] { 0, 0, 0, (byte) command }, 0, 4); // Command number
- ms.Write(dataLength, 0, 4); // Length of data + length of suffix
- ms.Write(payload, 0, payload.Length); // Data
- var crc32 = new Crc32();
- var crc = crc32.Get(ms.ToArray());
- byte[] crcBin = BitConverter.GetBytes(crc);
- if (BitConverter.IsLittleEndian) Array.Reverse(crcBin); // Make big-endian
- ms.Write(crcBin, 0, 4); // CRC32 checksum
- ms.Write(SUFFIX_VALUE, 0, 4); // Suffix
- payload = ms.ToArray();
- }
- return payload;
- }
Add Comment
Please, Sign In to add comment