aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
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/gcrypt/gcrypt_elgamal.c
parentb229dc91d8825689c5e66264b462ce01398e621e (diff)
downloadcmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.tar.gz
cmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.tar.bz2
cmix-623dffe2c054d1639dbf9c8f21ddfb088c7950fb.zip
Working Ed25519 Implementation of libcmix.
Diffstat (limited to 'libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c')
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c38
1 files changed, 30 insertions, 8 deletions
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;