SHA1PRNG.java (ensureIsSeeded): new method used to ensure seeding has occurred and...
authorRaif S. Naffah <raif@fl.net.au>
Tue, 11 Feb 2003 00:08:32 +0000 (00:08 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Tue, 11 Feb 2003 00:08:32 +0000 (00:08 +0000)
2003-02-10  Raif S. Naffah  <raif@fl.net.au>

* gnu/java/security/provider/SHA1PRNG.java (ensureIsSeeded): new
method used to ensure seeding has occurred and that a specific
seed can be set and used.

From-SVN: r62660

libjava/ChangeLog
libjava/gnu/java/security/provider/SHA1PRNG.java

index f5ec059558f5044ec8e92878d4b54b541ae1ac2e..4dfe820cd302dd2a0ed878c43af376df7199705f 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-10  Raif S. Naffah  <raif@fl.net.au>
+
+       * gnu/java/security/provider/SHA1PRNG.java (ensureIsSeeded): new 
+       method used to ensure seeding has occurred and that a specific 
+       seed can be set and used.
+
 2003-02-10  Ranjit Mathew  <rmathew@hotmail.com>
 
        * java/lang/Win32Process.java (destroy): Declare as native.
index 669b1b55b75d4439b5ca878bf26ee5c6fdc32b79..97a8b9e34334c1c095246dded593427ddcffc1f8 100644 (file)
@@ -1,5 +1,5 @@
 /* SHA1PRNG.java --- Secure Random SPI SHA1PRNG
-   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -51,27 +51,22 @@ public class SHA1PRNG extends SecureRandomSpi implements Serializable
   byte data[];
   int seedpos;
   int datapos;
+  private boolean seeded = false; // set to true when we seed this
 
   public SHA1PRNG()
   {
     try {
       digest = MessageDigest.getInstance("SHA");
     } catch ( NoSuchAlgorithmException nsae) {
-      System.out.println("Failed to find SHA Message Digest: " + nsae);
-      nsae.printStackTrace();
+//      System.out.println("Failed to find SHA Message Digest: " + nsae);
+//      nsae.printStackTrace();
+      throw new InternalError ("no SHA implementation found");
     }
 
     seed = new byte[20];
     seedpos = 0;
     data = new byte[40];
-    datapos = 0;
-
-    new Random().nextBytes(seed);
-
-    byte digestdata[];
-    digestdata = digest.digest( data );
-    System.arraycopy( digestdata, 0, data, 0, 20);
-
+    datapos = 20;  // try to force hashing a first block
   }
 
   public void engineSetSeed(byte[] seed)
@@ -84,6 +79,7 @@ public class SHA1PRNG extends SecureRandomSpi implements Serializable
 
   public void engineNextBytes(byte[] bytes)
   {
+    ensureIsSeeded ();
     int loc = 0;
     while (loc < bytes.length)
       {
@@ -113,4 +109,18 @@ public class SHA1PRNG extends SecureRandomSpi implements Serializable
     engineNextBytes( tmp );
     return tmp;
   }
+
+  private void ensureIsSeeded()
+  {
+    if (!seeded)
+      {
+        new Random(0L).nextBytes(seed);
+
+        byte[] digestdata = digest.digest(data);
+        System.arraycopy(digestdata, 0, data, 0, 20);
+
+        seeded = true;
+      }
+  }
+
 }