what-the-bank/sources/org/bouncycastle/crypto/modes/gcm/GCMUtil.java

290 lines
8.0 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.crypto.modes.gcm;
import org.bouncycastle.util.Pack;
/* loaded from: classes6.dex */
public abstract class GCMUtil {
private static final int E1 = -520093696;
private static final long E1L = -2233785415175766016L;
private static final int[] LOOKUP = generateLookup();
public static void xor(long[] jArr, long[] jArr2, long[] jArr3) {
jArr3[0] = jArr[0] ^ jArr2[0];
jArr3[1] = jArr2[1] ^ jArr[1];
}
public static void xor(long[] jArr, long[] jArr2) {
jArr[0] = jArr[0] ^ jArr2[0];
jArr[1] = jArr[1] ^ jArr2[1];
}
public static void xor(int[] iArr, int[] iArr2, int[] iArr3) {
iArr3[0] = iArr[0] ^ iArr2[0];
iArr3[1] = iArr[1] ^ iArr2[1];
iArr3[2] = iArr[2] ^ iArr2[2];
iArr3[3] = iArr[3] ^ iArr2[3];
}
public static void xor(int[] iArr, int[] iArr2) {
iArr[0] = iArr[0] ^ iArr2[0];
iArr[1] = iArr[1] ^ iArr2[1];
iArr[2] = iArr[2] ^ iArr2[2];
iArr[3] = iArr2[3] ^ iArr[3];
}
public static void xor(byte[] bArr, byte[] bArr2, byte[] bArr3) {
int i = 0;
do {
bArr3[i] = (byte) (bArr[i] ^ bArr2[i]);
int i2 = i + 1;
bArr3[i2] = (byte) (bArr[i2] ^ bArr2[i2]);
int i3 = i + 2;
bArr3[i3] = (byte) (bArr[i3] ^ bArr2[i3]);
int i4 = i + 3;
bArr3[i4] = (byte) (bArr[i4] ^ bArr2[i4]);
i += 4;
} while (i < 16);
}
public static void xor(byte[] bArr, byte[] bArr2, int i, int i2) {
while (true) {
i2--;
if (i2 < 0) {
return;
} else {
bArr[i2] = (byte) (bArr[i2] ^ bArr2[i + i2]);
}
}
}
public static void xor(byte[] bArr, byte[] bArr2) {
int i = 0;
do {
bArr[i] = (byte) (bArr[i] ^ bArr2[i]);
int i2 = i + 1;
bArr[i2] = (byte) (bArr[i2] ^ bArr2[i2]);
int i3 = i + 2;
bArr[i3] = (byte) (bArr[i3] ^ bArr2[i3]);
int i4 = i + 3;
bArr[i4] = (byte) (bArr[i4] ^ bArr2[i4]);
i += 4;
} while (i < 16);
}
static int shiftRightN(int[] iArr, int i, int[] iArr2) {
int i2 = iArr[0];
int i3 = 32 - i;
iArr2[0] = i2 >>> i;
int i4 = iArr[1];
iArr2[1] = (i2 << i3) | (i4 >>> i);
int i5 = iArr[2];
iArr2[2] = (i4 << i3) | (i5 >>> i);
int i6 = iArr[3];
iArr2[3] = (i6 >>> i) | (i5 << i3);
return i6 << i3;
}
static int shiftRightN(int[] iArr, int i) {
int i2 = iArr[0];
int i3 = 32 - i;
iArr[0] = i2 >>> i;
int i4 = iArr[1];
iArr[1] = (i2 << i3) | (i4 >>> i);
int i5 = iArr[2];
iArr[2] = (i4 << i3) | (i5 >>> i);
int i6 = iArr[3];
iArr[3] = (i6 >>> i) | (i5 << i3);
return i6 << i3;
}
static long shiftRight(long[] jArr, long[] jArr2) {
long j = jArr[0];
jArr2[0] = j >>> 1;
long j2 = jArr[1];
jArr2[1] = (j << 63) | (j2 >>> 1);
return j2 << 63;
}
static long shiftRight(long[] jArr) {
long j = jArr[0];
jArr[0] = j >>> 1;
long j2 = jArr[1];
jArr[1] = (j << 63) | (j2 >>> 1);
return j2 << 63;
}
static int shiftRight(int[] iArr, int[] iArr2) {
int i = iArr[0];
iArr2[0] = i >>> 1;
int i2 = iArr[1];
iArr2[1] = (i << 31) | (i2 >>> 1);
int i3 = iArr[2];
iArr2[2] = (i2 << 31) | (i3 >>> 1);
int i4 = iArr[3];
iArr2[3] = (i3 << 31) | (i4 >>> 1);
return i4 << 31;
}
static int shiftRight(int[] iArr) {
int i = iArr[0];
iArr[0] = i >>> 1;
int i2 = iArr[1];
iArr[1] = (i << 31) | (i2 >>> 1);
int i3 = iArr[2];
iArr[2] = (i2 << 31) | (i3 >>> 1);
int i4 = iArr[3];
iArr[3] = (i3 << 31) | (i4 >>> 1);
return i4 << 31;
}
public static long[] oneAsLongs() {
return new long[]{Long.MIN_VALUE};
}
public static int[] oneAsInts() {
int[] iArr = new int[4];
iArr[0] = Integer.MIN_VALUE;
return iArr;
}
public static byte[] oneAsBytes() {
byte[] bArr = new byte[16];
bArr[0] = Byte.MIN_VALUE;
return bArr;
}
public static void multiplyP8(int[] iArr, int[] iArr2) {
int shiftRightN = shiftRightN(iArr, 8, iArr2);
iArr2[0] = LOOKUP[shiftRightN >>> 24] ^ iArr2[0];
}
public static void multiplyP8(int[] iArr) {
int shiftRightN = shiftRightN(iArr, 8);
iArr[0] = LOOKUP[shiftRightN >>> 24] ^ iArr[0];
}
public static void multiplyP(int[] iArr, int[] iArr2) {
iArr2[0] = ((shiftRight(iArr, iArr2) >> 8) & E1) ^ iArr2[0];
}
public static void multiplyP(int[] iArr) {
iArr[0] = ((shiftRight(iArr) >> 8) & E1) ^ iArr[0];
}
public static void multiply(long[] jArr, long[] jArr2) {
long j = jArr[0];
long j2 = jArr[1];
long j3 = 0;
long j4 = 0;
for (int i = 0; i < 2; i++) {
long j5 = jArr2[i];
int i2 = 0;
while (i2 < 64) {
long j6 = j5 >> 63;
j5 <<= 1;
j3 ^= j & j6;
j4 ^= j6 & j2;
long j7 = (j2 >>> 1) | (j << 63);
j = (j >>> 1) ^ (((j2 << 63) >> 8) & E1L);
i2++;
j2 = j7;
}
}
jArr[0] = j3;
jArr[1] = j4;
}
public static void multiply(int[] iArr, int[] iArr2) {
int i = iArr[0];
int i2 = iArr[1];
int i3 = iArr[2];
int i4 = iArr[3];
int i5 = 0;
int i6 = 0;
int i7 = 0;
int i8 = 0;
for (int i9 = 0; i9 < 4; i9++) {
int i10 = iArr2[i9];
int i11 = 0;
while (i11 < 32) {
int i12 = i10 >> 31;
i10 <<= 1;
i5 ^= i & i12;
i6 ^= i2 & i12;
i7 ^= i3 & i12;
i8 ^= i12 & i4;
int i13 = (i4 >>> 1) | (i3 << 31);
i3 = (i3 >>> 1) | (i2 << 31);
i2 = (i2 >>> 1) | (i << 31);
i = (i >>> 1) ^ (((i4 << 31) >> 8) & E1);
i11++;
i4 = i13;
}
}
iArr[0] = i5;
iArr[1] = i6;
iArr[2] = i7;
iArr[3] = i8;
}
public static void multiply(byte[] bArr, byte[] bArr2) {
int[] asInts = asInts(bArr);
multiply(asInts, asInts(bArr2));
asBytes(asInts, bArr);
}
private static int[] generateLookup() {
int[] iArr = new int[256];
for (int i = 0; i < 256; i++) {
int i2 = 0;
for (int i3 = 7; i3 >= 0; i3--) {
if (((1 << i3) & i) != 0) {
i2 ^= E1 >>> (7 - i3);
}
}
iArr[i] = i2;
}
return iArr;
}
public static long[] asLongs(byte[] bArr) {
long[] jArr = new long[2];
Pack.bigEndianToLong(bArr, 0, jArr);
return jArr;
}
public static void asLongs(byte[] bArr, long[] jArr) {
Pack.bigEndianToLong(bArr, 0, jArr);
}
public static int[] asInts(byte[] bArr) {
int[] iArr = new int[4];
Pack.bigEndianToInt(bArr, 0, iArr);
return iArr;
}
public static void asInts(byte[] bArr, int[] iArr) {
Pack.bigEndianToInt(bArr, 0, iArr);
}
public static byte[] asBytes(long[] jArr) {
byte[] bArr = new byte[16];
Pack.longToBigEndian(jArr, bArr, 0);
return bArr;
}
public static byte[] asBytes(int[] iArr) {
byte[] bArr = new byte[16];
Pack.intToBigEndian(iArr, bArr, 0);
return bArr;
}
public static void asBytes(long[] jArr, byte[] bArr) {
Pack.longToBigEndian(jArr, bArr, 0);
}
public static void asBytes(int[] iArr, byte[] bArr) {
Pack.intToBigEndian(iArr, bArr, 0);
}
}