<PackageReference Include="SSH.NET" Version="2024.0.0" />

Poly1305Donna

namespace Renci.SshNet.Security.Chaos.NaCl.Internal { internal class Poly1305Donna { internal static void poly1305_auth(byte[] output, int outputOffset, byte[] m, int mStart, int mLength, ref Array8<uint> key) { uint x = key.x0; uint x2 = key.x1; uint x3 = key.x2; uint x4 = key.x3; uint num = x & 67108863; x >>= 26; x |= x2 << 6; uint num2 = x & 67108611; x2 >>= 20; x2 |= x3 << 12; uint num3 = x2 & 67092735; x3 >>= 14; x3 |= x4 << 18; uint num4 = x3 & 66076671; x4 >>= 8; uint num5 = x4 & 1048575; uint num6 = num2 * 5; uint num7 = num3 * 5; uint num8 = num4 * 5; uint num9 = num5 * 5; uint num10 = 0; uint num11 = 0; uint num12 = 0; uint num13 = 0; uint num14 = 0; if (mLength >= 16) goto IL_00a4; goto IL_0290; IL_0290: uint num15; if (mLength == 0) { num15 = num10 >> 26; num10 &= 67108863; num11 += num15; num15 = num11 >> 26; num11 &= 67108863; num12 += num15; num15 = num12 >> 26; num12 &= 67108863; num13 += num15; num15 = num13 >> 26; num13 &= 67108863; num14 += num15; num15 = num14 >> 26; num14 &= 67108863; num10 += num15 * 5; uint num16 = num10 + 5; num15 = num16 >> 26; num16 &= 67108863; uint num17 = num11 + num15; num15 = num17 >> 26; num17 &= 67108863; uint num18 = num12 + num15; num15 = num18 >> 26; num18 &= 67108863; uint num19 = num13 + num15; num15 = num19 >> 26; num19 &= 67108863; uint num20 = num14 + num15 - 67108864; num15 = (num20 >> 31) - 1; uint num21 = ~num15; num10 = ((num10 & num21) | (num16 & num15)); num11 = ((num11 & num21) | (num17 & num15)); num12 = ((num12 & num21) | (num18 & num15)); num13 = ((num13 & num21) | (num19 & num15)); num14 = ((num14 & num21) | (num20 & num15)); ulong num22 = (ulong)((long)(num10 | (num11 << 26)) + (long)key.x4); ulong num23 = (ulong)((long)((num11 >> 6) | (num12 << 20)) + (long)key.x5); ulong num24 = (ulong)((long)((num12 >> 12) | (num13 << 14)) + (long)key.x6); ulong num25 = (ulong)((long)((num13 >> 18) | (num14 << 8)) + (long)key.x7); ByteIntegerConverter.StoreLittleEndian32(output, outputOffset, (uint)num22); num23 += num22 >> 32; ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 4, (uint)num23); num24 += num23 >> 32; ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 8, (uint)num24); num25 += num24 >> 32; ByteIntegerConverter.StoreLittleEndian32(output, outputOffset + 12, (uint)num25); return; } byte[] array = new byte[16]; int i; for (i = 0; i < mLength; i++) { array[i] = m[mStart + i]; } array[i++] = 1; for (; i < 16; i++) { array[i] = 0; } mLength = 0; x = ByteIntegerConverter.LoadLittleEndian32(array, 0); x2 = ByteIntegerConverter.LoadLittleEndian32(array, 4); x3 = ByteIntegerConverter.LoadLittleEndian32(array, 8); x4 = ByteIntegerConverter.LoadLittleEndian32(array, 12); CryptoBytes.Wipe(array); num10 += (x & 67108863); num11 = (uint)((int)num11 + (int)(((((ulong)x2 << 32) | x) >> 26) & 67108863)); num12 = (uint)((int)num12 + (int)(((((ulong)x3 << 32) | x2) >> 20) & 67108863)); num13 = (uint)((int)num13 + (int)(((((ulong)x4 << 32) | x3) >> 14) & 67108863)); num14 += x4 >> 8; goto IL_013d; IL_013d: ulong num27 = (ulong)((long)num10 * (long)num + (long)num11 * (long)num9 + (long)num12 * (long)num8 + (long)num13 * (long)num7 + (long)num14 * (long)num6); ulong num28 = (ulong)((long)num10 * (long)num2 + (long)num11 * (long)num + (long)num12 * (long)num9 + (long)num13 * (long)num8 + (long)num14 * (long)num7); ulong num29 = (ulong)((long)num10 * (long)num3 + (long)num11 * (long)num2 + (long)num12 * (long)num + (long)num13 * (long)num9 + (long)num14 * (long)num8); ulong num30 = (ulong)((long)num10 * (long)num4 + (long)num11 * (long)num3 + (long)num12 * (long)num2 + (long)num13 * (long)num + (long)num14 * (long)num9); long num31 = (long)num10 * (long)num5 + (long)num11 * (long)num4 + (long)num12 * (long)num3 + (long)num13 * (long)num2 + (long)num14 * (long)num; num10 = (uint)((int)num27 & 67108863); ulong num32 = num27 >> 26; num28 += num32; num11 = (uint)((int)num28 & 67108863); num15 = (uint)(num28 >> 26); num29 += num15; num12 = (uint)((int)num29 & 67108863); num15 = (uint)(num29 >> 26); num30 += num15; num13 = (uint)((int)num30 & 67108863); num15 = (uint)(num30 >> 26); long num33 = num31 + num15; num14 = (uint)((int)num33 & 67108863); num15 = (uint)((ulong)num33 >> 26); num10 += num15 * 5; if (mLength >= 16) goto IL_00a4; goto IL_0290; IL_00a4: mStart += 16; mLength -= 16; x = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 16); x2 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 12); x3 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 8); x4 = ByteIntegerConverter.LoadLittleEndian32(m, mStart - 4); num10 += (x & 67108863); num11 = (uint)((int)num11 + (int)(((((ulong)x2 << 32) | x) >> 26) & 67108863)); num12 = (uint)((int)num12 + (int)(((((ulong)x3 << 32) | x2) >> 20) & 67108863)); num13 = (uint)((int)num13 + (int)(((((ulong)x4 << 32) | x3) >> 14) & 67108863)); num14 += ((x4 >> 8) | 16777216); goto IL_013d; } } }