aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-04 13:11:11 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-04 13:11:11 +0100
commit58ead6a9a4a2a81f067ad698366bd32841346058 (patch)
tree72398158aa8a077b48a9116dbbff629d340208af /libcmix-crypto
parent837d8336fb5323ff797cbcbce17a05a3838e051f (diff)
downloadcmix-58ead6a9a4a2a81f067ad698366bd32841346058.tar.gz
cmix-58ead6a9a4a2a81f067ad698366bd32841346058.tar.bz2
cmix-58ead6a9a4a2a81f067ad698366bd32841346058.zip
Consolidated all the crypto apis and implemented the Precomputation Postprocessing step
Diffstat (limited to 'libcmix-crypto')
-rw-r--r--libcmix-crypto/api.h6
-rw-r--r--libcmix-crypto/curve25519/curve25519.c33
-rw-r--r--libcmix-crypto/curve25519/curve25519.h70
-rw-r--r--libcmix-crypto/curve25519/null/null_curve25519.c40
-rw-r--r--libcmix-crypto/curve25519/sodium/libsodium_curve25519.c35
-rw-r--r--libcmix-crypto/elgamal/elgamal.c1
-rw-r--r--libcmix-crypto/elgamal/elgamal.h2
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c11
-rw-r--r--libcmix-crypto/elgamal/null/null_elgamal.c42
9 files changed, 147 insertions, 93 deletions
diff --git a/libcmix-crypto/api.h b/libcmix-crypto/api.h
index 6d701d7..addf9e3 100644
--- a/libcmix-crypto/api.h
+++ b/libcmix-crypto/api.h
@@ -96,6 +96,11 @@ typedef void(*GroupElementDeleter)(GroupElement);
typedef void (*Encrypter)(GroupElement*, GroupElement*, GroupElement, GroupElement);
/*!
+ *
+ */
+typedef GroupElement (*DecryptionShareGetter)(GroupElement, GroupElement);
+
+/*!
* \brief The Api struct stores pointers to functions of a specific implementation. Like a Curve25519 specific one.
*/
struct Api {
@@ -110,6 +115,7 @@ struct Api {
GroupElementDeleter free_group_element; ///< frees a base type of the cryptolibrary.
KeyExchangeValueGetter get_key_exchange_value; ///< get generator *op* group element.
GroupElementMultiplier multiply; ///< Multiplies two groupelements modulo group.
+ DecryptionShareGetter get_decryption_share; ///< calculates the first argument to the power of Inverse second argument;
PublicShareAdder add_public_share; ///< Adds the public key stored in void* to the existing share.
SharedKeyDeriver derive_shared_key; ///< Pointer to shared key derivation function
SharedKeyDeleter free_shared_key; ///< Pointer to shared key deleter function
diff --git a/libcmix-crypto/curve25519/curve25519.c b/libcmix-crypto/curve25519/curve25519.c
index db77d9a..a963840 100644
--- a/libcmix-crypto/curve25519/curve25519.c
+++ b/libcmix-crypto/curve25519/curve25519.c
@@ -5,22 +5,23 @@ struct Api get_curve25519_implementation()
{
curve25519_initialize();
return (struct Api) {
- &curve25519_initialize,
- &curve25519_create_keypair,
- &curve25519_keypair_deleter,
- &curve25519_key_to_array,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- &curve25519_add_public_share,
- &curve25519_derive_shared_key,
- &curve25519_shared_key_deleter,
- NULL,
- &curve25519_deinitialize
+ .initialize = curve25519_initialize,
+ .create_keypair = curve25519_create_keypair,
+ .free_keypair = curve25519_delete_keypair,
+ .element_to_array = curve25519_element_to_array,
+ .free_buffer = curve25519_free_buffer,
+ .array_to_element = curve25519_array_to_element,
+ .get_group_element = curve25519_get_group_element,
+ .get_group_element_array_size = curve25519_get_group_element_array_size,
+ .free_group_element = curve25519_delete_group_element,
+ .get_key_exchange_value = curve25519_get_key_exchange_value,
+ .multiply = curve25519_multiply,
+ .get_decryption_share = curve25519_get_decryption_share,
+ .add_public_share = curve25519_add_public_share,
+ .derive_shared_key = curve25519_derive_shared_key,
+ .free_shared_key = curve25519_delete_shared_key,
+ .encrypt = curve25519_encrypt,
+ .deinitialize = curve25519_deinitialize
};
}
diff --git a/libcmix-crypto/curve25519/curve25519.h b/libcmix-crypto/curve25519/curve25519.h
index 762e8db..5f30915 100644
--- a/libcmix-crypto/curve25519/curve25519.h
+++ b/libcmix-crypto/curve25519/curve25519.h
@@ -10,55 +10,39 @@ extern "C" {
* \file
*/
-/*!
- * \brief curve25519_initialize initilalize curve25519 library
- */
-extern void curve25519_initialize(void);
+extern Initializer curve25519_initialize;
-/*!
- * \brief curve25519_create_keypair
- * \return A curve25519 keypair.
- */
-extern struct KeyPair curve25519_create_keypair(void);
+extern KeyPairCreator curve25519_create_keypair;
-/*!
- * \brief curve25519_keypair_deleter
- * \param p The keypair to free.
- */
-extern void curve25519_keypair_deleter(struct KeyPair* p);
+extern KeyPairDeleter curve25519_delete_keypair;
-/*!
- * \brief curve25519_get_pubkey_array
- * \param pubkey
- * \param buffer
- * \param len
- */
-extern void curve25519_key_to_array(unsigned char** buffer, size_t* len, void* pubkey);
+extern ElementToArray curve25519_element_to_array;
-/*!
- * \brief curve25519_add_public_share
- * \param buffer
- * \param out_len
- * \param share
- * \param pubkey
- */
-extern void curve25519_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey);
+extern BufferDeleter curve25519_free_buffer;
-/*!
- * \brief curve25519_derive_shared_key
- * \param pair Our keypair.
- * \param pub_key The public key of the other party.
- * \param swap_pub_order Should we swap the order in which we feed the public keys to the hash function.
- * \return A Shared key
- */
-extern GroupElement curve25519_derive_shared_key(struct KeyPair pair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap_pub_order);
-/*!
- * \brief curve25519_shared_key_deleter
- * \param s the Shared key to free.
- */
-extern void curve25519_shared_key_deleter(struct SharedKey* s);
+extern ArrayToElement curve25519_array_to_element;
+
+extern GroupElementGetter curve25519_get_group_element;
+
+extern GroupElementDeleter curve25519_delete_group_element;
+
+extern KeyExchangeValueGetter curve25519_get_key_exchange_value;
+
+extern GroupElementMultiplier curve25519_multiply;
+
+extern DecryptionShareGetter curve25519_get_decryption_share;
+
+extern GroupElementArraySizeGetter curve25519_get_group_element_array_size;
+
+extern PublicShareAdder curve25519_add_public_share;
+
+extern SharedKeyDeriver curve25519_derive_shared_key;
+
+extern SharedKeyDeleter curve25519_delete_shared_key;
+
+extern Encrypter curve25519_encrypt;
-extern void curve25519_deinitialize(void);
+extern Deinitializer curve25519_deinitialize;
/*!
* \brief get_curve25519_implementation
diff --git a/libcmix-crypto/curve25519/null/null_curve25519.c b/libcmix-crypto/curve25519/null/null_curve25519.c
index 33fb963..d261791 100644
--- a/libcmix-crypto/curve25519/null/null_curve25519.c
+++ b/libcmix-crypto/curve25519/null/null_curve25519.c
@@ -1,31 +1,47 @@
-#include "api.h"
+#include "curve25519.h"
#include <stddef.h>
#include <stdbool.h>
-void curve25519_initialize(void){}
+void null_curve25519_initialize(void){}
-struct KeyPair curve25519_create_keypair(void) {
+struct KeyPair null_curve25519_create_keypair(void) {
return (struct KeyPair){
NULL,
NULL,
};
}
-void curve25519_keypair_deleter(struct KeyPair* p) {}
+void null_curve25519_delete_keypair(struct KeyPair* p) {}
-void curve25519_get_key_array(char** buffer, size_t* len, void* key) {}
+void null_curve25519_get_key_array(char** buffer, size_t* len, void* key) {}
-void curve25519_add_public_share(char** buffer, size_t* len_out, char const* share, size_t in_len, void* pubkey) {}
+void null_curve25519_add_public_share(char** buffer, size_t* len_out, char const* share, size_t in_len, void* pubkey) {}
-void curve25519_shared_key_deleter(struct SharedKey* s) {}
+void null_curve25519_shared_key_deleter(struct SharedKey* s) {}
-struct SharedKey curve25519_derive_shared_key(struct KeyPair pair, unsigned char const* pub_key, bool swap_pub_order) {
- return (struct SharedKey){
- NULL,
- };
+GroupElement null_curve25519_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) {
+ return NULL;
}
-void curve25519_deinitialize(void){} \ No newline at end of file
+void null_curve25519_deinitialize(void){}
+
+Initializer curve25519_initialize = &null_curve25519_initialize;
+KeyPairCreator curve25519_create_keypair = &null_curve25519_create_keypair;
+KeyPairDeleter curve25519_delete_keypair = &null_curve25519_delete_keypair;
+ElementToArray curve25519_element_to_array = NULL;//&null_curve25519_element_to_array;
+BufferDeleter curve25519_free_buffer = NULL;//&null_curve25519_free_buffer;
+ArrayToElement curve25519_array_to_element = NULL;//&null_curve25519_array_to_element;
+GroupElementGetter curve25519_get_group_element = NULL;//&null_curve25519_get_group_element;
+GroupElementDeleter curve25519_delete_group_element = NULL;//&null_curve25519_delete_group_element;
+KeyExchangeValueGetter curve25519_get_key_exchange_value = NULL;//&null_curve25519_get_key_exchange_value;
+GroupElementMultiplier curve25519_multiply = NULL;//&null_curve25519_multiply;
+DecryptionShareGetter curve25519_get_decryption_share = NULL;//&null_curve25519_get_decryption_share;
+GroupElementArraySizeGetter curve25519_get_group_element_array_size = NULL;//&null_curve25519_get_group_element_array_size;
+PublicShareAdder curve25519_add_public_share = NULL;//&null_curve25519_add_public_share;
+SharedKeyDeriver curve25519_derive_shared_key = &null_curve25519_derive_shared_key;
+SharedKeyDeleter curve25519_delete_shared_key = NULL;//&null_curve25519_delete_shared_key;
+Encrypter curve25519_encrypt = NULL;//&null_curve25519_encrypt;
+Deinitializer curve25519_deinitialize = &null_curve25519_deinitialize;
diff --git a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
index 2405442..b4ae963 100644
--- a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
+++ b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
@@ -6,13 +6,13 @@
#include <stddef.h>
#include <stdlib.h>
-void curve25519_initialize(void) {
+void sodium_curve25519_initialize(void) {
if(sodium_init() == -1) {
exit(-1);
}
}
-void curve25519_keypair_deleter(struct KeyPair* p) {
+void sodium_curve25519_delete_keypair(struct KeyPair* p) {
sodium_free(p->sec);
free(p->pub);
@@ -20,7 +20,7 @@ void curve25519_keypair_deleter(struct KeyPair* p) {
p->pub = NULL;
}
-struct KeyPair curve25519_create_keypair(void) {
+struct KeyPair sodium_curve25519_create_keypair(void) {
unsigned char* sec = (unsigned char*) sodium_malloc(crypto_box_SECRETKEYBYTES);
unsigned char* pub = (unsigned char*) malloc(crypto_box_PUBLICKEYBYTES);
@@ -33,21 +33,21 @@ struct KeyPair curve25519_create_keypair(void) {
};
}
-void curve25519_shared_key_deleter(struct SharedKey* s) {
+void sodium_curve25519_shared_key_deleter(struct SharedKey* s) {
sodium_free(s->shared);
s->shared = NULL;
}
-void curve25519_key_to_array(unsigned char** buffer, size_t* len, void* key) {
+void sodium_curve25519_key_to_array(unsigned char** buffer, size_t* len, void* key) {
}
-void curve25519_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
+void sodium_curve25519_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
}
-GroupElement curve25519_derive_shared_key(struct KeyPair pair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap_pub_order) {
+GroupElement sodium_curve25519_derive_shared_key(struct KeyPair pair, unsigned char const* other_pub, size_t pub_len, unsigned char const* value, size_t value_len, void* priv_value, bool swap_pub_order) {
unsigned char* shared = (unsigned char*) sodium_malloc(crypto_generichash_BYTES);
crypto_generichash_state h;
@@ -74,5 +74,22 @@ GroupElement curve25519_derive_shared_key(struct KeyPair pair, unsigned char con
return shared;
}
-void curve25519_deinitialize(void) {}
-
+void sodium_curve25519_deinitialize(void) {}
+
+Initializer curve25519_initialize = &sodium_curve25519_initialize;
+KeyPairCreator curve25519_create_keypair = &sodium_curve25519_create_keypair;
+KeyPairDeleter curve25519_delete_keypair = &sodium_curve25519_delete_keypair;
+ElementToArray curve25519_element_to_array = NULL;//&sodium_curve25519_element_to_array;
+BufferDeleter curve25519_free_buffer = NULL;//&sodium_curve25519_free_buffer;
+ArrayToElement curve25519_array_to_element = NULL;//&sodium_curve25519_array_to_element;
+GroupElementGetter curve25519_get_group_element = NULL;//&sodium_curve25519_get_group_element;
+GroupElementDeleter curve25519_delete_group_element = NULL;//&sodium_curve25519_delete_group_element;
+KeyExchangeValueGetter curve25519_get_key_exchange_value = NULL;//&sodium_curve25519_get_key_exchange_value;
+GroupElementMultiplier curve25519_multiply = NULL;//&sodium_curve25519_multiply;
+DecryptionShareGetter curve25519_get_decryption_share = NULL;//&sodium_curve25519_get_decryption_share;
+GroupElementArraySizeGetter curve25519_get_group_element_array_size = NULL;//&sodium_curve25519_get_group_element_array_size;
+PublicShareAdder curve25519_add_public_share = NULL;//&sodium_curve25519_add_public_share;
+SharedKeyDeriver curve25519_derive_shared_key = &sodium_curve25519_derive_shared_key;
+SharedKeyDeleter curve25519_delete_shared_key = NULL;//&sodium_curve25519_delete_shared_key;
+Encrypter curve25519_encrypt = NULL;//&sodium_curve25519_encrypt;
+Deinitializer curve25519_deinitialize = &sodium_curve25519_deinitialize;
diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c
index e54f76d..dbfccb9 100644
--- a/libcmix-crypto/elgamal/elgamal.c
+++ b/libcmix-crypto/elgamal/elgamal.c
@@ -15,6 +15,7 @@ struct Api get_elgamal_implementation()
.free_group_element = elgamal_delete_group_element,
.get_key_exchange_value = elgamal_get_key_exchange_value,
.multiply = elgamal_multiply,
+ .get_decryption_share = elgamal_get_decryption_share,
.add_public_share = elgamal_add_public_share,
.derive_shared_key = elgamal_derive_shared_key,
.free_shared_key = elgamal_delete_shared_key,
diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h
index 43ddca0..21bf58a 100644
--- a/libcmix-crypto/elgamal/elgamal.h
+++ b/libcmix-crypto/elgamal/elgamal.h
@@ -30,6 +30,8 @@ extern KeyExchangeValueGetter elgamal_get_key_exchange_value;
extern GroupElementMultiplier elgamal_multiply;
+extern DecryptionShareGetter elgamal_get_decryption_share;
+
extern GroupElementArraySizeGetter elgamal_get_group_element_array_size;
extern PublicShareAdder elgamal_add_public_share;
diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
index c610556..1824ccc 100644
--- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
+++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
@@ -152,6 +152,16 @@ GroupElement gcrypt_elgamal_multiply(GroupElement lh, GroupElement rh, bool secu
return ret;
}
+GroupElement gcrypt_elgamal_get_decryption_share(GroupElement r, GroupElement e) {
+ gcry_mpi_t inve = gcry_mpi_snew(0);
+ gcry_mpi_invm(inve, (gcry_mpi_t)e, p);
+
+ gcry_mpi_t d = gcry_mpi_snew(0);
+ gcry_mpi_powm(d, (gcry_mpi_t)r, inve, p);
+ gcry_mpi_release(inve);
+ return d;
+}
+
size_t gcrypt_elgamal_get_group_element_array_size() {
return 256u;
}
@@ -241,6 +251,7 @@ 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;
+DecryptionShareGetter elgamal_get_decryption_share = &gcrypt_elgamal_get_decryption_share;
GroupElementArraySizeGetter elgamal_get_group_element_array_size = &gcrypt_elgamal_get_group_element_array_size;
PublicShareAdder elgamal_add_public_share = &gcrypt_elgamal_add_public_share;
SharedKeyDeriver elgamal_derive_shared_key = &gcrypt_elgamal_derive_shared_key;
diff --git a/libcmix-crypto/elgamal/null/null_elgamal.c b/libcmix-crypto/elgamal/null/null_elgamal.c
index 17478e1..2b5c43b 100644
--- a/libcmix-crypto/elgamal/null/null_elgamal.c
+++ b/libcmix-crypto/elgamal/null/null_elgamal.c
@@ -1,30 +1,46 @@
-#include "api.h"
+#include "elgamal.h"
#include <stddef.h>
#include <stdbool.h>
-void elgamal_initialize(void) {}
+void null_elgamal_initialize(void) {}
-void elgamal_keypair_deleter(struct KeyPair p) {}
+void null_elgamal_keypair_deleter(struct KeyPair p) {}
-struct KeyPair elgamal_create_keypair() {
+struct KeyPair null_elgamal_create_keypair() {
return (struct KeyPair){
NULL,
NULL,
};
}
-void elgamal_get_key_array(char** buffer, size_t* len, void* pubkey) {}
+void null_elgamal_get_key_array(char** buffer, size_t* len, void* pubkey) {}
-void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {}
+void null_elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {}
-struct SharedKey elgamal_derive_shared_key(struct KeyPair pair, void const* pub_key, bool swap_pub_order) {
- return (struct SharedKey){
- NULL,
- };
+GroupElement null_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) {
+ return NULL;
}
-void elgamal_shared_key_deleter(struct SharedKey* s) {}
-
-void elgamal_deinitialize(void) {}
+void null_elgamal_shared_key_deleter(struct SharedKey* s) {}
+
+void null_elgamal_deinitialize(void) {}
+
+Initializer elgamal_initialize = &null_elgamal_initialize;
+KeyPairCreator elgamal_create_keypair = &null_elgamal_create_keypair;
+KeyPairDeleter elgamal_delete_keypair = NULL;//&null_elgamal_delete_keypair;
+ElementToArray elgamal_element_to_array = NULL;//&null_elgamal_element_to_array;
+BufferDeleter elgamal_free_buffer = NULL;//&null_elgamal_free_buffer;
+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;
+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;
+SharedKeyDeriver elgamal_derive_shared_key = &null_elgamal_derive_shared_key;
+SharedKeyDeleter elgamal_delete_shared_key = NULL;//&null_elgamal_delete_shared_key;
+Encrypter elgamal_encrypt = NULL;//&null_elgamal_encrypt;
+Deinitializer elgamal_deinitialize = &null_elgamal_deinitialize; \ No newline at end of file