call CollectField only if CollectAccessHash

This commit is contained in:
Wizou 2022-02-11 18:05:12 +01:00
parent 3fe9002f2e
commit 7570732a3f
3 changed files with 13 additions and 22 deletions

View file

@ -1175,9 +1175,8 @@ namespace WTelegram
lock (_accessHashes)
_accessHashes.GetOrCreate(typeof(T))[id] = access_hash;
}
internal void MonitorField(FieldInfo fieldInfo, object obj, object access_hash)
internal void CollectField(FieldInfo fieldInfo, object obj, object access_hash)
{
if (!CollectAccessHash) return;
if (fieldInfo.Name != "access_hash") return;
if (access_hash is not long accessHash) return;
var type = fieldInfo.ReflectedType;

View file

@ -213,9 +213,6 @@ namespace WTelegram
throw new ApplicationException("g^a or g^b is not between 2^{2048-64} and dh_prime - 2^{2048-64}");
}
[TLDef(0x7A19CB76)] //RSA_public_key#7a19cb76 n:bytes e:bytes = RSAPublicKey
public class RSAPublicKey : IObject { public byte[] n, e; }
public static void LoadPublicKey(string pem)
{
using var rsa = RSA.Create();
@ -224,7 +221,10 @@ namespace WTelegram
var rsaParam = rsa.ExportParameters(false);
if (rsaParam.Modulus[0] == 0) rsaParam.Modulus = rsaParam.Modulus[1..];
var publicKey = new RSAPublicKey { n = rsaParam.Modulus, e = rsaParam.Exponent };
var bareData = publicKey.Serialize(); // bare serialization
using var memStream = new MemoryStream(280);
using (var writer = new BinaryWriter(memStream))
writer.WriteTLObject(publicKey);
var bareData = memStream.ToArray();
var fingerprint = BinaryPrimitives.ReadInt64LittleEndian(sha1.ComputeHash(bareData, 4, bareData.Length - 4).AsSpan(12)); // 64 lower-order bits of SHA1
PublicKeys[fingerprint] = publicKey;
Helpers.Log(1, $"Loaded a public key with fingerprint {fingerprint:X}");

View file

@ -15,21 +15,6 @@ namespace TL
public static class Serialization
{
internal static byte[] Serialize(this IObject msg)
{
using var memStream = new MemoryStream(1024);
using (var writer = new BinaryWriter(memStream))
WriteTLObject(writer, msg);
return memStream.ToArray();
}
internal static T Deserialize<T>(byte[] bytes) where T : IObject
{
using var memStream = new MemoryStream(bytes);
using var reader = new BinaryReader(memStream, null);
return (T)reader.ReadTLObject();
}
internal static void WriteTLObject<T>(this BinaryWriter writer, T obj) where T : IObject
{
if (obj == null) { writer.WriteTLNull(typeof(T)); return; }
@ -71,7 +56,7 @@ namespace TL
object value = reader.ReadTLValue(field.FieldType);
field.SetValue(obj, value);
if (field.FieldType.IsEnum && field.Name == "flags") flags = (uint)value;
reader.Client?.MonitorField(field, obj, value);
if (reader.Client.CollectAccessHash) reader.Client.CollectField(field, obj, value);
}
return (IObject)obj;
}
@ -371,6 +356,13 @@ namespace TL
// Below TL types are commented "parsed manually" from https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/Resources/tl/mtproto.tl
[TLDef(0x7A19CB76)] //RSA_public_key#7a19cb76 n:bytes e:bytes = RSAPublicKey
public class RSAPublicKey : IObject
{
public byte[] n;
public byte[] e;
}
[TLDef(0xF35C6D01)] //rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult
public class RpcResult : IObject
{