RFR: 8343232: PKCS#12 KeyStore support for RFC 9879: Use of Password-Based Message Authentication Code 1 (PBMAC1) [v10]

Weijun Wang weijun at openjdk.org
Mon Sep 29 21:11:10 UTC 2025


On Mon, 29 Sep 2025 03:45:38 GMT, Mark Powers <mpowers at openjdk.org> wrote:

>> [JDK-8343232](https://bugs.openjdk.org/browse/JDK-8343232)
>
> Mark Powers has updated the pull request incrementally with one additional commit since the last revision:
> 
>   another day another iteration

Some comments.

src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Parameters.java line 69:

> 67:     private String pbmac1AlgorithmName = null;
> 68: 
> 69:     private byte[] salt = null;

Instead of including so many PBKDF2 components, can we just put one `PBKDF2Parameters` field here? We can also remove the `getPrf`, `getSalt`, and `getIterations` methods. IMO it's not awkward to call `pbmac1Params.getKdfParams().getPrf()` etc.

src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Parameters.java line 84:

> 82:     private int keyLength = -1;
> 83: 
> 84:     protected void Init(AlgorithmParameterSpec paramSpec)

Method names should start with a lowercase letter. If it's not used, remove it.

That said, in a different comment, I was hoping we can also construct a `PBMAC1Parameters` object using its components.

src/java.base/share/classes/com/sun/crypto/provider/PBMAC1Parameters.java line 184:

> 182:      * Returns a formatted string describing the parameters.
> 183:      */
> 184:     public String engineToString() {

Useless now. Therefore, `pbmac1AlgorithmName` is also useless.

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 190:

> 188:         var skf = SecretKeyFactory.getInstance(
> 189:                 kdfHmac.equals("HmacSHA512") ?
> 190:                 "PBKDF2WithHmacSHA512" : "PBKDF2WithHmacSHA256");

The calculation of mac can be consolidated in one method, which is then called by both `processMacData` and `calculateMac`.

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 234:

> 232:         String Hmac = null;
> 233: 
> 234:         if (newKeystore) {

What could happen if `newKeystore` is different? Is the only difference about the `And` in `macAlgorithm`? Can we just treat it in a consistent way no matter if a new keystore is created?

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 250:

> 248:             }
> 249:         }
> 250:         // Fall back to old way of computing MAC

This is not a fallback. There are 2 different kinds of algorithms. If it starts with "PBEWith", PBMAC1 is used. If it starts with "HmacPBE", the old algorithm is used.

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 260:

> 258: 
> 259:         var skf = SecretKeyFactory.getInstance(kdfHmac.equals("HmacSHA512") ?
> 260:                 "PBKDF2WithHmacSHA512" : "PBKDF2WithHmacSHA256");

Why not just use `"PBKDF2With" + kdfHmac`? What if `kdfHmac` is "HmacSHA384"?

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 262:

> 260:                 "PBKDF2WithHmacSHA512" : "PBKDF2WithHmacSHA256");
> 261:         try {
> 262:             int keyLength = Hmac.equals("HmacSHA512") ? 64*8 : 32*8;

Use `Mac.getInstance(Hmac).getMacLength()`. There are other algorithms.

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 287:

> 285:         return mData;
> 286:     }
> 287: 

For all methods below, unless one is used outside of this class, there is no need to create a getter method.

src/java.base/share/classes/sun/security/pkcs12/MacData.java line 322:

> 320:      * ASN.1 encoding.
> 321:      */
> 322:     public byte[] getEncoded() throws NoSuchAlgorithmException, IOException {

Since you have moved the decoding of PBKDF2-Params into its own class, are you going to move the encoding there as well? Ideally, a `PBKDF2Parameters` object can be either created using a `DerValue` or its components (salt, ic, keyLen), and then it has a `getEncoded()` method.

Same with the new `PBMAC1Parameters` class.

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

PR Review: https://git.openjdk.org/jdk/pull/24429#pullrequestreview-3281720001
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389276133
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389255889
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389268119
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389262830
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389223743
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389227816
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389230206
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389232306
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389237089
PR Review Comment: https://git.openjdk.org/jdk/pull/24429#discussion_r2389248160


More information about the security-dev mailing list