On Wed, 31 Jul 2024 21:07:49 GMT, Kevin Driver <kdri...@openjdk.org> wrote:

>> src/java.base/share/classes/javax/crypto/KDF.java line 51:
>> 
>>> 49:  * <p>
>>> 50:  * {@code KDF} objects are instantiated with the {@code getInstance} 
>>> family of
>>> 51:  * methods. KDF algorithm names follow a naming convention of
>> 
>> I'm not sure KDF algorithms always follow this name. For example, kdf3, 
>> scrypt, and argon2.
>
> The existing sentence seems to cover this scenario. Let me know if you 
> disagree. 
> 
> `In some cases the WithPRF portion of the algorithm field may be omitted if 
> the KDF algorithm has a fixed or default PRF.`
> 
> However, if Argon2 (or another relevant example) were to require a PRF 
> specifier at some point in the future, we would still want it to follow that 
> form, right? `<em>Algorithm</em>With<em>PRF</em>`

The PRF or any other config can be put in a `KDFParameters`. The algorithm name 
does not necessarily takes this form.

>> src/java.base/share/classes/javax/crypto/KDFSpi.java line 38:
>> 
>>> 36:  * This class defines the <i>Service Provider Interface</i> 
>>> (<b>SPI</b>) for the
>>> 37:  * {@code KDF} class.
>>> 38:  * <p>
>> 
>> Unfortunately I cannot unresolve a resolved conversation. For my comment 
>> above, thanks for adding the requirement on constructors. What about my 
>> other 2 suggestions?
>
> 1) An example of a KDF implementation within the class header seems a bit 
> excessive to me. 
> 
> 2) I felt that changes to the wording describing `KDFParameters` elsewhere 
> accomplished this goal.

I don't have strong opinions now. 2) is fine now. You can still consider 1) if 
you can write a short one. Not all details need to be implemented. Just the 
structure.

>> src/java.base/share/classes/javax/crypto/KDFSpi.java line 72:
>> 
>>> 70:      * <p>
>>> 71:      * The {@code engineDeriveKey} method may be called multiple times 
>>> on a particular
>>> 72:      * {@code KDFSpi} instance.
>> 
>> This sentence invites people asking about thread safety, but we don't want 
>> to guarantee anything here.
>
> I was trying to convey that deriveKey|Data are not like doFinal in that they 
> can be called more than once on a single instance. Is there a different way 
> to word this? Or is it not important to mention here?

Not sure. Maybe your sentence is OK.

>> src/java.base/share/classes/javax/crypto/KDFSpi.java line 80:
>> 
>>> 78:      *
>>> 79:      * @return a {@code SecretKey} object corresponding to a key built 
>>> from the
>>> 80:      *     KDF output and according to the derivation parameters
>> 
>> Do we need to specify that if the result is extractable then the encoding 
>> should be the same as the output of `deriveData`? I'm really not sure about 
>> this.
>
> Can you add some more detail here?

Something like: If the result key is extractable, then its getEncoded value 
should have the same content as the result of deriveData.

>> src/java.base/share/classes/javax/crypto/KDFSpi.java line 89:
>> 
>>> 87:      *     KDF output and according to the derivation parameters or 
>>> {@code null}
>>> 88:      *     in cases where an exception is not thrown but a value cannot 
>>> be
>>> 89:      *     returned
>> 
>> Do you really need to say "corresponding to" and "according to"? What else 
>> can it be?
>> 
>> It's not clear when the return value is null. This also requires users to 
>> check for multiple invalid cases.
>
> I looked at `Cipher` and `Mac`. They do not specify in `doFinal` whether or 
> not the result may be `null`. 
> 
> I think this specification is sufficient for implementations (more precise 
> than the above mentioned classes) and allows the implementors of `KDFSpi` to 
> return `null` in cases which we may not yet have anticipated.

In the era of `Cipher` and `Mac`, we don't treat nullability as a big issue and 
does not always specify it. Now it's called Java's Billion Dollar Mistake.

In fact, I don't think `doFinal` has ever intended to allow returning null.

>> src/java.base/share/classes/javax/crypto/KDFSpi.java line 94:
>> 
>>> 92:      *     if the information contained within the {@code 
>>> kdfParameterSpec} is
>>> 93:      *     invalid or incorrect for the type of key to be derived or if
>>> 94:      *     {@code alg} is invalid or unsupported by the KDF 
>>> implementation
>> 
>> The current spec says this is bad or that is bad. Is it necessary to include 
>> the case where the combination is invalid?
>> 
>> BTW, I still don't see why it's worth mentioning "invalid" and "incorrect". 
>> After all, the exception name only mentions invalid. Do you think it's not 
>> precise?
>
> I am open to changing this wording, but here is my logic on the above: 
> 
> `or if {@code alg} is invalid or unsupported by the KDF implementation`
> 
> Since the kdfParameterSpec (the `AlgorithmParameterSpec`) determines the KDF 
> implementation, my feeling is that **if** the implementation cannot return a 
> key of the desired algorithm, this could be because it is: `unsupported by 
> the KDF implementation`. To me, this covers the combination case.

One example is asking for a 42-byte AES key. We cannot say "AES" is 
unsupported, we also cannot say length 42 is not a valid params set itself, but 
the combination is invalid.

>> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 81:
>> 
>>> 79:  */
>>> 80: @PreviewFeature(feature = PreviewFeature.Feature.KEY_DERIVATION)
>>> 81: public interface HKDFParameterSpec extends AlgorithmParameterSpec {
>> 
>> Does this class need to extend `AlgorithmParameterSpec`? It's more like a 
>> factory.
>
> Each of the inner classes extend `HKDFParameterSpec` and therefore 
> `AlgorithmParameterSpec`. I like the inheritance model here.

OK.

>> src/java.base/share/classes/javax/crypto/spec/HKDFParameterSpec.java line 
>> 297:
>> 
>>> 295:      * @param length
>>> 296:      *     the length of the output key material (must be &gt; 0 and 
>>> &lt; 255 *
>>> 297:      *     HMAC length)
>> 
>> The maximum length can only be checked in the implementation and not here. 
>> Maybe do not mention it.
>
> I disagree. I think this is a helpful bit of info for the developer who may 
> be surprised later by an `Exception`.

OK. As long as the exception does not cover it.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700825281
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700937179
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700863644
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700872274
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700936295
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700941300
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700942655
PR Review Comment: https://git.openjdk.org/jdk/pull/20301#discussion_r1700943869

Reply via email to