what-the-bank/sources/org/bouncycastle/crypto/engines/HC128Engine.java

197 lines
6.3 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.crypto.engines;
import com.google.common.primitives.UnsignedBytes;
import io.flutter.plugin.platform.PlatformPlugin;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.OutputLengthException;
import org.bouncycastle.crypto.StreamCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
/* loaded from: classes6.dex */
public class HC128Engine implements StreamCipher {
private boolean initialised;
private byte[] iv;
private byte[] key;
private int[] p = new int[512];
private int[] q = new int[512];
private int cnt = 0;
private byte[] buf = new byte[4];
private int idx = 0;
private static int mod1024(int i) {
return i & 1023;
}
private static int mod512(int i) {
return i & 511;
}
private static int rotateLeft(int i, int i2) {
return (i << i2) | (i >>> (-i2));
}
private static int rotateRight(int i, int i2) {
return (i >>> i2) | (i << (-i2));
}
@Override // org.bouncycastle.crypto.StreamCipher
public byte returnByte(byte b) {
return (byte) (b ^ getByte());
}
@Override // org.bouncycastle.crypto.StreamCipher
public void reset() {
init();
}
@Override // org.bouncycastle.crypto.StreamCipher
public int processBytes(byte[] bArr, int i, int i2, byte[] bArr2, int i3) throws DataLengthException {
if (!this.initialised) {
StringBuilder sb = new StringBuilder();
sb.append(getAlgorithmName());
sb.append(" not initialised");
throw new IllegalStateException(sb.toString());
}
if (i + i2 > bArr.length) {
throw new DataLengthException("input buffer too short");
}
if (i3 + i2 > bArr2.length) {
throw new OutputLengthException("output buffer too short");
}
for (int i4 = 0; i4 < i2; i4++) {
bArr2[i3 + i4] = (byte) (bArr[i + i4] ^ getByte());
}
return i2;
}
@Override // org.bouncycastle.crypto.StreamCipher
public void init(boolean z, CipherParameters cipherParameters) throws IllegalArgumentException {
CipherParameters cipherParameters2;
if (cipherParameters instanceof ParametersWithIV) {
ParametersWithIV parametersWithIV = (ParametersWithIV) cipherParameters;
this.iv = parametersWithIV.getIV();
cipherParameters2 = parametersWithIV.getParameters();
} else {
this.iv = new byte[0];
cipherParameters2 = cipherParameters;
}
if (!(cipherParameters2 instanceof KeyParameter)) {
StringBuilder sb = new StringBuilder("Invalid parameter passed to HC128 init - ");
sb.append(cipherParameters.getClass().getName());
throw new IllegalArgumentException(sb.toString());
}
this.key = ((KeyParameter) cipherParameters2).getKey();
init();
this.initialised = true;
}
@Override // org.bouncycastle.crypto.StreamCipher
public String getAlgorithmName() {
return "HC-128";
}
private int step() {
int h2;
int i;
int mod512 = mod512(this.cnt);
if (this.cnt < 512) {
int[] iArr = this.p;
iArr[mod512] = iArr[mod512] + g1(iArr[dim(mod512, 3)], this.p[dim(mod512, 10)], this.p[dim(mod512, 511)]);
h2 = h1(this.p[dim(mod512, 12)]);
i = this.p[mod512];
} else {
int[] iArr2 = this.q;
iArr2[mod512] = iArr2[mod512] + g2(iArr2[dim(mod512, 3)], this.q[dim(mod512, 10)], this.q[dim(mod512, 511)]);
h2 = h2(this.q[dim(mod512, 12)]);
i = this.q[mod512];
}
this.cnt = mod1024(this.cnt + 1);
return i ^ h2;
}
private void init() {
if (this.key.length != 16) {
throw new IllegalArgumentException("The key must be 128 bits long");
}
this.idx = 0;
this.cnt = 0;
int[] iArr = new int[PlatformPlugin.DEFAULT_SYSTEM_UI];
for (int i = 0; i < 16; i++) {
int i2 = i >> 2;
iArr[i2] = iArr[i2] | ((this.key[i] & UnsignedBytes.MAX_VALUE) << ((i & 3) << 3));
}
System.arraycopy(iArr, 0, iArr, 4, 4);
int i3 = 0;
while (true) {
byte[] bArr = this.iv;
if (i3 >= bArr.length || i3 >= 16) {
break;
}
int i4 = (i3 >> 2) + 8;
iArr[i4] = ((bArr[i3] & UnsignedBytes.MAX_VALUE) << ((i3 & 3) << 3)) | iArr[i4];
i3++;
}
System.arraycopy(iArr, 8, iArr, 12, 4);
for (int i5 = 16; i5 < 1280; i5++) {
iArr[i5] = f2(iArr[i5 - 2]) + iArr[i5 - 7] + f1(iArr[i5 - 15]) + iArr[i5 - 16] + i5;
}
System.arraycopy(iArr, 256, this.p, 0, 512);
System.arraycopy(iArr, 768, this.q, 0, 512);
for (int i6 = 0; i6 < 512; i6++) {
this.p[i6] = step();
}
for (int i7 = 0; i7 < 512; i7++) {
this.q[i7] = step();
}
this.cnt = 0;
}
private int h2(int i) {
int[] iArr = this.p;
return iArr[i & 255] + iArr[((i >> 16) & 255) + 256];
}
private int h1(int i) {
int[] iArr = this.q;
return iArr[i & 255] + iArr[((i >> 16) & 255) + 256];
}
private byte getByte() {
if (this.idx == 0) {
int step = step();
byte[] bArr = this.buf;
bArr[0] = (byte) step;
bArr[1] = (byte) (step >> 8);
bArr[2] = (byte) (step >> 16);
bArr[3] = (byte) (step >>> 24);
}
byte[] bArr2 = this.buf;
int i = this.idx;
byte b = bArr2[i];
this.idx = (i + 1) & 3;
return b;
}
private int g2(int i, int i2, int i3) {
return (rotateLeft(i, 10) ^ rotateLeft(i3, 23)) + rotateLeft(i2, 8);
}
private int g1(int i, int i2, int i3) {
return (rotateRight(i, 10) ^ rotateRight(i3, 23)) + rotateRight(i2, 8);
}
private static int f2(int i) {
return (rotateRight(i, 19) ^ rotateRight(i, 17)) ^ (i >>> 10);
}
private static int f1(int i) {
return (rotateRight(i, 18) ^ rotateRight(i, 7)) ^ (i >>> 3);
}
private static int dim(int i, int i2) {
return mod512(i - i2);
}
}