aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-10-30 13:38:49 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-10-30 16:37:03 +0100
commita3e62d3bc6e7f75949726f9a8dafe03e757e869b (patch)
tree49e59076a7ffd7ea757f650a64aaba2b16be1886 /libcmix-crypto/elgamal
parent158bf81343054982800d44d507e8e50f2eeb6dd4 (diff)
downloadcmix-a3e62d3bc6e7f75949726f9a8dafe03e757e869b.tar.gz
cmix-a3e62d3bc6e7f75949726f9a8dafe03e757e869b.tar.bz2
cmix-a3e62d3bc6e7f75949726f9a8dafe03e757e869b.zip
Added the Preprocessing step for the Precomputation of CMix.
Diffstat (limited to 'libcmix-crypto/elgamal')
-rw-r--r--libcmix-crypto/elgamal/elgamal.c25
-rw-r--r--libcmix-crypto/elgamal/elgamal.h80
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c97
3 files changed, 107 insertions, 95 deletions
diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c
index 342659b..3ee86d7 100644
--- a/libcmix-crypto/elgamal/elgamal.c
+++ b/libcmix-crypto/elgamal/elgamal.c
@@ -4,17 +4,20 @@ struct Api get_elgamal_implementation()
{
elgamal_initialize();
return (struct Api) {
- &elgamal_initialize,
- &elgamal_create_keypair,
- &elgamal_keypair_deleter,
- &elgamal_get_key_array,
- &elgamal_get_group_element,
- &elgamal_get_key_exchange_value,
- &elgamal_free_group_element,
- &elgamal_add_public_share,
- &elgamal_derive_shared_key,
- &elgamal_shared_key_deleter,
- &elgamal_deinitialize
+ elgamal_initialize,
+ elgamal_create_keypair,
+ elgamal_delete_keypair,
+ elgamal_element_to_array,
+ elgamal_array_to_element,
+ elgamal_get_group_element,
+ elgamal_delete_group_element,
+ elgamal_get_key_exchange_value,
+ elgamal_multiply,
+ elgamal_add_public_share,
+ elgamal_derive_shared_key,
+ elgamal_delete_shared_key,
+ elgamal_encrypt,
+ elgamal_deinitialize
};
}
diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h
index dc2dd6f..746b726 100644
--- a/libcmix-crypto/elgamal/elgamal.h
+++ b/libcmix-crypto/elgamal/elgamal.h
@@ -10,79 +10,33 @@ extern "C" {
#include "api.h"
-/*!
- * \brief elgamal_initialize initializes the elgamal library
- */
-extern void elgamal_initialize(void);
+extern Initializer elgamal_initialize;
-/*!
- * \brief elgamal_create_keypair
- * \return The new keypair
- */
-extern struct KeyPair elgamal_create_keypair(void);
+extern KeyPairCreator elgamal_create_keypair;
-/*!
- * \brief elgamal_keypair_deleter
- * \param p the keypair to be freed
- */
-extern void elgamal_keypair_deleter(struct KeyPair* p);
+extern KeyPairDeleter elgamal_delete_keypair;
-/*!
- * \brief elgamal_get_pubkey_array
- * \param buffer
- * \param len
- * \param pubkey
- */
-extern void elgamal_get_key_array(char** buffer, size_t* len, void* pubkey);
+extern ElementToArray elgamal_element_to_array;
-/*!
- * \brief get_group_element
- * \param secure
- * \return
- */
-extern void* elgamal_get_group_element(bool secure);
+extern ArrayToElement elgamal_array_to_element;
-/*!
- * \brief get_key_exchange_value
- * \param group_el
- * \return
- */
-extern void* elgamal_get_key_exchange_value(void* group_el);
+extern GroupElementGetter elgamal_get_group_element;
-/*!
- * \brief elgamal_free_group_element
- */
-extern void elgamal_free_group_element(void*);
+extern GroupElementDeleter elgamal_delete_group_element;
-/*!
- * \brief elgamal_add_public_share
- * \param buffer
- * \param in_len
- * \param share
- * \param in_len
- * \param pubkey
- */
-void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey);
+extern KeyExchangeValueGetter elgamal_get_key_exchange_value;
-/*!
- * \brief elgamal_derive_shared_key
- * \param pair Our keypair.
- * \param pub_key The public key of the other party.
- * \param swap_pub_order Should we swap the order in which we feed the public keys to the hash function.
- * \return A Shared key
- */
-extern struct SharedKey elgamal_derive_shared_key(struct KeyPair keypair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap);
+extern GroupElementMultiplier elgamal_multiply;
-/*!
- * \brief elgamal_shared_key_deleter
- * \param s The shared key to be freed.
- */
-extern void elgamal_shared_key_deleter(struct SharedKey* s);
+extern PublicShareAdder elgamal_add_public_share;
-/*!
- * \brief elgamal_deinitialize deinitializes the elgamal_library
- */
-void elgamal_deinitialize(void);
+extern SharedKeyDeriver elgamal_derive_shared_key;
+
+extern SharedKeyDeleter elgamal_delete_shared_key;
+
+extern Encrypter elgamal_encrypt;
+
+extern Deinitializer elgamal_deinitialize;
/*!
* \brief get_elgamal_implementation
diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
index ac90a51..1dd0690 100644
--- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
+++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
@@ -1,5 +1,5 @@
-#include "api.h"
+#include "elgamal.h"
#include "gcrypt.h"
@@ -32,7 +32,7 @@ void print_sexp(gcry_sexp_t exp) {
free(str);
}
-void elgamal_initialize(void) {
+void gcrypt_elgamal_initialize(void) {
if (!gcry_check_version (GCRYPT_VERSION)) {
fprintf(stderr, "libgcrypt version mismatch\n");
exit(-1);
@@ -61,7 +61,7 @@ void elgamal_initialize(void) {
check(error);
}
-struct KeyPair elgamal_create_keypair() {
+struct KeyPair gcrypt_elgamal_create_keypair() {
size_t parse_error_offset;
gcry_error_t error;
@@ -90,23 +90,33 @@ struct KeyPair elgamal_create_keypair() {
};
}
-void elgamal_keypair_deleter(struct KeyPair* p) {
+void gcrypt_elgamal_delete_keypair(struct KeyPair* p) {
gcry_mpi_release((gcry_mpi_t) p->sec);
gcry_mpi_release((gcry_mpi_t) p->pub);
p->sec = NULL;
p->pub = NULL;
}
-void elgamal_get_key_array(unsigned char** buffer, size_t* len, void* key) {
+void gcrypt_elgamal_element_to_array(unsigned char** buffer, size_t* len, void* key) {
gcry_mpi_t mpi = (gcry_mpi_t) key;
gcry_error_t error;
-
error = gcry_mpi_aprint(GCRYMPI_FMT_USG, buffer, len, mpi);
check(error);
}
-void* elgamal_get_group_element(bool secure) {
+void* gcrypt_elgamal_array_to_element(char const* buffer, size_t len, bool secure) {
+ size_t error_pos;
+ gcry_error_t error;
+
+ gcry_mpi_t mpi = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0);
+ error = gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, buffer, len, &error_pos);
+ check(error);
+
+ return mpi;
+}
+
+void* gcrypt_elgamal_get_group_element(bool secure) {
size_t parse_error_offset;
gcry_error_t error;
@@ -120,11 +130,7 @@ void* elgamal_get_group_element(bool secure) {
return a;
}
-void elgamal_free_group_element(void* el) {
- gcry_mpi_release((gcry_mpi_t) el);
-}
-
-void* elgamal_get_key_exchange_value(void* group_el) {
+GroupElement gcrypt_elgamal_get_key_exchange_value(GroupElement group_el) {
gcry_mpi_t el = (gcry_mpi_t) group_el;
gcry_mpi_t val = gcry_mpi_new(0);
@@ -133,7 +139,19 @@ void* elgamal_get_key_exchange_value(void* group_el) {
return val;
}
-void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
+GroupElement gcrypt_elgamal_multiply(GroupElement lh, GroupElement rh, bool secure) {
+ gcry_mpi_t ret = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0);
+ gcry_mpi_mulm(ret, (gcry_mpi_t) lh, (gcry_mpi_t) rh, p);
+ return ret;
+}
+
+void gcrypt_elgamal_delete_group_element(void* el) {
+ gcry_mpi_release((gcry_mpi_t) el);
+}
+
+
+
+void gcrypt_elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
gcry_error_t error;
size_t parse_error_pos;
@@ -151,13 +169,7 @@ void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share,
check(error);
}
-void elgamal_shared_key_deleter(struct SharedKey* s) {
- gcry_mpi_release((gcry_mpi_t) s->shared);
- s->shared = NULL;
-}
-
-
-struct SharedKey elgamal_derive_shared_key(struct KeyPair keypair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap) {
+struct SharedKey gcrypt_elgamal_derive_shared_key(struct KeyPair keypair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap) {
gcry_error_t error;
size_t parse_error_pos;
@@ -177,8 +189,51 @@ struct SharedKey elgamal_derive_shared_key(struct KeyPair keypair, unsigned char
};
}
-void elgamal_deinitialize(void) {
+void gcrypt_elgamal_delete_shared_key(struct SharedKey* s) {
+ gcry_mpi_release((gcry_mpi_t) s->shared);
+ s->shared = NULL;
+}
+
+void gcrypt_elgamal_encrypt(GroupElement* random_element, GroupElement* message_element, GroupElement value, GroupElement key) {
+ gcry_error_t error;
+ size_t parse_error_pos;
+
+ gcry_sexp_t pubkey_expr;
+ error = gcry_sexp_build(&pubkey_expr, &parse_error_pos, "(public-key (elg (p %M) (g %M) (y %M)))", p, g, key);
+ check(error);
+
+ gcry_sexp_t value_expr;
+ error = gcry_sexp_build(&value_expr, &parse_error_pos, "(data (flags raw) (value %M))", value);
+ check(error);
+
+ gcry_sexp_t enc_expr;
+ error = gcry_pk_encrypt(&enc_expr, value_expr, pubkey_expr);
+ check(error);
+
+ gcry_sexp_extract_param(enc_expr, NULL, "ab", random_element, message_element, NULL);
+
+ gcry_sexp_release(enc_expr);
+ gcry_sexp_release(value_expr);
+ gcry_sexp_release(pubkey_expr);
+}
+
+void gcrypt_elgamal_deinitialize(void) {
gcry_mpi_release(p);
gcry_mpi_release(q);
gcry_mpi_release(g);
}
+
+Initializer elgamal_initialize = &gcrypt_elgamal_initialize;
+KeyPairCreator elgamal_create_keypair = &gcrypt_elgamal_create_keypair;
+KeyPairDeleter elgamal_delete_keypair = &gcrypt_elgamal_delete_keypair;
+ElementToArray elgamal_element_to_array = &gcrypt_elgamal_element_to_array;
+ArrayToElement elgamal_array_to_element = &gcrypt_elgamal_array_to_element;
+GroupElementGetter elgamal_get_group_element = &gcrypt_elgamal_get_group_element;
+GroupElementDeleter elgamal_delete_group_element = &gcrypt_elgamal_delete_group_element;
+KeyExchangeValueGetter elgamal_get_key_exchange_value = &gcrypt_elgamal_get_key_exchange_value;
+GroupElementMultiplier elgamal_multiply = &gcrypt_elgamal_multiply;
+PublicShareAdder elgamal_add_public_share = &gcrypt_elgamal_add_public_share;
+SharedKeyDeriver elgamal_derive_shared_key = &gcrypt_elgamal_derive_shared_key;
+SharedKeyDeleter elgamal_delete_shared_key = &gcrypt_elgamal_delete_shared_key;
+Encrypter elgamal_encrypt = &gcrypt_elgamal_encrypt;
+Deinitializer elgamal_deinitialize = &gcrypt_elgamal_deinitialize; \ No newline at end of file