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 66f5994551b10cba99e7908833b74afb0515a467 Author: samuele-andreoli <[email protected]> AuthorDate: Tue Nov 12 12:56:02 2019 +0000 add paillier to build --- CMakeLists.txt | 66 ++++++++++++++++++++++-- Makefile | 5 ++ cmake/AMCLParameters.cmake | 2 +- config.mk | 3 ++ include/paillier.h | 7 ++- src/big.c.in | 84 ++++++++++++++++++++++++++++++ src/ff.c.in | 84 ------------------------------ src/paillier.c | 126 +++++++++++++++++---------------------------- 8 files changed, 206 insertions(+), 171 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d44a372..746432b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,14 +114,16 @@ log(BUILD_EXAMPLES) log(BUILD_PYTHON) log(BUILD_TESTING) # added by 'include(CTest)' -option(BUILD_MPIN "Build MPIN" ON) -option(BUILD_WCC "Build WCC" ON) -option(BUILD_X509 "BUild X509" ON) -option(BUILD_BLS "Build BLS" ON) +option(BUILD_MPIN "Build MPIN" ON) +option(BUILD_WCC "Build WCC" ON) +option(BUILD_X509 "BUild X509" ON) +option(BUILD_BLS "Build BLS" ON) +option(BUILD_PAILLIER "Build Paillier" ON) log(BUILD_MPIN) log(BUILD_WCC) log(BUILD_X509) log(BUILD_BLS) +log(BUILD_PAILLIER) option(DEBUG_REDUCE "Print debug message for field reduction" OFF) option(DEBUG_NORM "Detect digit overflow" OFF) @@ -295,6 +297,62 @@ if(BUILD_X509) endif() ################################################## +# AMCL_PAILLIER Library +################################################## + +if(BUILD_PAILLIER) + foreach(level 2048 4096 8192) + amcl_rsa_field(BD "${level}") + amcl_rsa_field(TFF "${level}") + + amcl_configure_file_rsa(include/config_big.h.in include/config_big_${BD}.h "${level}" amcl_paillier_GEN_HDRS) + amcl_configure_file_rsa(include/config_ff.h.in include/config_ff_${TFF}.h "${level}" amcl_paillier_GEN_HDRS) + amcl_configure_file_rsa(include/big.h.in include/big_${BD}.h "${level}" amcl_paillier_GEN_HDRS) + amcl_configure_file_rsa(include/ff.h.in include/ff_${TFF}.h "${level}" amcl_paillier_GEN_HDRS) + + amcl_configure_file_rsa(src/big.c.in src/big_${BD}.c "${level}" amcl_paillier_GEN_SRCS) + amcl_configure_file_rsa(src/ff.c.in src/ff_${TFF}.c "${level}" amcl_paillier_GEN_SRCS) + endforeach() + + list(APPEND amcl_paillier_GEN_HDRS include/paillier.h) + list(APPEND amcl_paillier_GEN_SRCS src/paillier.c) + + message(STATUS "Build libamcl_paillier") + add_library(amcl_paillier + ${amcl_paillier_GEN_SRCS} + ) + list(APPEND AMCL_LIBRARIES amcl_paillier) + + set_target_properties(amcl_paillier PROPERTIES + EXPORT_NAME paillier + VERSION ${AMCL_VERSION} + SOVERSION ${AMCL_SOVERSION} + ) + + target_include_directories(amcl_paillier PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/incldue> + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> + ) + + target_link_libraries(amcl_paillier PUBLIC + amcl_core + ) + + install(TARGETS amcl_paillier + EXPORT AMCLTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + + install(FILES + ${amcl_paillier_GEN_HDRS} + DESTINATION ${INSTALL_INCLUDESUBDIR} + ) +endif() + +################################################## # AMCL_RSA_*** Libraries ################################################## foreach(level ${AMCL_RSA}) diff --git a/Makefile b/Makefile index 6460a91..f98eed0 100644 --- a/Makefile +++ b/Makefile @@ -185,6 +185,7 @@ ifeq ($(CMAKE_BUILD_TYPE),Coverage) -DBUILD_MPIN=$(AMCL_BUILD_MPIN) \ -DBUILD_WCC=$(AMCL_BUILD_WCC) \ -DBUILD_BLS=$(AMCL_BUILD_BLS) \ + -DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \ -DBUILD_DOCS=$(AMCL_BUILD_DOCS) \ -DAMCL_MAXPIN=$(AMCL_MAXPIN) \ -DAMCL_PBLEN=$(AMCL_PBLEN) \ @@ -213,6 +214,8 @@ else -DAMCL_RSA=$(AMCL_RSA) \ -DBUILD_MPIN=$(AMCL_BUILD_MPIN) \ -DBUILD_WCC=$(AMCL_BUILD_WCC) \ + -DBUILD_BLS=$(AMCL_BUILD_BLS) \ + -DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \ -DBUILD_DOCS=$(AMCL_BUILD_DOCS) \ -DAMCL_MAXPIN=$(AMCL_MAXPIN) \ -DAMCL_PBLEN=$(AMCL_PBLEN) \ @@ -320,6 +323,8 @@ doc: -DAMCL_RSA=$(AMCL_RSA) \ -DBUILD_MPIN=$(AMCL_BUILD_MPIN) \ -DBUILD_WCC=$(AMCL_BUILD_WCC) \ + -DBUILD_BLS=$(AMCL_BUILD_BLS) \ + -DBUILD_PAILLIER=$(AMCL_BUILD_PAILLIER) \ -DBUILD_DOXYGEN=$(AMCL_BUILD_DOXYGEN) \ -DAMCL_MAXPIN=$(AMCL_MAXPIN) \ -DAMCL_PBLEN=$(AMCL_PBLEN) \ diff --git a/cmake/AMCLParameters.cmake b/cmake/AMCLParameters.cmake index 4fe7339..c4333f4 100644 --- a/cmake/AMCLParameters.cmake +++ b/cmake/AMCLParameters.cmake @@ -101,7 +101,7 @@ set(AMCL_RSA_FIELDS TB TFF NB BASE ML) set(AMCL_RSA_64_2048 1024 2048 128 58 2 ) set(AMCL_RSA_64_3072 384 3072 48 56 8 ) set(AMCL_RSA_64_4096 512 4096 64 60 8 ) -set(AMCL_RSA_64_8192 512 8192 64 60 16 ) +set(AMCL_RSA_64_8192 512 8192 64 60 16) # ( TB TFF NB BASE ML) set(AMCL_RSA_32_2048 1024 2048 128 28 2 ) set(AMCL_RSA_32_3072 384 3072 48 28 8 ) diff --git a/config.mk b/config.mk index e9b25ef..4a12ba5 100644 --- a/config.mk +++ b/config.mk @@ -33,6 +33,9 @@ AMCL_BUILD_WCC:=ON # Build BLS ON/OFF AMCL_BUILD_BLS:=ON +# Build Paillier ON/OFF +AMCL_BUILD_PAILLIER:=ON + # Build Doxygen ON/OFF AMCL_BUILD_DOCS:=ON diff --git a/include/paillier.h b/include/paillier.h index 2dcacf9..fb35603 100644 --- a/include/paillier.h +++ b/include/paillier.h @@ -27,10 +27,9 @@ under the License. #include <stdlib.h> #include <string.h> #include <time.h> -#include <amcl/ff_8192.h> -#include <amcl/ff_4096.h> -#include <amcl/ff_2048.h> -#include <amcl/randapi.h> +#include "ff_8192.h" +#include "ff_4096.h" +#include "ff_2048.h" #define HASH_TYPE SHA256 /**< Hash function used */ diff --git a/src/big.c.in b/src/big.c.in index 3af1912..3a7980b 100644 --- a/src/big.c.in +++ b/src/big.c.in @@ -1387,6 +1387,90 @@ int BIG_XXX_jacobi(BIG_XXX a,BIG_XXX p) else return -1; } +/* Arazi and Qi inversion mod 256 */ +static int invmod256(int a) +{ + int U,t1,t2,b,c; + t1=0; + c=(a>>1)&1; + t1+=c; + t1&=1; + t1=2-t1; + t1<<=1; + U=t1+1; + +// i=2 + b=a&3; + t1=U*b; + t1>>=2; + c=(a>>2)&3; + t2=(U*c)&3; + t1+=t2; + t1*=U; + t1&=3; + t1=4-t1; + t1<<=2; + U+=t1; + +// i=4 + b=a&15; + t1=U*b; + t1>>=4; + c=(a>>4)&15; + t2=(U*c)&15; + t1+=t2; + t1*=U; + t1&=15; + t1=16-t1; + t1<<=4; + U+=t1; + + return U; +} + +/* a=1/a mod 2^BIGBITS. This is very fast! */ +void BIG_XXX_invmod2m(BIG_XXX a) +{ + int i; + BIG_XXX U,t1,b,c; + BIG_XXX_zero(U); + BIG_XXX_inc(U,invmod256(BIG_XXX_lastbits(a,8))); + for (i=8; i<BIGBITS_XXX; i<<=1) + { + BIG_XXX_norm(U); + BIG_XXX_copy(b,a); + BIG_XXX_mod2m(b,i); // bottom i bits of a + + BIG_XXX_smul(t1,U,b); + BIG_XXX_shr(t1,i); // top i bits of U*b + + BIG_XXX_copy(c,a); + BIG_XXX_shr(c,i); + BIG_XXX_mod2m(c,i); // top i bits of a + + BIG_XXX_smul(b,U,c); + BIG_XXX_mod2m(b,i); // bottom i bits of U*c + + BIG_XXX_add(t1,t1,b); + BIG_XXX_norm(t1); + BIG_XXX_smul(b,t1,U); + BIG_XXX_copy(t1,b); // (t1+b)*U + BIG_XXX_mod2m(t1,i); // bottom i bits of (t1+b)*U + + BIG_XXX_one(b); + BIG_XXX_shl(b,i); + BIG_XXX_sub(t1,b,t1); + BIG_XXX_norm(t1); + + BIG_XXX_shl(t1,i); + + BIG_XXX_add(U,U,t1); + } + BIG_XXX_copy(a,U); + BIG_XXX_norm(a); + BIG_XXX_mod2m(a,BIGBITS_XXX); +} + /* Set r=1/a mod p. Binary method */ /* SU= 240 */ void BIG_XXX_invmodp(BIG_XXX r,BIG_XXX a,BIG_XXX p) diff --git a/src/ff.c.in b/src/ff.c.in index 104c461..8f07849 100644 --- a/src/ff.c.in +++ b/src/ff.c.in @@ -21,90 +21,6 @@ under the License. #include "ff_WWW.h" -/* Arazi and Qi inversion mod 256 */ -static int invmod256(int a) -{ - int U,t1,t2,b,c; - t1=0; - c=(a>>1)&1; - t1+=c; - t1&=1; - t1=2-t1; - t1<<=1; - U=t1+1; - -// i=2 - b=a&3; - t1=U*b; - t1>>=2; - c=(a>>2)&3; - t2=(U*c)&3; - t1+=t2; - t1*=U; - t1&=3; - t1=4-t1; - t1<<=2; - U+=t1; - -// i=4 - b=a&15; - t1=U*b; - t1>>=4; - c=(a>>4)&15; - t2=(U*c)&15; - t1+=t2; - t1*=U; - t1&=15; - t1=16-t1; - t1<<=4; - U+=t1; - - return U; -} - -/* a=1/a mod 2^BIGBITS. This is very fast! */ -void BIG_XXX_invmod2m(BIG_XXX a) -{ - int i; - BIG_XXX U,t1,b,c; - BIG_XXX_zero(U); - BIG_XXX_inc(U,invmod256(BIG_XXX_lastbits(a,8))); - for (i=8; i<BIGBITS_XXX; i<<=1) - { - BIG_XXX_norm(U); - BIG_XXX_copy(b,a); - BIG_XXX_mod2m(b,i); // bottom i bits of a - - BIG_XXX_smul(t1,U,b); - BIG_XXX_shr(t1,i); // top i bits of U*b - - BIG_XXX_copy(c,a); - BIG_XXX_shr(c,i); - BIG_XXX_mod2m(c,i); // top i bits of a - - BIG_XXX_smul(b,U,c); - BIG_XXX_mod2m(b,i); // bottom i bits of U*c - - BIG_XXX_add(t1,t1,b); - BIG_XXX_norm(t1); - BIG_XXX_smul(b,t1,U); - BIG_XXX_copy(t1,b); // (t1+b)*U - BIG_XXX_mod2m(t1,i); // bottom i bits of (t1+b)*U - - BIG_XXX_one(b); - BIG_XXX_shl(b,i); - BIG_XXX_sub(t1,b,t1); - BIG_XXX_norm(t1); - - BIG_XXX_shl(t1,i); - - BIG_XXX_add(U,U,t1); - } - BIG_XXX_copy(a,U); - BIG_XXX_norm(a); - BIG_XXX_mod2m(a,BIGBITS_XXX); -} - /* x=y */ void FF_WWW_copy(BIG_XXX x[],BIG_XXX y[],int n) { diff --git a/src/paillier.c b/src/paillier.c index dcbb03c..faf9548 100644 --- a/src/paillier.c +++ b/src/paillier.c @@ -23,11 +23,10 @@ under the License. #include <stdlib.h> #include <string.h> #include <time.h> -#include <amcl/ff_8192.h> -#include <amcl/ff_4096.h> -#include <amcl/ff_2048.h> -#include <amcl/randapi.h> -#include <amcl/paillier.h> +#include "ff_8192.h" +#include "ff_4096.h" +#include "ff_2048.h" +#include "paillier.h" /* Truncates an octet string */ void OCT_truncate(octet *y,octet *x) @@ -55,14 +54,15 @@ int FF_4096_divide(BIG_512_60 x[], BIG_512_60 y[], BIG_512_60 z[]) BIG_512_60 d[FFLEN_4096]; BIG_512_60 q[FFLEN_4096]; - FF_4096_one(q,FFLEN_4096); - FF_4096_zero(d,FFLEN_4096); FF_4096_zero(z,FFLEN_4096); - FF_4096_add(d,d,x,FFLEN_4096); - while(FF_4096_comp(d,y,FFLEN_4096) <= 0) + while(FF_4096_comp(x,y,FFLEN_4096) <= 0) { - // left shift the denominator until bigger that remainder + // (Re)set values for d and q + FF_4096_one(q,FFLEN_4096); + FF_4096_copy(d,x,FFLEN_4096); + + // Left shift the denominator until bigger that remainder while(FF_4096_comp(d,y,FFLEN_4096) == -1) { FF_4096_shl(d,FFLEN_4096); @@ -82,11 +82,6 @@ int FF_4096_divide(BIG_512_60 x[], BIG_512_60 y[], BIG_512_60 z[]) // z = z + q i.e. update quotient FF_4096_add(z,z,q,FFLEN_4096); - - // Reset values - FF_4096_one(q,FFLEN_4096); - FF_4096_zero(d,FFLEN_4096); - FF_4096_add(d,d,x,FFLEN_4096); } return 0; @@ -97,20 +92,17 @@ int PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, octet* N, octet* G, octet { BIG_1024_58 p[HFLEN_2048]; BIG_1024_58 q[HFLEN_2048]; - BIG_1024_58 p1[HFLEN_2048]; - BIG_1024_58 q1[HFLEN_2048]; // Public key BIG_1024_58 n[FFLEN_2048]; BIG_1024_58 g[FFLEN_2048]; - // secret key + // Secret key BIG_1024_58 l[FFLEN_2048]; BIG_1024_58 m[FFLEN_2048]; if (RNG!=NULL) { - // p FF_2048_random(p,RNG,HFLEN_2048); while (FF_2048_lastbits(p,2)!=3) @@ -122,10 +114,6 @@ int PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, octet* N, octet* G, octet FF_2048_inc(p,4,HFLEN_2048); } - // p1=p-1 - FF_2048_copy(p1,p,HFLEN_2048); - FF_2048_dec(p1,1,HFLEN_2048); - // q FF_2048_random(q,RNG,HFLEN_2048); while (FF_2048_lastbits(q,2)!=3) @@ -136,21 +124,11 @@ int PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, octet* N, octet* G, octet { FF_2048_inc(q,4,HFLEN_2048); } - - // q1 = q-1 - FF_2048_copy(q1,q,HFLEN_2048); - FF_2048_dec(q1,1,HFLEN_2048); } else { FF_2048_fromOctet(p,P,HFLEN_2048); FF_2048_fromOctet(q,Q,HFLEN_2048); - - FF_2048_copy(p1,p,HFLEN_2048); - FF_2048_dec(p1,1,HFLEN_2048); - - FF_2048_copy(q1,q,HFLEN_2048); - FF_2048_dec(q1,1,HFLEN_2048); } // n = p * q @@ -160,15 +138,27 @@ int PAILLIER_KEY_PAIR(csprng *RNG, octet *P, octet* Q, octet* N, octet* G, octet FF_2048_copy(g,n,FFLEN_2048); FF_2048_inc(g,1,FFLEN_2048); + // Decrement p and q in place. They need to + // be restored before being returned + FF_2048_dec(p,1,HFLEN_2048); + FF_2048_dec(q,1,HFLEN_2048); + // l = (p-1) * (q-1) - FF_2048_mul(l,p1,q1,HFLEN_2048); + FF_2048_mul(l,p,q,HFLEN_2048); - // m = ( (p-1) * (q-1) ^{-1} mod n + // m = ((p-1) * (q-1))^{-1} mod n FF_2048_invmodp(m,l,n,FFLEN_2048); + // Restore p and q for output + FF_2048_inc(p,1,HFLEN_2048); + FF_2048_inc(q,1,HFLEN_2048); + // Output - FF_2048_toOctet(P, p, HFLEN_2048); - FF_2048_toOctet(Q, q, HFLEN_2048); + if (P != NULL) + FF_2048_toOctet(P, p, HFLEN_2048); + + if (Q != NULL) + FF_2048_toOctet(Q, q, HFLEN_2048); FF_2048_toOctet(N, n, FFLEN_2048); FF_2048_toOctet(G, g, FFLEN_2048); @@ -338,7 +328,6 @@ int PAILLIER_ENCRYPT(csprng *RNG, octet* N, octet* G, octet* PT, octet* CT, octe R->len = FS_2048; R2.len = FS_2048; OCT_truncate(R,&R2); - } #ifdef DEBUG @@ -388,17 +377,16 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) { // Public key BIG_512_60 n[FFLEN_4096]; - BIG_512_60 n8[FFLEN_8192]; // secret key BIG_512_60 l[FFLEN_4096]; - BIG_512_60 m[FFLEN_8192]; + BIG_512_60 m[FFLEN_4096]; // Ciphertext BIG_512_60 ct[FFLEN_4096]; // Plaintext - BIG_512_60 pt[FFLEN_8192]; + BIG_512_60 pt[FFLEN_4096]; // n2 = n^2 BIG_512_60 n2[FFLEN_4096]; @@ -408,7 +396,6 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) // ctln = ctl / n BIG_512_60 ctln[FFLEN_4096]; - BIG_512_60 ctln8[FFLEN_8192]; // Convert n from FF_2048 to FF_4096 char noct[FS_4096] = {0}; @@ -422,19 +409,11 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) OCT_joctet(&LOCT, L); FF_4096_fromOctet(l,&LOCT,FFLEN_4096); - // Convert m from FF_2048 to FF_8192 - char moct[FS_8192] = {0}; - int len = FS_2048 * 3; - octet MOCT = {len,FS_8192,moct}; + // Convert m from FF_2048 to FF_4096 + char moct[FS_4096] = {0}; + octet MOCT = {FS_2048,FS_4096,moct}; OCT_joctet(&MOCT, M); - FF_8192_fromOctet(m,&MOCT,FFLEN_8192); - - // Convert n from FF_2048 to FF_8192 - char noct8[FS_8192] = {0}; - len = FS_2048 * 3; - octet NOCT8 = {len,FS_8192,noct8}; - OCT_joctet(&NOCT8, N); - FF_8192_fromOctet(n8,&NOCT8,FFLEN_8192); + FF_4096_fromOctet(m,&MOCT,FFLEN_4096); FF_4096_fromOctet(ct,CT,FFLEN_4096); @@ -442,7 +421,7 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) FF_4096_sqr(n2, n, FFLEN_4096); // ct^l mod n^2 - 1 - FF_4096_pow(ctl, ct,l,n2,FFLEN_4096); + FF_4096_pow(ctl,ct,l,n2,FFLEN_4096); FF_4096_dec(ctl,1,FFLEN_4096); #ifdef DEBUG @@ -452,46 +431,38 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) #endif // ctln = ctl / n + // note that ctln fits into a FF_2048 element, + // since ctln = ctl/n < n^2 / n = n FF_4096_divide(n, ctl, ctln); - // Convert ctln from FF_4096 to FF_8192 - char ctln1[FS_4096] = {0}; - octet CTLN1 = {0,FS_4096,ctln1}; - FF_4096_toOctet(&CTLN1, ctln, FFLEN_4096); - char ctln2[FS_8192] = {0}; - octet CTLN2 = {FS_4096,FS_8192,ctln2}; - OCT_joctet(&CTLN2, &CTLN1); - FF_8192_fromOctet(ctln8,&CTLN2,FFLEN_8192); - // pt = ctln * m mod n - FF_8192_mul(pt,ctln8,m,FFLEN_8192); + // the result fits into a FF_4096 element, + // since both m and ctln fit into a FF_2048 element + FF_4096_mul(pt, ctln, m, FFLEN_4096); #ifdef DEBUG printf("pt1 "); - FF_8192_output(pt,FFLEN_8192); + FF_4096_output(pt,FFLEN_4096); printf("\n\n"); #endif - FF_8192_mod(pt,n8,FFLEN_8192); + FF_4096_mod(pt,n,FFLEN_4096); - // Output. Convert pt from FF_8192 to FF_2046 - char pt2[FS_8192] = {0}; - octet PT2 = {0,FS_8192,pt2}; - FF_8192_toOctet(&PT2, pt, FFLEN_8192); + // Output. Convert pt from FF_4096 to FF_2046 + char pt2[FS_4096] = {0}; + octet PT2 = {0,FS_4096,pt2}; + FF_4096_toOctet(&PT2, pt, FFLEN_4096); PT->len = FS_2048; - PT2.len = FS_2048*3; + PT2.len = FS_2048; OCT_truncate(PT,&PT2); #ifdef DEBUG printf("PAILLIER_DECRYPT n "); FF_4096_output(n,FFLEN_4096); printf("\n\n"); - printf("PAILLIER_DECRYPT n8 "); - FF_8192_output(n8,FFLEN_8192); - printf("\n\n"); printf("PAILLIER_DECRYPT l "); FF_4096_output(l,FFLEN_4096); printf("\n\n"); printf("PAILLIER_DECRYPT m "); - FF_8192_output(m,FFLEN_8192); + FF_4096_output(m,FFLEN_4096); printf("\n\n"); printf("PAILLIER_DECRYPT ct "); FF_4096_output(ct,FFLEN_4096); @@ -500,7 +471,7 @@ int PAILLIER_DECRYPT(octet* N, octet* L, octet* M, octet* CT, octet* PT) FF_4096_output(ctln,FFLEN_4096); printf("\n\n"); printf("PAILLIER_DECRYPT pt "); - FF_8192_output(pt,FFLEN_8192); + FF_4096_output(pt,FFLEN_4096); printf("\n\n"); #endif @@ -599,7 +570,6 @@ int PAILLIER_ADD(octet* N, octet* CT1, octet* CT2, octet* CT) */ int PAILLIER_MULT(octet* N, octet* CT1, octet* PT, octet* CT) { - // Public key BIG_512_60 n[FFLEN_4096];
