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;
}
}
}