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

179 lines
6.2 KiB
Java
Raw Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.crypto.tls;
import java.util.Enumeration;
import java.util.Hashtable;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.util.Shorts;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public class DeferredHash implements TlsHandshakeHash {
protected static final int BUFFERING_HASH_LIMIT = 4;
private DigestInputBuffer buf;
protected TlsContext context;
private Hashtable hashes;
private Short prfHashAlgorithm;
@Override // org.bouncycastle.crypto.Digest
public void update(byte[] bArr, int i, int i2) {
DigestInputBuffer digestInputBuffer = this.buf;
if (digestInputBuffer != null) {
digestInputBuffer.write(bArr, i, i2);
return;
}
Enumeration elements = this.hashes.elements();
while (elements.hasMoreElements()) {
((Digest) elements.nextElement()).update(bArr, i, i2);
}
}
@Override // org.bouncycastle.crypto.Digest
public void update(byte b) {
DigestInputBuffer digestInputBuffer = this.buf;
if (digestInputBuffer != null) {
digestInputBuffer.write(b);
return;
}
Enumeration elements = this.hashes.elements();
while (elements.hasMoreElements()) {
((Digest) elements.nextElement()).update(b);
}
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public void trackHashAlgorithm(short s) {
if (this.buf == null) {
throw new IllegalStateException("Too late to track more hash algorithms");
}
checkTrackingHash(Shorts.valueOf(s));
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public TlsHandshakeHash stopTracking() {
Digest cloneHash = TlsUtils.cloneHash(this.prfHashAlgorithm.shortValue(), (Digest) this.hashes.get(this.prfHashAlgorithm));
DigestInputBuffer digestInputBuffer = this.buf;
if (digestInputBuffer != null) {
digestInputBuffer.updateDigest(cloneHash);
}
DeferredHash deferredHash = new DeferredHash(this.prfHashAlgorithm, cloneHash);
deferredHash.init(this.context);
return deferredHash;
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public void sealHashAlgorithms() {
checkStopBuffering();
}
@Override // org.bouncycastle.crypto.Digest
public void reset() {
DigestInputBuffer digestInputBuffer = this.buf;
if (digestInputBuffer != null) {
digestInputBuffer.reset();
return;
}
Enumeration elements = this.hashes.elements();
while (elements.hasMoreElements()) {
((Digest) elements.nextElement()).reset();
}
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public TlsHandshakeHash notifyPRFDetermined() {
int prfAlgorithm = this.context.getSecurityParameters().getPrfAlgorithm();
if (prfAlgorithm == 0) {
CombinedHash combinedHash = new CombinedHash();
combinedHash.init(this.context);
this.buf.updateDigest(combinedHash);
return combinedHash.notifyPRFDetermined();
}
Short valueOf = Shorts.valueOf(TlsUtils.getHashAlgorithmForPRFAlgorithm(prfAlgorithm));
this.prfHashAlgorithm = valueOf;
checkTrackingHash(valueOf);
return this;
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public void init(TlsContext tlsContext) {
this.context = tlsContext;
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public byte[] getFinalHash(short s) {
Digest digest = (Digest) this.hashes.get(Shorts.valueOf(s));
if (digest == null) {
StringBuilder sb = new StringBuilder("HashAlgorithm.");
sb.append(HashAlgorithm.getText(s));
sb.append(" is not being tracked");
throw new IllegalStateException(sb.toString());
}
Digest cloneHash = TlsUtils.cloneHash(s, digest);
DigestInputBuffer digestInputBuffer = this.buf;
if (digestInputBuffer != null) {
digestInputBuffer.updateDigest(cloneHash);
}
byte[] bArr = new byte[cloneHash.getDigestSize()];
cloneHash.doFinal(bArr, 0);
return bArr;
}
@Override // org.bouncycastle.crypto.Digest
public int getDigestSize() {
throw new IllegalStateException("Use fork() to get a definite Digest");
}
@Override // org.bouncycastle.crypto.Digest
public String getAlgorithmName() {
throw new IllegalStateException("Use fork() to get a definite Digest");
}
@Override // org.bouncycastle.crypto.tls.TlsHandshakeHash
public Digest forkPRFHash() {
checkStopBuffering();
if (this.buf == null) {
return TlsUtils.cloneHash(this.prfHashAlgorithm.shortValue(), (Digest) this.hashes.get(this.prfHashAlgorithm));
}
Digest createHash = TlsUtils.createHash(this.prfHashAlgorithm.shortValue());
this.buf.updateDigest(createHash);
return createHash;
}
@Override // org.bouncycastle.crypto.Digest
public int doFinal(byte[] bArr, int i) {
throw new IllegalStateException("Use fork() to get a definite Digest");
}
protected void checkTrackingHash(Short sh) {
if (this.hashes.containsKey(sh)) {
return;
}
this.hashes.put(sh, TlsUtils.createHash(sh.shortValue()));
}
protected void checkStopBuffering() {
if (this.buf == null || this.hashes.size() > 4) {
return;
}
Enumeration elements = this.hashes.elements();
while (elements.hasMoreElements()) {
this.buf.updateDigest((Digest) elements.nextElement());
}
this.buf = null;
}
private DeferredHash(Short sh, Digest digest) {
this.buf = null;
Hashtable hashtable = new Hashtable();
this.hashes = hashtable;
this.prfHashAlgorithm = sh;
hashtable.put(sh, digest);
}
/* JADX INFO: Access modifiers changed from: package-private */
public DeferredHash() {
this.buf = new DigestInputBuffer();
this.hashes = new Hashtable();
this.prfHashAlgorithm = null;
}
}