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 <[email protected]> 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);
