summaryrefslogtreecommitdiff
path: root/gnu/java/security/util/PRNG.java
diff options
context:
space:
mode:
authorRaif S. Naffah <raif@swiftdsl.com.au>2006-02-03 19:29:01 +0000
committerRaif S. Naffah <raif@swiftdsl.com.au>2006-02-03 19:29:01 +0000
commit26b3dd7cbd3baab718057f9d43ca0746881ff992 (patch)
treee09d6d14a90e308104e350f658e39f05ca89e5d9 /gnu/java/security/util/PRNG.java
parent3b6b455e9a7760a1f6fff0099ab9191c31fe13c8 (diff)
downloadclasspath-26b3dd7cbd3baab718057f9d43ca0746881ff992.tar.gz
2006-02-04 Raif S. Naffah <raif@swiftdsl.com.au>
        * gnu/javax/crypto/sasl/srp/SRPServer.java (prng): New field.         (getDefaultPRNG): New method.         (parseO): Use method above.         * gnu/javax/crypto/sasl/srp/SRPClient.java (prng): New field.         (getDefaultPRNG): New method.         (createO): Use method above.         * gnu/javax/crypto/sasl/srp/KDF.java (prng): New class field.         (nextByte): Use above field.         * gnu/javax/crypto/pad/PKCS1_V1_5.java (selfTest): Use PRNG instance.         * gnu/java/security/sig/rsa/RSA.java: New class field.         (newR): Use above field         * gnu/java/security/sig/rsa/EME_PKCS1_V1_5.java (prng): New field.         (encode): Use field.above.         * gnu/java/security/key/dss/FIPS186.java (prng): New field.         (getDefaultPRNG): new method.         (nextRandomBytes): Use above method.         * gnu/java/security/key/rsa/RSAKeyPairGenerator.java: Likewise.         * gnu/java/security/sig/BaseSignature.java: Likewise.         * gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java: Likewise.         * gnu/javax/crypto/key/dh/RFC2631.java: Likewise.         * gnu/javax/crypto/key/srp6/SRPKeyPairGenerator.java: Likewise.         * gnu/javax/crypto/key/BaseKeyAgreementParty.java: Likewise.         * gnu/java/security/key/dss/DSSKeyPairGenerator.java (prng): New field.         (getDefaultPRNG): new method.         (nextRandomBytes): Use above method.         (STRICT_DEFAULTS): new class field.         (USE_DEFAULTS): more documentation to clarify behavior.         (setup): amended to handle new attribute. * gnu/java/security/util/PRNG.java: New file.
Diffstat (limited to 'gnu/java/security/util/PRNG.java')
-rw-r--r--gnu/java/security/util/PRNG.java156
1 files changed, 156 insertions, 0 deletions
diff --git a/gnu/java/security/util/PRNG.java b/gnu/java/security/util/PRNG.java
new file mode 100644
index 000000000..138cc6bcb
--- /dev/null
+++ b/gnu/java/security/util/PRNG.java
@@ -0,0 +1,156 @@
+/* PRNG.java -- A Utility methods for default source of randomness
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.security.util;
+
+import java.util.HashMap;
+
+import gnu.java.security.prng.IRandom;
+import gnu.java.security.prng.LimitReachedException;
+import gnu.java.security.prng.MDGenerator;
+
+/**
+ * A useful hash-based (SHA) pseudo-random number generator used
+ * throughout this library.
+ *
+ * @see MDGenerator
+ */
+public class PRNG
+{
+ // Constans and fields
+ // --------------------------------------------------------------------------
+
+ /** The underlying {@link IRandom}. */
+ private IRandom delegate;
+
+ // Constructor(s)
+ // --------------------------------------------------------------------------
+
+ /**
+ * Private constructor to enforce using the Factory method.
+ *
+ * @param delegate
+ * the undelying {@link IRandom} object used.
+ */
+ private PRNG(IRandom delegate)
+ {
+ super();
+
+ this.delegate = delegate;
+ }
+
+ // Class methods
+ // --------------------------------------------------------------------------
+
+ public static final PRNG getInstance()
+ {
+ IRandom delegate = new MDGenerator();
+ try
+ {
+ HashMap map = new HashMap();
+ // initialise it with a seed
+ long t = System.currentTimeMillis();
+ byte[] seed = new byte[] {
+ (byte) (t >>> 56), (byte) (t >>> 48),
+ (byte) (t >>> 40), (byte) (t >>> 32),
+ (byte) (t >>> 24), (byte) (t >>> 16),
+ (byte) (t >>> 8), (byte) t};
+ map.put(MDGenerator.SEEED, seed);
+ delegate.init(map); // default is to use SHA-1 hash
+ }
+ catch (Exception x)
+ {
+ throw new ExceptionInInitializerError(x);
+ }
+
+ return new PRNG(delegate);
+ }
+
+ // Instance methods
+ // --------------------------------------------------------------------------
+
+ /**
+ * Completely fills the designated <code>buffer</code> with random data
+ * generated by the underlying delegate.
+ *
+ * @param buffer
+ * the place holder of random bytes generated by the underlying
+ * delegate. On output, the contents of <code>buffer</code> are
+ * replaced with pseudo-random data, iff the <code>buffer</code>
+ * size is not zero.
+ */
+ public void nextBytes(byte[] buffer)
+ {
+ nextBytes(buffer, 0, buffer.length);
+ }
+
+ /**
+ * Fills the designated <code>buffer</code>, starting from byte at position
+ * <code>offset</code> with, at most, <code>length</code> bytes of random
+ * data generated by the underlying delegate.
+ *
+ * @see IRandom#nextBytes
+ */
+ public void nextBytes(byte[] buffer, int offset, int length)
+ {
+ try
+ {
+ delegate.nextBytes(buffer, offset, length);
+ }
+ catch (LimitReachedException x) // re-initialise with a seed
+ {
+ try
+ {
+ HashMap map = new HashMap();
+ long t = System.currentTimeMillis();
+ byte[] seed = new byte[] {
+ (byte)(t >>> 56), (byte)(t >>> 48),
+ (byte)(t >>> 40), (byte)(t >>> 32),
+ (byte)(t >>> 24), (byte)(t >>> 16),
+ (byte)(t >>> 8), (byte) t };
+ map.put(MDGenerator.SEEED, seed);
+ delegate.init(map); // default is to use SHA-1 hash
+ delegate.nextBytes(buffer, offset, length);
+ }
+ catch (Exception y)
+ {
+ throw new ExceptionInInitializerError(y);
+ }
+ }
+ }
+}