From a3e62d3bc6e7f75949726f9a8dafe03e757e869b Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sun, 30 Oct 2016 13:38:49 +0100 Subject: Added the Preprocessing step for the Precomputation of CMix. --- libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 97 ++++++++++++++++++++------ 1 file changed, 76 insertions(+), 21 deletions(-) (limited to 'libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c') 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 -- cgit v1.2.3-70-g09d2