On Thu, 17 Apr 2025 15:51:09 GMT, Anthony Scarpino <ascarp...@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 two 
> additional commits since the last revision:
> 
>  - javadoc updates
>  - code review comments

Some comments on internal classes.

Since each `KeyFactory` now accepts PKCS8 in `generatePublicKey`, I suggest 
adding some tests on it. Also, add some tests to check if `new 
PKCS8EncodedKeySpec(data)` and `new X509EncodedKeySpec(data)` are able to 
detect algorithms from only data.

src/java.base/share/classes/sun/security/ec/ECKeyFactory.java line 225:

> 223:         throws GeneralSecurityException {
> 224:         if (keySpec instanceof X509EncodedKeySpec) {
> 225:             return new 
> ECPublicKeyImpl(((X509EncodedKeySpec)keySpec).getEncoded());

We can also use `instanceof` pattern matching here. Same on line 246.

src/java.base/share/classes/sun/security/ec/ECPrivateKeyImpl.java line 157:

> 155:     }
> 156: 
> 157:     public byte[] getArrayS() {

Why remove `getArrayS0`? Not worth saving those bytes?

src/java.base/share/classes/sun/security/ec/ECPrivateKeyImpl.java line 191:

> 189:                 DerValue value = data.getDerValue();
> 190:                 if (value.isContextSpecific((byte) 0)) {
> 191:                     attributes = value.getDataBytes();  // Save DER 
> sequence

At [0], it's `ECDomainParameters`. I don't think it's the same as `attributes` 
inside `OneAsymmetricKey`.

src/java.base/share/classes/sun/security/ec/ECPrivateKeyImpl.java line 195:

> 193:                         return;
> 194:                     }
> 195:                     value = data.getDerValue();

The original code does not care about whether [0] comes before [1] or if there 
are duplicates. You modified code ensures only [1] can be after [0] but still 
allows duplicates (For example, [0], [1], [1]). The `while` on line 188 can be 
changed to `if` and we ensure `data.available() == 0` at the end.

src/java.base/share/classes/sun/security/ec/ECPrivateKeyImpl.java line 201:

> 199:                     BitArray bitArray = 
> bits.data.getUnalignedBitString();
> 200:                     pubKeyEncoded = new X509Key(algid,
> 201:                         bitArray).getEncoded();

We could have 2 copies of the public key, one here and one inside 
`OneAsymmetricKey`. Do you want to compare them?

src/java.base/share/classes/sun/security/util/DerValue.java line 195:

> 193: 
> 194:     /**
> 195:      * Returns true if the CONTEXT SPECIFIC bit is set in the type tag.

`iff` was used to mean `if and only if`. It's more precise than a simple `if`.

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

PR Review: https://git.openjdk.org/jdk/pull/17543#pullrequestreview-2793998438
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060169867
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060231627
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060222850
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060212787
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060201102
PR Review Comment: https://git.openjdk.org/jdk/pull/17543#discussion_r2060236284

Reply via email to