home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / java / security / SecureRandom.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  1.8 KB  |  101 lines

  1. package java.security;
  2.  
  3. import java.util.Random;
  4.  
  5. public class SecureRandom extends Random {
  6.    private byte[] state;
  7.    private MessageDigest digest;
  8.    private static SecureRandom generatorGenerator;
  9.    private byte[] randomBytes;
  10.    private int randomBytesUsed;
  11.    private long counter;
  12.  
  13.    public SecureRandom() {
  14.       this(nextSeed());
  15.    }
  16.  
  17.    private static synchronized byte[] nextSeed() {
  18.       if (generatorGenerator == null) {
  19.          generatorGenerator = new SecureRandom(getSeed(20));
  20.       }
  21.  
  22.       byte[] var0 = new byte[20];
  23.       generatorGenerator.nextBytes(var0);
  24.       return var0;
  25.    }
  26.  
  27.    public SecureRandom(byte[] var1) {
  28.       super(0L);
  29.  
  30.       try {
  31.          this.digest = MessageDigest.getInstance("SHA");
  32.       } catch (NoSuchAlgorithmException var2) {
  33.          throw new InternalError("internal error: SHA-1 not available.");
  34.       }
  35.  
  36.       this.setSeed(var1);
  37.    }
  38.  
  39.    public synchronized void setSeed(byte[] var1) {
  40.       if (this.state != null) {
  41.          this.digest.update(this.state);
  42.       }
  43.  
  44.       this.state = this.digest.digest(var1);
  45.    }
  46.  
  47.    public void setSeed(long var1) {
  48.       if (var1 != 0L) {
  49.          this.setSeed(longToByteArray(var1));
  50.       }
  51.  
  52.    }
  53.  
  54.    public synchronized void nextBytes(byte[] var1) {
  55.       int var2 = var1.length;
  56.  
  57.       for(int var3 = 0; var3 < var2; var1[var3++] = this.randomBytes[this.randomBytesUsed++]) {
  58.          if (this.randomBytes == null || this.randomBytesUsed == this.randomBytes.length) {
  59.             this.digest.update(this.state);
  60.             this.randomBytes = this.digest.digest(longToByteArray((long)(this.counter++)));
  61.             this.randomBytesUsed = 0;
  62.          }
  63.       }
  64.  
  65.    }
  66.  
  67.    protected final int next(int var1) {
  68.       int var2 = (var1 + 7) / 8;
  69.       byte[] var3 = new byte[var2];
  70.       int var4 = 0;
  71.       this.nextBytes(var3);
  72.  
  73.       for(int var5 = 0; var5 < var2; ++var5) {
  74.          var4 = (var4 << 8) + (var3[var5] & 255);
  75.       }
  76.  
  77.       return var4 >>> var2 * 8 - var1;
  78.    }
  79.  
  80.    public static byte[] getSeed(int var0) {
  81.       byte[] var1 = new byte[var0];
  82.  
  83.       for(int var2 = 0; var2 < var0; ++var2) {
  84.          var1[var2] = (byte)SeedGenerator.genSeed();
  85.       }
  86.  
  87.       return var1;
  88.    }
  89.  
  90.    private static byte[] longToByteArray(long var0) {
  91.       byte[] var2 = new byte[8];
  92.  
  93.       for(int var3 = 0; var3 < 8; ++var3) {
  94.          var2[var3] = (byte)((int)var0);
  95.          var0 >>= 8;
  96.       }
  97.  
  98.       return var2;
  99.    }
  100. }
  101.