diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java b/bcprov/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java new file mode 100644 index 0000000..fc25810 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java @@ -0,0 +1,36 @@ +package org.bouncycastle.crypto.modes.gcm; + +import org.bouncycastle.util.Arrays; + +public class BasicGCMExponentiator implements GCMExponentiator +{ + private int[] x; + + public void init(byte[] x) + { + this.x = GCMUtil.asInts(x); + } + + public void exponentiateX(long pow, byte[] output) + { + // Initial value is little-endian 1 + int[] y = GCMUtil.oneAsInts(); + + if (pow > 0) + { + int[] powX = Arrays.clone(x); + do + { + if ((pow & 1L) != 0) + { + GCMUtil.multiply(y, powX); + } + GCMUtil.multiply(powX, powX); + pow >>>= 1; + } + while (pow > 0); + } + + GCMUtil.asBytes(y, output); + } +} |