home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD 31 / SUPERCDa.iso / Inet / HotJava / hjava.exe / Windows / resource / jre / lib / rt.jar / java / security / SecureRandom.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-11  |  2.3 KB  |  147 lines

  1. package java.security;
  2.  
  3. import java.util.Random;
  4.  
  5. public class SecureRandom extends Random {
  6.    private static SecureRandom seeder;
  7.    private static final int DIGEST_SIZE = 20;
  8.    private transient MessageDigest digest;
  9.    private byte[] state;
  10.    private byte[] remainder;
  11.    private int remCount;
  12.  
  13.    public SecureRandom() {
  14.       this(nextSeed());
  15.    }
  16.  
  17.    private static synchronized byte[] nextSeed() {
  18.       if (seeder == null) {
  19.          seeder = new SecureRandom(getSeed(20));
  20.          seeder.setSeed(SeedGenerator.getSystemEntropy());
  21.       }
  22.  
  23.       byte[] var0 = new byte[20];
  24.       seeder.nextBytes(var0);
  25.       return var0;
  26.    }
  27.  
  28.    public SecureRandom(byte[] var1) {
  29.       super(0L);
  30.  
  31.       try {
  32.          this.digest = MessageDigest.getInstance("SHA");
  33.       } catch (NoSuchAlgorithmException var2) {
  34.          throw new InternalError("internal error: SHA-1 not available.");
  35.       }
  36.  
  37.       this.setSeed(var1);
  38.    }
  39.  
  40.    public synchronized void setSeed(byte[] var1) {
  41.       if (this.state != null) {
  42.          this.digest.update(this.state);
  43.  
  44.          for(int var2 = 0; var2 < this.state.length; ++var2) {
  45.             this.state[var2] = 0;
  46.          }
  47.       }
  48.  
  49.       this.state = this.digest.digest(var1);
  50.    }
  51.  
  52.    public void setSeed(long var1) {
  53.       if (var1 != 0L) {
  54.          this.setSeed(longToByteArray(var1));
  55.       }
  56.  
  57.    }
  58.  
  59.    private static void updateState(byte[] var0, byte[] var1) {
  60.       int var2 = 1;
  61.       int var3 = 0;
  62.       byte var4 = 0;
  63.       boolean var5 = false;
  64.  
  65.       for(int var6 = 0; var6 < var0.length; ++var6) {
  66.          var3 = var0[var6] + var1[var6] + var2;
  67.          var4 = (byte)var3;
  68.          var5 |= var0[var6] != var4;
  69.          var0[var6] = var4;
  70.          var2 = var3 >> 8;
  71.       }
  72.  
  73.       if (!var5) {
  74.          ++var0[0];
  75.       }
  76.  
  77.    }
  78.  
  79.    public synchronized void nextBytes(byte[] var1) {
  80.       int var2 = 0;
  81.       byte[] var4 = this.remainder;
  82.       int var5 = this.remCount;
  83.       if (var5 > 0) {
  84.          int var3 = var1.length - var2 < 20 - var5 ? var1.length - var2 : 20 - var5;
  85.  
  86.          for(int var6 = 0; var6 < var3; ++var6) {
  87.             var1[var6] = var4[var5];
  88.             var4[var5++] = 0;
  89.          }
  90.  
  91.          this.remCount += var3;
  92.          var2 += var3;
  93.       }
  94.  
  95.       while(var2 < var1.length) {
  96.          this.digest.update(this.state);
  97.          var4 = this.digest.digest();
  98.          updateState(this.state, var4);
  99.          int var7 = var1.length - var2 > 20 ? 20 : var1.length - var2;
  100.  
  101.          for(int var8 = 0; var8 < var7; ++var8) {
  102.             var1[var2++] = var4[var8];
  103.             var4[var8] = 0;
  104.          }
  105.  
  106.          this.remCount += var7;
  107.       }
  108.  
  109.       this.remainder = var4;
  110.       this.remCount %= 20;
  111.    }
  112.  
  113.    protected final int next(int var1) {
  114.       int var2 = (var1 + 7) / 8;
  115.       byte[] var3 = new byte[var2];
  116.       int var4 = 0;
  117.       this.nextBytes(var3);
  118.  
  119.       for(int var5 = 0; var5 < var2; ++var5) {
  120.          var4 = (var4 << 8) + (var3[var5] & 255);
  121.       }
  122.  
  123.       return var4 >>> var2 * 8 - var1;
  124.    }
  125.  
  126.    public static byte[] getSeed(int var0) {
  127.       byte[] var1 = new byte[var0];
  128.  
  129.       for(int var2 = 0; var2 < var0; ++var2) {
  130.          var1[var2] = SeedGenerator.getByte();
  131.       }
  132.  
  133.       return var1;
  134.    }
  135.  
  136.    private static byte[] longToByteArray(long var0) {
  137.       byte[] var2 = new byte[8];
  138.  
  139.       for(int var3 = 0; var3 < 8; ++var3) {
  140.          var2[var3] = (byte)((int)var0);
  141.          var0 >>= 8;
  142.       }
  143.  
  144.       return var2;
  145.    }
  146. }
  147.