what-the-bank/sources/org/bouncycastle/crypto/tls/TlsAEADCipher.java

178 lines
7.0 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
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);
}
}