SHA1PRNG.java (engineNextBytes): Rewrote.
authorTom Tromey <tromey@redhat.com>
Thu, 18 Oct 2001 00:05:29 +0000 (00:05 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 18 Oct 2001 00:05:29 +0000 (00:05 +0000)
* gnu/java/security/provider/SHA1PRNG.java (engineNextBytes):
Rewrote.
* java/security/SecureRandom.java (setSeed(long)): Don't set seed
if secureRandomSpi is not initialized.

From-SVN: r46327

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

index c5df7a24809c7a48288e0768c2a7fe4171854e44..629b3a830b00378d57344063e9a7406f1483ceb0 100644 (file)
@@ -1,5 +1,10 @@
 2001-10-17  Tom Tromey  <tromey@redhat.com>
 
+       * gnu/java/security/provider/SHA1PRNG.java (engineNextBytes):
+       Rewrote.
+       * java/security/SecureRandom.java (setSeed(long)): Don't set seed
+       if secureRandomSpi is not initialized.
+
        * Makefile.in: Rebuilt.
        * Makefile.am (secdir): New macro.
        (install-data-local): Install new data files.
index bb34ef0f189f43181b4911d397e93665eef2d6e1..c5d31be7478ec089e78a56fa4a8d23ace59bb2a0 100644 (file)
@@ -1,5 +1,5 @@
 /* SHA1PRNG.java --- Secure Random SPI SHA1PRNG
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -73,29 +73,26 @@ public class SHA1PRNG extends SecureRandomSpi implements Serializable
 
   public void engineNextBytes(byte[] bytes)
   {
-
-    if( bytes.length < (20 - datapos) ) {
-      System.arraycopy( data, datapos, bytes, 0, bytes.length);
-      datapos += bytes.length;
-      return;
-    }
-
-    int i, blen = bytes.length, bpos = 0;
-    byte digestdata[];
-    while( bpos < blen ) {
-      i = 20 - datapos;
-      System.arraycopy( data, datapos, bytes, bpos, i);
-      bpos += i;
-      datapos += i;
-      if( datapos >= 20) {
-       //System.out.println( (0 + 20) + "\n" + (20 + 20) );
-       System.arraycopy( seed, 0, data, 20, 20);
-       digestdata = digest.digest( data );
-       System.arraycopy( digestdata, 0, data, 0, 20);
-       datapos = 0;
+    int loc = 0;
+    while (loc < bytes.length)
+      {
+       int copy = Math.min (bytes.length - loc, 20 - datapos);
+
+       if (copy > 0)
+         {
+           System.arraycopy (data, datapos, bytes, loc, copy);
+           datapos += copy;
+           loc += copy;
+         }
+       else
+         {
+           // No data ready for copying, so refill our buffer.
+           System.arraycopy( seed, 0, data, 20, 20);
+           byte[] digestdata = digest.digest( data );
+           System.arraycopy( digestdata, 0, data, 0, 20);
+           datapos = 0;
+         }
       }
-    }
-
   }
 
   public byte[] engineGenerateSeed(int numBytes)
index 39a39474fd5f14b6f83d4b2080340c3212380273..597d077993bb797b5563ea6ca94d2a76ad1a6413 100644 (file)
@@ -1,5 +1,5 @@
 /* SecureRandom.java --- Secure Random class implmentation
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -52,7 +52,7 @@ public class SecureRandom extends Random
      new SecureRandom by instantating the first SecureRandom 
      algorithm in the default security provier. 
 
-     It is not seeded and should be seeded using setseed or else
+     It is not seeded and should be seeded using setSeed or else
      on the first call to getnextBytes it will force a seed.
 
      It is maintained for backwards compatability and programs
@@ -267,12 +267,24 @@ public class SecureRandom extends Random
    */
   public void setSeed(long seed)
   {
-    byte tmp[] = { (byte) (0xff & (seed >> 56)), (byte) (0xff & (seed >> 48)),
-      (byte) (0xff & (seed >> 40)), (byte) (0xff & (seed >> 32)),
-      (byte) (0xff & (seed >> 24)), (byte) (0xff & (seed >> 16)),
-      (byte) (0xff & (seed >> 8)), (byte) (0xff & seed)
-    };
-    secureRandomSpi.engineSetSeed(tmp);
+    // This particular setSeed will be called by Random.Random(), via
+    // our own constructor, before secureRandomSpi is initialized.  In
+    // this case we can't call a method on secureRandomSpi, and we
+    // definitely don't want to throw a NullPointerException.
+    // Therefore we test.
+    if (secureRandomSpi != null)
+      {
+        byte tmp[] = { (byte) (0xff & (seed >> 56)),
+                      (byte) (0xff & (seed >> 48)),
+                      (byte) (0xff & (seed >> 40)),
+                      (byte) (0xff & (seed >> 32)),
+                      (byte) (0xff & (seed >> 24)),
+                      (byte) (0xff & (seed >> 16)),
+                      (byte) (0xff & (seed >> 8)),
+                      (byte) (0xff & seed)
+       };
+       secureRandomSpi.engineSetSeed(tmp);
+      }
   }
 
   /**