Optimizations, modernizations, cleanup

This commit is contained in:
2019-02-22 11:04:41 -06:00
parent ffb891b04b
commit 4ecdacedab
13 changed files with 121 additions and 111 deletions

View File

@ -14,17 +14,21 @@ namespace ScreenLogicConnect
{
var arr = msg.AsByteArray();
System.Diagnostics.Debug.WriteLine($" sent {arr.Length}");
stream.Write(arr, 0, arr.Length);
stream.Write(arr);
}
public static void WritePrefixLength(this BinaryWriter bw, string val)
{
bw.Write(val.Length);
bw.Write(Encoding.ASCII.GetBytes(val));
bw.Write(new byte[HLMessageTypeHelper.AlignToNext4Boundary(val.Length)]);
var boundaryBufferLen = HLMessageTypeHelper.AlignToNext4Boundary(val.Length);
for (int i = 0; i < boundaryBufferLen; i++)
{
bw.Write((byte)0);
}
}
public static void WritePrefixLength(this BinaryWriter bw, byte[] val)
public static void WritePrefixLength(this BinaryWriter bw, ReadOnlySpan<byte> val)
{
bw.Write(val.Length);
bw.Write(val);

View File

@ -1,4 +1,6 @@
namespace ScreenLogicConnect
using System;
namespace ScreenLogicConnect
{
public class HLEncoder
{
@ -17,7 +19,7 @@
private readonly uint[] sm_U2 = new uint[] { 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 };
private readonly uint[] sm_U3 = new uint[] { 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 };
private readonly uint[] sm_U4 = new uint[] { 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d };
private readonly byte[] sm_rcon = new byte[] { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 };
private readonly byte[] sm_rcon = new byte[] { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 };
readonly uint[] tk = new uint[MAX_KC];
private bool bKeyInit;
@ -31,7 +33,7 @@
}
}
public byte[] GetEncryptedPassword(string cls)
public Span<byte> GetEncryptedPassword(string cls)
{
if (!string.IsNullOrEmpty(cls))
{
@ -41,14 +43,14 @@
return null;
}
private byte[] MakeBlock(string str, byte byFill)
private Span<byte> MakeBlock(string str, byte byFill)
{
int iLen = BLOCK_SIZE;
if (str.Length >= BLOCK_SIZE)
{
iLen = str.Length;
}
byte[] block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
var block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
for (int i = 0; i < block.Length; i++)
{
if (i < str.Length)
@ -63,14 +65,14 @@
return block;
}
private byte[] MakeBlock(byte[] source, byte byFill)
private Span<byte> MakeBlock(ReadOnlySpan<byte> source, byte byFill)
{
int iLen = BLOCK_SIZE;
if (source.Length >= BLOCK_SIZE)
{
iLen = source.Length;
}
byte[] block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
var block = new byte[(((iLen / BLOCK_SIZE) + (iLen % BLOCK_SIZE > 0 ? 1 : 0)) * BLOCK_SIZE)];
for (int i = 0; i < block.Length; i++)
{
if (i < source.Length)
@ -90,7 +92,7 @@
MakeKeyFromBlock(MakeBlock(sChallengeStr, 0));
}
private void MakeKeyFromBlock(byte[] block)
private void MakeKeyFromBlock(ReadOnlySpan<byte> block)
{
if (block == null)
{
@ -185,7 +187,7 @@
}
}
private byte[] EncryptBlock(byte[] block)
private Span<byte> EncryptBlock(ReadOnlySpan<byte> block)
{
if (!bKeyInit)
{
@ -218,7 +220,7 @@
};
}
byte[] Encrypt(string sString)
Span<byte> Encrypt(string sString)
{
if (bKeyInit)
{
@ -227,7 +229,7 @@
return null;
}
byte[] Encrypt(byte[] source)
Span<byte> Encrypt(ReadOnlySpan<byte> source)
{
if (bKeyInit)
{
@ -236,24 +238,19 @@
return null;
}
byte[] EncryptData(byte[] data)
Span<byte> EncryptData(ReadOnlySpan<byte> data)
{
if (data == null || data.Length < BLOCK_SIZE || data.Length % BLOCK_SIZE != 0)
{
return null;
}
byte[] byEncrypted = new byte[data.Length];
var byEncrypted = new byte[data.Length];
int iNBlocks = data.Length / BLOCK_SIZE;
for (int iBlock = 0; iBlock < iNBlocks; iBlock++)
{
int i;
byte[] decryptedBlock = new byte[BLOCK_SIZE];
for (i = 0; i < BLOCK_SIZE; i++)
{
decryptedBlock[i] = data[(iBlock * BLOCK_SIZE) + i];
}
byte[] encryptedBlock = EncryptBlock(decryptedBlock);
for (i = 0; i < encryptedBlock.Length; i++)
var encryptedBlock = EncryptBlock(data.Slice(iBlock * BLOCK_SIZE, BLOCK_SIZE));
for (int i = 0; i < encryptedBlock.Length; i++)
{
byEncrypted[(iBlock * BLOCK_SIZE) + i] = encryptedBlock[i];
}

View File

@ -36,26 +36,26 @@ namespace ScreenLogicConnect
}
}
public HLTime(short year, short month, short dayOfWeek, short day, short hour, short minute, short second, short millisecond)
public HLTime(short inYear, short inMonth, short inDayOfWeek, short inDay, short inHour, short inMinute, short inSecond, short inMillisecond)
{
this.year = year;
this.month = month;
this.dayOfWeek = dayOfWeek;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
this.millisecond = millisecond;
year = inYear;
month = inMonth;
dayOfWeek = inDayOfWeek;
day = inDay;
hour = inHour;
minute = inMinute;
second = inSecond;
millisecond = inMillisecond;
}
public string toString()
{
return "" + this.month + "/" + this.day + "/" + this.year;
return "" + month + "/" + day + "/" + year;
}
public DateTime toDate()
{
return new DateTime(year: (this.year - 2000) + 100, month: month - 1, day: day, hour: hour, minute: minute, second: second);
return new DateTime(year: (year - 2000) + 100, month: month - 1, day: day, hour: hour, minute: minute, second: second);
}
public long toMilliseconds()

View File

@ -19,7 +19,7 @@ namespace ScreenLogicConnect.Messages
{
}
public ChallengeString(byte[] header, byte[] data)
public ChallengeString(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data)
{
}
@ -31,13 +31,7 @@ namespace ScreenLogicConnect.Messages
protected override void Decode()
{
using (var ms = new MemoryStream(data))
{
using (var br = new BinaryReader(dataByteStream))
{
ChallengeStr = HLMessageTypeHelper.ExtractString(br);
}
}
ChallengeStr = HLMessageTypeHelper.ExtractString(data);
}
}
}

View File

@ -5,7 +5,7 @@ namespace ScreenLogicConnect.Messages
{
public class ClientLogin : HLMessage
{
public byte[] m_byteArray;
public byte[] m_password;
public int m_connectionType;
public int m_int;
public int m_procID;
@ -24,7 +24,7 @@ namespace ScreenLogicConnect.Messages
{
}
public override byte[] AsByteArray()
public override Span<byte> AsByteArray()
{
using (var ms = new MemoryStream())
{
@ -33,7 +33,7 @@ namespace ScreenLogicConnect.Messages
bw.Write(m_schema);
bw.Write(m_connectionType);
bw.WritePrefixLength(m_version);
bw.WritePrefixLength(m_byteArray);
bw.WritePrefixLength(m_password);
bw.Write(m_procID);
}

View File

@ -36,7 +36,7 @@ namespace ScreenLogicConnect.Messages
{
}
public GetControllerConfig(byte[] header, byte[] data)
public GetControllerConfig(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data)
{
}
@ -46,7 +46,7 @@ namespace ScreenLogicConnect.Messages
{
}
public override byte[] AsByteArray()
public override Span<byte> AsByteArray()
{
using (var ms = new MemoryStream())
{

View File

@ -35,7 +35,7 @@ namespace ScreenLogicConnect.Messages
{
}
public override byte[] AsByteArray()
public override Span<byte> AsByteArray()
{
using (var ms = new MemoryStream())
{

View File

@ -1,4 +1,6 @@
namespace ScreenLogicConnect.Messages
using System;
namespace ScreenLogicConnect.Messages
{
public class GetMode : HLMessage
{
@ -14,7 +16,7 @@
{
}
public GetMode(byte[] header, byte[] data)
public GetMode(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data)
{
}

View File

@ -1,4 +1,5 @@
using System.IO;
using System;
using System.IO;
using System.Linq;
namespace ScreenLogicConnect.Messages
@ -40,7 +41,7 @@ namespace ScreenLogicConnect.Messages
{
}
public GetPoolStatus(byte[] header, byte[] data)
public GetPoolStatus(ReadOnlySpan<byte> header, ReadOnlySpan<byte> data)
: base(header, data)
{
}
@ -50,7 +51,7 @@ namespace ScreenLogicConnect.Messages
{
}
public override byte[] AsByteArray()
public override Span<byte> AsByteArray()
{
using (var ms = new MemoryStream())
{
@ -124,27 +125,27 @@ namespace ScreenLogicConnect.Messages
public bool isDeviceready()
{
return this.m_Ok == 1;
return m_Ok == 1;
}
public bool isDeviceSync()
{
return this.m_Ok == 2;
return m_Ok == 2;
}
public bool isDeviceServiceMode()
{
return this.m_Ok == 3;
return m_Ok == 3;
}
public bool isSpaActive()
{
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.SPA_CIRCUIT_ID && x.state == 1) ?? false;
return circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.SPA_CIRCUIT_ID && x.state == 1) ?? false;
}
public bool isPoolActive()
{
return this.circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.POOL_CIRCUIT_ID && x.state == 1) ?? false;
return circuitArray?.Any(x => x.id == CircuitUpdateDataStructure.POOL_CIRCUIT_ID && x.state == 1) ?? false;
}
}
}

View File

@ -27,20 +27,23 @@ namespace ScreenLogicConnect.Messages
}
}
public HLMessage(byte[] headerArray, byte[] dataArray)
public HLMessage(ReadOnlySpan<byte> headerArray, ReadOnlySpan<byte> dataArray)
{
if (headerArray != null)
{
header = new byte[headerArray.Length];
Array.Copy(headerArray, header, headerArray.Length);
headerArray.CopyTo(header);
}
if (dataArray != null)
{
data = new byte[dataArray.Length];
Array.Copy(dataArray, data, dataArray.Length);
dataArray.CopyTo(data);
}
Decode();
if (data != null)
{
Decode();
}
}
public HLMessage(HLMessage msg)
@ -48,26 +51,29 @@ namespace ScreenLogicConnect.Messages
{
}
public virtual byte[] AsByteArray()
public virtual Span<byte> AsByteArray()
{
var dataLength = this.data?.Length ?? 0;
byte[] result = new byte[dataLength + this.header.Length];
using (var bw = new BinaryWriter(new MemoryStream(result)))
var dataLength = data?.Length ?? 0;
var result = new byte[dataLength + header.Length];
using (var ms = new MemoryStream(result))
{
bw.Write(this.header, 0, 4);
bw.Write(dataLength);
if (dataLength > 0)
using (var bw = new BinaryWriter(ms))
{
bw.Write(this.data);
bw.Write(header, 0, 4);
bw.Write(dataLength);
if (dataLength > 0)
{
bw.Write(data);
}
}
}
return result;
}
public static int ExtractDataSize(byte[] data)
public static int ExtractDataSize(ReadOnlySpan<byte> buf)
{
return BitConverter.ToInt32(data, 4);
return BitConverter.ToInt32(buf.Slice(4));
}
public short GetMessageID()
@ -80,7 +86,7 @@ namespace ScreenLogicConnect.Messages
return BitConverter.ToInt16(header, 0);
}
public string GetMessageIDasString()
public string GetMessageIDAsString()
{
return GetMessageID().ToString();
}

View File

@ -18,6 +18,19 @@ namespace ScreenLogicConnect.Messages
return str;
}
public static string ExtractString(ReadOnlySpan<byte> buf)
{
var len = BitConverter.ToInt32(buf);
int startIdx = sizeof(int);
Span<char> chars = stackalloc char[len];
for (int chIdx = 0; chIdx < len; chIdx++)
{
chars[chIdx] = (char)buf[startIdx + chIdx];
}
return new string(chars);
}
public static RgbColor ExtractColor(BinaryReader br)
{
return new RgbColor(

View File

@ -7,10 +7,10 @@ namespace ScreenLogicConnect
public RgbColor color { get; private set; }
public string name { get; private set; }
public PentLightColor(string name, RgbColor color)
public PentLightColor(string inName, RgbColor inColor)
{
this.name = name;
this.color = color;
name = inName;
color = inColor;
}
public override string ToString()

View File

@ -28,24 +28,22 @@ namespace ScreenLogicConnect
Debug.WriteLine("sending challenge string");
stream.SendHLMessage(Messages.ChallengeString.QUERY(0));
var recvBuf = new byte[1024];
var readBytes = stream.Read(recvBuf, 0, recvBuf.Length);
Debug.WriteLine("read {0}", readBytes);
string challengeStr = null;
using (var ms = new MemoryStream(recvBuf))
{
using (var br = new BinaryReader(ms))
{
br.ReadBytes(8);
challengeStr = Messages.HLMessageTypeHelper.ExtractString(br);
}
}
var recvBuf = new byte[8];
var readBytes = await stream.ReadAsync(recvBuf, 0, recvBuf.Length);
Debug.WriteLine("read {0} bytes (header)", readBytes);
var recvBody = new byte[Messages.HLMessage.ExtractDataSize(recvBuf)];
readBytes = await stream.ReadAsync(recvBody, 0, recvBody.Length);
Debug.WriteLine("read {0} bytes (body)", readBytes);
string challengeStr = Messages.HLMessageTypeHelper.ExtractString(recvBody);
Debug.WriteLine("sending login message");
stream.SendHLMessage(CreateLoginMessage(new HLEncoder(password).GetEncryptedPassword(challengeStr)));
readBytes = stream.Read(recvBuf, 0, recvBuf.Length);
readBytes = await stream.ReadAsync(recvBuf, 0, recvBuf.Length);
Debug.WriteLine("read {0}", readBytes);
recvBody = new byte[Messages.HLMessage.ExtractDataSize(recvBuf)];
await stream.ReadAsync(recvBody, 0, recvBody.Length);
return recvBuf[2] == Messages.ClientLogin.HLM_CLIENT_LOGIN + 1;
}
@ -88,7 +86,7 @@ namespace ScreenLogicConnect
}
int msgDataSize = Messages.HLMessage.ExtractDataSize(headerBuffer);
if (msgDataSize <= 0 || msgDataSize >= 100000)
if (msgDataSize <= 0 || msgDataSize >= 100_000)
{
return null;
}
@ -97,7 +95,7 @@ namespace ScreenLogicConnect
bytesRead = 0;
while (bytesRead < msgDataSize)
{
bytesRead += await ns.ReadAsync((byte[])(Array)dataBuffer, bytesRead, msgDataSize - bytesRead);
bytesRead += await ns.ReadAsync(dataBuffer, bytesRead, msgDataSize - bytesRead);
if (bytesRead < 0)
{
@ -113,18 +111,10 @@ namespace ScreenLogicConnect
private const string connectionMessage = "CONNECTSERVERHOST\r\n\r\n";
private byte[] CreateConnectServerSoftMessage()
{
using (var ms = new MemoryStream())
{
using (var bw = new BinaryWriter(ms))
{
bw.Write(Encoding.ASCII.GetBytes(connectionMessage));
}
return ms.ToArray();
}
return Encoding.ASCII.GetBytes(connectionMessage);
}
private Messages.HLMessage CreateLoginMessage(byte[] encodedPwd)
private Messages.HLMessage CreateLoginMessage(ReadOnlySpan<byte> encodedPwd)
{
Messages.ClientLogin login = Messages.ClientLogin.QUERY(0);
login.m_schema = 348;
@ -132,19 +122,22 @@ namespace ScreenLogicConnect
login.m_version = "ScreenLogicConnect library";
login.m_procID = 2;
if (encodedPwd == null)
if (encodedPwd != null)
{
encodedPwd = new byte[16];
}
if (encodedPwd.Length > 16)
{
login.m_byteArray = new byte[16];
Array.Copy(encodedPwd, login.m_byteArray, 16);
if (encodedPwd.Length > 16)
{
login.m_password = new byte[16];
encodedPwd.Slice(0, 16).CopyTo(login.m_password);
}
else
{
login.m_password = new byte[encodedPwd.Length];
encodedPwd.CopyTo(login.m_password);
}
}
else
{
login.m_byteArray = encodedPwd;
login.m_password = new byte[16];
}
return login;