RFR: 8331008: Implement JEP 478: Key Derivation Function API (Preview) [v11]
Kevin Driver
kdriver at openjdk.org
Fri Aug 16 21:16:32 UTC 2024
On Wed, 14 Aug 2024 02:50:39 GMT, Valerie Peng <valeriep at openjdk.org> wrote:
>> Kevin Driver has updated the pull request incrementally with one additional commit since the last revision:
>>
>> addressed several review comments, namely: - renaming the getParameters method - renaming the AlgorithmParameterSpec object - address some javadoc exception messages - add some information to KDF class private constructor javadocs - other general cleanup
>
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 86:
>
>> 84: *
>> 85: * @throws InvalidAlgorithmParameterException
>> 86: * if the information contained within the {@code KDFParameterSpec} is
>
> typo: `KDFParaneterSpec` should be `derivationParameterSpec`.
> BTW, I assume the javadoc is copied from `KDFSpi` class. I'd suggest to shorten it and match it to the actual implementation instead of the general description as in `KDFSpi`.
> For the last sentence, do you have an example of how the `derivationParameterSpec` typed `HKDFParameterSpec` can specify a type of output that is not a key?
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 242:
>
>> 240: }
>> 241: throw new InvalidAlgorithmParameterException(
>> 242: "an HKDF could not be initialized with the given KDFParameterSpec");
>
> It's clearer to state that the given `KDFParameterSpec` must be `HKDFParameterSpec`. Also, given that KDF.getInstance() takes a KDFParameters parameters, I'd avoid the word "initialized" as it may confuse people which parameters you are talking about.
> I'd suggest something like "HKDF data/key derivatopn requires HKDFParameterSpec, not " + derivationParameterSpec.getClass()
> Also, for readability, it may be better to check the specified `derivationParameterSpec` is an instanceof `HKDFParameterSpec` in the beginning.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 279:
>
>> 277:
>> 278: /**
>> 279: * Perform the HMAC-Extract operation.
>
> typo: 'HMAC' should be 'HKDF'
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 284:
>
>> 282: * the input keying material used for the HKDF-Extract operation.
>> 283: * @param salt
>> 284: * the salt value used for HKDF-Extract. If no salt is to be used a
>
> "If no salt is to be used a {@code null} value should be provided." should be "or {@code null} if no salt value is provided." as in the `hkdfExpand()` method javadoc.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 310:
>
>> 308:
>> 309: /**
>> 310: * Perform the HMAC-Expand operation. At the end of the operation, the
>
> typo: 'HMAC' should be 'HKDF'.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 312:
>
>> 310: * Perform the HMAC-Expand operation. At the end of the operation, the
>> 311: * keyStream instance variable will contain the complete KDF output based on
>> 312: * the input values and desired length.
>
> These lines are outdated? I can't find any `keyStream` instance variable.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 331:
>
>> 329: * or derived during the generation of the PRK.
>> 330: */
>> 331: protected byte[] hkdfExpand(SecretKey prk, byte[] info, int outLen)
>
> Same here, can be made 'private'.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/com/sun/crypto/provider/HkdfKeyDerivation.java line 338:
>
>> 336: // Calculate the number of rounds of HMAC that are needed to
>> 337: // meet the requested data. Then set up the buffers we will need.
>> 338: hmacObj.init(prk);
>
> RFC5869 sec 2.3 states that "PRK - a pseudorandom key of at least HashLen octets". Shouldn't we check it before passing to to `hmacObj`?
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/javax/crypto/KDFSpi.java line 129:
>
>> 127: * derivation parameters
>> 128: *
>> 129: * @return a byte array corresponding to a key built from the
>
> Can't we just state
>
>> @return a byte array output by this KDF object using the derivation parameters.
>
> No need to mention the "key built from ..." part. KDF output is bytes, we package it into key objects and not the other way around.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 262:
>
>> 260: throw new NullPointerException(
>> 261: "salt must not be null");
>> 262: }
>
> Why not use `Objects.requireNonNull(T, String)`? Same goes to all other `addXXX()` methods.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 362:
>
>> 360: *
>> 361: * @param prk
>> 362: * the pseudorandom key; may be {@code null}
>
> Instead of stating "prk may be {@null}", how about narrow it down/clarify to "in the case of ExtractThenExpand, prk may be {@null} since the output of extract phase is used"
Numerous comments elsewhere in the code illustrate what's happening. Is your concern for readers of the javadoc? This is probably a valid suggestion.
> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 428:
>
>> 426: * <p>
>> 427: * Note: {@code addIKMValue} and {@code addSaltValue} may be called
>> 428: * afterward to supply additional values, if desired
>
> What does this mean? {@code addIKMValue} and {@code addSaltValue} are methods of (@code Builder} class and do not belong to the {@code ExtractThenExpand} class. Copy-n-paste error?
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 443:
>
>> 441: * if {@code length} is not > 0
>> 442: */
>> 443: private ExtractThenExpand(Extract ext, byte[] info, int length) {
>
> Check {@code ext} to be not null?
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 444:
>
>> 442: */
>> 443: private ExtractThenExpand(Extract ext, byte[] info, int length) {
>> 444: // null-checked previously
>
> nit: where is this checked? I didn't find it. The comment seems incorrect.
Addressed in https://github.com/openjdk/jdk/pull/20301/commits/c6f491cd05c76088e6431b2ba9d4ab42b29e4055. Please indicate if this is resolved.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720360536
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720360709
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361297
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361445
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361360
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361525
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361254
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720361697
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720356437
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720357246
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720359927
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720360092
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720360264
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1720360406
More information about the security-dev
mailing list