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

Scalar448

static class 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 void 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> 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 = 27; int bitLengthPositive = ScalarUtilities.GetBitLengthPositive(num, y); while (bitLengthPositive > 447) { int num2 = ScalarUtilities.GetBitLength(num, span) - bitLengthPositive; num2 &= ~(num2 >> 31); if ((int)span[num] < 0) { ScalarUtilities.AddShifted_NP(num, num2, x, y, span); ScalarUtilities.AddShifted_UV(7, num2, x2, x3, y2, y3); } else { ScalarUtilities.SubShifted_NP(num, num2, x, y, span); ScalarUtilities.SubShifted_UV(7, num2, x2, x3, y2, y3); } if (ScalarUtilities.LessThan(num, x, y)) { ScalarUtilities.Swap(ref x2, ref y2); ScalarUtilities.Swap(ref x3, ref y3); ScalarUtilities.Swap(ref x, ref y); num = bitLengthPositive >> 5; bitLengthPositive = ScalarUtilities.GetBitLengthPositive(num, y); } } y2.CopyTo(z0); y3.CopyTo(z1); } 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); } } }