From 623dffe2c054d1639dbf9c8f21ddfb088c7950fb Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sat, 11 Feb 2017 14:48:52 +0100 Subject: Working Ed25519 Implementation of libcmix. --- libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 38 ++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 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 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; -- cgit v1.2.3-70-g09d2