liboqs/src/sig/uov/sig_uov_ov_Ip.c
Marco Gianvecchio 8ee6039c74
Add bitflip test for trivial SUF-CMA forgeries (#2090)
* add bitflip test to test_sig.c
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* format code
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* - add sig->suf_cma
- add command-line argument to test_sig.c (the number of bitflips)
- update CROSS upstream to SUF-CMA
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* %d to %ld for size_t bitflips

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* cast argument bitflips to size_t
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* replace atoi() with strtol()
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* cast bit_index to %llu

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* update bitflip tests:
- revert CROSS to EUF-CMA
- add test_bitflip_message
- exclude stateful signatures for now
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* remove bitflips_as_str in printf
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* test_bitflip as a single function, add support for stateful signatures
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* add OQS_TEST_CT_DECLASSIFY after test_bitflip_stfl
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* [extended tests]
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* more OQS_TEST_CT_DECLASSIFY [extended tests]
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* patch dilithium to add suf-cma
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* run copy_from_upstream.py
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* SUF-CMA in dilithium docs, run copy_from_upstream.py
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* correct sizeof in OQS_randombytes call (thank you @SWilson4!)
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* factor bitflip testing functions out into test_helpers.c
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* --allow-multiple-definition for Windows .dll in test_kem_mem
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

* --allow-multiple-definition for Windows .dll in test_sig and test_sig_stfl
Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>

---------

Signed-off-by: rtjk <47841774+rtjk@users.noreply.github.com>
2025-03-14 11:53:05 -04:00

145 lines
5.8 KiB
C

// SPDX-License-Identifier: MIT
#include <stdlib.h>
#include <oqs/sig_uov.h>
#if defined(OQS_ENABLE_SIG_uov_ov_Ip)
OQS_SIG *OQS_SIG_uov_ov_Ip_new(void) {
OQS_SIG *sig = OQS_MEM_malloc(sizeof(OQS_SIG));
if (sig == NULL) {
return NULL;
}
sig->method_name = OQS_SIG_alg_uov_ov_Ip;
sig->alg_version = "Round 2";
sig->claimed_nist_level = 1;
sig->euf_cma = true;
sig->suf_cma = false;
sig->sig_with_ctx_support = false;
sig->length_public_key = OQS_SIG_uov_ov_Ip_length_public_key;
sig->length_secret_key = OQS_SIG_uov_ov_Ip_length_secret_key;
sig->length_signature = OQS_SIG_uov_ov_Ip_length_signature;
sig->keypair = OQS_SIG_uov_ov_Ip_keypair;
sig->sign = OQS_SIG_uov_ov_Ip_sign;
sig->verify = OQS_SIG_uov_ov_Ip_verify;
sig->sign_with_ctx_str = OQS_SIG_uov_ov_Ip_sign_with_ctx_str;
sig->verify_with_ctx_str = OQS_SIG_uov_ov_Ip_verify_with_ctx_str;
return sig;
}
extern int pqov_uov_Ip_ref_keypair(uint8_t *pk, uint8_t *sk);
extern int pqov_uov_Ip_ref_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk);
extern int pqov_uov_Ip_ref_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk);
#if defined(OQS_ENABLE_SIG_uov_ov_Ip_neon)
extern int pqov_uov_Ip_neon_keypair(uint8_t *pk, uint8_t *sk);
extern int pqov_uov_Ip_neon_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk);
extern int pqov_uov_Ip_neon_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk);
#endif
#if defined(OQS_ENABLE_SIG_uov_ov_Ip_avx2)
extern int pqov_uov_Ip_avx2_keypair(uint8_t *pk, uint8_t *sk);
extern int pqov_uov_Ip_avx2_signature(uint8_t *sig, size_t *siglen, const uint8_t *m, size_t mlen, const uint8_t *sk);
extern int pqov_uov_Ip_avx2_verify(const uint8_t *sig, size_t siglen, const uint8_t *m, size_t mlen, const uint8_t *pk);
#endif
OQS_API OQS_STATUS OQS_SIG_uov_ov_Ip_keypair(uint8_t *public_key, uint8_t *secret_key) {
#if defined(OQS_ENABLE_SIG_uov_ov_Ip_neon)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_neon_keypair(public_key, secret_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_keypair(public_key, secret_key);
}
#endif /* OQS_DIST_BUILD */
#elif defined(OQS_ENABLE_SIG_uov_ov_Ip_avx2)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_avx2_keypair(public_key, secret_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_keypair(public_key, secret_key);
}
#endif /* OQS_DIST_BUILD */
#else
return (OQS_STATUS) pqov_uov_Ip_ref_keypair(public_key, secret_key);
#endif
}
OQS_API OQS_STATUS OQS_SIG_uov_ov_Ip_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
#if defined(OQS_ENABLE_SIG_uov_ov_Ip_neon)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_neon_signature(signature, signature_len, message, message_len, secret_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_signature(signature, signature_len, message, message_len, secret_key);
}
#endif /* OQS_DIST_BUILD */
#elif defined(OQS_ENABLE_SIG_uov_ov_Ip_avx2)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_avx2_signature(signature, signature_len, message, message_len, secret_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_signature(signature, signature_len, message, message_len, secret_key);
}
#endif /* OQS_DIST_BUILD */
#else
return (OQS_STATUS) pqov_uov_Ip_ref_signature(signature, signature_len, message, message_len, secret_key);
#endif
}
OQS_API OQS_STATUS OQS_SIG_uov_ov_Ip_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
#if defined(OQS_ENABLE_SIG_uov_ov_Ip_neon)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_ARM_NEON)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_neon_verify(signature, signature_len, message, message_len, public_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_verify(signature, signature_len, message, message_len, public_key);
}
#endif /* OQS_DIST_BUILD */
#elif defined(OQS_ENABLE_SIG_uov_ov_Ip_avx2)
#if defined(OQS_DIST_BUILD)
if (OQS_CPU_has_extension(OQS_CPU_EXT_AVX2)) {
#endif /* OQS_DIST_BUILD */
return (OQS_STATUS) pqov_uov_Ip_avx2_verify(signature, signature_len, message, message_len, public_key);
#if defined(OQS_DIST_BUILD)
} else {
return (OQS_STATUS) pqov_uov_Ip_ref_verify(signature, signature_len, message, message_len, public_key);
}
#endif /* OQS_DIST_BUILD */
#else
return (OQS_STATUS) pqov_uov_Ip_ref_verify(signature, signature_len, message, message_len, public_key);
#endif
}
OQS_API OQS_STATUS OQS_SIG_uov_ov_Ip_sign_with_ctx_str(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *ctx_str, size_t ctx_str_len, const uint8_t *secret_key) {
if (ctx_str == NULL && ctx_str_len == 0) {
return OQS_SIG_uov_ov_Ip_sign(signature, signature_len, message, message_len, secret_key);
} else {
return OQS_ERROR;
}
}
OQS_API OQS_STATUS OQS_SIG_uov_ov_Ip_verify_with_ctx_str(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *ctx_str, size_t ctx_str_len, const uint8_t *public_key) {
if (ctx_str == NULL && ctx_str_len == 0) {
return OQS_SIG_uov_ov_Ip_verify(message, message_len, signature, signature_len, public_key);
} else {
return OQS_ERROR;
}
}
#endif