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

Tables64kGcmMultiplier

using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Modes.Gcm { [Obsolete("Will be removed")] public class Tables64kGcmMultiplier : IGcmMultiplier { private byte[] H; private GcmUtilities.FieldElement[][] T; public void Init(byte[] H) { if (T == null) T = new GcmUtilities.FieldElement[16][]; else if (Arrays.AreEqual(this.H, H)) { return; } this.H = Arrays.Clone(H); for (int i = 0; i < 16; 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[15]; int num = x[15]; ulong num2 = array[num].n0; ulong num3 = array[num].n1; for (int num4 = 14; num4 >= 0; num4--) { array = T[num4]; num = x[num4]; num2 ^= array[num].n0; num3 ^= array[num].n1; } GcmUtilities.AsBytes(num2, num3, x); } } }