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