96 lines
2.6 KiB
Java
96 lines
2.6 KiB
Java
|
package org.bouncycastle.crypto.prng;
|
||
|
|
||
|
import org.bouncycastle.crypto.Digest;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class DigestRandomGenerator implements RandomGenerator {
|
||
|
private static long CYCLE_COUNT = 10;
|
||
|
private Digest digest;
|
||
|
private byte[] seed;
|
||
|
private byte[] state;
|
||
|
private long seedCounter = 1;
|
||
|
private long stateCounter = 1;
|
||
|
|
||
|
@Override // org.bouncycastle.crypto.prng.RandomGenerator
|
||
|
public void nextBytes(byte[] bArr, int i, int i2) {
|
||
|
synchronized (this) {
|
||
|
generateState();
|
||
|
int i3 = i;
|
||
|
int i4 = 0;
|
||
|
while (i3 != i2 + i) {
|
||
|
if (i4 == this.state.length) {
|
||
|
generateState();
|
||
|
i4 = 0;
|
||
|
}
|
||
|
bArr[i3] = this.state[i4];
|
||
|
i3++;
|
||
|
i4++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.crypto.prng.RandomGenerator
|
||
|
public void nextBytes(byte[] bArr) {
|
||
|
nextBytes(bArr, 0, bArr.length);
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.crypto.prng.RandomGenerator
|
||
|
public void addSeedMaterial(byte[] bArr) {
|
||
|
synchronized (this) {
|
||
|
digestUpdate(bArr);
|
||
|
digestUpdate(this.seed);
|
||
|
digestDoFinal(this.seed);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.crypto.prng.RandomGenerator
|
||
|
public void addSeedMaterial(long j) {
|
||
|
synchronized (this) {
|
||
|
digestAddCounter(j);
|
||
|
digestUpdate(this.seed);
|
||
|
digestDoFinal(this.seed);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void generateState() {
|
||
|
long j = this.stateCounter;
|
||
|
this.stateCounter = 1 + j;
|
||
|
digestAddCounter(j);
|
||
|
digestUpdate(this.state);
|
||
|
digestUpdate(this.seed);
|
||
|
digestDoFinal(this.state);
|
||
|
if (this.stateCounter % CYCLE_COUNT == 0) {
|
||
|
cycleSeed();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void digestUpdate(byte[] bArr) {
|
||
|
this.digest.update(bArr, 0, bArr.length);
|
||
|
}
|
||
|
|
||
|
private void digestDoFinal(byte[] bArr) {
|
||
|
this.digest.doFinal(bArr, 0);
|
||
|
}
|
||
|
|
||
|
private void digestAddCounter(long j) {
|
||
|
for (int i = 0; i != 8; i++) {
|
||
|
this.digest.update((byte) j);
|
||
|
j >>>= 8;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void cycleSeed() {
|
||
|
digestUpdate(this.seed);
|
||
|
long j = this.seedCounter;
|
||
|
this.seedCounter = 1 + j;
|
||
|
digestAddCounter(j);
|
||
|
digestDoFinal(this.seed);
|
||
|
}
|
||
|
|
||
|
public DigestRandomGenerator(Digest digest) {
|
||
|
this.digest = digest;
|
||
|
this.seed = new byte[digest.getDigestSize()];
|
||
|
this.state = new byte[digest.getDigestSize()];
|
||
|
}
|
||
|
}
|