X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Ftest_crypto_paillier.c;h=9950978c147605cfb8ec160f1a5f825114a1aa6d;hb=225ea594e86e56160b0f89b5cace24291cc6184b;hp=aaefd5ac0e59855b0a21a41d2a3076df5078d8d9;hpb=1d5ab4f4f4fe1d86a10cd9bd95464dcfbff3da8e;p=oweals%2Fgnunet.git diff --git a/src/util/test_crypto_paillier.c b/src/util/test_crypto_paillier.c index aaefd5ac0..9950978c1 100644 --- a/src/util/test_crypto_paillier.c +++ b/src/util/test_crypto_paillier.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2014 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -29,8 +29,104 @@ #include -int -main (int argc, char *argv[]) +static int +test_crypto () +{ + gcry_mpi_t plaintext; + gcry_mpi_t plaintext_result; + struct GNUNET_CRYPTO_PaillierCiphertext ciphertext; + struct GNUNET_CRYPTO_PaillierPublicKey public_key; + struct GNUNET_CRYPTO_PaillierPrivateKey private_key; + + GNUNET_CRYPTO_paillier_create (&public_key, + &private_key); + GNUNET_assert (NULL != (plaintext = gcry_mpi_new (0))); + GNUNET_assert (NULL != (plaintext_result = gcry_mpi_new (0))); + gcry_mpi_randomize (plaintext, + GNUNET_CRYPTO_PAILLIER_BITS / 2, + GCRY_WEAK_RANDOM); + + GNUNET_CRYPTO_paillier_encrypt (&public_key, + plaintext, + 0 /* 0 hom ops */, + &ciphertext); + GNUNET_CRYPTO_paillier_decrypt (&private_key, + &public_key, + &ciphertext, + plaintext_result); + + if (0 != gcry_mpi_cmp (plaintext, + plaintext_result)) + { + fprintf (stderr, + "Paillier decryption failed with plaintext of size %u\n", + gcry_mpi_get_nbits (plaintext)); + gcry_log_debugmpi ("\n", + plaintext); + gcry_log_debugmpi ("\n", + plaintext_result); + return 1; + } + return 0; +} + + +static int +test_hom_simple (unsigned int a, + unsigned int b) +{ + gcry_mpi_t m1; + gcry_mpi_t m2; + gcry_mpi_t result; + gcry_mpi_t hom_result; + struct GNUNET_CRYPTO_PaillierCiphertext c1; + struct GNUNET_CRYPTO_PaillierCiphertext c2; + struct GNUNET_CRYPTO_PaillierCiphertext c_result; + struct GNUNET_CRYPTO_PaillierPublicKey public_key; + struct GNUNET_CRYPTO_PaillierPrivateKey private_key; + + GNUNET_CRYPTO_paillier_create (&public_key, + &private_key); + + GNUNET_assert (NULL != (m1 = gcry_mpi_new (0))); + GNUNET_assert (NULL != (m2 = gcry_mpi_new (0))); + GNUNET_assert (NULL != (result = gcry_mpi_new (0))); + GNUNET_assert (NULL != (hom_result = gcry_mpi_new (0))); + m1 = gcry_mpi_set_ui (m1, a); + m2 = gcry_mpi_set_ui (m2, b); + gcry_mpi_add (result, + m1, + m2); + GNUNET_CRYPTO_paillier_encrypt (&public_key, + m1, + 2, + &c1); + GNUNET_CRYPTO_paillier_encrypt (&public_key, + m2, + 2, + &c2); + GNUNET_CRYPTO_paillier_hom_add (&public_key, + &c1, + &c2, + &c_result); + GNUNET_CRYPTO_paillier_decrypt (&private_key, + &public_key, + &c_result, + hom_result); + if (0 != gcry_mpi_cmp (result, hom_result)) + { + fprintf (stderr, + "GNUNET_CRYPTO_paillier failed simple math!\n"); + gcry_log_debugmpi ("got ", hom_result); + gcry_log_debugmpi ("wanted ", result); + return 1; + } + return 0; +} + + +static int +test_hom () { int ret; gcry_mpi_t m1; @@ -42,48 +138,93 @@ main (int argc, char *argv[]) struct GNUNET_CRYPTO_PaillierCiphertext c_result; struct GNUNET_CRYPTO_PaillierPublicKey public_key; struct GNUNET_CRYPTO_PaillierPrivateKey private_key; - - GNUNET_CRYPTO_paillier_create (&public_key, &private_key); + + GNUNET_CRYPTO_paillier_create (&public_key, + &private_key); GNUNET_assert (NULL != (m1 = gcry_mpi_new (0))); GNUNET_assert (NULL != (m2 = gcry_mpi_new (0))); GNUNET_assert (NULL != (result = gcry_mpi_new (0))); GNUNET_assert (NULL != (hom_result = gcry_mpi_new (0))); - //gcry_mpi_randomize (m1, GNUNET_CRYPTO_PAILLIER_BITS-2, GCRY_WEAK_RANDOM); - m1 = gcry_mpi_set_ui(m1,1); - gcry_mpi_mul_2exp(m1,m1,GNUNET_CRYPTO_PAILLIER_BITS-2); - //gcry_mpi_randomize (m2, GNUNET_CRYPTO_PAILLIER_BITS-2, GCRY_WEAK_RANDOM); - m2 = gcry_mpi_set_ui(m2,1); - gcry_mpi_mul_2exp(m2,m2,GNUNET_CRYPTO_PAILLIER_BITS-2); - gcry_mpi_add(result,m1,m2); - - if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, m1, &c1))){ - printf ("GNUNET_CRYPTO_paillier_encrypt 1 failed, should return 1 allowed operation, got %d!\n", ret); + m1 = gcry_mpi_set_ui (m1, 1); + /* m1 = m1 * 2 ^ (GCPB - 3) */ + gcry_mpi_mul_2exp (m1, + m1, + GNUNET_CRYPTO_PAILLIER_BITS - 3); + m2 = gcry_mpi_set_ui (m2, 15); + /* m1 = m1 * 2 ^ (GCPB / 2) */ + gcry_mpi_mul_2exp (m2, + m2, + GNUNET_CRYPTO_PAILLIER_BITS / 2); + gcry_mpi_add (result, + m1, + m2); + + if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, + m1, + 2, + &c1))) + { + fprintf (stderr, + "GNUNET_CRYPTO_paillier_encrypt 1 failed, should return 1 allowed operation, got %d!\n", + ret); return 1; } - if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, m2, &c2))){ - printf ("GNUNET_CRYPTO_paillier_encrypt 2 failed, should return 1 allowed operation, got %d!\n", ret); + if (2 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, + m2, + 2, + &c2))) + { + fprintf (stderr, + "GNUNET_CRYPTO_paillier_encrypt 2 failed, should return 2 allowed operation, got %d!\n", + ret); return 1; } - - GNUNET_CRYPTO_paillier_encrypt (&public_key, m2, &c2); - if (0 != (ret = GNUNET_CRYPTO_paillier_hom_add (&public_key, &c1,&c2, &c_result))){ - printf ("GNUNET_CRYPTO_paillier_hom_add failed, expected 0 remaining operations, got %d!\n", ret); + if (0 != (ret = GNUNET_CRYPTO_paillier_hom_add (&public_key, + &c1, + &c2, + &c_result))) + { + fprintf (stderr, + "GNUNET_CRYPTO_paillier_hom_add failed, expected 0 remaining operations, got %d!\n", + ret); return 1; } - - GNUNET_CRYPTO_paillier_decrypt (&private_key, &public_key, - &c_result, hom_result); - - gcry_log_debugmpi("\n", hom_result); - gcry_log_debugmpi("\n", result); - if (0 != gcry_mpi_cmp(result, hom_result)){ - printf ("GNUNET_CRYPTO_paillier miscalculated!\n"); + + GNUNET_CRYPTO_paillier_decrypt (&private_key, + &public_key, + &c_result, + hom_result); + + if (0 != gcry_mpi_cmp (result, hom_result)) + { + fprintf (stderr, + "GNUNET_CRYPTO_paillier miscalculated with large numbers!\n"); + gcry_log_debugmpi ("got", hom_result); + gcry_log_debugmpi ("wanted", result); return 1; } - return 0; } -/* end of test_crypto_paillier.c */ \ No newline at end of file + +int +main (int argc, + char *argv[]) +{ + int ret; + ret = test_crypto (); + if (0 != ret) + return ret; + ret = test_hom_simple (2,4); + if (0 != ret) + return ret; + ret = test_hom_simple (13,17); + if (0 != ret) + return ret; + ret = test_hom (); + return ret; +} + +/* end of test_crypto_paillier.c */