diff options
Diffstat (limited to 'libcmix-crypto')
| -rw-r--r-- | libcmix-crypto/api.h | 35 | ||||
| -rw-r--r-- | libcmix-crypto/curve25519/curve25519.c | 5 | ||||
| -rw-r--r-- | libcmix-crypto/curve25519/curve25519.h | 2 | ||||
| -rw-r--r-- | libcmix-crypto/curve25519/sodium/libsodium_curve25519.c | 2 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.c | 25 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/elgamal.h | 80 | ||||
| -rw-r--r-- | libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 97 | ||||
| -rw-r--r-- | libcmix-crypto/groupelement.h | 11 | ||||
| -rw-r--r-- | libcmix-crypto/keypair.h | 6 | ||||
| -rw-r--r-- | libcmix-crypto/sharedkey.h | 4 |
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 |
