diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-30 13:38:49 +0100 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-30 16:37:03 +0100 |
| commit | a3e62d3bc6e7f75949726f9a8dafe03e757e869b (patch) | |
| tree | 49e59076a7ffd7ea757f650a64aaba2b16be1886 /libcmix-crypto/elgamal | |
| parent | 158bf81343054982800d44d507e8e50f2eeb6dd4 (diff) | |
| download | cmix-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.c | 25 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.h | 80 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 97 |
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 |
