diff options
Diffstat (limited to 'core/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/core/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java b/core/src/main/java/org/bouncycastle/crypto/modes/gcm/BasicGCMExponentiator.java new file mode 100644 index 00000000..f2be2fc4 --- /dev/null +++ b/core/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 byte[] x; + + public void init(byte[] x) + { + this.x = Arrays.clone(x); + } + + public void exponentiateX(long pow, byte[] output) + { + // Initial value is little-endian 1 + byte[] y = GCMUtil.oneAsBytes(); + + if (pow > 0) + { + byte[] powX = Arrays.clone(x); + do + { + if ((pow & 1L) != 0) + { + GCMUtil.multiply(y, powX); + } + GCMUtil.multiply(powX, powX); + pow >>>= 1; + } + while (pow > 0); + } + + System.arraycopy(y, 0, output, 0, 16); + } +} |