Scalar448
using Org.BouncyCastle.Math.Raw;
using Org.BouncyCastle.Utilities;
using System;
using System.Runtime.InteropServices;
namespace Org.BouncyCastle.Math.EC.Rfc8032
{
internal static class Scalar448
{
internal const int Size = 14;
private const int ScalarBytes = 57;
private const ulong M26UL = 67108863;
private const ulong M28UL = 268435455;
private const int TargetLength = 447;
private static readonly uint[] L = new uint[14] {
2874688755,
595116690,
2378534741,
560775794,
2933274256,
3293502281,
2093622249,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
1073741823
};
private static readonly uint[] LSq = new uint[28] {
463601321,
3249404856,
1239460018,
3105617207,
3882145813,
1160071467,
2729996653,
1256291574,
3124512708,
4054436884,
2118977290,
2449812427,
2676112242,
3275762323,
1437344377,
2445041993,
1189267370,
280387897,
3614120776,
3794234788,
3194294772,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
uint.MaxValue,
268435455
};
private const int L_0 = 78101261;
private const int L_1 = 141809365;
private const int L_2 = 175155932;
private const int L_3 = 64542499;
private const int L_4 = 158326419;
private const int L_5 = 191173276;
private const int L_6 = 104575268;
private const int L_7 = 137584065;
private const int L4_0 = 43969588;
private const int L4_1 = 30366549;
private const int L4_2 = 163752818;
private const int L4_3 = 258169998;
private const int L4_4 = 96434764;
private const int L4_5 = 227822194;
private const int L4_6 = 149865618;
private const int L4_7 = 550336261;
internal static bool CheckVar(ReadOnlySpan<byte> s, Span<uint> n)
{
if (s[56] != 0)
return false;
Decode(s, n);
return !Nat.Gte(14, n, L);
}
internal static void Decode(ReadOnlySpan<byte> k, Span<uint> n)
{
Codec.Decode32(k, n.Slice(0, 14));
}
internal static void GetOrderWnafVar(int width, Span<sbyte> ws)
{
Wnaf.GetSignedVar(L, width, ws);
}
internal unsafe static void Multiply225Var(ReadOnlySpan<uint> x, ReadOnlySpan<uint> y225, Span<uint> z)
{
Span<uint> span = new Span<uint>(stackalloc byte[88], 22);
Nat.Mul(y225, x, span);
if ((int)y225[7] < 0) {
Nat.AddTo(14, L, span.Slice(8, span.Length - 8));
Nat.SubFrom(14, x, span.Slice(8, span.Length - 8));
}
if (BitConverter.IsLittleEndian) {
Span<byte> span2 = MemoryMarshal.AsBytes(span);
Reduce704(span2, span2);
span.Slice(0, 14).CopyTo(z);
} else {
Span<byte> span3 = new Span<byte>(stackalloc byte[88], 88);
Codec.Encode32(span, span3);
Reduce704(span3, span3);
Decode(span3, z);
}
}
internal static byte[] Reduce704(byte[] n)
{
byte[] array = new byte[57];
Reduce704(n, array);
return array;
}
internal static void Reduce704(ReadOnlySpan<byte> n, Span<byte> r)
{
ulong num = Codec.Decode32(n.Slice(0, n.Length));
ulong num2 = Codec.Decode24(n.Slice(4, n.Length - 4)) << 4;
ulong num3 = Codec.Decode32(n.Slice(7, n.Length - 7));
ulong num4 = Codec.Decode24(n.Slice(11, n.Length - 11)) << 4;
ulong num5 = Codec.Decode32(n.Slice(14, n.Length - 14));
ulong num6 = Codec.Decode24(n.Slice(18, n.Length - 18)) << 4;
ulong num7 = Codec.Decode32(n.Slice(21, n.Length - 21));
ulong num8 = Codec.Decode24(n.Slice(25, n.Length - 25)) << 4;
ulong num9 = Codec.Decode32(n.Slice(28, n.Length - 28));
ulong num10 = Codec.Decode24(n.Slice(32, n.Length - 32)) << 4;
ulong num11 = Codec.Decode32(n.Slice(35, n.Length - 35));
ulong num12 = Codec.Decode24(n.Slice(39, n.Length - 39)) << 4;
ulong num13 = Codec.Decode32(n.Slice(42, n.Length - 42));
ulong num14 = Codec.Decode24(n.Slice(46, n.Length - 46)) << 4;
ulong num15 = Codec.Decode32(n.Slice(49, n.Length - 49));
ulong num16 = Codec.Decode24(n.Slice(53, n.Length - 53)) << 4;
ulong num17 = Codec.Decode32(n.Slice(56, n.Length - 56));
ulong num18 = Codec.Decode24(n.Slice(60, n.Length - 60)) << 4;
ulong num19 = Codec.Decode32(n.Slice(63, n.Length - 63));
ulong num20 = Codec.Decode24(n.Slice(67, n.Length - 67)) << 4;
ulong num21 = Codec.Decode32(n.Slice(70, n.Length - 70));
ulong num22 = Codec.Decode24(n.Slice(74, n.Length - 74)) << 4;
ulong num23 = Codec.Decode32(n.Slice(77, n.Length - 77));
ulong num24 = Codec.Decode24(n.Slice(81, n.Length - 81)) << 4;
ulong num25 = Codec.Decode32(n.Slice(84, n.Length - 84));
ulong num26 = 0;
num26 += num25 >> 28;
num25 &= 268435455;
num10 += num26 * 43969588;
num11 += num26 * 30366549;
num12 += num26 * 163752818;
num13 += num26 * 258169998;
num14 += num26 * 96434764;
num15 += num26 * 227822194;
num16 += num26 * 149865618;
num17 += num26 * 550336261;
num22 += num21 >> 28;
num21 &= 268435455;
num23 += num22 >> 28;
num22 &= 268435455;
num24 += num23 >> 28;
num23 &= 268435455;
num25 += num24 >> 28;
num24 &= 268435455;
num9 += num25 * 43969588;
num10 += num25 * 30366549;
num11 += num25 * 163752818;
num12 += num25 * 258169998;
num13 += num25 * 96434764;
num14 += num25 * 227822194;
num15 += num25 * 149865618;
num16 += num25 * 550336261;
num8 += num24 * 43969588;
num9 += num24 * 30366549;
num10 += num24 * 163752818;
num11 += num24 * 258169998;
num12 += num24 * 96434764;
num13 += num24 * 227822194;
num14 += num24 * 149865618;
num15 += num24 * 550336261;
num7 += num23 * 43969588;
num8 += num23 * 30366549;
num9 += num23 * 163752818;
num10 += num23 * 258169998;
num11 += num23 * 96434764;
num12 += num23 * 227822194;
num13 += num23 * 149865618;
num14 += num23 * 550336261;
num19 += num18 >> 28;
num18 &= 268435455;
num20 += num19 >> 28;
num19 &= 268435455;
num21 += num20 >> 28;
num20 &= 268435455;
num22 += num21 >> 28;
num21 &= 268435455;
num6 += num22 * 43969588;
num7 += num22 * 30366549;
num8 += num22 * 163752818;
num9 += num22 * 258169998;
num10 += num22 * 96434764;
num11 += num22 * 227822194;
num12 += num22 * 149865618;
num13 += num22 * 550336261;
num5 += num21 * 43969588;
num6 += num21 * 30366549;
num7 += num21 * 163752818;
num8 += num21 * 258169998;
num9 += num21 * 96434764;
num10 += num21 * 227822194;
num11 += num21 * 149865618;
num12 += num21 * 550336261;
num4 += num20 * 43969588;
num5 += num20 * 30366549;
num6 += num20 * 163752818;
num7 += num20 * 258169998;
num8 += num20 * 96434764;
num9 += num20 * 227822194;
num10 += num20 * 149865618;
num11 += num20 * 550336261;
num16 += num15 >> 28;
num15 &= 268435455;
num17 += num16 >> 28;
num16 &= 268435455;
num18 += num17 >> 28;
num17 &= 268435455;
num19 += num18 >> 28;
num18 &= 268435455;
num3 += num19 * 43969588;
num4 += num19 * 30366549;
num5 += num19 * 163752818;
num6 += num19 * 258169998;
num7 += num19 * 96434764;
num8 += num19 * 227822194;
num9 += num19 * 149865618;
num10 += num19 * 550336261;
num2 += num18 * 43969588;
num3 += num18 * 30366549;
num4 += num18 * 163752818;
num5 += num18 * 258169998;
num6 += num18 * 96434764;
num7 += num18 * 227822194;
num8 += num18 * 149865618;
num9 += num18 * 550336261;
num17 *= 4;
num17 += num16 >> 26;
num16 &= 67108863;
num17++;
num += num17 * 78101261;
num2 += num17 * 141809365;
num3 += num17 * 175155932;
num4 += num17 * 64542499;
num5 += num17 * 158326419;
num6 += num17 * 191173276;
num7 += num17 * 104575268;
num8 += num17 * 137584065;
num2 += num >> 28;
num &= 268435455;
num3 += num2 >> 28;
num2 &= 268435455;
num4 += num3 >> 28;
num3 &= 268435455;
num5 += num4 >> 28;
num4 &= 268435455;
num6 += num5 >> 28;
num5 &= 268435455;
num7 += num6 >> 28;
num6 &= 268435455;
num8 += num7 >> 28;
num7 &= 268435455;
num9 += num8 >> 28;
num8 &= 268435455;
num10 += num9 >> 28;
num9 &= 268435455;
num11 += num10 >> 28;
num10 &= 268435455;
num12 += num11 >> 28;
num11 &= 268435455;
num13 += num12 >> 28;
num12 &= 268435455;
num14 += num13 >> 28;
num13 &= 268435455;
num15 += num14 >> 28;
num14 &= 268435455;
num16 += num15 >> 28;
num15 &= 268435455;
num17 = num16 >> 26;
num16 &= 67108863;
num17--;
num -= (num17 & 78101261);
num2 -= (num17 & 141809365);
num3 -= (num17 & 175155932);
num4 -= (num17 & 64542499);
num5 -= (num17 & 158326419);
num6 -= (num17 & 191173276);
num7 -= (num17 & 104575268);
num8 -= (num17 & 137584065);
num2 = (ulong)((long)num2 + ((long)num >> 28));
num &= 268435455;
num3 = (ulong)((long)num3 + ((long)num2 >> 28));
num2 &= 268435455;
num4 = (ulong)((long)num4 + ((long)num3 >> 28));
num3 &= 268435455;
num5 = (ulong)((long)num5 + ((long)num4 >> 28));
num4 &= 268435455;
num6 = (ulong)((long)num6 + ((long)num5 >> 28));
num5 &= 268435455;
num7 = (ulong)((long)num7 + ((long)num6 >> 28));
num6 &= 268435455;
num8 = (ulong)((long)num8 + ((long)num7 >> 28));
num7 &= 268435455;
num9 = (ulong)((long)num9 + ((long)num8 >> 28));
num8 &= 268435455;
num10 = (ulong)((long)num10 + ((long)num9 >> 28));
num9 &= 268435455;
num11 = (ulong)((long)num11 + ((long)num10 >> 28));
num10 &= 268435455;
num12 = (ulong)((long)num12 + ((long)num11 >> 28));
num11 &= 268435455;
num13 = (ulong)((long)num13 + ((long)num12 >> 28));
num12 &= 268435455;
num14 = (ulong)((long)num14 + ((long)num13 >> 28));
num13 &= 268435455;
num15 = (ulong)((long)num15 + ((long)num14 >> 28));
num14 &= 268435455;
num16 = (ulong)((long)num16 + ((long)num15 >> 28));
num15 &= 268435455;
Codec.Encode56(num | (num2 << 28), r);
Codec.Encode56(num3 | (num4 << 28), r.Slice(7, r.Length - 7));
Codec.Encode56(num5 | (num6 << 28), r.Slice(14, r.Length - 14));
Codec.Encode56(num7 | (num8 << 28), r.Slice(21, r.Length - 21));
Codec.Encode56(num9 | (num10 << 28), r.Slice(28, r.Length - 28));
Codec.Encode56(num11 | (num12 << 28), r.Slice(35, r.Length - 35));
Codec.Encode56(num13 | (num14 << 28), r.Slice(42, r.Length - 42));
Codec.Encode56(num15 | (num16 << 28), r.Slice(49, r.Length - 49));
r[56] = 0;
}
internal static byte[] Reduce912(byte[] n)
{
byte[] array = new byte[57];
Reduce912(n, array);
return array;
}
internal static void Reduce912(ReadOnlySpan<byte> n, Span<byte> r)
{
ulong num = Codec.Decode32(n.Slice(0, n.Length));
ulong num2 = Codec.Decode24(n.Slice(4, n.Length - 4)) << 4;
ulong num3 = Codec.Decode32(n.Slice(7, n.Length - 7));
ulong num4 = Codec.Decode24(n.Slice(11, n.Length - 11)) << 4;
ulong num5 = Codec.Decode32(n.Slice(14, n.Length - 14));
ulong num6 = Codec.Decode24(n.Slice(18, n.Length - 18)) << 4;
ulong num7 = Codec.Decode32(n.Slice(21, n.Length - 21));
ulong num8 = Codec.Decode24(n.Slice(25, n.Length - 25)) << 4;
ulong num9 = Codec.Decode32(n.Slice(28, n.Length - 28));
ulong num10 = Codec.Decode24(n.Slice(32, n.Length - 32)) << 4;
ulong num11 = Codec.Decode32(n.Slice(35, n.Length - 35));
ulong num12 = Codec.Decode24(n.Slice(39, n.Length - 39)) << 4;
ulong num13 = Codec.Decode32(n.Slice(42, n.Length - 42));
ulong num14 = Codec.Decode24(n.Slice(46, n.Length - 46)) << 4;
ulong num15 = Codec.Decode32(n.Slice(49, n.Length - 49));
ulong num16 = Codec.Decode24(n.Slice(53, n.Length - 53)) << 4;
ulong num17 = Codec.Decode32(n.Slice(56, n.Length - 56));
ulong num18 = Codec.Decode24(n.Slice(60, n.Length - 60)) << 4;
ulong num19 = Codec.Decode32(n.Slice(63, n.Length - 63));
ulong num20 = Codec.Decode24(n.Slice(67, n.Length - 67)) << 4;
ulong num21 = Codec.Decode32(n.Slice(70, n.Length - 70));
ulong num22 = Codec.Decode24(n.Slice(74, n.Length - 74)) << 4;
ulong num23 = Codec.Decode32(n.Slice(77, n.Length - 77));
ulong num24 = Codec.Decode24(n.Slice(81, n.Length - 81)) << 4;
ulong num25 = Codec.Decode32(n.Slice(84, n.Length - 84));
ulong num26 = Codec.Decode24(n.Slice(88, n.Length - 88)) << 4;
ulong num27 = Codec.Decode32(n.Slice(91, n.Length - 91));
ulong num28 = Codec.Decode24(n.Slice(95, n.Length - 95)) << 4;
ulong num29 = Codec.Decode32(n.Slice(98, n.Length - 98));
ulong num30 = Codec.Decode24(n.Slice(102, n.Length - 102)) << 4;
ulong num31 = Codec.Decode32(n.Slice(105, n.Length - 105));
ulong num32 = Codec.Decode24(n.Slice(109, n.Length - 109)) << 4;
ulong num33 = Codec.Decode16(n.Slice(112, n.Length - 112));
num17 += num33 * 43969588;
num18 += num33 * 30366549;
num19 += num33 * 163752818;
num20 += num33 * 258169998;
num21 += num33 * 96434764;
num22 += num33 * 227822194;
num23 += num33 * 149865618;
num24 += num33 * 550336261;
num32 += num31 >> 28;
num31 &= 268435455;
num16 += num32 * 43969588;
num17 += num32 * 30366549;
num18 += num32 * 163752818;
num19 += num32 * 258169998;
num20 += num32 * 96434764;
num21 += num32 * 227822194;
num22 += num32 * 149865618;
num23 += num32 * 550336261;
num15 += num31 * 43969588;
num16 += num31 * 30366549;
num17 += num31 * 163752818;
num18 += num31 * 258169998;
num19 += num31 * 96434764;
num20 += num31 * 227822194;
num21 += num31 * 149865618;
num22 += num31 * 550336261;
num30 += num29 >> 28;
num29 &= 268435455;
num14 += num30 * 43969588;
num15 += num30 * 30366549;
num16 += num30 * 163752818;
num17 += num30 * 258169998;
num18 += num30 * 96434764;
num19 += num30 * 227822194;
num20 += num30 * 149865618;
num21 += num30 * 550336261;
num13 += num29 * 43969588;
num14 += num29 * 30366549;
num15 += num29 * 163752818;
num16 += num29 * 258169998;
num17 += num29 * 96434764;
num18 += num29 * 227822194;
num19 += num29 * 149865618;
num20 += num29 * 550336261;
num28 += num27 >> 28;
num27 &= 268435455;
num12 += num28 * 43969588;
num13 += num28 * 30366549;
num14 += num28 * 163752818;
num15 += num28 * 258169998;
num16 += num28 * 96434764;
num17 += num28 * 227822194;
num18 += num28 * 149865618;
num19 += num28 * 550336261;
num11 += num27 * 43969588;
num12 += num27 * 30366549;
num13 += num27 * 163752818;
num14 += num27 * 258169998;
num15 += num27 * 96434764;
num16 += num27 * 227822194;
num17 += num27 * 149865618;
num18 += num27 * 550336261;
num26 += num25 >> 28;
num25 &= 268435455;
num10 += num26 * 43969588;
num11 += num26 * 30366549;
num12 += num26 * 163752818;
num13 += num26 * 258169998;
num14 += num26 * 96434764;
num15 += num26 * 227822194;
num16 += num26 * 149865618;
num17 += num26 * 550336261;
num22 += num21 >> 28;
num21 &= 268435455;
num23 += num22 >> 28;
num22 &= 268435455;
num24 += num23 >> 28;
num23 &= 268435455;
num25 += num24 >> 28;
num24 &= 268435455;
num9 += num25 * 43969588;
num10 += num25 * 30366549;
num11 += num25 * 163752818;
num12 += num25 * 258169998;
num13 += num25 * 96434764;
num14 += num25 * 227822194;
num15 += num25 * 149865618;
num16 += num25 * 550336261;
num8 += num24 * 43969588;
num9 += num24 * 30366549;
num10 += num24 * 163752818;
num11 += num24 * 258169998;
num12 += num24 * 96434764;
num13 += num24 * 227822194;
num14 += num24 * 149865618;
num15 += num24 * 550336261;
num7 += num23 * 43969588;
num8 += num23 * 30366549;
num9 += num23 * 163752818;
num10 += num23 * 258169998;
num11 += num23 * 96434764;
num12 += num23 * 227822194;
num13 += num23 * 149865618;
num14 += num23 * 550336261;
num19 += num18 >> 28;
num18 &= 268435455;
num20 += num19 >> 28;
num19 &= 268435455;
num21 += num20 >> 28;
num20 &= 268435455;
num22 += num21 >> 28;
num21 &= 268435455;
num6 += num22 * 43969588;
num7 += num22 * 30366549;
num8 += num22 * 163752818;
num9 += num22 * 258169998;
num10 += num22 * 96434764;
num11 += num22 * 227822194;
num12 += num22 * 149865618;
num13 += num22 * 550336261;
num5 += num21 * 43969588;
num6 += num21 * 30366549;
num7 += num21 * 163752818;
num8 += num21 * 258169998;
num9 += num21 * 96434764;
num10 += num21 * 227822194;
num11 += num21 * 149865618;
num12 += num21 * 550336261;
num4 += num20 * 43969588;
num5 += num20 * 30366549;
num6 += num20 * 163752818;
num7 += num20 * 258169998;
num8 += num20 * 96434764;
num9 += num20 * 227822194;
num10 += num20 * 149865618;
num11 += num20 * 550336261;
num16 += num15 >> 28;
num15 &= 268435455;
num17 += num16 >> 28;
num16 &= 268435455;
num18 += num17 >> 28;
num17 &= 268435455;
num19 += num18 >> 28;
num18 &= 268435455;
num3 += num19 * 43969588;
num4 += num19 * 30366549;
num5 += num19 * 163752818;
num6 += num19 * 258169998;
num7 += num19 * 96434764;
num8 += num19 * 227822194;
num9 += num19 * 149865618;
num10 += num19 * 550336261;
num2 += num18 * 43969588;
num3 += num18 * 30366549;
num4 += num18 * 163752818;
num5 += num18 * 258169998;
num6 += num18 * 96434764;
num7 += num18 * 227822194;
num8 += num18 * 149865618;
num9 += num18 * 550336261;
num17 *= 4;
num17 += num16 >> 26;
num16 &= 67108863;
num17++;
num += num17 * 78101261;
num2 += num17 * 141809365;
num3 += num17 * 175155932;
num4 += num17 * 64542499;
num5 += num17 * 158326419;
num6 += num17 * 191173276;
num7 += num17 * 104575268;
num8 += num17 * 137584065;
num2 += num >> 28;
num &= 268435455;
num3 += num2 >> 28;
num2 &= 268435455;
num4 += num3 >> 28;
num3 &= 268435455;
num5 += num4 >> 28;
num4 &= 268435455;
num6 += num5 >> 28;
num5 &= 268435455;
num7 += num6 >> 28;
num6 &= 268435455;
num8 += num7 >> 28;
num7 &= 268435455;
num9 += num8 >> 28;
num8 &= 268435455;
num10 += num9 >> 28;
num9 &= 268435455;
num11 += num10 >> 28;
num10 &= 268435455;
num12 += num11 >> 28;
num11 &= 268435455;
num13 += num12 >> 28;
num12 &= 268435455;
num14 += num13 >> 28;
num13 &= 268435455;
num15 += num14 >> 28;
num14 &= 268435455;
num16 += num15 >> 28;
num15 &= 268435455;
num17 = num16 >> 26;
num16 &= 67108863;
num17--;
num -= (num17 & 78101261);
num2 -= (num17 & 141809365);
num3 -= (num17 & 175155932);
num4 -= (num17 & 64542499);
num5 -= (num17 & 158326419);
num6 -= (num17 & 191173276);
num7 -= (num17 & 104575268);
num8 -= (num17 & 137584065);
num2 = (ulong)((long)num2 + ((long)num >> 28));
num &= 268435455;
num3 = (ulong)((long)num3 + ((long)num2 >> 28));
num2 &= 268435455;
num4 = (ulong)((long)num4 + ((long)num3 >> 28));
num3 &= 268435455;
num5 = (ulong)((long)num5 + ((long)num4 >> 28));
num4 &= 268435455;
num6 = (ulong)((long)num6 + ((long)num5 >> 28));
num5 &= 268435455;
num7 = (ulong)((long)num7 + ((long)num6 >> 28));
num6 &= 268435455;
num8 = (ulong)((long)num8 + ((long)num7 >> 28));
num7 &= 268435455;
num9 = (ulong)((long)num9 + ((long)num8 >> 28));
num8 &= 268435455;
num10 = (ulong)((long)num10 + ((long)num9 >> 28));
num9 &= 268435455;
num11 = (ulong)((long)num11 + ((long)num10 >> 28));
num10 &= 268435455;
num12 = (ulong)((long)num12 + ((long)num11 >> 28));
num11 &= 268435455;
num13 = (ulong)((long)num13 + ((long)num12 >> 28));
num12 &= 268435455;
num14 = (ulong)((long)num14 + ((long)num13 >> 28));
num13 &= 268435455;
num15 = (ulong)((long)num15 + ((long)num14 >> 28));
num14 &= 268435455;
num16 = (ulong)((long)num16 + ((long)num15 >> 28));
num15 &= 268435455;
Codec.Encode56(num | (num2 << 28), r);
Codec.Encode56(num3 | (num4 << 28), r.Slice(7, r.Length - 7));
Codec.Encode56(num5 | (num6 << 28), r.Slice(14, r.Length - 14));
Codec.Encode56(num7 | (num8 << 28), r.Slice(21, r.Length - 21));
Codec.Encode56(num9 | (num10 << 28), r.Slice(28, r.Length - 28));
Codec.Encode56(num11 | (num12 << 28), r.Slice(35, r.Length - 35));
Codec.Encode56(num13 | (num14 << 28), r.Slice(42, r.Length - 42));
Codec.Encode56(num15 | (num16 << 28), r.Slice(49, r.Length - 49));
r[56] = 0;
}
internal unsafe static bool ReduceBasisVar(ReadOnlySpan<uint> k, Span<uint> z0, Span<uint> z1)
{
Span<uint> x = new Span<uint>(stackalloc byte[112], 28);
LSq.CopyTo(x);
Span<uint> y = new Span<uint>(stackalloc byte[112], 28);
Nat448.Square(k, y);
y[0]++;
Span<uint> span = new Span<uint>(stackalloc byte[112], 28);
Nat448.Mul(L, k, span);
Span<uint> t = new Span<uint>(stackalloc byte[112], 28);
Span<uint> x2 = new Span<uint>(stackalloc byte[32], 8);
x2.CopyFrom(L);
Span<uint> x3 = new Span<uint>(stackalloc byte[32], 8);
Span<uint> y2 = new Span<uint>(stackalloc byte[32], 8);
y2.CopyFrom(k);
Span<uint> y3 = new Span<uint>(stackalloc byte[32], 8);
y3[0] = 1;
int num = 1788;
int num2 = 27;
int bitLengthPositive = ScalarUtilities.GetBitLengthPositive(num2, y);
while (bitLengthPositive > 447) {
if (--num < 0)
return false;
int num3 = ScalarUtilities.GetBitLength(num2, span) - bitLengthPositive;
num3 &= ~(num3 >> 31);
if ((int)span[num2] < 0) {
ScalarUtilities.AddShifted_NP(num2, num3, x, y, span, t);
ScalarUtilities.AddShifted_UV(7, num3, x2, x3, y2, y3);
} else {
ScalarUtilities.SubShifted_NP(num2, num3, x, y, span, t);
ScalarUtilities.SubShifted_UV(7, num3, x2, x3, y2, y3);
}
if (ScalarUtilities.LessThan(num2, x, y)) {
ScalarUtilities.Swap(ref x2, ref y2);
ScalarUtilities.Swap(ref x3, ref y3);
ScalarUtilities.Swap(ref x, ref y);
num2 = bitLengthPositive >> 5;
bitLengthPositive = ScalarUtilities.GetBitLengthPositive(num2, y);
}
}
y2.CopyTo(z0);
y3.CopyTo(z1);
return true;
}
internal static void ToSignedDigits(int bits, ReadOnlySpan<uint> x, Span<uint> z)
{
z[14] = (uint)((1 << bits - 448) + (int)Nat.CAdd(14, (int)(~x[0] & 1), x, L, z));
Nat.ShiftDownBit(15, z, 0);
}
}
}