aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2017-02-11 14:48:52 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2017-02-11 17:54:40 +0100
commit623dffe2c054d1639dbf9c8f21ddfb088c7950fb (patch)
treef8159c5b3cf9872f9b271d03ad5a4b65ecec19b8 /libcmix-crypto/elgamal
parentb229dc91d8825689c5e66264b462ce01398e621e (diff)
downloadcmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.tar.gz
cmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.tar.bz2
cmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.zip
Working Ed25519 Implementation of libcmix.
Diffstat (limited to 'libcmix-crypto/elgamal')
-rw-r--r--libcmix-crypto/elgamal/elgamal.c5
-rw-r--r--libcmix-crypto/elgamal/elgamal.h8
-rw-r--r--libcmix-crypto/elgamal/gcrypt/CMakeLists.txt2
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c38
-rw-r--r--libcmix-crypto/elgamal/null/CMakeLists.txt2
-rw-r--r--libcmix-crypto/elgamal/null/null_elgamal.c2
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;