aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_paillier.c
diff options
context:
space:
mode:
authorChristian Fuchs <christian.fuchs@cfuchs.net>2014-01-21 09:31:38 +0000
committerChristian Fuchs <christian.fuchs@cfuchs.net>2014-01-21 09:31:38 +0000
commiteb31587bd824d3a462bf0595f5ce685f66c42d49 (patch)
tree32de15fbcc90147f703d07f55fe71f2ceaa74cf4 /src/util/crypto_paillier.c
parent6c7fbc16f10f6ad752cfbdf6e6f892f65cb9d160 (diff)
downloadgnunet-eb31587bd824d3a462bf0595f5ce685f66c42d49.tar.gz
gnunet-eb31587bd824d3a462bf0595f5ce685f66c42d49.zip
- first extension of paillier with foolproof homomorphism support (ciphertext container carries information on support ops)
- adjusted encryt/decrypt functionality to handle gcry_mpi_t, not a plaintext container
Diffstat (limited to 'src/util/crypto_paillier.c')
-rw-r--r--src/util/crypto_paillier.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/src/util/crypto_paillier.c b/src/util/crypto_paillier.c
index 4697f14c3..4ae42e21a 100644
--- a/src/util/crypto_paillier.c
+++ b/src/util/crypto_paillier.c
@@ -90,29 +90,25 @@ GNUNET_CRYPTO_paillier_create (struct GNUNET_CRYPTO_PaillierPublicKey *public_ke
90 * Encrypt a plaintext with a paillier public key. 90 * Encrypt a plaintext with a paillier public key.
91 * 91 *
92 * @param public_key Public key to use. 92 * @param public_key Public key to use.
93 * @param plaintext Plaintext to encrypt. 93 * @param m Plaintext to encrypt.
94 * @param[out] ciphertext Encrytion of @a plaintext with @a public_key. 94 * @param[out] ciphertext Encrytion of @a plaintext with @a public_key.
95 */ 95 */
96void 96void
97GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *public_key, 97GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *public_key,
98 const struct GNUNET_CRYPTO_PaillierPlaintext *plaintext, 98 const gcry_mpi_t m,
99 struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext) 99 struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext)
100{ 100{
101 gcry_mpi_t n_square; 101 gcry_mpi_t n_square;
102 gcry_mpi_t r; 102 gcry_mpi_t r;
103 gcry_mpi_t g; 103 gcry_mpi_t g;
104 gcry_mpi_t c; 104 gcry_mpi_t c;
105
106 gcry_mpi_t n; 105 gcry_mpi_t n;
107 gcry_mpi_t m;
108
109 106
110 GNUNET_assert (0 != (n_square = gcry_mpi_new (0))); 107 GNUNET_assert (0 != (n_square = gcry_mpi_new (0)));
111 GNUNET_assert (0 != (r = gcry_mpi_new (0))); 108 GNUNET_assert (0 != (r = gcry_mpi_new (0)));
112 GNUNET_assert (0 != (g = gcry_mpi_new (0))); 109 GNUNET_assert (0 != (g = gcry_mpi_new (0)));
113 GNUNET_assert (0 != (c = gcry_mpi_new (0))); 110 GNUNET_assert (0 != (c = gcry_mpi_new (0)));
114 111
115 GNUNET_CRYPTO_mpi_scan_unsigned (&m, plaintext, sizeof (struct GNUNET_CRYPTO_PaillierPlaintext));
116 GNUNET_CRYPTO_mpi_scan_unsigned (&n, public_key, sizeof (struct GNUNET_CRYPTO_PaillierPublicKey)); 112 GNUNET_CRYPTO_mpi_scan_unsigned (&n, public_key, sizeof (struct GNUNET_CRYPTO_PaillierPublicKey));
117 113
118 gcry_mpi_mul (n_square, n, n); 114 gcry_mpi_mul (n_square, n, n);
@@ -132,11 +128,12 @@ GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *pu
132 // c <- r*c mod n^2 128 // c <- r*c mod n^2
133 gcry_mpi_mulm (c, r, c, n_square); 129 gcry_mpi_mulm (c, r, c, n_square);
134 130
135 GNUNET_CRYPTO_mpi_print_unsigned (ciphertext, sizeof *ciphertext, c); 131 GNUNET_CRYPTO_mpi_print_unsigned (ciphertext->bits,
132 sizeof(*ciphertext) - sizeof(ciphertext->remaining_ops),
133 c);
136 134
137 gcry_mpi_release (n_square); 135 gcry_mpi_release (n_square);
138 gcry_mpi_release (r); 136 gcry_mpi_release (r);
139 gcry_mpi_release (m);
140 gcry_mpi_release (c); 137 gcry_mpi_release (c);
141} 138}
142 139
@@ -147,15 +144,14 @@ GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *pu
147 * @param private_key Private key to use for decryption. 144 * @param private_key Private key to use for decryption.
148 * @param public_key Public key to use for decryption. 145 * @param public_key Public key to use for decryption.
149 * @param ciphertext Ciphertext to decrypt. 146 * @param ciphertext Ciphertext to decrypt.
150 * @param[out] plaintext Decryption of @a ciphertext with @private_key. 147 * @param[out] m Decryption of @a ciphertext with @private_key.
151 */ 148 */
152void 149void
153GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *private_key, 150GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *private_key,
154 const struct GNUNET_CRYPTO_PaillierPublicKey *public_key, 151 const struct GNUNET_CRYPTO_PaillierPublicKey *public_key,
155 const struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext, 152 const struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext,
156 struct GNUNET_CRYPTO_PaillierPlaintext *plaintext) 153 gcry_mpi_t *m)
157{ 154{
158 gcry_mpi_t m;
159 gcry_mpi_t mu; 155 gcry_mpi_t mu;
160 gcry_mpi_t lambda; 156 gcry_mpi_t lambda;
161 gcry_mpi_t n; 157 gcry_mpi_t n;
@@ -163,7 +159,8 @@ GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *p
163 gcry_mpi_t c; 159 gcry_mpi_t c;
164 160
165 GNUNET_assert (0 != (n_square = gcry_mpi_new (0))); 161 GNUNET_assert (0 != (n_square = gcry_mpi_new (0)));
166 GNUNET_assert (0 != (m = gcry_mpi_new (0))); 162 if (NULL == *m)
163 GNUNET_assert (0 != (m = gcry_mpi_new (0)));
167 164
168 GNUNET_CRYPTO_mpi_scan_unsigned (&lambda, private_key->lambda, sizeof private_key->lambda); 165 GNUNET_CRYPTO_mpi_scan_unsigned (&lambda, private_key->lambda, sizeof private_key->lambda);
169 GNUNET_CRYPTO_mpi_scan_unsigned (&mu, private_key->mu, sizeof private_key->mu); 166 GNUNET_CRYPTO_mpi_scan_unsigned (&mu, private_key->mu, sizeof private_key->mu);
@@ -179,9 +176,6 @@ GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *p
179 gcry_mpi_div (m, NULL, m, n, 0); 176 gcry_mpi_div (m, NULL, m, n, 0);
180 gcry_mpi_mulm (m, m, mu, n); 177 gcry_mpi_mulm (m, m, mu, n);
181 178
182 GNUNET_CRYPTO_mpi_print_unsigned (plaintext, sizeof *plaintext, m);
183
184 gcry_mpi_release (m);
185 gcry_mpi_release (mu); 179 gcry_mpi_release (mu);
186 gcry_mpi_release (lambda); 180 gcry_mpi_release (lambda);
187 gcry_mpi_release (n); 181 gcry_mpi_release (n);