aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix-crypto')
-rw-r--r--libcmix-crypto/api.h35
-rw-r--r--libcmix-crypto/curve25519/curve25519.c5
-rw-r--r--libcmix-crypto/curve25519/curve25519.h2
-rw-r--r--libcmix-crypto/curve25519/sodium/libsodium_curve25519.c2
-rw-r--r--libcmix-crypto/elgamal/elgamal.c25
-rw-r--r--libcmix-crypto/elgamal/elgamal.h80
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c97
-rw-r--r--libcmix-crypto/groupelement.h11
-rw-r--r--libcmix-crypto/keypair.h6
-rw-r--r--libcmix-crypto/sharedkey.h4
10 files changed, 158 insertions, 109 deletions
diff --git a/libcmix-crypto/api.h b/libcmix-crypto/api.h
index 99f6417..f50cee0 100644
--- a/libcmix-crypto/api.h
+++ b/libcmix-crypto/api.h
@@ -10,6 +10,7 @@ extern "C" {
#include <stdbool.h>
+#include "groupelement.h"
#include "keypair.h"
#include "sharedkey.h"
@@ -31,7 +32,7 @@ typedef void (*KeyPairDeleter)(struct KeyPair*);
* \brief Defines how a Derived Shared Key function should look like.
* Used to store a pointer to function to a implementation.
*/
-typedef struct SharedKey (*SharedKeyDeriver)(struct KeyPair, unsigned char const*, size_t, unsigned char const*, size_t, void*, bool);
+typedef struct SharedKey (*SharedKeyDeriver)(struct KeyPair, unsigned char const*, size_t, unsigned char const*, size_t, GroupElement, bool);
/*!
* \brief Defines how a Derived Shared Key deleter function should look like.
@@ -47,27 +48,42 @@ typedef void(*Deinitializer)(void);
/*!
* \brief PubKeyArrayGetter typedef
*/
-typedef void(*KeyArrayGetter)(char**, size_t* size, void*);
+typedef void(*ElementToArray)(unsigned char**, size_t* size, GroupElement);
+
+/*!
+ *
+ */
+typedef GroupElement(*ArrayToElement)(char const*, size_t size, bool);
/*!
* \brief PublicShareAdder typedef
*/
-typedef void(*PublicShareAdder)(char**, size_t*, char const*, size_t, void*);
+typedef void(*PublicShareAdder)(char**, size_t*, char const*, size_t, GroupElement);
/*!
*
*/
-typedef void*(*GroupElementGetter)(bool);
+typedef GroupElement(*GroupElementGetter)(bool);
/*!
*
*/
-typedef void*(*KeyExchangeValueGetter)(void*);
+typedef GroupElement(*KeyExchangeValueGetter)(GroupElement);
+
+/*!
+ *
+ */
+typedef GroupElement(*GroupElementMultiplier)(GroupElement, GroupElement, bool);
/*!
*
*/
-typedef void(*GroupElementDeleter)(void*);
+typedef void(*GroupElementDeleter)(GroupElement);
+
+/*!
+ *
+ */
+typedef void (*Encrypter)(GroupElement*, GroupElement*, GroupElement, GroupElement);
/*!
* \brief The Api struct stores pointers to functions of a specific implementation. Like a Curve25519 specific one.
@@ -76,13 +92,16 @@ struct Api {
Initializer initialize; ///< Function that will initialize the crypto library.
KeyPairCreator create_key_pair; ///< Pointer to keypair creation function
KeyPairDeleter free_key_pair; ///< Pointer to keypair deletor function
- KeyArrayGetter get_key_array; ///< Get the array representation of a public key
+ ElementToArray element_to_array; ///< Get the array representation of a public key
+ ArrayToElement array_to_element; ///< The the GroupElement representation of this array;
GroupElementGetter get_group_element; ///< get group element
- KeyExchangeValueGetter get_key_exchange_value; ///< get generator *op* group element.
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.
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
+ Encrypter encrypt; ///< encrypt value with key;
Deinitializer deinitialize; ///< Function that will deinitialize the crypto library.
};
diff --git a/libcmix-crypto/curve25519/curve25519.c b/libcmix-crypto/curve25519/curve25519.c
index 0036808..1a83308 100644
--- a/libcmix-crypto/curve25519/curve25519.c
+++ b/libcmix-crypto/curve25519/curve25519.c
@@ -8,13 +8,16 @@ struct Api get_curve25519_implementation()
&curve25519_initialize,
&curve25519_create_keypair,
&curve25519_keypair_deleter,
- &curve25519_get_key_array,
+ &curve25519_key_to_array,
+ NULL,
+ NULL,
NULL,
NULL,
NULL,
&curve25519_add_public_share,
&curve25519_derive_shared_key,
&curve25519_shared_key_deleter,
+ NULL,
&curve25519_deinitialize
};
}
diff --git a/libcmix-crypto/curve25519/curve25519.h b/libcmix-crypto/curve25519/curve25519.h
index 2dc2e48..9b65d4e 100644
--- a/libcmix-crypto/curve25519/curve25519.h
+++ b/libcmix-crypto/curve25519/curve25519.h
@@ -33,7 +33,7 @@ extern void curve25519_keypair_deleter(struct KeyPair* p);
* \param buffer
* \param len
*/
-extern void curve25519_get_key_array(char** buffer, size_t* len, void* pubkey);
+extern void curve25519_key_to_array(unsigned char** buffer, size_t* len, void* pubkey);
/*!
* \brief curve25519_add_public_share
diff --git a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
index 0fbd387..6c3fe13 100644
--- a/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
+++ b/libcmix-crypto/curve25519/sodium/libsodium_curve25519.c
@@ -39,7 +39,7 @@ void curve25519_shared_key_deleter(struct SharedKey* s) {
s->shared = NULL;
}
-void curve25519_get_key_array(char** buffer, size_t* len, void* key) {
+void curve25519_key_to_array(unsigned char** buffer, size_t* len, void* key) {
}
diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c
index 342659b..3ee86d7 100644
--- a/libcmix-crypto/elgamal/elgamal.c
+++ b/libcmix-crypto/elgamal/elgamal.c
@@ -4,17 +4,20 @@ struct Api get_elgamal_implementation()
{
elgamal_initialize();
return (struct Api) {
- &elgamal_initialize,
- &elgamal_create_keypair,
- &elgamal_keypair_deleter,
- &elgamal_get_key_array,
- &elgamal_get_group_element,
- &elgamal_get_key_exchange_value,
- &elgamal_free_group_element,
- &elgamal_add_public_share,
- &elgamal_derive_shared_key,
- &elgamal_shared_key_deleter,
- &elgamal_deinitialize
+ elgamal_initialize,
+ elgamal_create_keypair,
+ elgamal_delete_keypair,
+ elgamal_element_to_array,
+ elgamal_array_to_element,
+ elgamal_get_group_element,
+ elgamal_delete_group_element,
+ elgamal_get_key_exchange_value,
+ elgamal_multiply,
+ elgamal_add_public_share,
+ elgamal_derive_shared_key,
+ elgamal_delete_shared_key,
+ elgamal_encrypt,
+ elgamal_deinitialize
};
}
diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h
index dc2dd6f..746b726 100644
--- a/libcmix-crypto/elgamal/elgamal.h
+++ b/libcmix-crypto/elgamal/elgamal.h
@@ -10,79 +10,33 @@ extern "C" {
#include "api.h"
-/*!
- * \brief elgamal_initialize initializes the elgamal library
- */
-extern void elgamal_initialize(void);
+extern Initializer elgamal_initialize;
-/*!
- * \brief elgamal_create_keypair
- * \return The new keypair
- */
-extern struct KeyPair elgamal_create_keypair(void);
+extern KeyPairCreator elgamal_create_keypair;
-/*!
- * \brief elgamal_keypair_deleter
- * \param p the keypair to be freed
- */
-extern void elgamal_keypair_deleter(struct KeyPair* p);
+extern KeyPairDeleter elgamal_delete_keypair;
-/*!
- * \brief elgamal_get_pubkey_array
- * \param buffer
- * \param len
- * \param pubkey
- */
-extern void elgamal_get_key_array(char** buffer, size_t* len, void* pubkey);
+extern ElementToArray elgamal_element_to_array;
-/*!
- * \brief get_group_element
- * \param secure
- * \return
- */
-extern void* elgamal_get_group_element(bool secure);
+extern ArrayToElement elgamal_array_to_element;
-/*!
- * \brief get_key_exchange_value
- * \param group_el
- * \return
- */
-extern void* elgamal_get_key_exchange_value(void* group_el);
+extern GroupElementGetter elgamal_get_group_element;
-/*!
- * \brief elgamal_free_group_element
- */
-extern void elgamal_free_group_element(void*);
+extern GroupElementDeleter elgamal_delete_group_element;
-/*!
- * \brief elgamal_add_public_share
- * \param buffer
- * \param in_len
- * \param share
- * \param in_len
- * \param pubkey
- */
-void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey);
+extern KeyExchangeValueGetter elgamal_get_key_exchange_value;
-/*!
- * \brief elgamal_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 struct SharedKey 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);
+extern GroupElementMultiplier elgamal_multiply;
-/*!
- * \brief elgamal_shared_key_deleter
- * \param s The shared key to be freed.
- */
-extern void elgamal_shared_key_deleter(struct SharedKey* s);
+extern PublicShareAdder elgamal_add_public_share;
-/*!
- * \brief elgamal_deinitialize deinitializes the elgamal_library
- */
-void elgamal_deinitialize(void);
+extern SharedKeyDeriver elgamal_derive_shared_key;
+
+extern SharedKeyDeleter elgamal_delete_shared_key;
+
+extern Encrypter elgamal_encrypt;
+
+extern Deinitializer elgamal_deinitialize;
/*!
* \brief get_elgamal_implementation
diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
index ac90a51..1dd0690 100644
--- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
+++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c
@@ -1,5 +1,5 @@
-#include "api.h"
+#include "elgamal.h"
#include "gcrypt.h"
@@ -32,7 +32,7 @@ void print_sexp(gcry_sexp_t exp) {
free(str);
}
-void elgamal_initialize(void) {
+void gcrypt_elgamal_initialize(void) {
if (!gcry_check_version (GCRYPT_VERSION)) {
fprintf(stderr, "libgcrypt version mismatch\n");
exit(-1);
@@ -61,7 +61,7 @@ void elgamal_initialize(void) {
check(error);
}
-struct KeyPair elgamal_create_keypair() {
+struct KeyPair gcrypt_elgamal_create_keypair() {
size_t parse_error_offset;
gcry_error_t error;
@@ -90,23 +90,33 @@ struct KeyPair elgamal_create_keypair() {
};
}
-void elgamal_keypair_deleter(struct KeyPair* p) {
+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 elgamal_get_key_array(unsigned char** buffer, size_t* len, void* key) {
+void gcrypt_elgamal_element_to_array(unsigned char** buffer, size_t* len, void* key) {
gcry_mpi_t mpi = (gcry_mpi_t) key;
gcry_error_t error;
-
error = gcry_mpi_aprint(GCRYMPI_FMT_USG, buffer, len, mpi);
check(error);
}
-void* elgamal_get_group_element(bool secure) {
+void* gcrypt_elgamal_array_to_element(char const* buffer, size_t len, bool secure) {
+ size_t error_pos;
+ gcry_error_t error;
+
+ gcry_mpi_t mpi = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0);
+ error = gcry_mpi_scan(&mpi, GCRYMPI_FMT_USG, buffer, len, &error_pos);
+ check(error);
+
+ return mpi;
+}
+
+void* gcrypt_elgamal_get_group_element(bool secure) {
size_t parse_error_offset;
gcry_error_t error;
@@ -120,11 +130,7 @@ void* elgamal_get_group_element(bool secure) {
return a;
}
-void elgamal_free_group_element(void* el) {
- gcry_mpi_release((gcry_mpi_t) el);
-}
-
-void* elgamal_get_key_exchange_value(void* group_el) {
+GroupElement gcrypt_elgamal_get_key_exchange_value(GroupElement group_el) {
gcry_mpi_t el = (gcry_mpi_t) group_el;
gcry_mpi_t val = gcry_mpi_new(0);
@@ -133,7 +139,19 @@ void* elgamal_get_key_exchange_value(void* group_el) {
return val;
}
-void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
+GroupElement gcrypt_elgamal_multiply(GroupElement lh, GroupElement rh, bool secure) {
+ gcry_mpi_t ret = secure ? gcry_mpi_snew(0) : gcry_mpi_new(0);
+ gcry_mpi_mulm(ret, (gcry_mpi_t) lh, (gcry_mpi_t) rh, p);
+ return ret;
+}
+
+void gcrypt_elgamal_delete_group_element(void* el) {
+ gcry_mpi_release((gcry_mpi_t) el);
+}
+
+
+
+void gcrypt_elgamal_add_public_share(char** buffer, size_t* out_len, char const* share, size_t in_len, void* pubkey) {
gcry_error_t error;
size_t parse_error_pos;
@@ -151,13 +169,7 @@ void elgamal_add_public_share(char** buffer, size_t* out_len, char const* share,
check(error);
}
-void elgamal_shared_key_deleter(struct SharedKey* s) {
- gcry_mpi_release((gcry_mpi_t) s->shared);
- s->shared = NULL;
-}
-
-
-struct SharedKey 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) {
+struct SharedKey gcrypt_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) {
gcry_error_t error;
size_t parse_error_pos;
@@ -177,8 +189,51 @@ struct SharedKey elgamal_derive_shared_key(struct KeyPair keypair, unsigned char
};
}
-void elgamal_deinitialize(void) {
+void gcrypt_elgamal_delete_shared_key(struct SharedKey* s) {
+ gcry_mpi_release((gcry_mpi_t) s->shared);
+ s->shared = NULL;
+}
+
+void gcrypt_elgamal_encrypt(GroupElement* random_element, GroupElement* message_element, GroupElement value, GroupElement key) {
+ gcry_error_t error;
+ size_t parse_error_pos;
+
+ gcry_sexp_t pubkey_expr;
+ error = gcry_sexp_build(&pubkey_expr, &parse_error_pos, "(public-key (elg (p %M) (g %M) (y %M)))", p, g, key);
+ check(error);
+
+ gcry_sexp_t value_expr;
+ error = gcry_sexp_build(&value_expr, &parse_error_pos, "(data (flags raw) (value %M))", value);
+ check(error);
+
+ gcry_sexp_t enc_expr;
+ error = gcry_pk_encrypt(&enc_expr, value_expr, pubkey_expr);
+ check(error);
+
+ gcry_sexp_extract_param(enc_expr, NULL, "ab", random_element, message_element, NULL);
+
+ gcry_sexp_release(enc_expr);
+ gcry_sexp_release(value_expr);
+ gcry_sexp_release(pubkey_expr);
+}
+
+void gcrypt_elgamal_deinitialize(void) {
gcry_mpi_release(p);
gcry_mpi_release(q);
gcry_mpi_release(g);
}
+
+Initializer elgamal_initialize = &gcrypt_elgamal_initialize;
+KeyPairCreator elgamal_create_keypair = &gcrypt_elgamal_create_keypair;
+KeyPairDeleter elgamal_delete_keypair = &gcrypt_elgamal_delete_keypair;
+ElementToArray elgamal_element_to_array = &gcrypt_elgamal_element_to_array;
+ArrayToElement elgamal_array_to_element = &gcrypt_elgamal_array_to_element;
+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;
+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;
+Encrypter elgamal_encrypt = &gcrypt_elgamal_encrypt;
+Deinitializer elgamal_deinitialize = &gcrypt_elgamal_deinitialize; \ No newline at end of file
diff --git a/libcmix-crypto/groupelement.h b/libcmix-crypto/groupelement.h
new file mode 100644
index 0000000..60c6b21
--- /dev/null
+++ b/libcmix-crypto/groupelement.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* GroupElement;
+
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file
diff --git a/libcmix-crypto/keypair.h b/libcmix-crypto/keypair.h
index 3b6e0d1..1222c51 100644
--- a/libcmix-crypto/keypair.h
+++ b/libcmix-crypto/keypair.h
@@ -8,6 +8,8 @@
extern "C" {
#endif
+#include "groupelement.h"
+
#include <stdlib.h>
/*!
@@ -17,8 +19,8 @@ extern "C" {
* responsible for memory meanagement. See the Api struct for examples of this.
*/
struct KeyPair {
- void* sec; ///< Private key
- void* pub; ///< Public key
+ GroupElement sec; ///< Private key
+ GroupElement pub; ///< Public key
};
diff --git a/libcmix-crypto/sharedkey.h b/libcmix-crypto/sharedkey.h
index b89cb5b..b2f84f6 100644
--- a/libcmix-crypto/sharedkey.h
+++ b/libcmix-crypto/sharedkey.h
@@ -8,13 +8,15 @@
extern "C" {
#endif
+#include "groupelement.h"
+
/*!
* \brief The SharedKey struct.
*
* Stored the derived shared secret after for instance Diffie-Hellman.
*/
struct SharedKey {
- void* shared; ///< The Shared key.
+ GroupElement shared; ///< The Shared key.
};
#ifdef __cplusplus