aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal/gcrypt
diff options
context:
space:
mode:
Diffstat (limited to 'libcmix-crypto/elgamal/gcrypt')
-rw-r--r--libcmix-crypto/elgamal/gcrypt/gcrypt_elgamal.c26
1 files changed, 26 insertions, 0 deletions
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