home *** CD-ROM | disk | FTP | other *** search
- package java.security;
-
- import java.util.Random;
-
- public class SecureRandom extends Random {
- private static SecureRandom seeder;
- private static final int DIGEST_SIZE = 20;
- private transient MessageDigest digest;
- private byte[] state;
- private byte[] remainder;
- private int remCount;
-
- public SecureRandom() {
- this(nextSeed());
- }
-
- private static synchronized byte[] nextSeed() {
- if (seeder == null) {
- seeder = new SecureRandom(getSeed(20));
- seeder.setSeed(SeedGenerator.getSystemEntropy());
- }
-
- byte[] var0 = new byte[20];
- seeder.nextBytes(var0);
- return var0;
- }
-
- public SecureRandom(byte[] var1) {
- super(0L);
-
- try {
- this.digest = MessageDigest.getInstance("SHA");
- } catch (NoSuchAlgorithmException var2) {
- throw new InternalError("internal error: SHA-1 not available.");
- }
-
- this.setSeed(var1);
- }
-
- public synchronized void setSeed(byte[] var1) {
- if (this.state != null) {
- this.digest.update(this.state);
-
- for(int var2 = 0; var2 < this.state.length; ++var2) {
- this.state[var2] = 0;
- }
- }
-
- this.state = this.digest.digest(var1);
- }
-
- public void setSeed(long var1) {
- if (var1 != 0L) {
- this.setSeed(longToByteArray(var1));
- }
-
- }
-
- private static void updateState(byte[] var0, byte[] var1) {
- int var2 = 1;
- int var3 = 0;
- byte var4 = 0;
- boolean var5 = false;
-
- for(int var6 = 0; var6 < var0.length; ++var6) {
- var3 = var0[var6] + var1[var6] + var2;
- var4 = (byte)var3;
- var5 |= var0[var6] != var4;
- var0[var6] = var4;
- var2 = var3 >> 8;
- }
-
- if (!var5) {
- ++var0[0];
- }
-
- }
-
- public synchronized void nextBytes(byte[] var1) {
- int var2 = 0;
- byte[] var4 = this.remainder;
- int var5 = this.remCount;
- if (var5 > 0) {
- int var3 = var1.length - var2 < 20 - var5 ? var1.length - var2 : 20 - var5;
-
- for(int var6 = 0; var6 < var3; ++var6) {
- var1[var6] = var4[var5];
- var4[var5++] = 0;
- }
-
- this.remCount += var3;
- var2 += var3;
- }
-
- while(var2 < var1.length) {
- this.digest.update(this.state);
- var4 = this.digest.digest();
- updateState(this.state, var4);
- int var7 = var1.length - var2 > 20 ? 20 : var1.length - var2;
-
- for(int var8 = 0; var8 < var7; ++var8) {
- var1[var2++] = var4[var8];
- var4[var8] = 0;
- }
-
- this.remCount += var7;
- }
-
- this.remainder = var4;
- this.remCount %= 20;
- }
-
- protected final int next(int var1) {
- int var2 = (var1 + 7) / 8;
- byte[] var3 = new byte[var2];
- int var4 = 0;
- this.nextBytes(var3);
-
- for(int var5 = 0; var5 < var2; ++var5) {
- var4 = (var4 << 8) + (var3[var5] & 255);
- }
-
- return var4 >>> var2 * 8 - var1;
- }
-
- public static byte[] getSeed(int var0) {
- byte[] var1 = new byte[var0];
-
- for(int var2 = 0; var2 < var0; ++var2) {
- var1[var2] = SeedGenerator.getByte();
- }
-
- return var1;
- }
-
- private static byte[] longToByteArray(long var0) {
- byte[] var2 = new byte[8];
-
- for(int var3 = 0; var3 < 8; ++var3) {
- var2[var3] = (byte)((int)var0);
- var0 >>= 8;
- }
-
- return var2;
- }
- }
-