1818 *
1919 * Description: FIPS 204: Algorithm 6 ML-DSA.KeyGen_internal.
2020 * Generates public and private key. Internal API.
21+ * When MLD_CONFIG_KEYGEN_PCT is set, performs a Pairwise
22+ * Consistency Test (PCT) as required by FIPS 140-3 IG.
2123 *
2224 * Arguments: - uint8_t *pk: pointer to output public key (allocated
2325 * array of CRYPTO_PUBLICKEYBYTES bytes)
2628 * - uint8_t *seed: pointer to input random seed (MLDSA_SEEDBYTES
2729 * bytes)
2830 *
29- * Returns 0 (success)
31+ * Returns 0 (success) or -1 (PCT failure)
3032 **************************************************/
3133int crypto_sign_keypair_internal (uint8_t * pk , uint8_t * sk ,
3234 const uint8_t seed [MLDSA_SEEDBYTES ])
@@ -36,6 +38,7 @@ __contract__(
3638 requires (memory_no_alias (seed , MLDSA_SEEDBYTES ))
3739 assigns (object_whole (pk ))
3840 assigns (object_whole (sk ))
41+ ensures (return_value == 0 || return_value == -1 )
3942);
4043
4144#define crypto_sign_keypair MLD_NAMESPACE(keypair)
@@ -44,20 +47,23 @@ __contract__(
4447 *
4548 * Description: FIPS 204: Algorithm 1 ML-DSA.KeyGen
4649 * Generates public and private key.
50+ * When MLD_CONFIG_KEYGEN_PCT is set, performs a Pairwise
51+ * Consistency Test (PCT) as required by FIPS 140-3 IG.
4752 *
4853 * Arguments: - uint8_t *pk: pointer to output public key (allocated
4954 * array of CRYPTO_PUBLICKEYBYTES bytes)
5055 * - uint8_t *sk: pointer to output private key (allocated
5156 * array of CRYPTO_SECRETKEYBYTES bytes)
5257 *
53- * Returns 0 (success)
58+ * Returns 0 (success) or -1 (PCT failure)
5459 **************************************************/
5560int crypto_sign_keypair (uint8_t * pk , uint8_t * sk )
5661__contract__ (
5762 requires (memory_no_alias (pk , CRYPTO_PUBLICKEYBYTES ))
5863 requires (memory_no_alias (sk , CRYPTO_SECRETKEYBYTES ))
5964 assigns (object_whole (pk ))
6065 assigns (object_whole (sk ))
66+ ensures (return_value == 0 || return_value == -1 )
6167);
6268
6369#define crypto_sign_signature_internal MLD_NAMESPACE(signature_internal)
@@ -117,8 +123,9 @@ __contract__(
117123 * - size_t *siglen: pointer to output length of signature
118124 * - uint8_t *m: pointer to message to be signed
119125 * - size_t mlen: length of message
120- * - uint8_t *ctx: pointer to contex string
121- * - size_t ctxlen: length of contex string. Should be <= 255.
126+ * - uint8_t *ctx: pointer to context string. May be NULL
127+ * iff ctxlen == 0
128+ * - size_t ctxlen: length of context string. Should be <= 255.
122129 * - uint8_t *sk: pointer to bit-packed secret key
123130 *
124131 * Returns 0 (success) or -1 (context string too long OR nonce exhaustion)
@@ -130,7 +137,7 @@ __contract__(
130137 requires (memory_no_alias (sig , CRYPTO_BYTES ))
131138 requires (memory_no_alias (siglen , sizeof (size_t )))
132139 requires (memory_no_alias (m , mlen ))
133- requires (memory_no_alias (ctx , ctxlen ))
140+ requires (( ctx == NULL && ctxlen == 0 ) || memory_no_alias (ctx , ctxlen ))
134141 requires (memory_no_alias (sk , CRYPTO_SECRETKEYBYTES ))
135142 assigns (memory_slice (sig , CRYPTO_BYTES ))
136143 assigns (object_whole (siglen ))
@@ -243,6 +250,7 @@ __contract__(
243250 * - const uint8_t *m: pointer to message
244251 * - size_t mlen: length of message
245252 * - const uint8_t *ctx: pointer to context string
253+ * May be NULL iff ctxlen == 0
246254 * - size_t ctxlen: length of context string
247255 * - const uint8_t *pk: pointer to bit-packed public key
248256 *
@@ -254,7 +262,7 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m,
254262__contract__ (
255263 requires (memory_no_alias (sig , siglen ))
256264 requires (memory_no_alias (m , mlen ))
257- requires (memory_no_alias (ctx , ctxlen ))
265+ requires (( ctx == NULL && ctxlen == 0 ) || memory_no_alias (ctx , ctxlen ))
258266 requires (memory_no_alias (pk , CRYPTO_PUBLICKEYBYTES ))
259267 ensures (return_value == 0 || return_value == -1 )
260268);
0 commit comments