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

Reply via email to