Dear Forum Members,
I am an undergraduate student working on implementing CRYSTALS-Dilithium. I have thoroughly reviewed both the CRYSTALS-Dilithium 3.1 specification and the FIPS 204 draft. Since CRYSTALS-Dilithium 3.1 is the standardized version and FIPS 204 has been withdrawn, I understand that I should focus on the standardized version.
However, I’ve encountered a challenge. For example, in the key generation algorithm functions like ExpandA, in the CRYSTALS-Dilithium 3.1 specification they are explained theoretically, without accompanying pseudocode. In contrast, FIPS 204 includes pseudocode for functions such as ExpandA etc.
Given this, I wanted to ask: Is it acceptable to reference and use the pseudocode from FIPS 204 for functions like ExpandA while still adhering to the algorithms in CRYSTALS-Dilithium 3.1, or should I strictly stick to the theoretical explanations provided in the standardized document?
Thank you for your guidance.
Best regards,
Hafsa Shoaib
Thank you for your guidance.
Best regards,
Hafsa Shoaib
Dear Forum Members,
As I am currently implementing the Dilithium algorithm at security level 5 (ML-DSA-87), which, as per the specification, requires the use of an approved Random Bit Generator (RBG). Given that SP 800-90C is still in draft form, I would like to ask for guidance regarding the choice between SP 800-90A and SP 800-90B.
Specifically, could you advise whether I should prefer implementing the RBG specified in SP 800-90A or SP 800-90B for this purpose?
Thank you for your assistance.
Best regards,
Hafsa Shoaib
Dear Forum Members,
As I am currently implementing the Dilithium algorithm at security level 5 (ML-DSA-87), which, as per the specification, requires the use of an approved Random Bit Generator (RBG). Given that SP 800-90C is still in draft form, I would like to ask for guidance regarding the choice between SP 800-90A and SP 800-90B.
Specifically, could you advise whether I should prefer implementing the RBG specified in SP 800-90A or SP 800-90B for this purpose?
Thank you for your assistance.
Best regards,
Hafsa ShoaibOn Saturday 14 September 2024 at 19:19:16 UTC+5 Stephan Mueller wrote:Am Samstag, 14. September 2024, 09:12:04 GMT-5 schrieb HAFSA SHOAIB:
Hi HAFSA,
> Dear Forum Members,
>
> I want to ask about the final FIPS 204 specification, which includes two
> closely related but domain-separated signature schemes: HashML-DSA and
> ML-DSA. HashML-DSA only adds a pre-hashing step before signing. Since my
> goal is to implement Dilithium, should I focus solely on implementing
> ML-DSA, or do I need to include the HashML-DSA algorithm as well?
>
> Thank you for your guidance.
This depends on your use case. Commonly you want pure ML-DSA - and that is
also explicitly the preferred method as stated in FIPS 204. But if you have,
say, a smartcard with ML-DSA with a small link to a host where you cannot send
gigabytes of data over, you perhaps want the HashML-DSA where the host hashes
the gigabytes of data and only sends the message digest over the small link to
your smart card.
Ciao
Stephan
--
You received this message because you are subscribed to the Google Groups "pqc-forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pqc-forum+...@list.nist.gov.
To view this discussion on the web visit https://groups.google.com/a/list.nist.gov/d/msgid/pqc-forum/36d4509a-89b6-4020-a53a-a1236b510295n%40list.nist.gov.
Yes, I understand that SP 800-90C specifies the combination of a DRBG (from SP 800-90A) and entropy sources (from SP 800-90B). However, since SP 800-90C is still in draft form, I need to work with the standardized versions for now. :)
Dear Forum Members,
I've implemented the key generation algorithm of Dilithum/ml-dsa in Python and now want to verify if it's correct. Are there any benchmarks or ways to check this? The lengths of the public and secret keys match the FIPS 204 final standard
Thank you for your assistance.
Best regards,
Hafsa Shoaib
Hi Stephan,
Thank you for your response and for sharing the links to the test vectors...I follow the [1] a list of vectors from NIST.
I have a follow-up question regarding the key generation process for verification purposes. As the key generation algorithm involves generating a seed through an RBG (Random Bit Generator), I understand that for testing, a predefined seed is used along with the expected public and secret keys.
However, I am wondering how the output of the key generation algorithm will match the expected output, given that the algorithm includes hashing operations (such as through SHAKE) which are sensitive to even small changes in input. Could you clarify how the randomized process ensures that the outputs (public and secret keys) are identical to the expected ones in the provided test vectors?
Best regards,
Hafsa
--
You received this message because you are subscribed to the Google Groups "pqc-forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pqc-forum+...@list.nist.gov.
To view this discussion on the web visit https://groups.google.com/a/list.nist.gov/d/msgid/pqc-forum/10131766.37r6zqXVbV%40tauon.atsec.com.
Thank you again for your helpful insights.
I’ve been focusing on this folder:
https://github.com/usnistgov/ACVP-Server/blob/master/gen-val/json-files/ML-DSA-keyGen-FIPS204/
However, I’m unable to locate fields such as sk_seed, sk_prf, and pk_seed in the files within this directory.
Interestingly, I did find these values in the following folder:
https://github.com/usnistgov/ACVP-Server/tree/master/gen-val/json-files/SLH-DSA-keyGen-FIPS205
Could you please clarify if there is another recommended approach to retrieve these key generation parameters?
I appreciate your guidance.
Best regards,
Hafsa
Hi Stephan,
Its Ok,
For ML-DSA, we have a seed that used directly by the ML-DSA.Keygen_internal as the "random number".
However, I am wondering how the output of the key generation algorithm will match the expected output, given that the algorithm includes hashing operations (such as through SHAKE) which are sensitive to even small changes in input. Could you clarify how the randomized process ensures that the outputs (public and secret keys) are identical to the expected ones in the provided test vectors?.. or whats your thought on that?
Best regards,
Hafsa
Hi Stephan,
Hmm I understand.
However, it would be helpful if the test vectors provided intermediate outputs at various steps of the algorithm, rather than just the final public and secret keys. This would allow for better debugging and diagnosing of any issues during failed test cases, making it easier to identify where things might go wrong.
What are your thoughts on this?
Best regards,
Hafsa
--
You received this message because you are subscribed to the Google Groups "pqc-forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pqc-forum+...@list.nist.gov.
To view this discussion on the web visit https://groups.google.com/a/list.nist.gov/d/msgid/pqc-forum/6f1e6436-9908-4a18-9781-4200eaadbe2cn%40list.nist.gov.
--
You received this message because you are subscribed to the Google Groups "pqc-forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pqc-forum+...@list.nist.gov.
To view this discussion on the web visit https://groups.google.com/a/list.nist.gov/d/msgid/pqc-forum/3039966.hnj0FZ9ARc%40tauon.atsec.com.
I'm also in the group of Hafsa Shoaib, we have verified our software code for Dilithium (Key Algorithm) using the ACVP Server JSON files ACVP-Server and PyCryptodome for SHAKE256.
As we are developing a hardware accelerator for Dilithium, and our hardware SHAKE256 implementation matches the NIST standard. But the Python-based SHAKE256 outputs differ when testing a 0-bit message with SHAKE256 (as per this NIST example), the output does not match the NIST document.. How can I verify my hardware if the Python output is inconsistent with NIST?
Best regards,
Asfiyan
![]() |