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

ScalarUtilities

static class ScalarUtilities
using Org.BouncyCastle.Utilities; using System; using System.Runtime.CompilerServices; namespace Org.BouncyCastle.Math.EC.Rfc8032 { internal static class ScalarUtilities { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void AddShifted_NP(int last, int s, Span<uint> Nu, ReadOnlySpan<uint> Nv, Span<uint> p, Span<uint> t) { ulong num = 0; ulong num2 = 0; if (s == 0) { for (int i = 0; i <= last; i++) { uint num3 = p[i]; num2 += Nu[i]; num2 += num3; num += num3; num += Nv[i]; num3 = (uint)num; num >>= 32; p[i] = num3; num2 += num3; Nu[i] = (uint)num2; num2 >>= 32; } } else if (s < 32) { uint num4 = 0; uint num5 = 0; uint num6 = 0; for (int j = 0; j <= last; j++) { uint num7 = p[j]; uint num8 = (num7 << s) | (num4 >> -s); num4 = num7; num2 += Nu[j]; num2 += num8; uint num9 = Nv[j]; uint num10 = (num9 << s) | (num6 >> -s); num6 = num9; num += num7; num += num10; num7 = (uint)num; num >>= 32; p[j] = num7; uint num11 = (num7 << s) | (num5 >> -s); num5 = num7; num2 += num11; Nu[j] = (uint)num2; num2 >>= 32; } } else { t.Slice(0, last).CopyFrom(p); int num12 = s >> 5; int num13 = s & 31; if (num13 == 0) { for (int k = num12; k <= last; k++) { num2 += Nu[k]; num2 += t[k - num12]; num += p[k]; num += Nv[k - num12]; p[k] = (uint)num; num >>= 32; num2 += p[k - num12]; Nu[k] = (uint)num2; num2 >>= 32; } } else { uint num14 = 0; uint num15 = 0; uint num16 = 0; for (int l = num12; l <= last; l++) { uint num17 = t[l - num12]; uint num18 = (num17 << num13) | (num14 >> -num13); num14 = num17; num2 += Nu[l]; num2 += num18; uint num19 = Nv[l - num12]; uint num20 = (num19 << num13) | (num16 >> -num13); num16 = num19; num += p[l]; num += num20; p[l] = (uint)num; num >>= 32; uint num21 = p[l - num12]; uint num22 = (num21 << num13) | (num15 >> -num13); num15 = num21; num2 += num22; Nu[l] = (uint)num2; num2 >>= 32; } } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void AddShifted_UV(int last, int s, Span<uint> u0, Span<uint> u1, ReadOnlySpan<uint> v0, ReadOnlySpan<uint> v1) { int num = s >> 5; int num2 = s & 31; ulong num3 = 0; ulong num4 = 0; if (num2 == 0) { for (int i = num; i <= last; i++) { num3 += u0[i]; num4 += u1[i]; num3 += v0[i - num]; num4 += v1[i - num]; u0[i] = (uint)num3; num3 >>= 32; u1[i] = (uint)num4; num4 >>= 32; } } else { uint num5 = 0; uint num6 = 0; for (int j = num; j <= last; j++) { uint num7 = v0[j - num]; uint num8 = v1[j - num]; uint num9 = (num7 << num2) | (num5 >> -num2); uint num10 = (num8 << num2) | (num6 >> -num2); num5 = num7; num6 = num8; num3 += u0[j]; num4 += u1[j]; num3 += num9; num4 += num10; u0[j] = (uint)num3; num3 >>= 32; u1[j] = (uint)num4; num4 >>= 32; } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static int GetBitLength(int last, ReadOnlySpan<uint> x) { int num = last; uint num2 = (uint)((int)x[num] >> 31); while (num > 0 && x[num] == num2) { num--; } return num * 32 + 32 - Integers.NumberOfLeadingZeros((int)(x[num] ^ num2)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static int GetBitLengthPositive(int last, ReadOnlySpan<uint> x) { int num = last; while (num > 0 && x[num] == 0) { num--; } return num * 32 + 32 - Integers.NumberOfLeadingZeros((int)x[num]); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool LessThan(int last, ReadOnlySpan<uint> x, ReadOnlySpan<uint> y) { int num = last; do { if (x[num] < y[num]) return true; if (x[num] > y[num]) return false; } while (--num >= 0); return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void SubShifted_NP(int last, int s, Span<uint> Nu, ReadOnlySpan<uint> Nv, Span<uint> p, Span<uint> t) { long num = 0; long num2 = 0; if (s == 0) { for (int i = 0; i <= last; i++) { uint num3 = p[i]; num2 += Nu[i]; num2 -= num3; num += num3; num -= Nv[i]; num3 = (uint)num; num >>= 32; p[i] = num3; num2 -= num3; Nu[i] = (uint)num2; num2 >>= 32; } } else if (s < 32) { uint num4 = 0; uint num5 = 0; uint num6 = 0; for (int j = 0; j <= last; j++) { uint num7 = p[j]; uint num8 = (num7 << s) | (num4 >> -s); num4 = num7; num2 += Nu[j]; num2 -= num8; uint num9 = Nv[j]; uint num10 = (num9 << s) | (num6 >> -s); num6 = num9; num += num7; num -= num10; num7 = (uint)num; num >>= 32; p[j] = num7; uint num11 = (num7 << s) | (num5 >> -s); num5 = num7; num2 -= num11; Nu[j] = (uint)num2; num2 >>= 32; } } else { t.Slice(0, last).CopyFrom(p); int num12 = s >> 5; int num13 = s & 31; if (num13 == 0) { for (int k = num12; k <= last; k++) { num2 += Nu[k]; num2 -= t[k - num12]; num += p[k]; num -= Nv[k - num12]; p[k] = (uint)num; num >>= 32; num2 -= p[k - num12]; Nu[k] = (uint)num2; num2 >>= 32; } } else { uint num14 = 0; uint num15 = 0; uint num16 = 0; for (int l = num12; l <= last; l++) { uint num17 = t[l - num12]; uint num18 = (num17 << num13) | (num14 >> -num13); num14 = num17; num2 += Nu[l]; num2 -= num18; uint num19 = Nv[l - num12]; uint num20 = (num19 << num13) | (num16 >> -num13); num16 = num19; num += p[l]; num -= num20; p[l] = (uint)num; num >>= 32; uint num21 = p[l - num12]; uint num22 = (num21 << num13) | (num15 >> -num13); num15 = num21; num2 -= num22; Nu[l] = (uint)num2; num2 >>= 32; } } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void SubShifted_UV(int last, int s, Span<uint> u0, Span<uint> u1, ReadOnlySpan<uint> v0, ReadOnlySpan<uint> v1) { int num = s >> 5; int num2 = s & 31; long num3 = 0; long num4 = 0; if (num2 == 0) { for (int i = num; i <= last; i++) { num3 += u0[i]; num4 += u1[i]; num3 -= v0[i - num]; num4 -= v1[i - num]; u0[i] = (uint)num3; num3 >>= 32; u1[i] = (uint)num4; num4 >>= 32; } } else { uint num5 = 0; uint num6 = 0; for (int j = num; j <= last; j++) { uint num7 = v0[j - num]; uint num8 = v1[j - num]; uint num9 = (num7 << num2) | (num5 >> -num2); uint num10 = (num8 << num2) | (num6 >> -num2); num5 = num7; num6 = num8; num3 += u0[j]; num4 += u1[j]; num3 -= num9; num4 -= num10; u0[j] = (uint)num3; num3 >>= 32; u1[j] = (uint)num4; num4 >>= 32; } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Swap(ref Span<uint> x, ref Span<uint> y) { Span<uint> span = x; x = y; y = span; } } }