From: Simo Sorce Date: Mon, 15 Oct 2018 20:01:52 +0000 (-0400) Subject: Unit test for rsa_sec_decyrpt X-Git-Tag: nettle_3.4.1rc1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9a7756280046a508cfa290d27537672531cacd4;p=thirdparty%2Fnettle.git Unit test for rsa_sec_decyrpt Signed-off-by: Simo Sorce --- diff --git a/testsuite/.gitignore b/testsuite/.gitignore index fb8ecc54..53ffff96 100644 --- a/testsuite/.gitignore +++ b/testsuite/.gitignore @@ -65,6 +65,7 @@ /pss-test /random-prime-test /ripemd160-test +/rsa-sec-decrypt-test /rsa-encrypt-test /rsa-keygen-test /rsa-pss-sign-tr-test diff --git a/testsuite/.test-rules.make b/testsuite/.test-rules.make index e2f0b465..cc03851e 100644 --- a/testsuite/.test-rules.make +++ b/testsuite/.test-rules.make @@ -211,6 +211,9 @@ rsa-encrypt-test$(EXEEXT): rsa-encrypt-test.$(OBJEXT) rsa-keygen-test$(EXEEXT): rsa-keygen-test.$(OBJEXT) $(LINK) rsa-keygen-test.$(OBJEXT) $(TEST_OBJS) -o rsa-keygen-test$(EXEEXT) +rsa-sec-decrypt-test$(EXEEXT): rsa-sec-decrypt-test.$(OBJEXT) + $(LINK) rsa-sec-decrypt-test.$(OBJEXT) $(TEST_OBJS) -o rsa-sec-decrypt-test$(EXEEXT) + dsa-test$(EXEEXT): dsa-test.$(OBJEXT) $(LINK) dsa-test.$(OBJEXT) $(TEST_OBJS) -o dsa-test$(EXEEXT) diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in index aa594a24..ecb2f69f 100644 --- a/testsuite/Makefile.in +++ b/testsuite/Makefile.in @@ -40,6 +40,7 @@ TS_HOGWEED_SOURCES = sexp-test.c sexp-format-test.c \ pss-test.c rsa-sign-tr-test.c \ pss-mgf1-test.c rsa-pss-sign-tr-test.c \ rsa-test.c rsa-encrypt-test.c rsa-keygen-test.c \ + rsa-sec-decrypt-test.c \ dsa-test.c dsa-keygen-test.c \ curve25519-dh-test.c \ ecc-mod-test.c ecc-modinv-test.c ecc-redc-test.c \ diff --git a/testsuite/rsa-sec-decrypt-test.c b/testsuite/rsa-sec-decrypt-test.c new file mode 100644 index 00000000..ea5494d4 --- /dev/null +++ b/testsuite/rsa-sec-decrypt-test.c @@ -0,0 +1,110 @@ +#include "testutils.h" + +#include "rsa.h" +#include "knuth-lfib.h" + +#if HAVE_VALGRIND_MEMCHECK_H +# include + +#define MARK_MPZ_LIMBS_UNDEFINED(parm) \ + VALGRIND_MAKE_MEM_UNDEFINED (mpz_limbs_read (parm), \ + mpz_size (parm) * sizeof (mp_limb_t)) +#define MARK_MPZ_LIMBS_DEFINED(parm) \ + VALGRIND_MAKE_MEM_DEFINED (mpz_limbs_read (parm), \ + mpz_size (parm) * sizeof (mp_limb_t)) +static int +rsa_decrypt_for_test(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t length, uint8_t *message, + const mpz_t gibberish) +{ + int ret; + /* Makes valgrind trigger on any branches depending on the input + data. */ + VALGRIND_MAKE_MEM_UNDEFINED (message, length); + MARK_MPZ_LIMBS_UNDEFINED(gibberish); + MARK_MPZ_LIMBS_UNDEFINED(key->a); + MARK_MPZ_LIMBS_UNDEFINED(key->b); + MARK_MPZ_LIMBS_UNDEFINED(key->c); + MARK_MPZ_LIMBS_UNDEFINED(key->p); + MARK_MPZ_LIMBS_UNDEFINED(key->q); + + ret = rsa_sec_decrypt (pub, key, random_ctx, random, length, message, gibberish); + + VALGRIND_MAKE_MEM_DEFINED (message, length); + MARK_MPZ_LIMBS_DEFINED(gibberish); + MARK_MPZ_LIMBS_DEFINED(key->a); + MARK_MPZ_LIMBS_DEFINED(key->b); + MARK_MPZ_LIMBS_DEFINED(key->c); + MARK_MPZ_LIMBS_DEFINED(key->p); + MARK_MPZ_LIMBS_DEFINED(key->q); + + return ret; +} +#else +#define rsa_decrypt_for_test rsa_sec_decrypt +#endif + +#define PAYLOAD_SIZE 50 +void +test_main(void) +{ + struct rsa_public_key pub; + struct rsa_private_key key; + struct knuth_lfib_ctx random_ctx; + + uint8_t plaintext[PAYLOAD_SIZE]; + uint8_t decrypted[PAYLOAD_SIZE]; + uint8_t verifybad[PAYLOAD_SIZE]; + unsigned n_size = 1024; + mpz_t gibberish; + mpz_t garbage; + + rsa_private_key_init(&key); + rsa_public_key_init(&pub); + mpz_init(gibberish); + mpz_init(garbage); + + knuth_lfib_init (&random_ctx, 19); + + memset(verifybad, 'A', PAYLOAD_SIZE); + + for (size_t size = 1; size < 51; size++) + { + ASSERT (rsa_generate_keypair(&pub, &key, &random_ctx, + (nettle_random_func *) knuth_lfib_random, + NULL, NULL, n_size, 17)); + + /* the next key will be 19 bits larger */ + n_size += 19; + + knuth_lfib_random (&random_ctx, PAYLOAD_SIZE, plaintext); + ASSERT(rsa_encrypt(&pub, &random_ctx, + (nettle_random_func *) knuth_lfib_random, + PAYLOAD_SIZE, plaintext, gibberish)); + + /* good decryption */ + ASSERT (rsa_decrypt_for_test (&pub, &key, &random_ctx, + (nettle_random_func *) knuth_lfib_random, + PAYLOAD_SIZE, decrypted, gibberish) == 1); + ASSERT (MEMEQ (PAYLOAD_SIZE, plaintext, decrypted)); + + /* bad one */ + memcpy(decrypted, verifybad, PAYLOAD_SIZE); + nettle_mpz_random_size(garbage, &random_ctx, + (nettle_random_func *) knuth_lfib_random, + mpz_sizeinbase(gibberish, 2)); + + ASSERT (rsa_decrypt_for_test (&pub, &key, &random_ctx, + (nettle_random_func *) knuth_lfib_random, + PAYLOAD_SIZE, decrypted, garbage) == 0); + ASSERT (MEMEQ (PAYLOAD_SIZE, verifybad, decrypted)); + } + + rsa_private_key_clear(&key); + rsa_public_key_clear(&pub); + mpz_clear(gibberish); + mpz_clear(garbage); +} +