/**
- * Paillier plaintext.
+ * Paillier ciphertext.
*/
-struct GNUNET_CRYPTO_PaillierPlaintext
+struct GNUNET_CRYPTO_PaillierCiphertext
{
/**
- * The bits of the plaintext.
+ * guaranteed minimum number of homomorphic operations with this ciphertext
*/
- unsigned char bits[GNUNET_CRYPTO_PAILLIER_BITS / 8];
-};
+ int32_t remaining_ops GNUNET_PACKED;
-
-/**
- * Paillier ciphertext.
- */
-struct GNUNET_CRYPTO_PaillierCiphertext
-{
/**
* The bits of the ciphertext.
*/
struct GNUNET_CRYPTO_EddsaPrivateKey *
GNUNET_CRYPTO_eddsa_key_create_from_file (const char *filename);
+struct GNUNET_CONFIGURATION_Handle;
+
/**
* @ingroup crypto
* Encrypt a plaintext with a paillier public key.
*
* @param public_key Public key to use.
- * @param plaintext Plaintext to encrypt.
+ * @param m Plaintext to encrypt.
+ * @param desired_ops How many homomorphic ops the caller intends to use
* @param[out] ciphertext Encrytion of @a plaintext with @a public_key.
+ * @return guaranteed number of supported homomorphic operations >= 1,
+ * or desired_ops, in case that is lower,
+ * or -1 if less than one homomorphic operation is possible
*/
-void
+int
GNUNET_CRYPTO_paillier_encrypt (const struct GNUNET_CRYPTO_PaillierPublicKey *public_key,
- const struct GNUNET_CRYPTO_PaillierPlaintext *plaintext,
+ const gcry_mpi_t m,
+ int desired_ops,
struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext);
* @param private_key Private key to use for decryption.
* @param public_key Public key to use for decryption.
* @param ciphertext Ciphertext to decrypt.
- * @param[out] plaintext Decryption of @a ciphertext with @private_key.
+ * @param[out] m Decryption of @a ciphertext with @private_key.
*/
void
GNUNET_CRYPTO_paillier_decrypt (const struct GNUNET_CRYPTO_PaillierPrivateKey *private_key,
const struct GNUNET_CRYPTO_PaillierPublicKey *public_key,
const struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext,
- struct GNUNET_CRYPTO_PaillierPlaintext *plaintext);
+ gcry_mpi_t m);
/**
* Note that this operation can only be done a finite number of times
* before an overflow occurs.
*
- * @param x1 Paillier cipher text.
- * @param x2 Paillier cipher text.
+ * @param public_key Public key to use for encryption.
+ * @param c1 Paillier cipher text.
+ * @param c2 Paillier cipher text.
* @param[out] result Result of the homomorphic operation.
- * @return GNUNET_OK if the result could be computed,
- * GNUNET_SYSERR if no more homomorphic operations are remaining.
+ * @return #GNUNET_OK if the result could be computed,
+ * #GNUNET_SYSERR if no more homomorphic operations are remaining.
*/
int
-GNUNET_CRYPTO_paillier_hom_add (const struct GNUNET_CRYPTO_PaillierCiphertext *x1,
- const struct GNUNET_CRYPTO_PaillierCiphertext *x2,
- const struct GNUNET_CRYPTO_PaillierCiphertext *result);
+GNUNET_CRYPTO_paillier_hom_add (const struct GNUNET_CRYPTO_PaillierPublicKey *public_key,
+ const struct GNUNET_CRYPTO_PaillierCiphertext *c1,
+ const struct GNUNET_CRYPTO_PaillierCiphertext *c2,
+ struct GNUNET_CRYPTO_PaillierCiphertext *result);
+
+/**
+ * Get the number of remaining supported homomorphic operations.
+ *
+ * @param c Paillier cipher text.
+ * @return the number of remaining homomorphic operations
+ */
+int
+GNUNET_CRYPTO_paillier_hom_get_remaining (const struct GNUNET_CRYPTO_PaillierCiphertext *c);
#if 0 /* keep Emacsens' auto-indent happy */
{