RFR: 8331008: Implement JEP 478: Key Derivation Function API (Preview) [v27]

Sean Mullan mullan at openjdk.org
Tue Sep 10 15:28:27 UTC 2024


On Fri, 6 Sep 2024 18:45:42 GMT, Kevin Driver <kdriver at openjdk.org> wrote:

>> Introduce an API for Key Derivation Functions (KDFs), which are cryptographic algorithms for deriving additional keys from a secret key and other data. See [JEP 478](https://openjdk.org/jeps/478).
>> 
>> Work was begun in [another PR](https://github.com/openjdk/jdk/pull/18924).
>
> Kevin Driver has updated the pull request incrementally with one additional commit since the last revision:
> 
>   updated comments around locking mechanism

src/java.base/share/classes/javax/crypto/KDF.java line 54:

> 52:  * The class has two derive methods, {@code deriveKey} and {@code deriveData}.
> 53:  * The {@code deriveKey} method accepts an algorithm {@code String} and
> 54:  * will return a {@code SecretKey} object with the specified algorithm. The

Keep wording consistent with next sentence ("returns a byte array").

s/will return/returns/

src/java.base/share/classes/javax/crypto/KDF.java line 94:

> 92:  * optional {@code KDFParameters} is chosen. This provider may not support
> 93:  * the key material that is subsequently passed to the deriveKey or
> 94:  * deriveData methods. Therefore, it is recommended not to call the {@code

Put @code around deriveKey and deriveData.

src/java.base/share/classes/javax/crypto/KDF.java line 225:

> 223:      *     if {@code algorithm} is {@code null}
> 224:      */
> 225:     public static KDF getInstance(String algorithm)

One thing that is missing from this method is an Implementation Note describing how the `jdk.security.provider.preferred` property affects the search algorithm. See any other JCE API - you can just copy/paste the text. Also affects the `getInstance` method that takes an algorithm and params.

src/java.base/share/classes/javax/crypto/KDF.java line 349:

> 347:                 Object obj = s.newInstance(kdfParameters);
> 348:                 if (!(obj instanceof KDFSpi spiObj)) {
> 349:                     lastException = new NoSuchAlgorithmException(

Unless I'm mistaken, you don't need to wrap the IAPE in a NSAE, only to unwrap it again in `handleException()`. I think you can throw it directly as an IAPE on line 379.

src/java.base/share/classes/javax/crypto/KDF.java line 507:

> 505:      * <p>
> 506:      * The {@code deriveKey} method may be called multiple times on a particular
> 507:      * {@code KDF} instance, but it is not considered thread-safe.

My preference would be to remove this sentence and the same one in deriveData now that you have the "Concurrent Access" section in the Class Summary which I think describes the concurrency behavior of the whole API better.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1752169245
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1752170033
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1752170158
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1752197908
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1752192026


More information about the security-dev mailing list