RFR: 8298420: PEM API: Implementation (Preview) [v9]

Weijun Wang weijun at openjdk.org
Wed Oct 30 22:40:35 UTC 2024


On Mon, 21 Oct 2024 19:52:36 GMT, Anthony Scarpino <ascarpino at openjdk.org> wrote:

>> Hi all,
>> 
>> I need a code review of the PEM API.  Privacy-Enhanced Mail (PEM) is a format for encoding and decoding cryptographic keys and certificates.  It will be integrated into JDK24 as a Preview Feature.  Preview features does not permanently define the API and it is subject to change in future releases until it is finalized.
>> 
>> Details about this change can be seen at [PEM API JEP](https://bugs.openjdk.org/browse/JDK-8300911).
>> 
>> Thanks
>> 
>> Tony
>
> Anthony Scarpino has updated the pull request incrementally with one additional commit since the last revision:
> 
>   apparently <p> can't be before a @implNote.. Who know.

For `PEMEncoder`.

Also, do you want to update the `PKCS8EncodedKeySpec` class with a new ASN.1 grammar and a link to version 2.0?

src/java.base/share/classes/java/security/PEMEncoder.java line 63:

> 61:  * by passing an {@link EncryptedPrivateKeyInfo} object into the encode methods.
> 62:  * <p>
> 63:  * PKCS8 v2.0 allows OneAsymmetric encoding, which is a private and public

Add a link to PKCS 8 2.0?

src/java.base/share/classes/java/security/PEMEncoder.java line 74:

> 72:  * @apiNote
> 73:  * Here is an example of encoding a PrivateKey object:
> 74:  * <pre>

Change to code snippet.

src/java.base/share/classes/java/security/PEMEncoder.java line 143:

> 141:      *           DEREncodable.
> 142:      * @return PEM encoding in a String
> 143:      * @throws IllegalArgumentException when the passed object returns a null

What does "returns a null binary encoding" mean? There is no other method talking about this. I think we can just say "if configured for encryption but object does not support" since this looks like the only reason.

Also, how about `IllegalStateException`?

src/java.base/share/classes/java/security/PEMEncoder.java line 177:

> 175:                         PEMRecord.ENCRYPTED_PRIVATE_KEY, epki.getEncoded()));
> 176:                 } catch (IOException e) {
> 177:                     throw new SecurityException(e);

Do you really want to use `SecurityException`? This only happens when the `AlgorithmParameters` inside EPKI is not initialized. I would say this is a very good candidate for an `IllegalStateException`.

src/java.base/share/classes/java/security/PEMEncoder.java line 240:

> 238:      *
> 239:      * @param password sets the encryption password.  The array is cloned and
> 240:      *                stored in the new instance.

Can password be empty? I vaguely remember some algorithms might not like it, or, is it just that `SecretKeySpec` does not like an empty key?

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

PR Review: https://git.openjdk.org/jdk/pull/17543#pullrequestreview-2406520187
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r1823529997
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r1823530133
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r1823531557
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r1823532621
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r1823533634


More information about the security-dev mailing list