diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-12-09 20:57:07 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-12-09 20:57:07 +0000 |
commit | e613b7acfde2427b5ea48f2ac866489f2d9b6589 (patch) | |
tree | d00d04e4a8a10473505156ffea7f38a591413084 /src/util/test_crypto_paillier.c | |
parent | 82bedb216e21147473795fb43be9cfd48414e7ca (diff) | |
download | gnunet-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.c | 178 |
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 | ||
32 | int | 32 | static int |
33 | test_crypto () | 33 | test_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); | 74 | static int |
75 | test_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 | ||
63 | int | 127 | |
64 | test_hom() | 128 | static int |
129 | test_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 | ||
119 | int | 212 | int |
120 | main (int argc, char *argv[]) | 213 | main (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 | } |