package org.bouncycastle.crypto.engines; 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.util.Pack; /* loaded from: classes6.dex */ public class ISAACEngine implements StreamCipher { private final int sizeL = 8; private final int stateArraySize = 256; private int[] engineState = null; private int[] results = null; private int a = 0; private int b = 0; private int c = 0; private int index = 0; private byte[] keyStream = new byte[1024]; private byte[] workingKey = null; private boolean initialised = false; @Override // org.bouncycastle.crypto.StreamCipher public byte returnByte(byte b) { if (this.index == 0) { isaac(); this.keyStream = Pack.intToBigEndian(this.results); } byte[] bArr = this.keyStream; int i = this.index; byte b2 = (byte) (b ^ bArr[i]); this.index = (i + 1) & 1023; return b2; } @Override // org.bouncycastle.crypto.StreamCipher public void reset() { setKey(this.workingKey); } @Override // org.bouncycastle.crypto.StreamCipher public int processBytes(byte[] bArr, int i, int i2, byte[] bArr2, int i3) { 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++) { if (this.index == 0) { isaac(); this.keyStream = Pack.intToBigEndian(this.results); } byte[] bArr3 = this.keyStream; int i5 = this.index; bArr2[i4 + i3] = (byte) (bArr3[i5] ^ bArr[i4 + i]); this.index = (i5 + 1) & 1023; } return i2; } @Override // org.bouncycastle.crypto.StreamCipher public void init(boolean z, CipherParameters cipherParameters) { if (cipherParameters instanceof KeyParameter) { setKey(((KeyParameter) cipherParameters).getKey()); } else { StringBuilder sb = new StringBuilder("invalid parameter passed to ISAAC init - "); sb.append(cipherParameters.getClass().getName()); throw new IllegalArgumentException(sb.toString()); } } @Override // org.bouncycastle.crypto.StreamCipher public String getAlgorithmName() { return "ISAAC"; } private void setKey(byte[] bArr) { this.workingKey = bArr; if (this.engineState == null) { this.engineState = new int[256]; } if (this.results == null) { this.results = new int[256]; } for (int i = 0; i < 256; i++) { int[] iArr = this.engineState; this.results[i] = 0; iArr[i] = 0; } this.c = 0; this.b = 0; this.a = 0; this.index = 0; int length = bArr.length + (bArr.length & 3); byte[] bArr2 = new byte[length]; System.arraycopy(bArr, 0, bArr2, 0, bArr.length); for (int i2 = 0; i2 < length; i2 += 4) { this.results[i2 >>> 2] = Pack.littleEndianToInt(bArr2, i2); } int[] iArr2 = new int[8]; for (int i3 = 0; i3 < 8; i3++) { iArr2[i3] = -1640531527; } for (int i4 = 0; i4 < 4; i4++) { mix(iArr2); } int i5 = 0; while (i5 < 2) { for (int i6 = 0; i6 < 256; i6 += 8) { for (int i7 = 0; i7 < 8; i7++) { iArr2[i7] = iArr2[i7] + (i5 <= 0 ? this.results[i6 + i7] : this.engineState[i6 + i7]); } mix(iArr2); for (int i8 = 0; i8 < 8; i8++) { this.engineState[i6 + i8] = iArr2[i8]; } } i5++; } isaac(); this.initialised = true; } private void mix(int[] iArr) { int i = iArr[0]; int i2 = iArr[1]; int i3 = i ^ (i2 << 11); iArr[0] = i3; int i4 = iArr[3] + i3; iArr[3] = i4; int i5 = iArr[2]; int i6 = i2 + i5; iArr[1] = i6; int i7 = i6 ^ (i5 >>> 2); iArr[1] = i7; int i8 = iArr[4] + i7; iArr[4] = i8; int i9 = i5 + i4; iArr[2] = i9; int i10 = i9 ^ (i4 << 8); iArr[2] = i10; int i11 = iArr[5] + i10; iArr[5] = i11; int i12 = i4 + i8; iArr[3] = i12; int i13 = i12 ^ (i8 >>> 16); iArr[3] = i13; int i14 = iArr[6] + i13; iArr[6] = i14; int i15 = i8 + i11; iArr[4] = i15; int i16 = (i11 << 10) ^ i15; iArr[4] = i16; int i17 = iArr[7] + i16; iArr[7] = i17; int i18 = i11 + i14; iArr[5] = i18; int i19 = (i14 >>> 4) ^ i18; iArr[5] = i19; int i20 = i3 + i19; iArr[0] = i20; int i21 = i14 + i17; iArr[6] = i21; int i22 = (i17 << 8) ^ i21; iArr[6] = i22; int i23 = i7 + i22; iArr[1] = i23; int i24 = i17 + i20; iArr[7] = i24; int i25 = (i20 >>> 9) ^ i24; iArr[7] = i25; iArr[2] = i10 + i25; iArr[0] = i20 + i23; } private void isaac() { int i; int i2; int i3 = this.b; int i4 = this.c + 1; this.c = i4; this.b = i3 + i4; for (int i5 = 0; i5 < 256; i5++) { int[] iArr = this.engineState; int i6 = iArr[i5]; int i7 = i5 & 3; if (i7 == 0) { i = this.a; i2 = i << 13; } else if (i7 == 1) { i = this.a; i2 = i >>> 6; } else if (i7 == 2) { i = this.a; i2 = i << 2; } else if (i7 == 3) { i = this.a; i2 = i >>> 16; } else { int i8 = this.a + iArr[(i5 + 128) & 255]; this.a = i8; int i9 = iArr[(i6 >>> 2) & 255] + i8 + this.b; iArr[i5] = i9; int[] iArr2 = this.results; int i10 = iArr[(i9 >>> 10) & 255] + i6; this.b = i10; iArr2[i5] = i10; } this.a = i ^ i2; int i82 = this.a + iArr[(i5 + 128) & 255]; this.a = i82; int i92 = iArr[(i6 >>> 2) & 255] + i82 + this.b; iArr[i5] = i92; int[] iArr22 = this.results; int i102 = iArr[(i92 >>> 10) & 255] + i6; this.b = i102; iArr22[i5] = i102; } } }