<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.1" />

Wnaf

static class Wnaf
using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Math.EC.Rfc8032 { internal static class Wnaf { internal unsafe static void GetSignedVar(ReadOnlySpan<uint> n, int width, Span<sbyte> ws) { Span<uint> span; if (n.Length <= 64) { int num = n.Length * 2; span = new Span<uint>(stackalloc byte[(int)checked(unchecked((ulong)(uint)num) * 4)], num); } else span = new uint[n.Length * 2]; Span<uint> span2 = span; uint num2 = 0 - (n[n.Length - 1] >> 31); int num3 = span2.Length; int num4 = n.Length; while (--num4 >= 0) { uint num5 = n[num4]; span2[--num3] = ((num5 >> 16) | (num2 << 16)); num2 = (span2[--num3] = num5); } int num6 = 0; int num7 = 32 - width; int num8 = 0; int num9 = 0; while (num9 < span2.Length) { uint num10 = span2[num9]; while (num6 < 16) { int num11 = (int)(num10 >> num6); int num12 = Integers.NumberOfTrailingZeros((num8 ^ num11) | 65536); if (num12 > 0) num6 += num12; else { int num13 = (num11 | 1) << num7; num8 = num13 >> 31; ws[(num9 << 4) + num6] = (sbyte)(num13 >> num7); num6 += width; } } num9++; num6 -= 16; } } } }