package org.bouncycastle.crypto.tls; import java.io.IOException; import org.bouncycastle.crypto.modes.AEADBlockCipher; import org.bouncycastle.crypto.params.AEADParameters; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.util.Arrays; /* loaded from: classes6.dex */ public class TlsAEADCipher implements TlsCipher { static final int NONCE_DRAFT_CHACHA20_POLY1305 = 2; public static final int NONCE_RFC5288 = 1; protected TlsContext context; protected AEADBlockCipher decryptCipher; protected byte[] decryptImplicitNonce; protected AEADBlockCipher encryptCipher; protected byte[] encryptImplicitNonce; protected int macSize; protected int nonceMode; protected int record_iv_length; @Override // org.bouncycastle.crypto.tls.TlsCipher public int getPlaintextLimit(int i) { return (i - this.macSize) - this.record_iv_length; } protected byte[] getAdditionalData(long j, short s, int i) throws IOException { byte[] bArr = new byte[13]; TlsUtils.writeUint64(j, bArr, 0); TlsUtils.writeUint8(s, bArr, 8); TlsUtils.writeVersion(this.context.getServerVersion(), bArr, 9); TlsUtils.writeUint16(i, bArr, 11); return bArr; } @Override // org.bouncycastle.crypto.tls.TlsCipher public byte[] encodePlaintext(long j, short s, byte[] bArr, int i, int i2) throws IOException { byte[] bArr2 = this.encryptImplicitNonce; int length = bArr2.length + this.record_iv_length; byte[] bArr3 = new byte[length]; int i3 = this.nonceMode; if (i3 == 1) { System.arraycopy(bArr2, 0, bArr3, 0, bArr2.length); TlsUtils.writeUint64(j, bArr3, this.encryptImplicitNonce.length); } else { if (i3 != 2) { throw new TlsFatalAlert((short) 80); } TlsUtils.writeUint64(j, bArr3, length - 8); int i4 = 0; while (true) { byte[] bArr4 = this.encryptImplicitNonce; if (i4 >= bArr4.length) { break; } bArr3[i4] = (byte) (bArr4[i4] ^ bArr3[i4]); i4++; } } int outputSize = this.encryptCipher.getOutputSize(i2); int i5 = this.record_iv_length; int i6 = i5 + outputSize; byte[] bArr5 = new byte[i6]; if (i5 != 0) { System.arraycopy(bArr3, length - i5, bArr5, 0, i5); } int i7 = this.record_iv_length; try { this.encryptCipher.init(true, new AEADParameters(null, this.macSize << 3, bArr3, getAdditionalData(j, s, i2))); int processBytes = i7 + this.encryptCipher.processBytes(bArr, i, i2, bArr5, i7); if (processBytes + this.encryptCipher.doFinal(bArr5, processBytes) == i6) { return bArr5; } throw new TlsFatalAlert((short) 80); } catch (Exception e) { throw new TlsFatalAlert((short) 80, e); } } @Override // org.bouncycastle.crypto.tls.TlsCipher public byte[] decodeCiphertext(long j, short s, byte[] bArr, int i, int i2) throws IOException { if (getPlaintextLimit(i2) < 0) { throw new TlsFatalAlert((short) 50); } byte[] bArr2 = this.decryptImplicitNonce; int length = bArr2.length + this.record_iv_length; byte[] bArr3 = new byte[length]; int i3 = this.nonceMode; if (i3 == 1) { System.arraycopy(bArr2, 0, bArr3, 0, bArr2.length); int i4 = this.record_iv_length; System.arraycopy(bArr, i, bArr3, length - i4, i4); } else { if (i3 != 2) { throw new TlsFatalAlert((short) 80); } TlsUtils.writeUint64(j, bArr3, length - 8); int i5 = 0; while (true) { byte[] bArr4 = this.decryptImplicitNonce; if (i5 >= bArr4.length) { break; } bArr3[i5] = (byte) (bArr4[i5] ^ bArr3[i5]); i5++; } } int i6 = this.record_iv_length; int i7 = i2 - i6; int outputSize = this.decryptCipher.getOutputSize(i7); byte[] bArr5 = new byte[outputSize]; try { this.decryptCipher.init(false, new AEADParameters(null, this.macSize << 3, bArr3, getAdditionalData(j, s, outputSize))); int processBytes = this.decryptCipher.processBytes(bArr, i + i6, i7, bArr5, 0); if (processBytes + this.decryptCipher.doFinal(bArr5, processBytes) == outputSize) { return bArr5; } throw new TlsFatalAlert((short) 80); } catch (Exception e) { throw new TlsFatalAlert((short) 20, e); } } /* JADX INFO: Access modifiers changed from: package-private */ public TlsAEADCipher(TlsContext tlsContext, AEADBlockCipher aEADBlockCipher, AEADBlockCipher aEADBlockCipher2, int i, int i2, int i3) throws IOException { int i4; if (!TlsUtils.isTLSv12(tlsContext)) { throw new TlsFatalAlert((short) 80); } this.nonceMode = i3; if (i3 == 1) { this.record_iv_length = 8; i4 = 4; } else { if (i3 != 2) { throw new TlsFatalAlert((short) 80); } this.record_iv_length = 0; i4 = 12; } this.context = tlsContext; this.macSize = i2; int i5 = (i << 1) + (i4 << 1); byte[] calculateKeyBlock = TlsUtils.calculateKeyBlock(tlsContext, i5); KeyParameter keyParameter = new KeyParameter(calculateKeyBlock, 0, i); KeyParameter keyParameter2 = new KeyParameter(calculateKeyBlock, i, i); int i6 = i + i; int i7 = i6 + i4; byte[] copyOfRange = Arrays.copyOfRange(calculateKeyBlock, i6, i7); int i8 = i7 + i4; byte[] copyOfRange2 = Arrays.copyOfRange(calculateKeyBlock, i7, i8); if (i8 != i5) { throw new TlsFatalAlert((short) 80); } if (tlsContext.isServer()) { this.encryptCipher = aEADBlockCipher2; this.decryptCipher = aEADBlockCipher; this.encryptImplicitNonce = copyOfRange2; this.decryptImplicitNonce = copyOfRange; keyParameter2 = keyParameter; keyParameter = keyParameter2; } else { this.encryptCipher = aEADBlockCipher; this.decryptCipher = aEADBlockCipher2; this.encryptImplicitNonce = copyOfRange; this.decryptImplicitNonce = copyOfRange2; } byte[] bArr = new byte[i4 + this.record_iv_length]; int i9 = i2 << 3; this.encryptCipher.init(true, new AEADParameters(keyParameter, i9, bArr)); this.decryptCipher.init(false, new AEADParameters(keyParameter2, i9, bArr)); } public TlsAEADCipher(TlsContext tlsContext, AEADBlockCipher aEADBlockCipher, AEADBlockCipher aEADBlockCipher2, int i, int i2) throws IOException { this(tlsContext, aEADBlockCipher, aEADBlockCipher2, i, i2, 1); } }