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);