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

Tables8kGcmMultiplier

using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Modes.Gcm { [Obsolete("Will be removed")] public class Tables8kGcmMultiplier : IGcmMultiplier { private byte[] H; private GcmUtilities.FieldElement[][] T; public void Init(byte[] H) { if (T == null) T = new GcmUtilities.FieldElement[2][]; else if (Arrays.AreEqual(this.H, H)) { return; } this.H = Arrays.Clone(H); for (int i = 0; i < 2; i++) { GcmUtilities.FieldElement[] array = T[i] = new GcmUtilities.FieldElement[256]; if (i == 0) { GcmUtilities.AsFieldElement(this.H, out array[1]); GcmUtilities.MultiplyP7(ref array[1]); } else GcmUtilities.MultiplyP8(ref T[i - 1][1], out array[1]); for (int j = 1; j < 128; j++) { GcmUtilities.DivideP(ref array[j], out array[j << 1]); GcmUtilities.Xor(ref array[j << 1], ref array[1], out array[(j << 1) + 1]); } } } public void MultiplyH(byte[] x) { GcmUtilities.FieldElement[] array = T[0]; GcmUtilities.FieldElement[] array2 = T[1]; int num = x[15]; int num2 = x[14]; ulong num3 = array[num2].n1 ^ array2[num].n1; ulong num4 = array[num2].n0 ^ array2[num].n0; for (int num5 = 12; num5 >= 0; num5 -= 2) { num = x[num5 + 1]; num2 = x[num5]; ulong num6 = num3 << 48; num3 = (array[num2].n1 ^ array2[num].n1 ^ ((num3 >> 16) | (num4 << 48))); num4 = (array[num2].n0 ^ array2[num].n0 ^ (num4 >> 16) ^ num6 ^ (num6 >> 1) ^ (num6 >> 2) ^ (num6 >> 7)); } GcmUtilities.AsBytes(num4, num3, x); } } }