From 6d55dcba54ceaccc9d90ea7c2f1746524a6e81e3 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Fri, 18 Nov 2016 12:47:35 +0100 Subject: Made permutation a responsibility of cmix in the precomputation phase. --- libcmix-crypto/api.h | 6 ++++++ libcmix-crypto/elgamal/elgamal.c | 1 + libcmix-crypto/elgamal/elgamal.h | 2 ++ libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+) (limited to 'libcmix-crypto') diff --git a/libcmix-crypto/api.h b/libcmix-crypto/api.h index d52ab95..caf97b6 100644 --- a/libcmix-crypto/api.h +++ b/libcmix-crypto/api.h @@ -105,6 +105,11 @@ typedef void (*Encrypter)(GroupElement*, GroupElement*, GroupElement, GroupEleme */ typedef GroupElement (*Inverter)(GroupElement); +/*! + * + */ +typedef unsigned int (*UniformIntGetter)(unsigned int); + /*! * */ @@ -132,6 +137,7 @@ struct Api { SharedKeyDeleter free_shared_key; ///< Pointer to shared key deleter function Encrypter encrypt; ///< encrypt value with key; Inverter invert; ///< Invert the group element; + UniformIntGetter get_uniform_int; ///< Get a uniform int [0 .. argument); Deinitializer deinitialize; ///< Function that will deinitialize the crypto library. }; diff --git a/libcmix-crypto/elgamal/elgamal.c b/libcmix-crypto/elgamal/elgamal.c index 7eea0f3..8f26a3c 100644 --- a/libcmix-crypto/elgamal/elgamal.c +++ b/libcmix-crypto/elgamal/elgamal.c @@ -22,6 +22,7 @@ struct Api get_elgamal_implementation() .free_shared_key = elgamal_delete_shared_key, .encrypt = elgamal_encrypt, .invert = elgamal_invert, + .get_uniform_int = elgamal_get_uniform_int, .deinitialize = elgamal_deinitialize }; } diff --git a/libcmix-crypto/elgamal/elgamal.h b/libcmix-crypto/elgamal/elgamal.h index 1054e3e..f937899 100644 --- a/libcmix-crypto/elgamal/elgamal.h +++ b/libcmix-crypto/elgamal/elgamal.h @@ -46,6 +46,8 @@ extern Encrypter elgamal_encrypt; extern Inverter elgamal_invert; +extern UniformIntGetter elgamal_get_uniform_int; + extern Deinitializer elgamal_deinitialize; /*! diff --git a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c index 6a03fb1..e25ba72 100644 --- a/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c +++ b/libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c @@ -284,6 +284,31 @@ GroupElement gcrypt_elgamal_invert(GroupElement const x) { return inv_x; } +unsigned int gcrypt_elgamal_get_uniform_int(unsigned int upper) { + unsigned int random_value; + + if(upper == 0) { + void* buffer = gcry_random_bytes_secure(nr_bytes, GCRY_STRONG_RANDOM); + + memcpy(&random_value, buffer, sizeof(unsigned int)); + + gcry_free(buffer); + return random_value; + } + + unsigned int lower = -upper % upper; + do { + void* buffer = gcry_random_bytes_secure(nr_bytes, GCRY_STRONG_RANDOM); + + memcpy(&random_value, buffer, sizeof(unsigned int)); + + if (random_value >= lower) + return random_value % upper; + + gcry_free(buffer); + } while(true); +} + void gcrypt_elgamal_deinitialize(void) { gcry_mpi_release(p); gcry_mpi_release(q); @@ -308,4 +333,5 @@ 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; Inverter elgamal_invert = &gcrypt_elgamal_invert; +UniformIntGetter elgamal_get_uniform_int = &gcrypt_elgamal_get_uniform_int; Deinitializer elgamal_deinitialize = &gcrypt_elgamal_deinitialize; \ No newline at end of file -- cgit v1.2.3-70-g09d2