home *** CD-ROM | disk | FTP | other *** search
- package java.security;
-
- import java.util.Random;
-
- public class SecureRandom extends Random {
- private byte[] state;
- private MessageDigest digest;
- private static SecureRandom generatorGenerator;
- private byte[] randomBytes;
- private int randomBytesUsed;
- private long counter;
-
- public SecureRandom() {
- this(nextSeed());
- }
-
- private static synchronized byte[] nextSeed() {
- if (generatorGenerator == null) {
- generatorGenerator = new SecureRandom(getSeed(20));
- }
-
- byte[] var0 = new byte[20];
- generatorGenerator.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);
- }
-
- this.state = this.digest.digest(var1);
- }
-
- public void setSeed(long var1) {
- if (var1 != 0L) {
- this.setSeed(longToByteArray(var1));
- }
-
- }
-
- public synchronized void nextBytes(byte[] var1) {
- int var2 = var1.length;
-
- for(int var3 = 0; var3 < var2; var1[var3++] = this.randomBytes[this.randomBytesUsed++]) {
- if (this.randomBytes == null || this.randomBytesUsed == this.randomBytes.length) {
- this.digest.update(this.state);
- this.randomBytes = this.digest.digest(longToByteArray((long)(this.counter++)));
- this.randomBytesUsed = 0;
- }
- }
-
- }
-
- 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] = (byte)SeedGenerator.genSeed();
- }
-
- 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;
- }
- }
-