RFR: 8298387: Implementing ML-DSA signature algorithm
Weijun Wang
weijun at openjdk.org
Tue Oct 8 15:03:00 UTC 2024
On Fri, 4 Oct 2024 20:59:45 GMT, Ben Perez <bperez at openjdk.org> wrote:
> Java implementation of ML-DSA, the FIPS 204 post-quantum signature scheme https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf. Depends on https://github.com/openjdk/jdk/pull/21167
src/java.base/share/classes/sun/security/provider/ML_DSA.java line 545:
> 543: int[][] s1 = Arrays.stream(sk.s1()).map(int[]::clone).toArray(int[][]::new);
> 544: int[][] s2 = Arrays.stream(sk.s2()).map(int[]::clone).toArray(int[][]::new);
> 545: int[][] t0 = Arrays.stream(sk.t0()).map(int[]::clone).toArray(int[][]::new);
Instead of calling `mlDsa.skDecode(skBytes)` in `ML_DSA_Provider`, can we move the call here? Then `sk` becomes a local variable and you probably don't need to make the deep clones above.
src/java.base/share/classes/sun/security/provider/ML_DSA.java line 563:
> 561: hash.update(rnd);
> 562: hash.update(mu);
> 563: byte[] rhoPrime = hash.squeeze(mlDsaMaskSeedLength);
The name is `rhoDoublePrime`.
src/java.base/share/classes/sun/security/provider/ML_DSA.java line 660:
> 658: //Check verify conditions
> 659: boolean hashEq = Arrays.equals(sig.commitmentHash(), cTildePrime);
> 660: boolean weight = hammingWeight(sig.hint()) <= omega;
This is no longer required in the final FIPS 204. On the other hand, `hintBitUnpack` is modified to add more checks.
src/java.base/share/classes/sun/security/provider/ML_DSA.java line 665:
> 663:
> 664: /*
> 665: Data conversion functions in Section 8.1 of specification
It's Section 8 now.
src/java.base/share/classes/sun/security/provider/ML_DSA_Provider.java line 109:
> 107: }
> 108:
> 109: // TODO: check key in initSign and initVerify?
Maybe you can at least check the size of the keys?
src/java.base/share/classes/sun/security/provider/ML_DSA_Provider.java line 135:
> 133: var mlDsa = new ML_DSA(size);
> 134: var pk = mlDsa.pkDecode(pkBytes);
> 135: var sig = mlDsa.sigDecode(sigBytes);
Check the size of `sigBytes` and throw a `SignatureException` if invalid.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1791986347
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1791999822
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1792033938
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1792048448
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1791975633
PR Review Comment: https://git.openjdk.org/jdk/pull/21364#discussion_r1791978136
More information about the security-dev
mailing list