You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by sa...@apache.org on 2019/12/06 15:07:48 UTC
[incubator-milagro-crypto-c] 09/10: add i/o functions for paillier
public key
This is an automated email from the ASF dual-hosted git repository.
sandreoli pushed a commit to branch issue51
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-crypto-c.git
commit 294e3c04a10da7f46f66fed28ea066fc26cef6aa
Author: samuele-andreoli <sa...@yahoo.it>
AuthorDate: Wed Dec 4 13:00:30 2019 +0000
add i/o functions for paillier public key
---
include/paillier.h | 14 +++++++++++
src/paillier.c | 17 ++++++++++++++
test/test_paillier_consistency.c | 50 ++++++++++++++++++++--------------------
3 files changed, 56 insertions(+), 25 deletions(-)
diff --git a/include/paillier.h b/include/paillier.h
index 94bf087..38b9ef0 100644
--- a/include/paillier.h
+++ b/include/paillier.h
@@ -152,3 +152,17 @@ void PAILLIER_ADD(PAILLIER_public_key *PUB, octet* CT1, octet* CT2, octet* CT);
* @param CT Ciphertext
*/
void PAILLIER_MULT(PAILLIER_public_key *PUB, octet* CT1, octet* PT, octet* CT);
+
+/**! \brief Read a public key from its octet representation
+ *
+ * @param PUB Public key
+ * @param PK Octet representation of the public key
+ */
+void PAILLIER_PK_fromOctet(PAILLIER_public_key *PUB, octet *PK);
+
+/**! \brief Write a public key to an octet
+ *
+ * @param PK Destination octet
+ * @param PUB Public key
+ */
+void PAILLIER_PK_toOctet(octet *PK, PAILLIER_public_key *PUB);
diff --git a/src/paillier.c b/src/paillier.c
index 15532ab..61534f3 100644
--- a/src/paillier.c
+++ b/src/paillier.c
@@ -410,3 +410,20 @@ void PAILLIER_MULT(PAILLIER_public_key *PUB, octet* CT1, octet* PT, octet* CT)
// Clean memory
FF_4096_zero(pt, HFLEN_4096);
}
+
+void PAILLIER_PK_fromOctet(PAILLIER_public_key *PUB, octet *PK)
+{
+ FF_4096_zero(PUB->n, FFLEN_4096);
+ FF_4096_fromOctet(PUB->n, PK, HFLEN_4096);
+
+ FF_4096_sqr(PUB->n2, PUB->n, HFLEN_4096);
+ FF_4096_norm(PUB->n2, FFLEN_4096);
+
+ FF_4096_copy(PUB->g, PUB->n, FFLEN_4096);
+ FF_4096_inc(PUB->g,1,HFLEN_4096);
+}
+
+void PAILLIER_PK_toOctet(octet *PK, PAILLIER_public_key *PUB)
+{
+ FF_4096_toOctet(PK, PUB->n, HFLEN_4096);
+}
diff --git a/test/test_paillier_consistency.c b/test/test_paillier_consistency.c
index dd8a3c8..f07b11f 100644
--- a/test/test_paillier_consistency.c
+++ b/test/test_paillier_consistency.c
@@ -32,13 +32,25 @@ under the License.
char* PT3GOLDEN_hex = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [...]
+void ff_compare(BIG_512_60 *a, BIG_512_60 *b, char *msg, int n)
+{
+ if(FF_4096_comp(a, b, n))
+ {
+ fprintf(stderr, "FAILURE %s\n", msg);
+ exit(EXIT_FAILURE);
+ }
+}
+
int paillier(csprng *RNG)
{
BIG_512_60 zero[FFLEN_4096];
// Key material
PAILLIER_private_key PRIV;
- PAILLIER_public_key PUB;
+ PAILLIER_public_key PUB, PUBIN;
+
+ char pub[HFS_4096];
+ octet PUBOCT = {0,HFS_4096,pub};
// Plaintext to encrypt
char ptin[NTHREADS][FS_2048];
@@ -100,6 +112,14 @@ int paillier(csprng *RNG)
PAILLIER_KEY_PAIR(RNG, NULL, NULL, &PUB, &PRIV);
+ // Check public key i/o functions
+ PAILLIER_PK_toOctet(&PUBOCT, &PUB);
+ PAILLIER_PK_fromOctet(&PUBIN, &PUBOCT);
+
+ ff_compare(PUB.n, PUBIN.n, "n not correctly loaded", FFLEN_4096);
+ ff_compare(PUB.g, PUBIN.g, "g not correctly loaded", FFLEN_4096);
+ ff_compare(PUB.n2, PUBIN.n2, "n^2 not correctly loaded", FFLEN_4096);
+
#ifdef DEBUG
printf("P: ");
FF_4096_output(PRIV.p, HFLEN_4096);
@@ -224,30 +244,10 @@ int paillier(csprng *RNG)
PAILLIER_PRIVATE_KEY_KILL(&PRIV);
FF_4096_zero(zero, FFLEN_4096);
-
- if(FF_4096_comp(zero, PRIV.p, HFLEN_4096))
- {
- fprintf(stderr, "FAILURE p not cleaned from private key\n");
- exit(EXIT_FAILURE);
- }
-
- if(FF_4096_comp(zero, PRIV.q, HFLEN_4096))
- {
- fprintf(stderr, "FAILURE q not cleaned from private key\n");
- exit(EXIT_FAILURE);
- }
-
- if(FF_4096_comp(zero, PRIV.l, FFLEN_4096))
- {
- fprintf(stderr, "FAILURE l not cleaned from private key\n");
- exit(EXIT_FAILURE);
- }
-
- if(FF_4096_comp(zero, PRIV.m, FFLEN_4096))
- {
- fprintf(stderr, "FAILURE m not cleaned from private key\n");
- exit(EXIT_FAILURE);
- }
+ ff_compare(zero, PRIV.p, "p not cleaned from private key", HFLEN_4096);
+ ff_compare(zero, PRIV.q, "p not cleaned from private key", HFLEN_4096);
+ ff_compare(zero, PRIV.l, "p not cleaned from private key", HFLEN_4096);
+ ff_compare(zero, PRIV.m, "p not cleaned from private key", FFLEN_4096);
OCT_clear(&CT3);
OCT_clear(&PT3);