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

X448Field

public static class X448Field
using Org.BouncyCastle.Math.Raw; using Org.BouncyCastle.Runtime.Intrinsics; using Org.BouncyCastle.Runtime.Intrinsics.X86; using System; using System.Buffers.Binary; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; namespace Org.BouncyCastle.Math.EC.Rfc7748 { [CLSCompliant(false)] public static class X448Field { public const int Size = 16; private const uint M28 = 268435455; private static readonly uint[] P32 = new uint[14] { uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, 4294967294, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue, uint.MaxValue }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Add(uint[] x, uint[] y, uint[] z) { Add(x.AsSpan(), y.AsSpan(), z.AsSpan()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Add(ReadOnlySpan<uint> x, ReadOnlySpan<uint> y, Span<uint> z) { int i = 0; if (System.Numerics.Vector.IsHardwareAccelerated) { for (int num = 16 - Vector<uint>.Count; i <= num; i += Vector<uint>.Count) { int num2 = i; Vector<uint> left = new Vector<uint>(x.Slice(num2, x.Length - num2)); num2 = i; Vector<uint> right = new Vector<uint>(y.Slice(num2, y.Length - num2)); Vector<uint> vector = left + right; num2 = i; vector.CopyTo(z.Slice(num2, z.Length - num2)); } } for (; i < 16; i++) { z[i] = x[i] + y[i]; } } public static void AddOne(uint[] z) { z[0]++; } public static void AddOne(uint[] z, int zOff) { z[zOff]++; } public static int AreEqual(uint[] x, uint[] y) { uint num = 0; for (int i = 0; i < 16; i++) { num |= (x[i] ^ y[i]); } num |= num >> 16; num &= 65535; return (int)(num - 1) >> 31; } public static bool AreEqualVar(uint[] x, uint[] y) { return AreEqual(x, y) != 0; } public static void Carry(uint[] z) { uint num = z[0]; uint num2 = z[1]; uint num3 = z[2]; uint num4 = z[3]; uint num5 = z[4]; uint num6 = z[5]; uint num7 = z[6]; uint num8 = z[7]; uint num9 = z[8]; uint num10 = z[9]; uint num11 = z[10]; uint num12 = z[11]; uint num13 = z[12]; uint num14 = z[13]; uint num15 = z[14]; uint num16 = z[15]; num2 += num >> 28; num &= 268435455; num6 += num5 >> 28; num5 &= 268435455; num10 += num9 >> 28; num9 &= 268435455; num14 += num13 >> 28; num13 &= 268435455; num3 += num2 >> 28; num2 &= 268435455; num7 += num6 >> 28; num6 &= 268435455; num11 += num10 >> 28; num10 &= 268435455; num15 += num14 >> 28; num14 &= 268435455; num4 += num3 >> 28; num3 &= 268435455; num8 += num7 >> 28; num7 &= 268435455; num12 += num11 >> 28; num11 &= 268435455; num16 += num15 >> 28; num15 &= 268435455; uint num17 = num16 >> 28; num16 &= 268435455; num += num17; num9 += num17; num5 += num4 >> 28; num4 &= 268435455; num9 += num8 >> 28; num8 &= 268435455; num13 += num12 >> 28; num12 &= 268435455; num2 += num >> 28; num &= 268435455; num6 += num5 >> 28; num5 &= 268435455; num10 += num9 >> 28; num9 &= 268435455; num14 += num13 >> 28; num13 &= 268435455; z[0] = num; z[1] = num2; z[2] = num3; z[3] = num4; z[4] = num5; z[5] = num6; z[6] = num7; z[7] = num8; z[8] = num9; z[9] = num10; z[10] = num11; z[11] = num12; z[12] = num13; z[13] = num14; z[14] = num15; z[15] = num16; } public static void CMov(int cond, uint[] x, int xOff, uint[] z, int zOff) { for (int i = 0; i < 16; i++) { uint num = z[zOff + i]; uint num2 = num ^ x[xOff + i]; num = (z[zOff + i] = (uint)((int)num ^ ((int)num2 & cond))); } } public static void CMov(int cond, ReadOnlySpan<uint> x, Span<uint> z) { for (int i = 0; i < 16; i++) { uint num = z[i]; uint num2 = num ^ x[i]; num = (uint)((int)num ^ ((int)num2 & cond)); z[i] = num; } } public static void CNegate(int negate, uint[] z) { uint[] array = Create(); Sub(array, z, array); CMov(-negate, array, 0, z, 0); } public static void Copy(uint[] x, int xOff, uint[] z, int zOff) { Copy(x.AsSpan(xOff), z.AsSpan(zOff)); } public static void Copy(ReadOnlySpan<uint> x, Span<uint> z) { x.Slice(0, 16).CopyTo(z); } public static uint[] Create() { return new uint[16]; } public static uint[] CreateTable(int n) { return new uint[16 * n]; } public static void CSwap(int swap, uint[] a, uint[] b) { uint num = (uint)(-swap); for (int i = 0; i < 16; i++) { uint num2 = a[i]; uint num3 = b[i]; uint num4 = num & (num2 ^ num3); a[i] = (num2 ^ num4); b[i] = (num3 ^ num4); } } public static void Decode(uint[] x, int xOff, uint[] z) { Decode224(x, xOff, z, 0); Decode224(x, xOff + 7, z, 8); } public static void Decode(ReadOnlySpan<uint> x, Span<uint> z) { Decode224(x, z); Decode224(x.Slice(7, x.Length - 7), z.Slice(8, z.Length - 8)); } public static void Decode(byte[] x, uint[] z) { Decode56(x, 0, z, 0); Decode56(x, 7, z, 2); Decode56(x, 14, z, 4); Decode56(x, 21, z, 6); Decode56(x, 28, z, 8); Decode56(x, 35, z, 10); Decode56(x, 42, z, 12); Decode56(x, 49, z, 14); } public static void Decode(byte[] x, int xOff, uint[] z) { Decode56(x, xOff, z, 0); Decode56(x, xOff + 7, z, 2); Decode56(x, xOff + 14, z, 4); Decode56(x, xOff + 21, z, 6); Decode56(x, xOff + 28, z, 8); Decode56(x, xOff + 35, z, 10); Decode56(x, xOff + 42, z, 12); Decode56(x, xOff + 49, z, 14); } public static void Decode(byte[] x, int xOff, uint[] z, int zOff) { Decode56(x, xOff, z, zOff); Decode56(x, xOff + 7, z, zOff + 2); Decode56(x, xOff + 14, z, zOff + 4); Decode56(x, xOff + 21, z, zOff + 6); Decode56(x, xOff + 28, z, zOff + 8); Decode56(x, xOff + 35, z, zOff + 10); Decode56(x, xOff + 42, z, zOff + 12); Decode56(x, xOff + 49, z, zOff + 14); } public static void Decode(ReadOnlySpan<byte> x, Span<uint> z) { Decode56(x, z); Decode56(x.Slice(7, x.Length - 7), z.Slice(2, z.Length - 2)); Decode56(x.Slice(14, x.Length - 14), z.Slice(4, z.Length - 4)); Decode56(x.Slice(21, x.Length - 21), z.Slice(6, z.Length - 6)); Decode56(x.Slice(28, x.Length - 28), z.Slice(8, z.Length - 8)); Decode56(x.Slice(35, x.Length - 35), z.Slice(10, z.Length - 10)); Decode56(x.Slice(42, x.Length - 42), z.Slice(12, z.Length - 12)); Decode56(x.Slice(49, x.Length - 49), z.Slice(14, z.Length - 14)); } private static void Decode224(uint[] x, int xOff, uint[] z, int zOff) { uint num = x[xOff]; uint num2 = x[xOff + 1]; uint num3 = x[xOff + 2]; uint num4 = x[xOff + 3]; uint num5 = x[xOff + 4]; uint num6 = x[xOff + 5]; uint num7 = x[xOff + 6]; z[zOff] = (num & 268435455); z[zOff + 1] = (((num >> 28) | (num2 << 4)) & 268435455); z[zOff + 2] = (((num2 >> 24) | (num3 << 8)) & 268435455); z[zOff + 3] = (((num3 >> 20) | (num4 << 12)) & 268435455); z[zOff + 4] = (((num4 >> 16) | (num5 << 16)) & 268435455); z[zOff + 5] = (((num5 >> 12) | (num6 << 20)) & 268435455); z[zOff + 6] = (((num6 >> 8) | (num7 << 24)) & 268435455); z[zOff + 7] = num7 >> 4; } private static void Decode224(ReadOnlySpan<uint> x, Span<uint> z) { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; z[0] = (num & 268435455); z[1] = (((num >> 28) | (num2 << 4)) & 268435455); z[2] = (((num2 >> 24) | (num3 << 8)) & 268435455); z[3] = (((num3 >> 20) | (num4 << 12)) & 268435455); z[4] = (((num4 >> 16) | (num5 << 16)) & 268435455); z[5] = (((num5 >> 12) | (num6 << 20)) & 268435455); z[6] = (((num6 >> 8) | (num7 << 24)) & 268435455); z[7] = num7 >> 4; } private static uint Decode24(byte[] bs, int off) { return (uint)(bs[off] | (bs[++off] << 8) | (bs[++off] << 16)); } private static uint Decode24(ReadOnlySpan<byte> bs) { return (uint)(bs[0] | (bs[1] << 8) | (bs[2] << 16)); } private static uint Decode32(byte[] bs, int off) { return BinaryPrimitives.ReadUInt32LittleEndian(bs.AsSpan(off)); } private static uint Decode32(ReadOnlySpan<byte> bs) { return BinaryPrimitives.ReadUInt32LittleEndian(bs); } private static void Decode56(byte[] bs, int off, uint[] z, int zOff) { uint num = Decode32(bs, off); uint num2 = Decode24(bs, off + 4); z[zOff] = (num & 268435455); z[zOff + 1] = ((num >> 28) | (num2 << 4)); } private static void Decode56(ReadOnlySpan<byte> bs, Span<uint> z) { uint num = Decode32(bs); uint num2 = Decode24(bs.Slice(4, bs.Length - 4)); z[0] = (num & 268435455); z[1] = ((num >> 28) | (num2 << 4)); } public static void Encode(uint[] x, uint[] z, int zOff) { Encode224(x, 0, z, zOff); Encode224(x, 8, z, zOff + 7); } public static void Encode(ReadOnlySpan<uint> x, Span<uint> z) { Encode224(x, z); Encode224(x.Slice(8, x.Length - 8), z.Slice(7, z.Length - 7)); } public static void Encode(uint[] x, byte[] z) { Encode56(x, 0, z, 0); Encode56(x, 2, z, 7); Encode56(x, 4, z, 14); Encode56(x, 6, z, 21); Encode56(x, 8, z, 28); Encode56(x, 10, z, 35); Encode56(x, 12, z, 42); Encode56(x, 14, z, 49); } public static void Encode(uint[] x, byte[] z, int zOff) { Encode56(x, 0, z, zOff); Encode56(x, 2, z, zOff + 7); Encode56(x, 4, z, zOff + 14); Encode56(x, 6, z, zOff + 21); Encode56(x, 8, z, zOff + 28); Encode56(x, 10, z, zOff + 35); Encode56(x, 12, z, zOff + 42); Encode56(x, 14, z, zOff + 49); } public static void Encode(uint[] x, int xOff, byte[] z, int zOff) { Encode56(x, xOff, z, zOff); Encode56(x, xOff + 2, z, zOff + 7); Encode56(x, xOff + 4, z, zOff + 14); Encode56(x, xOff + 6, z, zOff + 21); Encode56(x, xOff + 8, z, zOff + 28); Encode56(x, xOff + 10, z, zOff + 35); Encode56(x, xOff + 12, z, zOff + 42); Encode56(x, xOff + 14, z, zOff + 49); } public static void Encode(ReadOnlySpan<uint> x, Span<byte> z) { Encode56(x, z); Encode56(x.Slice(2, x.Length - 2), z.Slice(7, z.Length - 7)); Encode56(x.Slice(4, x.Length - 4), z.Slice(14, z.Length - 14)); Encode56(x.Slice(6, x.Length - 6), z.Slice(21, z.Length - 21)); Encode56(x.Slice(8, x.Length - 8), z.Slice(28, z.Length - 28)); Encode56(x.Slice(10, x.Length - 10), z.Slice(35, z.Length - 35)); Encode56(x.Slice(12, x.Length - 12), z.Slice(42, z.Length - 42)); Encode56(x.Slice(14, x.Length - 14), z.Slice(49, z.Length - 49)); } private static void Encode224(uint[] x, int xOff, uint[] z, int zOff) { uint num = x[xOff]; uint num2 = x[xOff + 1]; uint num3 = x[xOff + 2]; uint num4 = x[xOff + 3]; uint num5 = x[xOff + 4]; uint num6 = x[xOff + 5]; uint num7 = x[xOff + 6]; uint num8 = x[xOff + 7]; z[zOff] = (num | (num2 << 28)); z[zOff + 1] = ((num2 >> 4) | (num3 << 24)); z[zOff + 2] = ((num3 >> 8) | (num4 << 20)); z[zOff + 3] = ((num4 >> 12) | (num5 << 16)); z[zOff + 4] = ((num5 >> 16) | (num6 << 12)); z[zOff + 5] = ((num6 >> 20) | (num7 << 8)); z[zOff + 6] = ((num7 >> 24) | (num8 << 4)); } private static void Encode224(ReadOnlySpan<uint> x, Span<uint> z) { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; uint num8 = x[7]; z[0] = (num | (num2 << 28)); z[1] = ((num2 >> 4) | (num3 << 24)); z[2] = ((num3 >> 8) | (num4 << 20)); z[3] = ((num4 >> 12) | (num5 << 16)); z[4] = ((num5 >> 16) | (num6 << 12)); z[5] = ((num6 >> 20) | (num7 << 8)); z[6] = ((num7 >> 24) | (num8 << 4)); } private static void Encode24(uint n, byte[] bs, int off) { bs[off] = (byte)n; bs[++off] = (byte)(n >> 8); bs[++off] = (byte)(n >> 16); } private static void Encode24(uint n, Span<byte> bs) { bs[0] = (byte)n; bs[1] = (byte)(n >> 8); bs[2] = (byte)(n >> 16); } private static void Encode32(uint n, byte[] bs, int off) { BinaryPrimitives.WriteUInt32LittleEndian(bs.AsSpan(off), n); } private static void Encode32(uint n, Span<byte> bs) { BinaryPrimitives.WriteUInt32LittleEndian(bs, n); } private static void Encode56(uint[] x, int xOff, byte[] bs, int off) { uint num = x[xOff]; uint num2 = x[xOff + 1]; Encode32(num | (num2 << 28), bs, off); Encode24(num2 >> 4, bs, off + 4); } private static void Encode56(ReadOnlySpan<uint> x, Span<byte> bs) { uint num = x[0]; uint num2 = x[1]; Encode32(num | (num2 << 28), bs); Encode24(num2 >> 4, bs.Slice(4, bs.Length - 4)); } public static void Inv(uint[] x, uint[] z) { Inv(x.AsSpan(), z.AsSpan()); } public unsafe static void Inv(ReadOnlySpan<uint> x, Span<uint> z) { Span<uint> span = new Span<uint>(stackalloc byte[64], 16); Span<uint> span2 = new Span<uint>(stackalloc byte[56], 14); Copy(x, span); Normalize(span); Encode(span, span2); Mod.ModOddInverse(P32, span2, span2); Decode(span2, z); } public static void InvVar(uint[] x, uint[] z) { InvVar(x.AsSpan(), z.AsSpan()); } public unsafe static void InvVar(ReadOnlySpan<uint> x, Span<uint> z) { Span<uint> span = new Span<uint>(stackalloc byte[64], 16); Span<uint> span2 = new Span<uint>(stackalloc byte[56], 14); Copy(x, span); Normalize(span); Encode(span, span2); Mod.ModOddInverseVar(P32, span2, span2); Decode(span2, z); } public static int IsOne(uint[] x) { uint num = x[0] ^ 1; for (int i = 1; i < 16; i++) { num |= x[i]; } num |= num >> 16; num &= 65535; return (int)(num - 1) >> 31; } public static bool IsOneVar(uint[] x) { return IsOne(x) != 0; } public static int IsZero(uint[] x) { uint num = 0; for (int i = 0; i < 16; i++) { num |= x[i]; } num |= num >> 16; num &= 65535; return (int)(num - 1) >> 31; } public static bool IsZeroVar(uint[] x) { return (long)IsZero(x) != 0; } public static void Mul(uint[] x, uint y, uint[] z) { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; uint num8 = x[7]; uint num9 = x[8]; uint num10 = x[9]; uint num11 = x[10]; uint num12 = x[11]; uint num13 = x[12]; uint num14 = x[13]; uint num15 = x[14]; uint num16 = x[15]; ulong num17 = (ulong)((long)num2 * (long)y); uint num18 = (uint)((int)num17 & 268435455); num17 >>= 28; ulong num19 = (ulong)((long)num6 * (long)y); uint num20 = (uint)((int)num19 & 268435455); num19 >>= 28; ulong num21 = (ulong)((long)num10 * (long)y); uint num22 = (uint)((int)num21 & 268435455); num21 >>= 28; ulong num23 = (ulong)((long)num14 * (long)y); uint num24 = (uint)((int)num23 & 268435455); num23 >>= 28; num17 = (ulong)((long)num17 + (long)num3 * (long)y); z[2] = (uint)((int)num17 & 268435455); num17 >>= 28; num19 = (ulong)((long)num19 + (long)num7 * (long)y); z[6] = (uint)((int)num19 & 268435455); num19 >>= 28; num21 = (ulong)((long)num21 + (long)num11 * (long)y); z[10] = (uint)((int)num21 & 268435455); num21 >>= 28; num23 = (ulong)((long)num23 + (long)num15 * (long)y); z[14] = (uint)((int)num23 & 268435455); num23 >>= 28; num17 = (ulong)((long)num17 + (long)num4 * (long)y); z[3] = (uint)((int)num17 & 268435455); num17 >>= 28; num19 = (ulong)((long)num19 + (long)num8 * (long)y); z[7] = (uint)((int)num19 & 268435455); num19 >>= 28; num21 = (ulong)((long)num21 + (long)num12 * (long)y); z[11] = (uint)((int)num21 & 268435455); num21 >>= 28; num23 = (ulong)((long)num23 + (long)num16 * (long)y); z[15] = (uint)((int)num23 & 268435455); num23 >>= 28; num19 += num23; num17 = (ulong)((long)num17 + (long)num5 * (long)y); z[4] = (uint)((int)num17 & 268435455); num17 >>= 28; num19 = (ulong)((long)num19 + (long)num9 * (long)y); z[8] = (uint)((int)num19 & 268435455); num19 >>= 28; num21 = (ulong)((long)num21 + (long)num13 * (long)y); z[12] = (uint)((int)num21 & 268435455); num21 >>= 28; num23 = (ulong)((long)num23 + (long)num * (long)y); z[0] = (uint)((int)num23 & 268435455); num23 >>= 28; z[1] = (uint)((int)num18 + (int)num23); z[5] = (uint)((int)num20 + (int)num17); z[9] = (uint)((int)num22 + (int)num19); z[13] = (uint)((int)num24 + (int)num21); } public static void Mul(uint[] x, uint[] y, uint[] z) { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; uint num8 = x[7]; uint num9 = x[8]; uint num10 = x[9]; uint num11 = x[10]; uint num12 = x[11]; uint num13 = x[12]; uint num14 = x[13]; uint num15 = x[14]; uint num16 = x[15]; uint num17 = y[0]; uint num18 = y[1]; uint num19 = y[2]; uint num20 = y[3]; uint num21 = y[4]; uint num22 = y[5]; uint num23 = y[6]; uint num24 = y[7]; uint num25 = y[8]; uint num26 = y[9]; uint num27 = y[10]; uint num28 = y[11]; uint num29 = y[12]; uint num30 = y[13]; uint num31 = y[14]; uint num32 = y[15]; uint num33 = num + num9; uint num34 = num2 + num10; uint num35 = num3 + num11; uint num36 = num4 + num12; uint num37 = num5 + num13; uint num38 = num6 + num14; uint num39 = num7 + num15; uint num40 = num8 + num16; uint num41 = num17 + num25; uint num42 = num18 + num26; uint num43 = num19 + num27; uint num44 = num20 + num28; uint num45 = num21 + num29; uint num46 = num22 + num30; uint num47 = num23 + num31; uint num48 = num24 + num32; ulong num49 = (ulong)((long)num * (long)num17); ulong num50 = (ulong)((long)num8 * (long)num18 + (long)num7 * (long)num19 + (long)num6 * (long)num20 + (long)num5 * (long)num21 + (long)num4 * (long)num22 + (long)num3 * (long)num23 + (long)num2 * (long)num24); ulong num51 = (ulong)((long)num9 * (long)num25); long num52 = (long)num16 * (long)num26 + (long)num15 * (long)num27 + (long)num14 * (long)num28 + (long)num13 * (long)num29 + (long)num12 * (long)num30 + (long)num11 * (long)num31 + (long)num10 * (long)num32; ulong num53 = (ulong)((long)num33 * (long)num41); ulong num54 = (ulong)((long)num40 * (long)num42 + (long)num39 * (long)num43 + (long)num38 * (long)num44 + (long)num37 * (long)num45 + (long)num36 * (long)num46 + (long)num35 * (long)num47 + (long)num34 * (long)num48); ulong num55 = num49 + num51 + num54 - num50; uint num56 = (uint)((int)num55 & 268435455); num55 >>= 28; ulong num57 = (ulong)(num52 + (long)num53 - (long)num49 + (long)num54); uint num58 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num59 = (ulong)((long)num2 * (long)num17 + (long)num * (long)num18); ulong num60 = (ulong)((long)num8 * (long)num19 + (long)num7 * (long)num20 + (long)num6 * (long)num21 + (long)num5 * (long)num22 + (long)num4 * (long)num23 + (long)num3 * (long)num24); ulong num61 = (ulong)((long)num10 * (long)num25 + (long)num9 * (long)num26); ulong num62 = (ulong)((long)num16 * (long)num27 + (long)num15 * (long)num28 + (long)num14 * (long)num29 + (long)num13 * (long)num30 + (long)num12 * (long)num31 + (long)num11 * (long)num32); ulong num63 = (ulong)((long)num34 * (long)num41 + (long)num33 * (long)num42); ulong num64 = (ulong)((long)num40 * (long)num43 + (long)num39 * (long)num44 + (long)num38 * (long)num45 + (long)num37 * (long)num46 + (long)num36 * (long)num47 + (long)num35 * (long)num48); num55 += num59 + num61 + num64 - num60; uint num65 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num62 + num63 - num59 + num64; uint num66 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num67 = (ulong)((long)num3 * (long)num17 + (long)num2 * (long)num18 + (long)num * (long)num19); ulong num68 = (ulong)((long)num8 * (long)num20 + (long)num7 * (long)num21 + (long)num6 * (long)num22 + (long)num5 * (long)num23 + (long)num4 * (long)num24); ulong num69 = (ulong)((long)num11 * (long)num25 + (long)num10 * (long)num26 + (long)num9 * (long)num27); ulong num70 = (ulong)((long)num16 * (long)num28 + (long)num15 * (long)num29 + (long)num14 * (long)num30 + (long)num13 * (long)num31 + (long)num12 * (long)num32); ulong num71 = (ulong)((long)num35 * (long)num41 + (long)num34 * (long)num42 + (long)num33 * (long)num43); ulong num72 = (ulong)((long)num40 * (long)num44 + (long)num39 * (long)num45 + (long)num38 * (long)num46 + (long)num37 * (long)num47 + (long)num36 * (long)num48); num55 += num67 + num69 + num72 - num68; uint num73 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num70 + num71 - num67 + num72; uint num74 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num75 = (ulong)((long)num4 * (long)num17 + (long)num3 * (long)num18 + (long)num2 * (long)num19 + (long)num * (long)num20); ulong num76 = (ulong)((long)num8 * (long)num21 + (long)num7 * (long)num22 + (long)num6 * (long)num23 + (long)num5 * (long)num24); ulong num77 = (ulong)((long)num12 * (long)num25 + (long)num11 * (long)num26 + (long)num10 * (long)num27 + (long)num9 * (long)num28); ulong num78 = (ulong)((long)num16 * (long)num29 + (long)num15 * (long)num30 + (long)num14 * (long)num31 + (long)num13 * (long)num32); ulong num79 = (ulong)((long)num36 * (long)num41 + (long)num35 * (long)num42 + (long)num34 * (long)num43 + (long)num33 * (long)num44); ulong num80 = (ulong)((long)num40 * (long)num45 + (long)num39 * (long)num46 + (long)num38 * (long)num47 + (long)num37 * (long)num48); num55 += num75 + num77 + num80 - num76; uint num81 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num78 + num79 - num75 + num80; uint num82 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num83 = (ulong)((long)num5 * (long)num17 + (long)num4 * (long)num18 + (long)num3 * (long)num19 + (long)num2 * (long)num20 + (long)num * (long)num21); ulong num84 = (ulong)((long)num8 * (long)num22 + (long)num7 * (long)num23 + (long)num6 * (long)num24); ulong num85 = (ulong)((long)num13 * (long)num25 + (long)num12 * (long)num26 + (long)num11 * (long)num27 + (long)num10 * (long)num28 + (long)num9 * (long)num29); ulong num86 = (ulong)((long)num16 * (long)num30 + (long)num15 * (long)num31 + (long)num14 * (long)num32); ulong num87 = (ulong)((long)num37 * (long)num41 + (long)num36 * (long)num42 + (long)num35 * (long)num43 + (long)num34 * (long)num44 + (long)num33 * (long)num45); ulong num88 = (ulong)((long)num40 * (long)num46 + (long)num39 * (long)num47 + (long)num38 * (long)num48); num55 += num83 + num85 + num88 - num84; uint num89 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num86 + num87 - num83 + num88; uint num90 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num91 = (ulong)((long)num6 * (long)num17 + (long)num5 * (long)num18 + (long)num4 * (long)num19 + (long)num3 * (long)num20 + (long)num2 * (long)num21 + (long)num * (long)num22); ulong num92 = (ulong)((long)num8 * (long)num23 + (long)num7 * (long)num24); ulong num93 = (ulong)((long)num14 * (long)num25 + (long)num13 * (long)num26 + (long)num12 * (long)num27 + (long)num11 * (long)num28 + (long)num10 * (long)num29 + (long)num9 * (long)num30); ulong num94 = (ulong)((long)num16 * (long)num31 + (long)num15 * (long)num32); ulong num95 = (ulong)((long)num38 * (long)num41 + (long)num37 * (long)num42 + (long)num36 * (long)num43 + (long)num35 * (long)num44 + (long)num34 * (long)num45 + (long)num33 * (long)num46); ulong num96 = (ulong)((long)num40 * (long)num47 + (long)num39 * (long)num48); num55 += num91 + num93 + num96 - num92; uint num97 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num94 + num95 - num91 + num96; uint num98 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num99 = (ulong)((long)num7 * (long)num17 + (long)num6 * (long)num18 + (long)num5 * (long)num19 + (long)num4 * (long)num20 + (long)num3 * (long)num21 + (long)num2 * (long)num22 + (long)num * (long)num23); ulong num100 = (ulong)((long)num8 * (long)num24); ulong num101 = (ulong)((long)num15 * (long)num25 + (long)num14 * (long)num26 + (long)num13 * (long)num27 + (long)num12 * (long)num28 + (long)num11 * (long)num29 + (long)num10 * (long)num30 + (long)num9 * (long)num31); ulong num102 = (ulong)((long)num16 * (long)num32); ulong num103 = (ulong)((long)num39 * (long)num41 + (long)num38 * (long)num42 + (long)num37 * (long)num43 + (long)num36 * (long)num44 + (long)num35 * (long)num45 + (long)num34 * (long)num46 + (long)num33 * (long)num47); ulong num104 = (ulong)((long)num40 * (long)num48); num55 += num99 + num101 + num104 - num100; uint num105 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num102 + num103 - num99 + num104; uint num106 = (uint)((int)num57 & 268435455); num57 >>= 28; ulong num107 = (ulong)((long)num8 * (long)num17 + (long)num7 * (long)num18 + (long)num6 * (long)num19 + (long)num5 * (long)num20 + (long)num4 * (long)num21 + (long)num3 * (long)num22 + (long)num2 * (long)num23 + (long)num * (long)num24); ulong num108 = (ulong)((long)num16 * (long)num25 + (long)num15 * (long)num26 + (long)num14 * (long)num27 + (long)num13 * (long)num28 + (long)num12 * (long)num29 + (long)num11 * (long)num30 + (long)num10 * (long)num31 + (long)num9 * (long)num32); ulong num109 = (ulong)((long)num40 * (long)num41 + (long)num39 * (long)num42 + (long)num38 * (long)num43 + (long)num37 * (long)num44 + (long)num36 * (long)num45 + (long)num35 * (long)num46 + (long)num34 * (long)num47 + (long)num33 * (long)num48); num55 += num107 + num108; uint num110 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num109 - num107; uint num111 = (uint)((int)num57 & 268435455); num57 >>= 28; num55 += num57; num55 += num58; num58 = (uint)((int)num55 & 268435455); num55 >>= 28; num57 += num56; num56 = (uint)((int)num57 & 268435455); num57 >>= 28; num66 = (uint)((int)num66 + (int)num55); num65 = (uint)((int)num65 + (int)num57); z[0] = num56; z[1] = num65; z[2] = num73; z[3] = num81; z[4] = num89; z[5] = num97; z[6] = num105; z[7] = num110; z[8] = num58; z[9] = num66; z[10] = num74; z[11] = num82; z[12] = num90; z[13] = num98; z[14] = num106; z[15] = num111; } public static void Negate(uint[] x, uint[] z) { Sub(Create(), x, z); } public static void Normalize(uint[] z) { Reduce(z, 1); Reduce(z, -1); } public static void Normalize(Span<uint> z) { Reduce(z, 1); Reduce(z, -1); } public static void One(uint[] z) { z[0] = 1; for (int i = 1; i < 16; i++) { z[i] = 0; } } private static void PowPm3d4(uint[] x, uint[] z) { uint[] array = Create(); Sqr(x, array); Mul(x, array, array); uint[] array2 = Create(); Sqr(array, array2); Mul(x, array2, array2); uint[] array3 = Create(); Sqr(array2, 3, array3); Mul(array2, array3, array3); uint[] array4 = Create(); Sqr(array3, 3, array4); Mul(array2, array4, array4); uint[] array5 = Create(); Sqr(array4, 9, array5); Mul(array4, array5, array5); uint[] array6 = Create(); Sqr(array5, array6); Mul(x, array6, array6); uint[] array7 = Create(); Sqr(array6, 18, array7); Mul(array5, array7, array7); uint[] array8 = Create(); Sqr(array7, 37, array8); Mul(array7, array8, array8); uint[] array9 = Create(); Sqr(array8, 37, array9); Mul(array7, array9, array9); uint[] array10 = Create(); Sqr(array9, 111, array10); Mul(array9, array10, array10); uint[] array11 = Create(); Sqr(array10, array11); Mul(x, array11, array11); uint[] array12 = Create(); Sqr(array11, 223, array12); Mul(array12, array10, z); } private static void Reduce(uint[] z, int x) { uint num = z[15]; uint num2 = num & 268435455; int num3 = (int)(num >> 28) + x; long num4 = num3; for (int i = 0; i < 8; i++) { num4 += z[i]; z[i] = (uint)((int)num4 & 268435455); num4 >>= 28; } num4 += num3; for (int j = 8; j < 15; j++) { num4 += z[j]; z[j] = (uint)((int)num4 & 268435455); num4 >>= 28; } z[15] = (uint)((int)num2 + (int)num4); } private static void Reduce(Span<uint> z, int x) { uint num = z[15]; uint num2 = num & 268435455; int num3 = (int)(num >> 28) + x; long num4 = num3; for (int i = 0; i < 8; i++) { num4 += z[i]; z[i] = (uint)((int)num4 & 268435455); num4 >>= 28; } num4 += num3; for (int j = 8; j < 15; j++) { num4 += z[j]; z[j] = (uint)((int)num4 & 268435455); num4 >>= 28; } z[15] = (uint)((int)num2 + (int)num4); } public static void Sqr(uint[] x, uint[] z) { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; uint num8 = x[7]; uint num9 = x[8]; uint num10 = x[9]; uint num11 = x[10]; uint num12 = x[11]; uint num13 = x[12]; uint num14 = x[13]; uint num15 = x[14]; uint num16 = x[15]; uint num17 = num * 2; uint num18 = num2 * 2; uint num19 = num3 * 2; uint num20 = num4 * 2; uint num21 = num5 * 2; uint num22 = num6 * 2; uint num23 = num7 * 2; uint num24 = num9 * 2; uint num25 = num10 * 2; uint num26 = num11 * 2; uint num27 = num12 * 2; uint num28 = num13 * 2; uint num29 = num14 * 2; uint num30 = num15 * 2; uint num31 = num + num9; uint num32 = num2 + num10; uint num33 = num3 + num11; uint num34 = num4 + num12; uint num35 = num5 + num13; uint num36 = num6 + num14; uint num37 = num7 + num15; uint num38 = num8 + num16; uint num39 = num31 * 2; uint num40 = num32 * 2; uint num41 = num33 * 2; uint num42 = num34 * 2; uint num43 = num35 * 2; uint num44 = num36 * 2; uint num45 = num37 * 2; ulong num46 = (ulong)((long)num * (long)num); ulong num47 = (ulong)((long)num8 * (long)num18 + (long)num7 * (long)num19 + (long)num6 * (long)num20 + (long)num5 * (long)num5); ulong num48 = (ulong)((long)num9 * (long)num9); long num49 = (long)num16 * (long)num25 + (long)num15 * (long)num26 + (long)num14 * (long)num27 + (long)num13 * (long)num13; ulong num50 = (ulong)((long)num31 * (long)num31); ulong num51 = (ulong)((long)num38 * (long)num40 + (long)num37 * (long)num41 + (long)num36 * (long)num42 + (long)num35 * (long)num35); ulong num52 = num46 + num48 + num51 - num47; uint num53 = (uint)((int)num52 & 268435455); num52 >>= 28; ulong num54 = (ulong)(num49 + (long)num50 - (long)num46 + (long)num51); uint num55 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num56 = (ulong)((long)num2 * (long)num17); ulong num57 = (ulong)((long)num8 * (long)num19 + (long)num7 * (long)num20 + (long)num6 * (long)num21); ulong num58 = (ulong)((long)num10 * (long)num24); ulong num59 = (ulong)((long)num16 * (long)num26 + (long)num15 * (long)num27 + (long)num14 * (long)num28); ulong num60 = (ulong)((long)num32 * (long)num39); ulong num61 = (ulong)((long)num38 * (long)num41 + (long)num37 * (long)num42 + (long)num36 * (long)num43); num52 += num56 + num58 + num61 - num57; uint num62 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num59 + num60 - num56 + num61; uint num63 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num64 = (ulong)((long)num3 * (long)num17 + (long)num2 * (long)num2); ulong num65 = (ulong)((long)num8 * (long)num20 + (long)num7 * (long)num21 + (long)num6 * (long)num6); ulong num66 = (ulong)((long)num11 * (long)num24 + (long)num10 * (long)num10); ulong num67 = (ulong)((long)num16 * (long)num27 + (long)num15 * (long)num28 + (long)num14 * (long)num14); ulong num68 = (ulong)((long)num33 * (long)num39 + (long)num32 * (long)num32); ulong num69 = (ulong)((long)num38 * (long)num42 + (long)num37 * (long)num43 + (long)num36 * (long)num36); num52 += num64 + num66 + num69 - num65; uint num70 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num67 + num68 - num64 + num69; uint num71 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num72 = (ulong)((long)num4 * (long)num17 + (long)num3 * (long)num18); ulong num73 = (ulong)((long)num8 * (long)num21 + (long)num7 * (long)num22); ulong num74 = (ulong)((long)num12 * (long)num24 + (long)num11 * (long)num25); ulong num75 = (ulong)((long)num16 * (long)num28 + (long)num15 * (long)num29); ulong num76 = (ulong)((long)num34 * (long)num39 + (long)num33 * (long)num40); ulong num77 = (ulong)((long)num38 * (long)num43 + (long)num37 * (long)num44); num52 += num72 + num74 + num77 - num73; uint num78 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num75 + num76 - num72 + num77; uint num79 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num80 = (ulong)((long)num5 * (long)num17 + (long)num4 * (long)num18 + (long)num3 * (long)num3); ulong num81 = (ulong)((long)num8 * (long)num22 + (long)num7 * (long)num7); ulong num82 = (ulong)((long)num13 * (long)num24 + (long)num12 * (long)num25 + (long)num11 * (long)num11); ulong num83 = (ulong)((long)num16 * (long)num29 + (long)num15 * (long)num15); ulong num84 = (ulong)((long)num35 * (long)num39 + (long)num34 * (long)num40 + (long)num33 * (long)num33); ulong num85 = (ulong)((long)num38 * (long)num44 + (long)num37 * (long)num37); num52 += num80 + num82 + num85 - num81; uint num86 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num83 + num84 - num80 + num85; uint num87 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num88 = (ulong)((long)num6 * (long)num17 + (long)num5 * (long)num18 + (long)num4 * (long)num19); ulong num89 = (ulong)((long)num8 * (long)num23); ulong num90 = (ulong)((long)num14 * (long)num24 + (long)num13 * (long)num25 + (long)num12 * (long)num26); ulong num91 = (ulong)((long)num16 * (long)num30); ulong num92 = (ulong)((long)num36 * (long)num39 + (long)num35 * (long)num40 + (long)num34 * (long)num41); ulong num93 = (ulong)((long)num38 * (long)num45); num52 += num88 + num90 + num93 - num89; uint num94 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num91 + num92 - num88 + num93; uint num95 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num96 = (ulong)((long)num7 * (long)num17 + (long)num6 * (long)num18 + (long)num5 * (long)num19 + (long)num4 * (long)num4); ulong num97 = (ulong)((long)num8 * (long)num8); ulong num98 = (ulong)((long)num15 * (long)num24 + (long)num14 * (long)num25 + (long)num13 * (long)num26 + (long)num12 * (long)num12); ulong num99 = (ulong)((long)num16 * (long)num16); ulong num100 = (ulong)((long)num37 * (long)num39 + (long)num36 * (long)num40 + (long)num35 * (long)num41 + (long)num34 * (long)num34); ulong num101 = (ulong)((long)num38 * (long)num38); num52 += num96 + num98 + num101 - num97; uint num102 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num99 + num100 - num96 + num101; uint num103 = (uint)((int)num54 & 268435455); num54 >>= 28; ulong num104 = (ulong)((long)num8 * (long)num17 + (long)num7 * (long)num18 + (long)num6 * (long)num19 + (long)num5 * (long)num20); ulong num105 = (ulong)((long)num16 * (long)num24 + (long)num15 * (long)num25 + (long)num14 * (long)num26 + (long)num13 * (long)num27); ulong num106 = (ulong)((long)num38 * (long)num39 + (long)num37 * (long)num40 + (long)num36 * (long)num41 + (long)num35 * (long)num42); num52 += num104 + num105; uint num107 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num106 - num104; uint num108 = (uint)((int)num54 & 268435455); num54 >>= 28; num52 += num54; num52 += num55; num55 = (uint)((int)num52 & 268435455); num52 >>= 28; num54 += num53; num53 = (uint)((int)num54 & 268435455); num54 >>= 28; num63 = (uint)((int)num63 + (int)num52); num62 = (uint)((int)num62 + (int)num54); z[0] = num53; z[1] = num62; z[2] = num70; z[3] = num78; z[4] = num86; z[5] = num94; z[6] = num102; z[7] = num107; z[8] = num55; z[9] = num63; z[10] = num71; z[11] = num79; z[12] = num87; z[13] = num95; z[14] = num103; z[15] = num108; } public static void Sqr(uint[] x, int n, uint[] z) { Sqr(x, z); while (--n > 0) { Sqr(z, z); } } public static bool SqrtRatioVar(uint[] u, uint[] v, uint[] z) { uint[] array = Create(); uint[] array2 = Create(); Sqr(u, array); Mul(array, v, array); Sqr(array, array2); Mul(array, u, array); Mul(array2, u, array2); Mul(array2, v, array2); uint[] array3 = Create(); PowPm3d4(array2, array3); Mul(array3, array, array3); uint[] array4 = Create(); Sqr(array3, array4); Mul(array4, v, array4); Sub(u, array4, array4); Normalize(array4); if (IsZeroVar(array4)) { Copy(array3, 0, z, 0); return true; } return false; } public static void Sub(uint[] x, uint[] y, uint[] z) { Sub(x.AsSpan(), y.AsSpan(), z.AsSpan()); } public static void Sub(ReadOnlySpan<uint> x, ReadOnlySpan<uint> y, Span<uint> z) { if (Org.BouncyCastle.Runtime.Intrinsics.X86.Avx2.IsEnabled && Org.BouncyCastle.Runtime.Intrinsics.Vector.IsPackedLittleEndian) { Vector256<uint> control = Vector256.Create(7, 0, 1, 2, 3, 4, 5, 6); Vector256<uint> right = Vector256.Create(268435455); Vector256<uint> right2 = Vector256.CreateScalar(uint.MaxValue); Vector256<uint> vector = Vector256.Create(536870910); Vector256<uint> right3 = vector.WithElement(0, 536870908); ReadOnlySpan<byte> readOnlySpan = MemoryMarshal.AsBytes(x.Slice(0, 16)); ReadOnlySpan<byte> readOnlySpan2 = MemoryMarshal.AsBytes(y.Slice(0, 16)); Span<byte> span = MemoryMarshal.AsBytes(z.Slice(0, 16)); Vector256<uint> left = MemoryMarshal.Read<Vector256<uint>>(readOnlySpan.Slice(0, 32)); Vector256<uint> left2 = MemoryMarshal.Read<Vector256<uint>>(readOnlySpan.Slice(32, 32)); Vector256<uint> right4 = MemoryMarshal.Read<Vector256<uint>>(readOnlySpan2.Slice(0, 32)); Vector256<uint> right5 = MemoryMarshal.Read<Vector256<uint>>(readOnlySpan2.Slice(32, 32)); Vector256<uint> value = System.Runtime.Intrinsics.X86.Avx2.Subtract(System.Runtime.Intrinsics.X86.Avx2.Add(left, vector), right4); Vector256<uint> value2 = System.Runtime.Intrinsics.X86.Avx2.Subtract(System.Runtime.Intrinsics.X86.Avx2.Add(left2, right3), right5); Vector256<uint> left3 = System.Runtime.Intrinsics.X86.Avx2.ShiftRightLogical(value, 28); Vector256<uint> left4 = System.Runtime.Intrinsics.X86.Avx2.ShiftRightLogical(value2, 28); value = System.Runtime.Intrinsics.X86.Avx2.And(value, right); value2 = System.Runtime.Intrinsics.X86.Avx2.And(value2, right); left3 = System.Runtime.Intrinsics.X86.Avx2.PermuteVar8x32(left3, control); left4 = System.Runtime.Intrinsics.X86.Avx2.PermuteVar8x32(left4, control); value = System.Runtime.Intrinsics.X86.Avx2.Add(value, System.Runtime.Intrinsics.X86.Avx2.Blend(left3, left4, 1)); value2 = System.Runtime.Intrinsics.X86.Avx2.Add(value2, left4); value2 = System.Runtime.Intrinsics.X86.Avx2.Add(value2, System.Runtime.Intrinsics.X86.Avx2.And(left3, right2)); Vector256<uint> left5 = System.Runtime.Intrinsics.X86.Avx2.ShiftRightLogical(value, 28); Vector256<uint> left6 = System.Runtime.Intrinsics.X86.Avx2.ShiftRightLogical(value2, 28); value = System.Runtime.Intrinsics.X86.Avx2.And(value, right); value2 = System.Runtime.Intrinsics.X86.Avx2.And(value2, right); left5 = System.Runtime.Intrinsics.X86.Avx2.PermuteVar8x32(left5, control); left6 = System.Runtime.Intrinsics.X86.Avx2.PermuteVar8x32(left6, control); value = System.Runtime.Intrinsics.X86.Avx2.Add(value, System.Runtime.Intrinsics.X86.Avx2.Blend(left5, left6, 1)); value2 = System.Runtime.Intrinsics.X86.Avx2.Add(value2, left6); value2 = System.Runtime.Intrinsics.X86.Avx2.Add(value2, System.Runtime.Intrinsics.X86.Avx2.And(left5, right2)); MemoryMarshal.Write(span.Slice(0, 32), ref value); MemoryMarshal.Write(span.Slice(32, 32), ref value2); } else { uint num = x[0]; uint num2 = x[1]; uint num3 = x[2]; uint num4 = x[3]; uint num5 = x[4]; uint num6 = x[5]; uint num7 = x[6]; uint num8 = x[7]; uint num9 = x[8]; uint num10 = x[9]; uint num11 = x[10]; uint num12 = x[11]; uint num13 = x[12]; uint num14 = x[13]; uint num15 = x[14]; uint num16 = x[15]; uint num17 = y[0]; uint num18 = y[1]; uint num19 = y[2]; uint num20 = y[3]; uint num21 = y[4]; uint num22 = y[5]; uint num23 = y[6]; uint num24 = y[7]; uint num25 = y[8]; uint num26 = y[9]; uint num27 = y[10]; uint num28 = y[11]; uint num29 = y[12]; uint num30 = y[13]; uint num31 = y[14]; uint num32 = y[15]; uint num33 = num + 536870910 - num17; uint num34 = num2 + 536870910 - num18; uint num35 = num3 + 536870910 - num19; uint num36 = num4 + 536870910 - num20; uint num37 = num5 + 536870910 - num21; uint num38 = num6 + 536870910 - num22; uint num39 = num7 + 536870910 - num23; uint num40 = num8 + 536870910 - num24; uint num41 = num9 + 536870908 - num25; uint num42 = num10 + 536870910 - num26; uint num43 = num11 + 536870910 - num27; uint num44 = num12 + 536870910 - num28; uint num45 = num13 + 536870910 - num29; uint num46 = num14 + 536870910 - num30; uint num47 = num15 + 536870910 - num31; uint num48 = num16 + 536870910 - num32; num35 += num34 >> 28; num34 &= 268435455; num39 += num38 >> 28; num38 &= 268435455; num43 += num42 >> 28; num42 &= 268435455; num47 += num46 >> 28; num46 &= 268435455; num36 += num35 >> 28; num35 &= 268435455; num40 += num39 >> 28; num39 &= 268435455; num44 += num43 >> 28; num43 &= 268435455; num48 += num47 >> 28; num47 &= 268435455; uint num49 = num48 >> 28; num48 &= 268435455; num33 += num49; num41 += num49; num37 += num36 >> 28; num36 &= 268435455; num41 += num40 >> 28; num40 &= 268435455; num45 += num44 >> 28; num44 &= 268435455; num34 += num33 >> 28; num33 &= 268435455; num38 += num37 >> 28; num37 &= 268435455; num42 += num41 >> 28; num41 &= 268435455; num46 += num45 >> 28; num45 &= 268435455; z[0] = num33; z[1] = num34; z[2] = num35; z[3] = num36; z[4] = num37; z[5] = num38; z[6] = num39; z[7] = num40; z[8] = num41; z[9] = num42; z[10] = num43; z[11] = num44; z[12] = num45; z[13] = num46; z[14] = num47; z[15] = num48; } } public static void SubOne(uint[] z) { uint[] array = Create(); array[0] = 1; Sub(z, array, z); } public static void Zero(uint[] z) { for (int i = 0; i < 16; i++) { z[i] = 0; } } } }