Just push all changes to the PR and you can remove mine later. I cannot 
guarantee when my PR can be integrated. Those I-Ds are still in Ed Queue.

--Weijun

> On Aug 4, 2025, at 08:55, Sebastian Stenzel <sebastian.sten...@gmail.com> 
> wrote:
> 
> I believe I got it working. Since my PR now relies on [1] your key encoding 
> changes, shall I push the changes or rather wait until your’s is merged into 
> master?
> 
> [1]: https://github.com/openjdk/jdk/pull/24969
> 
>> On 3. Aug 2025, at 21:56, Wei-Jun Wang <weijun.w...@oracle.com> wrote:
>> 
>> The ML-KEM key does not need to be serialized anywhere so I think its 
>> encoding does not matter. If you already have the expanded key you can 
>> directly create a NamedPKCS8Key whose expander is an identity function, i.e. 
>> both its encoding and expanded key are the expanded key itself. The encoding 
>> does not necessarily be the seed.
>> 
>> Thanks,
>> Weijun
>> 
>>> On Aug 2, 2025, at 13:42, Sebastian Stenzel <sebastian.sten...@gmail.com> 
>>> wrote:
>>> 
>>> Hi,
>>> 
>>> I merged your NamedPKCS8Key branch into the X-Wing branch and tried to 
>>> adjust to the new API. I encountered one problem:
>>> 
>>> With your changes, `NamedKEM#implDecapsulate` will now receive the expanded 
>>> key (no longer the raw seed). So far, so good. However, in X-Wing I need to 
>>> split this into an ML-KEM key and the X25519 key. Now here is the problem: 
>>> If I only have expanded bytes, how can I construct an ML-KEM key? 
>>> NamedPKCS8Key requires „raw key bytes, not null“ (i.e. the seed) and only 
>>> optionally the expanded bytes.
>>> 
>>> Is there any internal API I can use to run ML-KEM’s decapsulate with a 
>>> byte[] key?
>>> 
>>> Otherwise, I would suggest that you widen the signature of 
>>> `NamedKEM#implDecapsulate` to receive both parameters, the seed and the 
>>> expanded key.
>>> 
>>> Cheers,
>>> Sebastian
>>> 
>>>> On 23. Jul 2025, at 17:52, Wei-Jun Wang <weijun.w...@oracle.com> wrote:
>>>> 
>>>> 
>>>> 
>>>>> On Jul 23, 2025, at 11:41, Sebastian Stenzel 
>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>> 
>>>>> Welcome back, I hope you enjoyed the time! :-)
>>>>> 
>>>>> If you find time, can you give me an update on the ASN.1 key encoding 
>>>>> topic? This is the only remaining issue to fulfill the spec. Afterwards 
>>>>> we simply need to wait for the final test vectors and publication of the 
>>>>> RFC.
>>>> 
>>>> https://github.com/openjdk/jdk/pull/24969 updated NamedPKCS8Key which 
>>>> contains both the encoding format (as in PKCS #8) and the expanded format 
>>>> (used in calculation). For X-Wing, I think the encoding will be the seed, 
>>>> but you are free to choose the expanded format, or, you can "expand" it to 
>>>> an arbitrary object at NamdKEM::implCheckPrivateKey. The KeyPairGenerator 
>>>> interface does not have a deterministic generateKey method so you will 
>>>> have to call internal methods for both ML-KEM and x25519.
>>>> 
>>>> Thanks,
>>>> Weijun
>>>> 
>>>>> 
>>>>> Thank you!
>>>>> Sebastian
>>>>> 
>>>>>> Am 23.07.2025 um 14:33 schrieb Wei-Jun Wang <weijun.w...@oracle.com>:
>>>>>> 
>>>>>> Hi Sebastian,
>>>>>> 
>>>>>> I'm back from my vacation. Thanks for the update.
>>>>>> 
>>>>>> I agree, using NamedKey is probably a better choice anyway. It's nice 
>>>>>> that getParams() always return a name and we don't need to call 
>>>>>> getAlgorithm() as a fallback.
>>>>>> 
>>>>>> Thanks,
>>>>>> Weijun
>>>>>> 
>>>>>>> On Jun 30, 2025, at 06:06, Sebastian Stenzel 
>>>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>>>> 
>>>>>>> Quoting Bas Westerbaan (in CC) again, we will most likely see further 
>>>>>>> PQ/T hybrids from the IETF crypto forum research group (CFRG for short):
>>>>>>> 
>>>>>>>> It seems likely that the CFRG will at some point produce a 
>>>>>>>> P-384+ML-KEM-1024 hybrid. See 
>>>>>>>> https://mailarchive.ietf.org/arch/msg/cfrg/CwrVvm-J7o85TEWkG9RJxZwfXDY/
>>>>>>>>  . That might take some time.
>>>>>>>> 
>>>>>>>> Very few (but notably Ericsson) have asked for X448 hybrids, so I 
>>>>>>>> don't expect them soon.
>>>>>>> 
>>>>>>> That said, the construction does not necessarily be compatible to 
>>>>>>> X-Wing. Just to be sure, I asked whether they see any value in 
>>>>>>> parameterizing X-Wing to swap out algorithms. This is what Bas replied:
>>>>>>> 
>>>>>>>> Even if the other hybrids will also use an X-Wing style combiner, it 
>>>>>>>> doesn't hurt not to parametrize initially. :)
>>>>>>> 
>>>>>>> So I would suggest to follow this advice for now and only refactor the 
>>>>>>> implementation eventually, when further pairs of algorithms are 
>>>>>>> combined in the same way.
>>>>>>> 
>>>>>>> Best,
>>>>>>> Sebastian
>>>>>>> 
>>>>>>> 
>>>>>>>>> On 29. Jun 2025, at 12:02, Sebastian Stenzel 
>>>>>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On 28. Jun 2025, at 00:12, Wei-Jun Wang <weijun.w...@oracle.com> 
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> [...] After all, there is no parameter for X-Wing. Did you hear the 
>>>>>>>>> authors they want to introduce other algorithms like ed448 and 
>>>>>>>>> ML-KEM-1024 into it?
>>>>>>>> 
>>>>>>>> I forwarded this question and let you know the answer!
>>>>>>>> 
>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> On 7. Jun 2025, at 23:34, Wei-Jun Wang <weijun.w...@oracle.com> 
>>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> Cool.
>>>>>>>>>>> 
>>>>>>>>>>> The current NamedPKCS8Key was designed based on an older approach 
>>>>>>>>>>> where modern asymmetric keys store private key data in a nested 
>>>>>>>>>>> OCTET STRING format. This pattern was introduced with EdDSA and 
>>>>>>>>>>> XDH, and at the time of JDK 24, we anticipated it would become the 
>>>>>>>>>>> norm.
>>>>>>>>>>> 
>>>>>>>>>>> However, things have changed significantly, as seen in the 
>>>>>>>>>>> evolution of draft-ietf-lamps-dilithium-certificates and 
>>>>>>>>>>> draft-ietf-lamps-kyber-certificates. The original design now needs 
>>>>>>>>>>> to be revised. While we’re still waiting for the IETF drafts to be 
>>>>>>>>>>> finalized, we’re already experimenting with changes in 
>>>>>>>>>>> https://github.com/openjdk/jdk/pull/24969.
>>>>>>>>>>> 
>>>>>>>>>>> Hopefully, by the time X-Wing is finalized, we’ll already have a 
>>>>>>>>>>> solution in place.
>>>>>>>>>>> 
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Weijun
>>>>>>>>>>> 
>>>>>>>>>>>> On Jun 7, 2025, at 16:14, Sebastian Stenzel 
>>>>>>>>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Hi Weijun,
>>>>>>>>>>>> 
>>>>>>>>>>>> I got a mostly working implementation based on NamedKEM [0], 
>>>>>>>>>>>> however to fulfil the spec I need your advice:
>>>>>>>>>>>> 
>>>>>>>>>>>> The (current) X-Wing spec wants this PKCS#8 encoding: [1]
>>>>>>>>>>>> 
>>>>>>>>>>>> However, the NamedPKCS8Key implementation always puts a nested 
>>>>>>>>>>>> OctetString into the private key part. [2]
>>>>>>>>>>>> 
>>>>>>>>>>>> Note the difference here:
>>>>>>>>>>>> * 
>>>>>>>>>>>> https://lapo.it/asn1js/#MDQCAQAwDQYLKwYBBAGD5i2ByHoEIAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4f
>>>>>>>>>>>> * 
>>>>>>>>>>>> https://lapo.it/asn1js/#MDYCAQAwDQYLKwYBBAGD5i2ByHoEIgQg9IFQEyQtdLJL8j-hRm6Yzx3CzFiDyNk4yCADl6ZiXWo
>>>>>>>>>>>> 
>>>>>>>>>>>> I believe we need some more flexibility, as the ASN.1 standard 
>>>>>>>>>>>> leaves it open to the algorithms how a private key is formatted. 
>>>>>>>>>>>> What do you think how to approach this?
>>>>>>>>>>>> 
>>>>>>>>>>>> Or should I ask the authors whether they have a specific encoding 
>>>>>>>>>>>> in mind? The ASN.1 definitions in the spec don’t seem to be 
>>>>>>>>>>>> complete yet.
>>>>>>>>>>>> 
>>>>>>>>>>>> Best regards,
>>>>>>>>>>>> Sebastian
>>>>>>>>>>>> 
>>>>>>>>>>>> [0]: 
>>>>>>>>>>>> https://github.com/openjdk/jdk/compare/master...overheadhunter:jdk:x-wing
>>>>>>>>>>>> [1]: 
>>>>>>>>>>>> https://www.ietf.org/archive/id/draft-connolly-cfrg-xwing-kem-07.html#appendix-D
>>>>>>>>>>>> [2]: 
>>>>>>>>>>>> https://github.com/openjdk/jdk/blob/d7352559195b9e052c3eb24d773c0d6c10dc23ad/src/java.base/share/classes/sun/security/pkcs/NamedPKCS8Key.java#L76-L81
>>>>>>>>>>>> 
>>>>>>>>>>>>> On 30. May 2025, at 15:03, Wei-Jun Wang <weijun.w...@oracle.com> 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On May 30, 2025, at 08:40, Sebastian Stenzel 
>>>>>>>>>>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Hi Weijun,
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> waiting for the final standard is understandable. The internals 
>>>>>>>>>>>>>> may still change, but the „outer hull“ of the PR is something 
>>>>>>>>>>>>>> that could already be discussed before - under these premises, 
>>>>>>>>>>>>>> would it make sense to already start a draft? Knowing that it 
>>>>>>>>>>>>>> won’t be merged yet?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Feel free to start a draft if you’d like. I'll create a JBS issue 
>>>>>>>>>>>>> once we decide we want to include it in the JDK.
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I have a working set of KeyPairGenerator, KeyFactory and KEM SPI 
>>>>>>>>>>>>>> including test vectors basically ready - just SHAKE256 currently 
>>>>>>>>>>>>>> borrowed from BC.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I know that using SHAKE256 within the JDK is not a problem. 
>>>>>>>>>>>>>> However if we want to make it public, there simply *is no* XOF 
>>>>>>>>>>>>>> API in JCA. Technically the expand step of the KDF API can be 
>>>>>>>>>>>>>> used, but semantically that would be a misuse. Adding a 
>>>>>>>>>>>>>> completely new API is nothing I currently want to work on.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I see.
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Btw I am somewhat familiar with the development process as I 
>>>>>>>>>>>>>> have started contributing to the JDK in 2021 on cipher and NIO 
>>>>>>>>>>>>>> issues. [1]
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Nice to know. Sorry I didn't noticed that earlier.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> Weijun
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> [1] 
>>>>>>>>>>>>>> https://github.com/openjdk/jdk/pulls?q=is%3Apr+author%3Aoverheadhunter
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On 29. May 2025, at 18:44, Wei-Jun Wang 
>>>>>>>>>>>>>>> <weijun.w...@oracle.com> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Hi Sebastian.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On May 24, 2025, at 05:40, Sebastian Stenzel 
>>>>>>>>>>>>>>>> <sebastian.sten...@gmail.com> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> For the past few months I have been in contact with one of the 
>>>>>>>>>>>>>>>> authors of two spec drafts for future JOSE encryption 
>>>>>>>>>>>>>>>> standards [1] [2] with the latter of them relying on X-Wing.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> As the X-Wing spec doesn’t face significant changes any more 
>>>>>>>>>>>>>>>> (there have been some larger shifts in regards to secret key 
>>>>>>>>>>>>>>>> derivation last year), I am now tasked to create a prototype 
>>>>>>>>>>>>>>>> implementation for these RFCs.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Thanks for your continued interest on enhancing OpenJDK.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> That said, we have a policy of not implementing algorithms that 
>>>>>>>>>>>>>>> haven't been standardized. So we won't be able to consider your 
>>>>>>>>>>>>>>> contribution until IETF publishes draft-connolly-cfrg-xwing-kem 
>>>>>>>>>>>>>>> as an RFC. I'm not sure how familiar you are with the OpenJDK 
>>>>>>>>>>>>>>> developing process, but in the meantime, you might find it 
>>>>>>>>>>>>>>> helpful to read the OpenJDK Developers’ Guide [1] and try 
>>>>>>>>>>>>>>> working on something smaller first.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> All the primitives for X-Wing are technically already there in 
>>>>>>>>>>>>>>>> OpenJDK, however two of them are private API (namely SHAKE256 
>>>>>>>>>>>>>>>> and ML-KEM’s `KeyGen_internal(d, z)` [3]). So the question 
>>>>>>>>>>>>>>>> arises whether I can contribute an X-Wing KEM implementation 
>>>>>>>>>>>>>>>> to the JDK at the current state of the spec?
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> It's acceptable to use private API inside OpenJDK when you are 
>>>>>>>>>>>>>>> working on OpenJDK itself. After all, we created them for this 
>>>>>>>>>>>>>>> very purpose. However, please keep in mind that this means you 
>>>>>>>>>>>>>>> bind your X-Wing implementation to the SunJCE/SunEC 
>>>>>>>>>>>>>>> implementations. Usually, as a higher-level algorithm, if its 
>>>>>>>>>>>>>>> underlying algorithms could be implemented by different 
>>>>>>>>>>>>>>> security providers, it will be nice to make it provider-neutral 
>>>>>>>>>>>>>>> where possible.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Alternatively, can we make the two mentioned APIs public?
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> No. These methods are too specific to their respective 
>>>>>>>>>>>>>>> algorithms. We prefer JCA/JCE-style API that is 
>>>>>>>>>>>>>>> algorithm-neutral.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> [1] https://openjdk.org/guide/
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>> Weijun
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Cheers!
>>>>>>>>>>>>>>>> Sebastian
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> [1]: 
>>>>>>>>>>>>>>>> https://datatracker.ietf.org/doc/html/draft-ietf-jose-hpke-encrypt/
>>>>>>>>>>>>>>>> [2]: 
>>>>>>>>>>>>>>>> https://datatracker.ietf.org/doc/html/draft-reddy-cose-jose-pqc-hybrid-hpke-07
>>>>>>>>>>>>>>>> [3]: 
>>>>>>>>>>>>>>>> https://github.com/openjdk/jdk/blob/070c84cd22485a93a562a7639439fb056e840861/src/java.base/share/classes/com/sun/crypto/provider/ML_KEM.java#L498-L536
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to