diff options
author | Christian Fuchs <christian.fuchs@cfuchs.net> | 2014-01-21 09:31:38 +0000 |
---|---|---|
committer | Christian Fuchs <christian.fuchs@cfuchs.net> | 2014-01-21 09:31:38 +0000 |
commit | eb31587bd824d3a462bf0595f5ce685f66c42d49 (patch) | |
tree | 32de15fbcc90147f703d07f55fe71f2ceaa74cf4 /src/util/crypto_paillier.c | |
parent | 6c7fbc16f10f6ad752cfbdf6e6f892f65cb9d160 (diff) | |
download | gnunet-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.c | 24 |
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 | */ |
96 | void | 96 | void |
97 | GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *public_key, | 97 | GNUNET_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 | */ |
152 | void | 149 | void |
153 | GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *private_key, | 150 | GNUNET_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); |