On Sat, 11 May 2024 02:06:09 GMT, Kevin Driver <kdri...@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).
>
> Kevin Driver has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   commenting out until better understood -- causing failures

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

> 1: /*

Note: many of my comments apply to multiple methods, so please check all other 
methods when fixing.

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

> 44: 
> 45: /**
> 46:  * This class provides the functionality of a key derivation algorithm 
> for JCE.

Suggest adding a sentence describing what key derivation does.

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

> 142:      *
> 143:      * <p>This is the same name that was specified in one of the
> 144:      * {@code getInstance} calls that created this {@code KDF} object.

I don't think it is necessary to include this sentence.

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

> 161: 
> 162:     /**
> 163:      * Creates an instance of the {@code KDF} object.

Suggest rewording as "Returns a {@code KDF} object that implements the 
specified algorithm."

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

> 164:      *
> 165:      * @param algorithm
> 166:      *     the key derivation algorithm to use

This should include a pointer to the KDF section of the Standard Algorithm 
Names specification once you set that up.

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

> 169:      *
> 170:      * @throws NoSuchAlgorithmException
> 171:      *     if no {@code Provider} supports a {@code KDFSpi} 
> implementation for

s/KDFSpi/KDF/

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

> 172:      *     the specified algorithm
> 173:      * @throws NullPointerException
> 174:      *     if the algorithm is {@code null}

s/the algorithm/{@code algorithm}/

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

> 188:     /**
> 189:      * Creates an instance of the {@code KDF} object with a specific
> 190:      * {@code Provider}.

Suggest rewording as "Returns a {@code KDF} object that implements the 
specified algorithm from the specified security provider."

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

> 193:      *     the key derivation algorithm to use
> 194:      * @param provider
> 195:      *     the provider to use for this key derivation

It looks like provider can be null. If so, you should specify that, e.g. "If 
null, this method is equivalent to getInstance(String)."

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

> 199:      * @throws NoSuchAlgorithmException
> 200:      *     if no {@code Provider} supports a {@code KDFSpi} 
> implementation for
> 201:      *     the specified algorithm

This exception reason looks to be copied from getInstance(String), but is 
different for this method. It should be: "if a provider is specified and it 
does not support the specified KDF algorithm, or if provider is null and there 
is no provider that supports a KDF implementation of the specified algorithm"

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

> 221:     /**
> 222:      * Creates an instance of the {@code KDF} object using a supplied
> 223:      * {@code Provider} instance.

Suggest rewording as "Returns a {code KDF} object that implements the specified 
algorithm from the specified security provider."

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

> 250: 
> 251:     /**
> 252:      * Creates an instance of the {@code KDF} object.

Suggest rewording as "Returns a {@code KDF} object that implements the 
specified algorithm and is initialized with the specified parameters."

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

> 256:      * @param algParameterSpec
> 257:      *     the {@code AlgorithmParameterSpec} used to configure this 
> KDF's
> 258:      *     algorithm or {@code null} if no additional parameters were 
> provided.

s/were/are/
no period at end

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

> 393:      * <p>
> 394:      * The {@code deriveKey} method may be called multiple times once a
> 395:      * {@code KDF} object is initialized.

I think this sentence is important enough that it should be repeated in the 
class summary.

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

> 396:      * <p>
> 397:      * Delayed provider selection is also supported such that the 
> provider
> 398:      * performing the derive is not selected until the method is called.

Delayed provider selection is an important enough topic that it probably should 
be in the class summary. However it is complicated to word correctly as there 
is also the case if someone calls `getProviderName` beforehand which locks the 
provider to the first one supporting the algorithm. I would probably also avoid 
"delayed provider" as that is not a term currently used in the javadocs. 
Suggest something like:

If a provider is not specified in the getInstance method when instantiating a 
KDF object, the provider is selected the first time the deriveKey or deriveData 
method is called and a provider is chosen that supports the parameters passed 
to the deriveKey or deriveData method, for example the initial key material. 
However, if getProviderName is called before calling the deriveKey or 
deriveData methods, the first provider supporting the KDF algorithm is chosen 
which may not be the desired one; therefore it is recommended to not call 
getProviderName until after a key derivation operation.

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

> 399:      *
> 400:      * @param alg
> 401:      *     the algorithm of the resultant {@code SecretKey} object

This method should throw NPE if alg is null.

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

> 401:      *     the algorithm of the resultant {@code SecretKey} object
> 402:      * @param kdfParameterSpec
> 403:      *     derivation parameters

Can this be null? If so, you should specify that null is allowed.

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

> 412:      *
> 413:      */
> 414:     public SecretKey deriveKey(String alg, KDFParameterSpec 
> kdfParameterSpec)

Are there cases where the parameters are correct, but the derive operation can 
still fail for other reasons? If so, I'm not sure we should be wrapping those 
in InvalidParameterSpecException. That exception should be thrown by the method 
initially when it inspects the parameters and before the derive operation 
begins.

This is why I mentioned previously if it makes sense to add a 
DerivationException class.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597651531
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597651374
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597644343
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597644752
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597644842
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597644961
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597645015
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597646828
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597645773
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597646383
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597646492
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597647056
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597647294
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597651283
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597650550
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597651071
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597650904
PR Review Comment: https://git.openjdk.org/jdk/pull/18924#discussion_r1597652741

Reply via email to