aboutsummaryrefslogtreecommitdiff
path: root/libcmix-crypto/elgamal
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-11-18 12:47:35 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2016-11-18 12:47:35 +0100
commit6d55dcba54ceaccc9d90ea7c2f1746524a6e81e3 (patch)
tree264bcf206535d41cdfec7c0a659c861ea0bd5f31 /libcmix-crypto/elgamal
parentd9e011488b9d7af4683e6640216e78871a06a5ec (diff)
downloadcmix-6d55dcba54ceaccc9d90ea7c2f1746524a6e81e3.tar.gz
cmix-6d55dcba54ceaccc9d90ea7c2f1746524a6e81e3.tar.bz2
cmix-6d55dcba54ceaccc9d90ea7c2f1746524a6e81e3.zip
Made permutation a responsibility of cmix in the precomputation phase.
Diffstat (limited to 'libcmix-crypto/elgamal')
-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.c26
3 files changed, 29 insertions, 0 deletions
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