From 67285c1c082b0bfe64c54f08fddbd9bbdf32d4e5 Mon Sep 17 00:00:00 2001 From: Wizou Date: Wed, 1 Sep 2021 23:03:04 +0200 Subject: [PATCH] Remember the good primes to prevent verifying them twice --- .github/ci.yml | 2 +- src/Client.cs | 16 ++++++++-------- src/Encryption.cs | 2 +- src/Helpers.cs | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/ci.yml b/.github/ci.yml index 5c950d0..cec7554 100644 --- a/.github/ci.yml +++ b/.github/ci.yml @@ -2,7 +2,7 @@ pr: none trigger: - master -name: 0.9.4-ci.$(Rev:r) +name: 0.9.5-ci.$(Rev:r) pool: vmImage: ubuntu-latest diff --git a/src/Client.cs b/src/Client.cs index b353962..923e3ee 100644 --- a/src/Client.cs +++ b/src/Client.cs @@ -190,7 +190,7 @@ namespace WTelegram writer.Write(0L); // int64 auth_key_id = 0 (Unencrypted) writer.Write(msgId); // int64 message_id writer.Write(0); // int32 message_data_length (to be patched) - var typeName = func(writer); // bytes message_data + var typeName = func(writer); // bytes message_data Helpers.Log(1, $"Sending {typeName}..."); BinaryPrimitives.WriteInt32LittleEndian(memStream.GetBuffer().AsSpan(24), (int)memStream.Length - 28); // patch message_data_length } @@ -204,12 +204,12 @@ namespace WTelegram const int prepend = 32; clearWriter.Write(_session.AuthKey, 88, prepend); #endif - clearWriter.Write(_session.Salt); // int64 salt - clearWriter.Write(_session.Id); // int64 session_id - clearWriter.Write(msgId); // int64 message_id - clearWriter.Write(seqno); // int32 msg_seqno - clearWriter.Write(0); // int32 message_data_length (to be patched) - var typeName = func(clearWriter); // bytes message_data + clearWriter.Write(_session.Salt); // int64 salt + clearWriter.Write(_session.Id); // int64 session_id + clearWriter.Write(msgId); // int64 message_id + clearWriter.Write(seqno); // int32 msg_seqno + clearWriter.Write(0); // int32 message_data_length (to be patched) + var typeName = func(clearWriter); // bytes message_data if ((seqno & 1) != 0) Helpers.Log(1, $"Sending {typeName,-50} #{(short)msgId.GetHashCode():X4}"); else @@ -558,7 +558,7 @@ namespace WTelegram } catch (OperationCanceledException) { } - catch (Exception ex) + catch (Exception ex) when (!ct.IsCancellationRequested) { Helpers.Log(5, $"An exception occured in the reactor: {ex}"); } diff --git a/src/Encryption.cs b/src/Encryption.cs index 1fae77c..209b0d3 100644 --- a/src/Encryption.cs +++ b/src/Encryption.cs @@ -194,7 +194,7 @@ namespace WTelegram private static void ValidityChecks(BigInteger p, int g) { - Helpers.Log(2, "Verifying encryption key safety... (this happens only during session negociation)"); + Helpers.Log(2, "Verifying encryption key safety... (this should happen only once)"); // check that 2^2047 <= p < 2^2048 if (p.GetBitLength() != 2048) throw new ApplicationException("p is not 2048-bit number"); // check that g generates a cyclic subgroup of prime order (p - 1) / 2, i.e. is a quadratic residue mod p. diff --git a/src/Helpers.cs b/src/Helpers.cs index 31b5f53..6e2e72f 100644 --- a/src/Helpers.cs +++ b/src/Helpers.cs @@ -147,12 +147,13 @@ namespace WTelegram } public static int MillerRabinIterations { get; set; } = 64; // 64 is OpenSSL default for 2048-bits numbers - + private static readonly HashSet GoodPrimes = new(); // Miller–Rabin primality test public static bool IsProbablePrime(this BigInteger n) { var n_minus_one = n - BigInteger.One; if (n_minus_one.Sign <= 0) return false; + if (GoodPrimes.Contains(n)) return true; int s; var d = n_minus_one; @@ -187,6 +188,7 @@ namespace WTelegram } if (r == 0) return false; } + GoodPrimes.Add(n); return true; } }