> On Nov 10, 2015, at 10:13 AM, Bernd <e...@zusammenkunft.net> wrote:
> 
> Hello,
> 
> The JEP does not specifically talk about getInstanceStrong(). Will it be 
> possible to configure one of the new algorithms with the existing security 
> parameter mechanism (and will the default change given that ShA1 has a pretty 
> narrow state space to generate larger crypto keys.

The JEP includes this line:

   Open Issues
        • Choose the new default SecureRandom provider on all platforms.

When I say default, it should cover both getInstance() and getInstanceStrong().

Also, this is just my initial design and my team has not reviewed it yet. As 
for getInstanceStrong(), it's a SecureRandom static method that does not take 
any parameter. So it's not possible to use it to choose between a SHA-1 based 
HashDRBG and a SHA-512-based one.

Currently JDK still prefers NativePRNG to SHA1PRNG, and this JEP might not 
change it. What I can be sure if that if you choose getInstance("HashDRBG") 
without configure I will try my best to choose an adequate strength.

Is that OK?

> 
> Typo in DrbgSpec: A DRBG will be reseeded automatically 

Updated in my local code.

> BTW: some places specify "optional" should this be defined as "empty byte 
> array or null"?

I will be more precise on these in @param later. I will also add words like "if 
not null, will be cloned".

Thanks
Max

> 
> Gruss
> Bernd
> 
> 
> Wang Weijun <weijun.w...@oracle.com> schrieb am Mo., 9. Nov. 2015 21:04:
> Hi All
> 
> The following is API/SPI to support NIST 800-90A DRBGs. The JEP is at
> 
>   https://bugs.openjdk.java.net/browse/JDK-8051408
> 
> Some notes before the text:
> 
> 1. Mainly, new methods are added to SecureRandom to match DRBG functions:
> 
>  - configure: choosing the algorithms and parameters
>  - reseed: reseed using configured entropy. This is not same as existing 
> setSeed() which reseeds using a caller-provided seed
>  - nextBytes: random bits generation, with support for additional input
> 
> Like the existing ones, DRBGs will still be initiated automatically when 
> nextBytes() is called.
> 
> SecureRandomSpi is also updated with related engine methods.
> 
> 2. The new APIs will apply to all existing SecureRandom implementations, 
> although some is just a no-op. We believe the concepts apply to all.
> 
> 3. An EntropyInput interface is introduced to model source of entropy input. 
> We will provide some internal implementations so these DRBGs work out of box. 
> However, we won't expose any implementation that an application can use 
> directly. If you have a special entropy source, just implement the interface 
> yourself. Also note the interface is super simple now. New methods (or 
> getInstance() methods) might be added in the future.
> 
> 4. Three new SecureRandom algorithms are provided by the SUN provider - 
> HashDRBG, HmacDRBH, and CTRDRBG.
> 
> 
> Here is an example:
> 
>   SecureRandom sr = SecureRandom.getInstance("HashDRBG");
>   hd.configure(new DrbgSpec("SHA-512", -1, true, false,
>         nonce, person), new MyEntropyInput());
>   hg.nextBytes(output, additional);
>   hg.reseed(additional2);
> 
> 
> Any suggestion is welcome.
> 
> Thanks
> Max
> 
> -----API START-----
> package java.security;
> 
> 
> /**
>  *
>  * ....
>  *
>  * <p> Some SecureRandom implementations can be further configured by
>  * calling {@link #configure}. For example, a DRBG mechanism can be configured
>  * by a {@link DrbgSpec} object.
>  *
>  * ....
>  *
>  * <p> A SecureRandom can be reseeded by itself by calling {@link #reseed}.
>  * A caller can also reseed it a user-provided seed by calling
>  * {@link #setSeed(byte[])}.
>  *
>  * ....
>  *
>  * <p> Except for one created by {@link #SecureRandom(byte[])},
>  * a newly created SecureRandom object is usually not seeded.  To seed the
>  * returned object, call the {@code setSeed} method.
>  * If {@code setSeed} is not called, the first call to
>  * {@code nextBytes} or {@code reseed} will force the SecureRandom
>  * object to seed itself. This self-seeding will not occur
>  * if {@code setSeed} was previously called.
>  *
>  * <p>
>  * Note: Depending on the implementation, the {@code generateSeed},
>  * {@code reseed} and {@code nextBytes} methods may block as entropy is being
>  * gathered, for example, if they need to read from /dev/random on various
>  * Unix-like operating systems.
>  */
> public class SecureRandom {
> 
>     ....
> 
>     /**
>      * Configure this {@code SecureRandom} with an {@link 
> AlgorithmParameterSpec}
>      * object and a source of entropy input.
>      *
>      * @implNote The actual type of {@code spec} must match the algorithm of 
> this
>      * {@code SecureRandom} object. Fo example, a DRBG must be configured by
>      * a {@link DrbgSpec}. Otherwise, an {@link IllegalArgumentException}
>      * should be thrown.
>      * <p>
>      * If {@code ei} is null, a default EntropyInput will be chosen. If not
>      * null, the caller needs to make sure the EntropyInput matches the
>      * {@code SecureRandom} to be configured with enough security strength,
>      * live entropy, and other features.
>      *
>      * @param spec the {@link AlgorithmParameterSpec} object. Null if not 
> needed.
>      * @param ei the source of entropy input. Null if not user-chosen.
>      * @throws IllegalArgumentException if {@code spec} is not recognized by
>      *      this {@code SecureRandom} object.
>      * @since 1.9
>      */
>     public void configure(AlgorithmParameterSpec spec, EntropyInput ei);
> 
>     /**
>      * Generates a user-specified number of random bytes with an optional
>      * additional input argument.
>      *
>      * @param bytes the array to be filled in with random bytes.
>      * @param additionalInput an optional additional input argument.
>      * @since 1.9
>      */
>     public void nextBytes(byte[] bytes, byte[] additionalInput);
> 
>     /**
>      * Reseeds this {@code SecureRandom} with entropy read from its
>      * {@code EntropyInput} and an optional additional data.
>      * <p>
>      * Note that the entropy is obtained from {@code EntropyInput}. While
>      * {@code additional} may contain entropy but its main usage is to
>      * provide diversity.
>      *
>      * @param additionalInput an optional additional input argument.
>      * @since 1.9
>      */
>     public void reseed(byte[] additionalInput);
> 
>     ....
> }
> 
> public abstract class SecureRandomSpi {
> 
>     /**
>      * Configure this random object.
>      *
>      * @param spec the {@link AlgorithmParameterSpec} object. Null if not 
> needed.
>      * @param ei the source of entropy input. Null if not user-chosen.
>      * @throws IllegalArgumentException if this random object does not need
>      *      to be configured or it does not recongize {@code spec}.
>      * @since 1.9
>      */
>     protected void engineConfigure(AlgorithmParameterSpec spec, EntropyInput 
> ei);
> 
>     /**
>      * Generates random bits.
>      *
>      * @param bytes output.
>      * @param additionalInput optional additional input.
>      * @since 1.9
>      */
>     public void engineGenerate(byte[] bytes, byte[] additionalInput);
> 
>     /**
>      * Reseeds this random object with entropy read from its
>      * {@code EntropyInput} and an optional additional data.
>      *
>      * @param additional optional additional string.
>      * @since 1.9
>      */
>     protected void engineReseed(byte[] additional);
> }
> 
> /**
>  * An interface of a source of entropy input.
>  *
>  * @since 1.9
>  */
> public interface EntropyInput {
> 
>     /**
>      * Fills a byte array with full entropy.
>      *
>      * <p>This method might block and/or fail.
>      *
>      * @param entropy the byte array with filled entropy.
>      * @throws EntropyNotAvailableException if not enough entropy is 
> available.
>      */
>     public void getFullEntropy(byte[] entropy);
> }
> 
> 
> /**
>  * A RuntimeException thrown when not enough entropy is available.
>  *
>  * @since 1.9
>  */
> public class EntropyNotAvailableException extends RuntimeException {
> 
>     private static final long serialVersionUID = 9L;
> 
>     /**
>      * Creates one
>      * @param msg the message
>      */
>     public EntropyNotAvailableException(String msg);
> }
> 
> 
> /**
>  * This class specifies the configuration of a DRBG.
>  * <p>
>  * DRBG (deterministic random bits generator) is defined in
>  * <a 
> href="http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf";>
>  * NIST Special Publication 800-90A Revision 1, Recommendation for Random
>  * Number Generation Using Deterministic Random Bit Generators</a>.
>  * A DRBG mechanism should extend this class.
>  * <p>
>  * The following {@link SecureRandom} methods match to DRBG functions:
>  * <ul>
>  *     <li>{@link SecureRandom#configure} to configure.
>  *     <li>A DRBG will be automatically instantiated.
>  *     <li>{@link SecureRandom#nextBytes(byte[], byte[])} to generate.
>  *     <li>{@link SecureRandom#reseed} to reseed.
>  * </ul>
>  * <p>
>  * Calling {@link SecureRandom#generateSeed} is equivalent to calling
>  * {@link EntropyInput#getFullEntropy} on its entropy source.
>  * <p>
>  * A DRBG {@code SecureRandom} can be configured before generating random
>  * bits or reseeding. Otherwise, it will be configured with default values
>  * defined by the DRBG mechanism at the first call of
>  * {@link SecureRandom#nextBytes} or {@link SecureRandom#reseed}.
>  * <p>
>  * If {@link SecureRandom#setSeed} is the first call on a DRBG, the DRBG
>  * will be configured by default but instantiated with the argument of this
>  * method, therefore will not block. Callers should make sure the argument
>  * must contain enough entropy to ensure the security of this DRBG.
>  * <p>
>  * A DRBG will be reseeded aotomatically if the seed period is bigger
>  * than the maximum seedlife defined by the DRBG mechanism.
>  * <p>
>  * A Source of Entropy Input (SEI) can be provided at configure time,
>  * otherwise, a default SEI defined by the DRBG mechanism will be chosen.
>  *
>  * @see SecureRandom#configure
>  * @since 1.9
>  */
> public class DrbgSpec implements AlgorithmParameterSpec {
> 
>     /**
>      * Return the nonce used by this DRBG
>      *
>      * @return the nonce.
>      */
>     public byte[] getNonce();
> 
>     /**
>      * Return the personalization string used by this DRBG
>      *
>      * @return the personalization string.
>      */
>     public byte[] getPersonal();
> 
>     /**
>      * Return the source of entropy input used by this DRBG
>      *
>      * @return the source of entropy input.
>      */
>     public EntropyInput getEntropyInput();
> 
>     /**
>      * Return the algorithm used by this DRBG.
>      *
>      * @return the algorithm.
>      */
>     public String getAlgorithm();
> 
>     /**
>      * Returns the strength used by this DRBG.
>      *
>      * @return the strength.
>      */
>     public int getStrength();
> 
>     /**
>      * Returns whether a derivation function is used by this DRBG
>      *
>      * @return whether a derivation function is used.
>      */
>     public boolean isUsedf();
> 
>     /**
>      * Returns whether prediction resistance is provided by this DRBG.
>      *
>      * @return whether prediction resistance is provided.
>      */
>     public boolean isPr();
> 
>     /**
>      * Creates a {@code DrbgSpec}.
>      *
>      * @param algorithm the algorithm used by the DRBG mechanism. For example,
>      *      "SHA-256" for HashDRBG, or "AES-256" for CtrDRBG. If null,
>      *      the algorithm will be determined by the requested strength.
>      * @param strength the requested strength, ignored if algorithm is null,
>      *      -1 means a strength automatically chosen.
>      * @param pr if prediction resistance is requested.
>      * @param usedf if a derivation function will be used.
>      * @param nonce the nonce used.
>      * @param personal an optional personalization string.
>      */
>     public DrbgSpec(String algorithm, int strength, boolean pr,
>                     boolean usedf, byte[] nonce, byte[] personal);
> }
> 
> -----API END-----

Reply via email to