package org.bouncycastle.crypto.engines; import com.google.common.primitives.UnsignedBytes; 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; /* loaded from: classes6.dex */ public class RC4Engine implements StreamCipher { private static final int STATE_LENGTH = 256; private byte[] engineState = null; private int x = 0; private int y = 0; private byte[] workingKey = null; @Override // org.bouncycastle.crypto.StreamCipher public byte returnByte(byte b) { int i = (this.x + 1) & 255; this.x = i; byte[] bArr = this.engineState; byte b2 = bArr[i]; int i2 = (this.y + b2) & 255; this.y = i2; bArr[i] = bArr[i2]; bArr[i2] = b2; return (byte) (b ^ bArr[(bArr[i] + b2) & 255]); } @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 (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++) { int i5 = (this.x + 1) & 255; this.x = i5; byte[] bArr3 = this.engineState; byte b = bArr3[i5]; int i6 = (this.y + b) & 255; this.y = i6; bArr3[i5] = bArr3[i6]; bArr3[i6] = b; bArr2[i4 + i3] = (byte) (bArr3[(bArr3[i5] + b) & 255] ^ bArr[i4 + i]); } return i2; } @Override // org.bouncycastle.crypto.StreamCipher public void init(boolean z, CipherParameters cipherParameters) { if (!(cipherParameters instanceof KeyParameter)) { StringBuilder sb = new StringBuilder("invalid parameter passed to RC4 init - "); sb.append(cipherParameters.getClass().getName()); throw new IllegalArgumentException(sb.toString()); } byte[] key = ((KeyParameter) cipherParameters).getKey(); this.workingKey = key; setKey(key); } @Override // org.bouncycastle.crypto.StreamCipher public String getAlgorithmName() { return "RC4"; } private void setKey(byte[] bArr) { this.workingKey = bArr; this.x = 0; this.y = 0; if (this.engineState == null) { this.engineState = new byte[256]; } for (int i = 0; i < 256; i++) { this.engineState[i] = (byte) i; } int i2 = 0; int i3 = 0; for (int i4 = 0; i4 < 256; i4++) { byte b = bArr[i2]; byte[] bArr2 = this.engineState; byte b2 = bArr2[i4]; i3 = ((b & UnsignedBytes.MAX_VALUE) + b2 + i3) & 255; bArr2[i4] = bArr2[i3]; bArr2[i3] = b2; i2 = (i2 + 1) % bArr.length; } } }