Further GCM updates
1 files changed, 11 insertions, 9 deletions
diff --git a/crypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs b/crypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs
index 3667241e3..4a15712c2 100644
--- a/crypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs
+++ b/crypto/src/crypto/modes/gcm/Tables1kGcmExponentiator.cs
@@ -14,8 +14,9 @@ namespace Org.BouncyCastle.Crypto.Modes.Gcm
public void Init(byte[] x)
{
- ulong[] y = GcmUtilities.AsUlongs(x);
- if (lookupPowX2 != null && Arrays.AreEqual(y, (ulong[])lookupPowX2[0]))
+ GcmUtilities.FieldElement y;
+ GcmUtilities.AsFieldElement(x, out y);
+ if (lookupPowX2 != null && y.Equals(lookupPowX2[0]))
return;
lookupPowX2 = Platform.CreateArrayList(8);
@@ -24,20 +25,22 @@ namespace Org.BouncyCastle.Crypto.Modes.Gcm
public void ExponentiateX(long pow, byte[] output)
{
- ulong[] y = GcmUtilities.OneAsUlongs();
+ GcmUtilities.FieldElement y;
+ GcmUtilities.One(out y);
int bit = 0;
while (pow > 0)
{
if ((pow & 1L) != 0)
{
EnsureAvailable(bit);
- GcmUtilities.Multiply(y, (ulong[])lookupPowX2[bit]);
+ GcmUtilities.FieldElement powX2 = (GcmUtilities.FieldElement)lookupPowX2[bit];
+ GcmUtilities.Multiply(ref y, ref powX2);
}
++bit;
pow >>= 1;
}
- GcmUtilities.AsBytes(y, output);
+ GcmUtilities.AsBytes(ref y, output);
}
private void EnsureAvailable(int bit)
@@ -45,12 +48,11 @@ namespace Org.BouncyCastle.Crypto.Modes.Gcm
int count = lookupPowX2.Count;
if (count <= bit)
{
- ulong[] tmp = (ulong[])lookupPowX2[count - 1];
+ GcmUtilities.FieldElement powX2 = (GcmUtilities.FieldElement)lookupPowX2[count - 1];
do
{
- tmp = Arrays.Clone(tmp);
- GcmUtilities.Square(tmp, tmp);
- lookupPowX2.Add(tmp);
+ GcmUtilities.Square(ref powX2);
+ lookupPowX2.Add(powX2);
}
while (++count <= bit);
}
|