aboutsummaryrefslogtreecommitdiff
path: root/src/util/test_crypto_paillier.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2014-12-09 20:57:07 +0000
committerChristian Grothoff <christian@grothoff.org>2014-12-09 20:57:07 +0000
commite613b7acfde2427b5ea48f2ac866489f2d9b6589 (patch)
treed00d04e4a8a10473505156ffea7f38a591413084 /src/util/test_crypto_paillier.c
parent82bedb216e21147473795fb43be9cfd48414e7ca (diff)
downloadgnunet-e613b7acfde2427b5ea48f2ac866489f2d9b6589.tar.gz
gnunet-e613b7acfde2427b5ea48f2ac866489f2d9b6589.zip
-fixing paillier bug, improving testcase
Diffstat (limited to 'src/util/test_crypto_paillier.c')
-rw-r--r--src/util/test_crypto_paillier.c178
1 files changed, 139 insertions, 39 deletions
diff --git a/src/util/test_crypto_paillier.c b/src/util/test_crypto_paillier.c
index cd8c77e5e..750eeece1 100644
--- a/src/util/test_crypto_paillier.c
+++ b/src/util/test_crypto_paillier.c
@@ -29,7 +29,7 @@
29#include <gcrypt.h> 29#include <gcrypt.h>
30 30
31 31
32int 32static int
33test_crypto () 33test_crypto ()
34{ 34{
35 gcry_mpi_t plaintext; 35 gcry_mpi_t plaintext;
@@ -38,30 +38,95 @@ test_crypto ()
38 struct GNUNET_CRYPTO_PaillierPublicKey public_key; 38 struct GNUNET_CRYPTO_PaillierPublicKey public_key;
39 struct GNUNET_CRYPTO_PaillierPrivateKey private_key; 39 struct GNUNET_CRYPTO_PaillierPrivateKey private_key;
40 40
41 GNUNET_CRYPTO_paillier_create (&public_key, &private_key); 41 GNUNET_CRYPTO_paillier_create (&public_key,
42 42 &private_key);
43 GNUNET_assert (NULL != (plaintext = gcry_mpi_new (0))); 43 GNUNET_assert (NULL != (plaintext = gcry_mpi_new (0)));
44 GNUNET_assert (NULL != (plaintext_result = gcry_mpi_new (0))); 44 GNUNET_assert (NULL != (plaintext_result = gcry_mpi_new (0)));
45 gcry_mpi_randomize (plaintext,
46 GNUNET_CRYPTO_PAILLIER_BITS / 2,
47 GCRY_WEAK_RANDOM);
48
49 GNUNET_CRYPTO_paillier_encrypt (&public_key,
50 plaintext,
51 0 /* 0 hom ops */,
52 &ciphertext);
53 GNUNET_CRYPTO_paillier_decrypt (&private_key,
54 &public_key,
55 &ciphertext,
56 plaintext_result);
57
58 if (0 != gcry_mpi_cmp (plaintext,
59 plaintext_result))
60 {
61 fprintf (stderr,
62 "Paillier decryption failed with plaintext of size %u\n",
63 gcry_mpi_get_nbits (plaintext));
64 gcry_log_debugmpi ("\n",
65 plaintext);
66 gcry_log_debugmpi ("\n",
67 plaintext_result);
68 return 1;
69 }
70 return 0;
71}
45 72
46 gcry_mpi_randomize (plaintext, GNUNET_CRYPTO_PAILLIER_BITS / 2, GCRY_WEAK_RANDOM);
47 73
48 GNUNET_CRYPTO_paillier_encrypt (&public_key, plaintext, 0, &ciphertext); 74static int
75test_hom_simple (unsigned int a,
76 unsigned int b)
77{
78 gcry_mpi_t m1;
79 gcry_mpi_t m2;
80 gcry_mpi_t result;
81 gcry_mpi_t hom_result;
82 struct GNUNET_CRYPTO_PaillierCiphertext c1;
83 struct GNUNET_CRYPTO_PaillierCiphertext c2;
84 struct GNUNET_CRYPTO_PaillierCiphertext c_result;
85 struct GNUNET_CRYPTO_PaillierPublicKey public_key;
86 struct GNUNET_CRYPTO_PaillierPrivateKey private_key;
49 87
50 GNUNET_CRYPTO_paillier_decrypt (&private_key, &public_key, 88 GNUNET_CRYPTO_paillier_create (&public_key,
51 &ciphertext, plaintext_result); 89 &private_key);
52 90
53 if (0 != gcry_mpi_cmp (plaintext, plaintext_result)) 91 GNUNET_assert (NULL != (m1 = gcry_mpi_new (0)));
92 GNUNET_assert (NULL != (m2 = gcry_mpi_new (0)));
93 GNUNET_assert (NULL != (result = gcry_mpi_new (0)));
94 GNUNET_assert (NULL != (hom_result = gcry_mpi_new (0)));
95 m1 = gcry_mpi_set_ui (m1, a);
96 m2 = gcry_mpi_set_ui (m2, b);
97 gcry_mpi_add (result,
98 m1,
99 m2);
100 GNUNET_CRYPTO_paillier_encrypt (&public_key,
101 m1,
102 2,
103 &c1);
104 GNUNET_CRYPTO_paillier_encrypt (&public_key,
105 m2,
106 2,
107 &c2);
108 GNUNET_CRYPTO_paillier_hom_add (&public_key,
109 &c1,
110 &c2,
111 &c_result);
112 GNUNET_CRYPTO_paillier_decrypt (&private_key,
113 &public_key,
114 &c_result,
115 hom_result);
116 if (0 != gcry_mpi_cmp (result, hom_result))
54 { 117 {
55 printf ("paillier failed with plaintext of size %u\n", gcry_mpi_get_nbits (plaintext)); 118 fprintf (stderr,
56 gcry_log_debugmpi("\n", plaintext); 119 "GNUNET_CRYPTO_paillier failed simple math!\n");
57 gcry_log_debugmpi("\n", plaintext_result); 120 gcry_log_debugmpi ("got ", hom_result);
121 gcry_log_debugmpi ("wanted ", result);
58 return 1; 122 return 1;
59 } 123 }
60 return 0; 124 return 0;
61} 125}
62 126
63int 127
64test_hom() 128static int
129test_hom ()
65{ 130{
66 int ret; 131 int ret;
67 gcry_mpi_t m1; 132 gcry_mpi_t m1;
@@ -73,56 +138,91 @@ test_hom()
73 struct GNUNET_CRYPTO_PaillierCiphertext c_result; 138 struct GNUNET_CRYPTO_PaillierCiphertext c_result;
74 struct GNUNET_CRYPTO_PaillierPublicKey public_key; 139 struct GNUNET_CRYPTO_PaillierPublicKey public_key;
75 struct GNUNET_CRYPTO_PaillierPrivateKey private_key; 140 struct GNUNET_CRYPTO_PaillierPrivateKey private_key;
76 141
77 GNUNET_CRYPTO_paillier_create (&public_key, &private_key); 142 GNUNET_CRYPTO_paillier_create (&public_key,
143 &private_key);
78 144
79 GNUNET_assert (NULL != (m1 = gcry_mpi_new (0))); 145 GNUNET_assert (NULL != (m1 = gcry_mpi_new (0)));
80 GNUNET_assert (NULL != (m2 = gcry_mpi_new (0))); 146 GNUNET_assert (NULL != (m2 = gcry_mpi_new (0)));
81 GNUNET_assert (NULL != (result = gcry_mpi_new (0))); 147 GNUNET_assert (NULL != (result = gcry_mpi_new (0)));
82 GNUNET_assert (NULL != (hom_result = gcry_mpi_new (0))); 148 GNUNET_assert (NULL != (hom_result = gcry_mpi_new (0)));
83 //gcry_mpi_randomize (m1, GNUNET_CRYPTO_PAILLIER_BITS-2, GCRY_WEAK_RANDOM); 149 m1 = gcry_mpi_set_ui (m1, 1);
84 m1 = gcry_mpi_set_ui(m1,1); 150 /* m1 = m1 * 2 ^ (GCPB - 3) */
85 gcry_mpi_mul_2exp(m1,m1,GNUNET_CRYPTO_PAILLIER_BITS-3); 151 gcry_mpi_mul_2exp (m1,
86 //gcry_mpi_randomize (m2, GNUNET_CRYPTO_PAILLIER_BITS-2, GCRY_WEAK_RANDOM); 152 m1,
87 m2 = gcry_mpi_set_ui(m2,1); 153 GNUNET_CRYPTO_PAILLIER_BITS - 3);
88 gcry_mpi_mul_2exp(m2,m2,GNUNET_CRYPTO_PAILLIER_BITS-3); 154 m2 = gcry_mpi_set_ui (m2, 15);
89 gcry_mpi_add(result,m1,m2); 155 /* m1 = m1 * 2 ^ (GCPB / 2) */
90 156 gcry_mpi_mul_2exp (m2,
91 if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, m1, 2, &c1))){ 157 m2,
92 printf ("GNUNET_CRYPTO_paillier_encrypt 1 failed, should return 1 allowed operation, got %d!\n", ret); 158 GNUNET_CRYPTO_PAILLIER_BITS / 2);
159 gcry_mpi_add (result,
160 m1,
161 m2);
162
163 if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key,
164 m1,
165 2,
166 &c1)))
167 {
168 fprintf (stderr,
169 "GNUNET_CRYPTO_paillier_encrypt 1 failed, should return 1 allowed operation, got %d!\n",
170 ret);
93 return 1; 171 return 1;
94 } 172 }
95 if (1 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key, m2, 2, &c2))){ 173 if (2 != (ret = GNUNET_CRYPTO_paillier_encrypt (&public_key,
96 printf ("GNUNET_CRYPTO_paillier_encrypt 2 failed, should return 1 allowed operation, got %d!\n", ret); 174 m2,
175 2,
176 &c2)))
177 {
178 fprintf (stderr,
179 "GNUNET_CRYPTO_paillier_encrypt 2 failed, should return 2 allowed operation, got %d!\n",
180 ret);
97 return 1; 181 return 1;
98 } 182 }
99 183
100 if (0 != (ret = GNUNET_CRYPTO_paillier_hom_add (&public_key, &c1,&c2, &c_result))){ 184 if (0 != (ret = GNUNET_CRYPTO_paillier_hom_add (&public_key,
101 printf ("GNUNET_CRYPTO_paillier_hom_add failed, expected 0 remaining operations, got %d!\n", ret); 185 &c1,
186 &c2,
187 &c_result)))
188 {
189 fprintf (stderr,
190 "GNUNET_CRYPTO_paillier_hom_add failed, expected 0 remaining operations, got %d!\n",
191 ret);
102 return 1; 192 return 1;
103 } 193 }
104 194
105 GNUNET_CRYPTO_paillier_decrypt (&private_key, &public_key, 195 GNUNET_CRYPTO_paillier_decrypt (&private_key,
106 &c_result, hom_result); 196 &public_key,
107 197 &c_result,
108 gcry_log_debugmpi("\n", hom_result); 198 hom_result);
109 gcry_log_debugmpi("\n", result); 199
110 if (0 != gcry_mpi_cmp(result, hom_result)){ 200 if (0 != gcry_mpi_cmp (result, hom_result))
111 printf ("GNUNET_CRYPTO_paillier miscalculated!\n"); 201 {
202 fprintf (stderr,
203 "GNUNET_CRYPTO_paillier miscalculated with large numbers!\n");
204 gcry_log_debugmpi ("got", hom_result);
205 gcry_log_debugmpi ("wanted", result);
112 return 1; 206 return 1;
113 } 207 }
114
115 return 0; 208 return 0;
116} 209}
117 210
118 211
119int 212int
120main (int argc, char *argv[]) 213main (int argc,
214 char *argv[])
121{ 215{
122 int ret; 216 int ret;
123 ret = test_crypto (); 217 ret = test_crypto ();
124 if (0 != ret) 218 if (0 != ret)
125 return ret; 219 return ret;
220 ret = test_hom_simple (2,4);
221 if (0 != ret)
222 return ret;
223 ret = test_hom_simple (13,17);
224 if (0 != ret)
225 return ret;
126 ret = test_hom (); 226 ret = test_hom ();
127 return ret; 227 return ret;
128} 228}