| 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); |
| } |
| } |