diff options
Diffstat (limited to 'libcmix-crypto/elgamal')
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.c | 5 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.h | 8 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 38 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/null/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/null/null_elgamal.c | 2 |
6 files changed, 44 insertions, 13 deletions
diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c index 399d952..d103230 100644 --- a/libcmix-crypto/elgamal/elgamal.c +++ b/libcmix-crypto/elgamal/elgamal.c @@ -10,13 +10,16 @@ struct Api get_elgamal_implementation() .element_to_array = elgamal_element_to_array, .free_buffer = elgamal_free_buffer, .array_to_element = elgamal_array_to_element, + .message_to_element = elgamal_message_to_element, .get_pub_key_hash = elgamal_get_pub_key_hash, .get_pub_key_hash_length = elgamal_get_pub_key_hash_length, .get_group_element = elgamal_get_group_element, .get_group_element_array_size = elgamal_get_group_element_array_size, + .get_message_size = elgamal_get_message_size, .free_group_element = elgamal_delete_group_element, .get_key_exchange_value = elgamal_get_key_exchange_value, - .multiply = elgamal_multiply, + .combine = elgamal_combine, + .uncombine = elgamal_uncombine, .get_decryption_share = elgamal_get_decryption_share, .add_public_share = elgamal_add_public_share, .derive_shared_key = elgamal_derive_shared_key, diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h index 1fe4447..4cc3013 100644 --- a/libcmix-crypto/elgamal/elgamal.h +++ b/libcmix-crypto/elgamal/elgamal.h @@ -22,6 +22,8 @@ extern BufferDeleter elgamal_free_buffer; extern ArrayToElement elgamal_array_to_element; +extern MessageToElement elgamal_message_to_element; + extern PubKeyHashGetter elgamal_get_pub_key_hash; extern PubKeyHashLengthGetter elgamal_get_pub_key_hash_length; @@ -32,12 +34,16 @@ extern GroupElementDeleter elgamal_delete_group_element; extern KeyExchangeValueGetter elgamal_get_key_exchange_value; -extern GroupElementMultiplier elgamal_multiply; +extern GroupElementCombiner elgamal_combine; + +extern GroupElementUncombiner elgamal_uncombine; extern DecryptionShareGetter elgamal_get_decryption_share; extern GroupElementArraySizeGetter elgamal_get_group_element_array_size; +extern MessageSizeGetter elgamal_get_message_size; + extern PublicShareAdder elgamal_add_public_share; extern SharedKeyDeriver elgamal_derive_shared_key; diff --git a/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt b/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt index d8c19b8..6dfdc74 100644 --- a/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt +++ b/libcmix-crypto/elgamal/gcrypt/CMakeLists.txt @@ -1,6 +1,6 @@ include(get_target_name) -get_target_name(target_name) +get_target_name(target_name algo api) find_package(Gcrypt REQUIRED) diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c index ec993a6..dff75b1 100644 --- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c +++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c @@ -31,7 +31,7 @@ void print_sexp(gcry_sexp_t exp) { char* str = (char *) malloc(sizeof(char)*required_size); - gcry_sexp_sprint(exp, GCRYSEXP_FMT_ADVANCED, str, 2000); //So we ignore the size here. + gcry_sexp_sprint(exp, GCRYSEXP_FMT_ADVANCED, str, required_size); //So we ignore the size here. printf("size = %zu\n", required_size); for(size_t i = 0; i < required_size; i++) @@ -113,11 +113,11 @@ struct KeyPair gcrypt_elgamal_create_keypair() { }; } -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 gcrypt_elgamal_delete_keypair(struct KeyPair* pair) { + gcry_mpi_release((gcry_mpi_t) pair->sec); + gcry_mpi_release((gcry_mpi_t) pair->pub); + pair->sec = NULL; + pair->pub = NULL; } void gcrypt_elgamal_element_to_array(unsigned char** buffer, size_t* len, void* key) { @@ -145,6 +145,10 @@ void* gcrypt_elgamal_array_to_element(char const* buffer, size_t len, bool secur return mpi; } +GroupElement gcrypt_elgamal_message_to_element(char const* buffer, size_t len, bool secure) { + return gcrypt_elgamal_array_to_element(buffer, len, secure); +} + void gcrypt_elgamal_get_pub_key_hash(char** buffer, size_t* len, GroupElement const pub) { gcry_sexp_t pubkey; gcry_error_t error; @@ -192,13 +196,24 @@ GroupElement gcrypt_elgamal_get_key_exchange_value(GroupElement group_el) { return val; } -GroupElement gcrypt_elgamal_multiply(GroupElement lh, GroupElement rh, bool secure) { +GroupElement gcrypt_elgamal_invert(GroupElement const el); +void gcrypt_elgamal_delete_group_element(GroupElement el); + +GroupElement gcrypt_elgamal_combine(GroupElement lh, GroupElement rh, bool secure) { gcry_mpi_t ret = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0); TRACE(__FILE__, __LINE__, ret); gcry_mpi_mulm(ret, (gcry_mpi_t) lh, (gcry_mpi_t) rh, p); return ret; } +GroupElement gcrypt_elgamal_uncombine(GroupElement lh, GroupElement rh, bool secure) { + (void) secure; + GroupElement inv_rh = gcrypt_elgamal_invert(rh); + GroupElement ret = gcrypt_elgamal_combine(lh, inv_rh, true); + gcrypt_elgamal_delete_group_element(inv_rh); + return ret; +} + GroupElement gcrypt_elgamal_get_decryption_share(GroupElement r, GroupElement e) { gcry_mpi_t inv_d = gcry_mpi_snew(nr_bits); gcry_mpi_powm(inv_d, (gcry_mpi_t)r, (gcry_mpi_t)e, p); @@ -217,6 +232,10 @@ size_t gcrypt_elgamal_get_group_element_array_size() { return nr_bytes; } +size_t gcrypt_elgamal_get_message_size() { + return nr_bytes - 1; +} + void gcrypt_elgamal_delete_group_element(void* el) { gcry_mpi_release((gcry_mpi_t) el); } @@ -346,14 +365,17 @@ KeyPairDeleter elgamal_delete_keypair = &gcrypt_elgamal_delete_keypair; ElementToArray elgamal_element_to_array = &gcrypt_elgamal_element_to_array; BufferDeleter elgamal_free_buffer = &gcrypt_elgamal_free_buffer; ArrayToElement elgamal_array_to_element = &gcrypt_elgamal_array_to_element; +MessageToElement elgamal_message_to_element = &gcrypt_elgamal_message_to_element; PubKeyHashGetter elgamal_get_pub_key_hash = &gcrypt_elgamal_get_pub_key_hash; PubKeyHashLengthGetter elgamal_get_pub_key_hash_length = &gcrypt_elgamal_get_pub_key_hash_length; 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; +GroupElementCombiner elgamal_combine = &gcrypt_elgamal_combine; +GroupElementUncombiner elgamal_uncombine = &gcrypt_elgamal_uncombine; DecryptionShareGetter elgamal_get_decryption_share = &gcrypt_elgamal_get_decryption_share; GroupElementArraySizeGetter elgamal_get_group_element_array_size = &gcrypt_elgamal_get_group_element_array_size; +MessageSizeGetter elgamal_get_message_size = &gcrypt_elgamal_get_message_size; 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; diff --git a/libcmix-crypto/elgamal/null/CMakeLists.txt b/libcmix-crypto/elgamal/null/CMakeLists.txt index a866428..c017bdc 100644 --- a/libcmix-crypto/elgamal/null/CMakeLists.txt +++ b/libcmix-crypto/elgamal/null/CMakeLists.txt @@ -1,6 +1,6 @@ include(get_target_name) -get_target_name(target_name) +get_target_name(target_name algo api) add_library(${target_name} SHARED null_elgamal.c diff --git a/libcmix-crypto/elgamal/null/null_elgamal.c b/libcmix-crypto/elgamal/null/null_elgamal.c index 2b5c43b..c626e63 100644 --- a/libcmix-crypto/elgamal/null/null_elgamal.c +++ b/libcmix-crypto/elgamal/null/null_elgamal.c @@ -36,7 +36,7 @@ ArrayToElement elgamal_array_to_element = NULL;//&null_elgamal_array_to_element; GroupElementGetter elgamal_get_group_element = NULL;//&null_elgamal_get_group_element; GroupElementDeleter elgamal_delete_group_element = NULL;//&null_elgamal_delete_group_element; KeyExchangeValueGetter elgamal_get_key_exchange_value = NULL;//&null_elgamal_get_key_exchange_value; -GroupElementMultiplier elgamal_multiply = NULL;//&null_elgamal_multiply; +GroupElementCombiner elgamal_multiply = NULL;//&null_elgamal_multiply; DecryptionShareGetter elgamal_get_decryption_share = NULL;//&null_elgamal_get_decryption_share; GroupElementArraySizeGetter elgamal_get_group_element_array_size = NULL;//&null_elgamal_get_group_element_array_size; PublicShareAdder elgamal_add_public_share = NULL;//&null_elgamal_add_public_share; |
