org.spongycastle.crypto.modes.gcm.Tables1kGCMExponentiator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scprov-jdk15 Show documentation
Show all versions of scprov-jdk15 Show documentation
Spongy Castle is a package-rename (org.bouncycastle.* to org.spongycastle.*) of Bouncy Castle intended for Android.
Android ships with a stripped-down version of Bouncy Castle - this causes classloader collisions if you try to add
an alternative (updated/complete) Bouncy Castle jar.
This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK 1.5.
package org.spongycastle.crypto.modes.gcm;
import org.spongycastle.util.Arrays;
public class Tables1kGCMExponentiator implements GCMExponentiator
{
// A lookup table of the power-of-two powers of 'x'
byte[][] lookupPowX2 = new byte[64][];
public void init(byte[] x)
{
// Initial value is little-endian 1
lookupPowX2[0] = new byte[16];
lookupPowX2[0][0] = (byte)0x80;
lookupPowX2[1] = Arrays.clone(x);
for (int i = 2; i != 64; ++i)
{
byte[] tmp = Arrays.clone(lookupPowX2[i - 1]);
GCMUtil.multiply(tmp, tmp);
lookupPowX2[i] = tmp;
}
}
public void exponentiateX(long pow, byte[] output)
{
// Initial value is little-endian 1
byte[] y = GCMUtil.oneAsBytes();
int powX2 = 1;
while (pow > 0)
{
if ((pow & 1L) != 0)
{
GCMUtil.multiply(y, lookupPowX2[powX2]);
}
++powX2;
pow >>>= 1;
}
System.arraycopy(y, 0, output, 0, 16);
}
}