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; } }