<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.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) { int num = s >> 5; int num2 = s & 31; ulong num3 = 0; ulong num4 = 0; if (num2 == 0) { for (int i = num; i <= last; i++) { num4 += Nu[i]; num4 += _p[i - num]; num3 += _p[i]; num3 += Nv[i - num]; _p[i] = (uint)num3; num3 >>= 32; num4 += _p[i - num]; Nu[i] = (uint)num4; num4 >>= 32; } } else { uint num5 = 0; uint num6 = 0; uint num7 = 0; for (int j = num; j <= last; j++) { uint num8 = _p[j - num]; uint num9 = (num8 << num2) | (num5 >> -num2); num5 = num8; num4 += Nu[j]; num4 += num9; uint num10 = Nv[j - num]; uint num11 = (num10 << num2) | (num7 >> -num2); num7 = num10; num3 += _p[j]; num3 += num11; _p[j] = (uint)num3; num3 >>= 32; uint num12 = _p[j - num]; uint num13 = (num12 << num2) | (num6 >> -num2); num6 = num12; num4 += num13; Nu[j] = (uint)num4; num4 >>= 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) { int num = s >> 5; int num2 = s & 31; long num3 = 0; long num4 = 0; if (num2 == 0) { for (int i = num; i <= last; i++) { num4 += Nu[i]; num4 -= _p[i - num]; num3 += _p[i]; num3 -= Nv[i - num]; _p[i] = (uint)num3; num3 >>= 32; num4 -= _p[i - num]; Nu[i] = (uint)num4; num4 >>= 32; } } else { uint num5 = 0; uint num6 = 0; uint num7 = 0; for (int j = num; j <= last; j++) { uint num8 = _p[j - num]; uint num9 = (num8 << num2) | (num5 >> -num2); num5 = num8; num4 += Nu[j]; num4 -= num9; uint num10 = Nv[j - num]; uint num11 = (num10 << num2) | (num7 >> -num2); num7 = num10; num3 += _p[j]; num3 -= num11; _p[j] = (uint)num3; num3 >>= 32; uint num12 = _p[j - num]; uint num13 = (num12 << num2) | (num6 >> -num2); num6 = num12; num4 -= num13; Nu[j] = (uint)num4; num4 >>= 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; } } }