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 2020/05/14 22:45:58 UTC

[incubator-milagro-MPC] branch review-ncc created (now 739cfe6)

This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a change to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git.


      at 739cfe6  update python wrappers

This branch includes the following new commits:

     new c6d3d5a  Add bounds check in factoring nizkp verify
     new 4682b29  Justify random generation in mta
     new 9fbae7b  Add ID and additional data from RFC8235
     new 58b2fd1  Add tests and test vectors
     new 1fa363b  Add benchmark and examples
     new 739cfe6  update python wrappers

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-milagro-MPC] 03/06: Add ID and additional data from RFC8235

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 9fbae7bf555a7569903cbf0bf088607885ca37e5
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Thu May 14 23:42:56 2020 +0100

    Add ID and additional data from RFC8235
---
 include/amcl/factoring_zk.h |  8 ++++++--
 include/amcl/schnorr.h      | 10 +++++++---
 src/factoring_zk.c          | 24 +++++++++++++++++++-----
 src/schnorr.c               | 22 ++++++++++++++++++----
 4 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/include/amcl/factoring_zk.h b/include/amcl/factoring_zk.h
index d4db1ac..4ae7a39 100644
--- a/include/amcl/factoring_zk.h
+++ b/include/amcl/factoring_zk.h
@@ -55,11 +55,13 @@ extern "C"
  *  @param  RNG         Cryptographically secure PRNG
  *  @param  P           First prime of the factorization
  *  @param  Q           Second prime of the factorization
+ *  @param  ID          Prover unique identifier
+ *  @param  AD          Additional data to bind in the proof - Optional
  *  @param  R           Random value used in the proof. If RNG is NULL this is read
  *  @param  E           First component of the ZK proof
  *  @param  Y           Second component of the ZK proof
  */
-void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, octet *Y);
+void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *ID, octet *AD, octet *R, octet *E, octet *Y);
 
 /** \brief Verify ZK proof of knowledge of factoring of N
  *
@@ -68,9 +70,11 @@ void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, oct
  *  @param  N           Public integer, the RSA modulus
  *  @param  E           Fisrt component of the ZK proof
  *  @param  Y           Second component of the ZK proof
+ *  @param  ID          Prover unique identifier
+ *  @param  AD          Additional data to bind in the proof - Optional
  *  @return             1 if the proof is valid, 0 otherwise
  */
-int FACTORING_ZK_verify(octet *N, octet *E, octet *Y);
+int FACTORING_ZK_verify(octet *N, octet *E, octet *Y, octet *ID, octet *AD);
 
 #ifdef __cplusplus
 }
diff --git a/include/amcl/schnorr.h b/include/amcl/schnorr.h
index 74529b7..8ab93a8 100644
--- a/include/amcl/schnorr.h
+++ b/include/amcl/schnorr.h
@@ -68,9 +68,11 @@ extern void SCHNORR_commit(csprng *RNG, octet *R, octet *C);
  *
  * @param V     Public ECP of the DLOG. V = x.G. Compressed form
  * @param C     Public commitment value. Compressed form
+ * @param ID    Prover unique identifier
+ * @param AD    Additional data to bind in the challenge - Optional
  * @param E     Challenge generated
  */
-extern void SCHNORR_challenge(const octet *V, const octet *C, octet *E);
+extern void SCHNORR_challenge(const octet *V, const octet *C, octet *ID, octet *AD, octet *E);
 
 /*! \brief Generate the proof for the given commitment and challenge
  *
@@ -111,14 +113,16 @@ extern int SCHNORR_D_commit(csprng *RNG, octet *R, octet *A, octet *B, octet *C)
  *
  * Compute the challenge for the proof. RFC8235#section-3.3 can not be applied
  * here, but we try to follow closely by treating R like a secondary generator.
- * Returns H(G, R, C, V)
+ * Returns H(G, R, C, V, ID[, AD])
  *
  * @param V     Public ECP result of the DLOG. V = s.R + l.G. Compressed form
  * @param R     Public ECP base of the DLOG. Compressed form
  * @param C     Public commitment value. Compressed form
+ * @param ID    Prover unique identifier
+ * @param AD    Additional data to bind in the challenge - Optional
  * @param E     Challenge generated
  */
-extern void SCHNORR_D_challenge(const octet *R, const octet *V, const octet *C, octet *E);
+extern void SCHNORR_D_challenge(const octet *R, const octet *V, const octet *C, octet* ID, octet *AD, octet *E);
 
 /*! \brief Generate the proof for the given commitment and challenge
  *
diff --git a/src/factoring_zk.c b/src/factoring_zk.c
index 7578733..d8d24e9 100644
--- a/src/factoring_zk.c
+++ b/src/factoring_zk.c
@@ -90,10 +90,10 @@ void generator(hash256 *sha, int k, octet *O)
 /*
  *  Zi = MGF_SHA256(N, i)
  *  X  = H(Z1^r, Z2^r)
- *  e  = H'(N, Z1, Z2, X)
+ *  e  = H'(N, Z1, Z2, X, ID, AD)
  *  y  = r + (N - phi(N)) * e
  */
-void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, octet *Y)
+void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *ID, octet *AD, octet *R, octet *E, octet *Y)
 {
     int i;
 
@@ -188,8 +188,15 @@ void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, oct
     HASH256_hash(&sha_x, W.val);
     W.len = SHA256;
 
-    // Compute e = H(N, Z1, Z2, X)
+    // Compute e = H(N, Z1, Z2, X, ID, AD)
     hash_oct(&sha_prime, &W);
+    hash_oct(&sha_prime, ID);
+
+    if (AD != NULL)
+    {
+        hash_oct(&sha_prime, AD);
+    }
+
     HASH256_hash(&sha_prime, W.val);
     W.len = FACTORING_ZK_B;
 
@@ -222,7 +229,7 @@ void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, oct
     FF_2048_zero(hws, HFLEN_2048);
 }
 
-int FACTORING_ZK_verify(octet *N, octet *E, octet *Y)
+int FACTORING_ZK_verify(octet *N, octet *E, octet *Y, octet *ID, octet *AD)
 {
     int i;
 
@@ -303,8 +310,15 @@ int FACTORING_ZK_verify(octet *N, octet *E, octet *Y)
     HASH256_hash(&sha_x, W.val);
     W.len = SHA256;
 
-    // Compute e = H(N, Z1, Z2, X)
+    // Compute e = H(N, Z1, Z2, X, ID, AD)
     hash_oct(&sha_prime, &W);
+    hash_oct(&sha_prime, ID);
+
+    if (AD != NULL)
+    {
+        hash_oct(&sha_prime, AD);
+    }
+
     HASH256_hash(&sha_prime, W.val);
     W.len = FACTORING_ZK_B;
 
diff --git a/src/schnorr.c b/src/schnorr.c
index 7d20095..f5082ce 100644
--- a/src/schnorr.c
+++ b/src/schnorr.c
@@ -75,7 +75,7 @@ void SCHNORR_commit(csprng *RNG, octet *R, octet *C)
     BIG_256_56_zero(r);
 }
 
-void SCHNORR_challenge(const octet *V, const octet *C, octet *E)
+void SCHNORR_challenge(const octet *V, const octet *C, octet *ID, octet *AD, octet *E)
 {
     hash256 sha;
 
@@ -91,11 +91,18 @@ void SCHNORR_challenge(const octet *V, const octet *C, octet *E)
     ECP_SECP256K1_generator(&G);
     ECP_SECP256K1_toOctet(&O, &G, true);
 
-    // e = H(G,C,V) mod q
+    // e = H(G,C,V,ID,AD) mod q
     HASH256_init(&sha);
     hash_octet(&sha, &O);
     hash_octet(&sha, C);
     hash_octet(&sha, V);
+    hash_octet(&sha, ID);
+
+    if (AD != NULL)
+    {
+        hash_octet(&sha, AD);
+    }
+
     HASH256_hash(&sha, o);
 
     BIG_256_56_fromBytesLen(e, o, SHA256);
@@ -219,7 +226,7 @@ int SCHNORR_D_commit(csprng *RNG, octet *R, octet *A, octet *B, octet *C)
     return SCHNORR_OK;
 }
 
-void SCHNORR_D_challenge(const octet *R, const octet *V, const octet *C, octet *E)
+void SCHNORR_D_challenge(const octet *R, const octet *V, const octet *C, octet *ID, octet *AD, octet *E)
 {
     hash256 sha;
 
@@ -235,12 +242,19 @@ void SCHNORR_D_challenge(const octet *R, const octet *V, const octet *C, octet *
     ECP_SECP256K1_generator(&G);
     ECP_SECP256K1_toOctet(&O, &G, true);
 
-    // e = H(G,R,C,V) mod q
+    // e = H(G,R,C,V,ID,AD) mod q
     HASH256_init(&sha);
     hash_octet(&sha, &O);
     hash_octet(&sha, R);
     hash_octet(&sha, C);
     hash_octet(&sha, V);
+    hash_octet(&sha, ID);
+
+    if (AD != NULL)
+    {
+        hash_octet(&sha, AD);
+    }
+
     HASH256_hash(&sha, o);
 
     BIG_256_56_fromBytesLen(e, o, SHA256);


[incubator-milagro-MPC] 02/06: Justify random generation in mta

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 4682b29bf330fb4fa6ff61c37bb6ff68426fe1dd
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Wed May 13 14:53:31 2020 +0100

    Justify random generation in mta
---
 src/mta.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/mta.c b/src/mta.c
index a1bf84c..a1a05e9 100644
--- a/src/mta.c
+++ b/src/mta.c
@@ -26,6 +26,23 @@ under the License.
 
 static char* curve_order_hex = "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141";
 
+/* Remark 1
+ *
+ * The generation of some random blinding values in this file uses
+ * a modular reduction, producing a slightly biased distribution.
+ * However, the random numbers reduced have significatively more
+ * bits of entropy than the modulus, making this bias negligible.
+ *
+ * In particular we have moduli
+ * |q^3|    ~ 768
+ * |Nt*q|   ~ 2048 + 256
+ * |Nt*q^3| ~ 2048 + 768
+ *
+ * used (respectively) to reduce random numbers of size 1024, 3096
+ * and 3096. Each of these random numbers has at least 256 bits of
+ * extra entropy, making the exploitation of this bias not viable.
+ */
+
 /* Octet manipulation utilities */
 
 static void OCT_hash(hash256 *sha, const octet *O)
@@ -349,10 +366,11 @@ void MTA_RP_commit(csprng *RNG, PAILLIER_private_key *key, COMMITMENTS_BC_pub_mo
 
     if (RNG != NULL)
     {
-        // Generate alpha in [0, .., q^3]
         FF_2048_sqr(ws1, q, HFLEN_2048);
         FF_2048_mul(ws2, q, ws1, HFLEN_2048);
 
+        // Generate alpha in [0, .., q^3]
+        // See Remark 1 at the top for more information
         FF_2048_zero(rv->alpha, FFLEN_2048);
         FF_2048_random(rv->alpha, RNG, HFLEN_2048);
         FF_2048_mod(rv->alpha, ws2, HFLEN_2048);
@@ -361,11 +379,13 @@ void MTA_RP_commit(csprng *RNG, PAILLIER_private_key *key, COMMITMENTS_BC_pub_mo
         FF_2048_randomnum(rv->beta, n, RNG, FFLEN_2048);
 
         // Generate gamma in [0, .., Nt * q^3]
+        // See Remark 1 at the top for more information
         FF_2048_amul(dws1, ws2, HFLEN_2048, mod->N, FFLEN_2048);
         FF_2048_random(rv->gamma, RNG, FFLEN_2048 + HFLEN_2048);
         FF_2048_mod(rv->gamma, dws1, FFLEN_2048 + HFLEN_2048);
 
         // Generate rho in [0, .., Nt * q]
+        // See Remark 1 at the top for more information
         FF_2048_amul(dws1, q, HFLEN_2048, mod->N, FFLEN_2048);
         FF_2048_random(rv->rho, RNG, FFLEN_2048 + HFLEN_2048);
         FF_2048_mod(rv->rho, dws1, FFLEN_2048 + HFLEN_2048);
@@ -727,10 +747,11 @@ void MTA_ZK_commit(csprng *RNG, PAILLIER_public_key *key, COMMITMENTS_BC_pub_mod
 
     if (RNG != NULL)
     {
-        // Generate alpha in [0, .., q^3]
         FF_2048_sqr(q3, q, HFLEN_2048);
         FF_2048_mul(q3, q, q3, HFLEN_2048);
 
+        // Generate alpha in [0, .., q^3]
+        // See Remark 1 at the top for more information
         FF_2048_zero(rv->alpha, FFLEN_2048);
         FF_2048_random(rv->alpha, RNG, HFLEN_2048);
         FF_2048_mod(rv->alpha, q3, HFLEN_2048);
@@ -746,6 +767,7 @@ void MTA_ZK_commit(csprng *RNG, PAILLIER_public_key *key, COMMITMENTS_BC_pub_mod
         FF_2048_fromOctet(rv->gamma, &OCT, FFLEN_2048);
 
         // Generate rho, tau, sigma in [0, .., Nt * q]
+        // See Remark 1 at the top for more information
         FF_2048_amul(tws, q, HFLEN_2048, mod->N, FFLEN_2048);
         FF_2048_random(rv->rho, RNG, FFLEN_2048 + HFLEN_2048);
         FF_2048_mod(rv->rho, tws, FFLEN_2048 + HFLEN_2048);
@@ -757,6 +779,7 @@ void MTA_ZK_commit(csprng *RNG, PAILLIER_public_key *key, COMMITMENTS_BC_pub_mod
         FF_2048_mod(rv->sigma, tws, FFLEN_2048 + HFLEN_2048);
 
         // Generate rho1 in [0, .., Nt * q^3]
+        // See Remark 1 at the top for more information
         FF_2048_amul(tws, q3, HFLEN_2048, mod->N, FFLEN_2048);
         FF_2048_random(rv->rho1, RNG, FFLEN_2048 + HFLEN_2048);
         FF_2048_mod(rv->rho1, tws, FFLEN_2048 + HFLEN_2048);


[incubator-milagro-MPC] 04/06: Add tests and test vectors

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 58b2fd16780b2ee35dad3f5bde2c7ace70b6cf85
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Thu May 14 23:43:26 2020 +0100

    Add tests and test vectors
---
 test/smoke/test_d_schnorr_smoke.c    |  12 ++-
 test/smoke/test_factoring_zk_smoke.c |  13 +++-
 test/smoke/test_schnorr_smoke.c      |  11 ++-
 test/unit/test_d_schnorr_challenge.c |  28 ++++++-
 test/unit/test_factoring_zk_prove.c  |  27 ++++++-
 test/unit/test_factoring_zk_verify.c |  33 ++++++--
 test/unit/test_schnorr_challenge.c   |  28 ++++++-
 testVectors/factoring_zk/prove.json  | 142 ++++++++++++++++++++---------------
 testVectors/factoring_zk/prove.txt   | 141 +++++++++++++++++++---------------
 testVectors/factoring_zk/verify.json |  82 ++++++++++++--------
 testVectors/factoring_zk/verify.txt  |  81 ++++++++++++--------
 testVectors/schnorr/challenge.json   |  80 ++++++++++++--------
 testVectors/schnorr/challenge.txt    |  80 ++++++++++++--------
 testVectors/schnorr/dchallenge.json  | 100 ++++++++++++++----------
 testVectors/schnorr/dchallenge.txt   | 100 ++++++++++++++----------
 15 files changed, 620 insertions(+), 338 deletions(-)

diff --git a/test/smoke/test_d_schnorr_smoke.c b/test/smoke/test_d_schnorr_smoke.c
index 40cfbf8..aff2e4d 100644
--- a/test/smoke/test_d_schnorr_smoke.c
+++ b/test/smoke/test_d_schnorr_smoke.c
@@ -32,6 +32,12 @@ int main()
     ECP_SECP256K1 G;
     ECP_SECP256K1 ECPR;
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char oct_s[SGS_SECP256K1];
     octet S = {0, sizeof(oct_s), oct_s};
 
@@ -71,6 +77,10 @@ int main()
     ECP_SECP256K1_generator(&G);
     ECP_SECP256K1_generator(&ECPR);
 
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     // Generate public R
     BIG_256_56_randomnum(r, q, &RNG);
     ECP_SECP256K1_mul(&ECPR, r);
@@ -98,7 +108,7 @@ int main()
         exit(EXIT_FAILURE);
     }
 
-    SCHNORR_D_challenge(&R, &V, &C, &E);
+    SCHNORR_D_challenge(&R, &V, &C, &ID, &AD, &E);
     SCHNORR_D_prove(&A, &B, &E, &S, &L, &T, &U);
 
     rc = SCHNORR_D_verify(&R, &V, &C, &E, &T, &U);
diff --git a/test/smoke/test_factoring_zk_smoke.c b/test/smoke/test_factoring_zk_smoke.c
index d2a0b54..2984c1c 100644
--- a/test/smoke/test_factoring_zk_smoke.c
+++ b/test/smoke/test_factoring_zk_smoke.c
@@ -27,6 +27,12 @@ char *N_hex = "c0870b552afb6c8c09f79e39ad6ca17ca93085c2cd7a726ade69574961ff9ce8a
 
 int main()
 {
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char p[HFS_2048] = {0};
     octet P = {0, sizeof(p), p};
 
@@ -50,16 +56,19 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     // Load RSA modulus
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
     OCT_fromHex(&N, N_hex);
 
     // ZK proof
-    FACTORING_ZK_prove(&RNG, &P, &Q, NULL, &E, &Y);
+    FACTORING_ZK_prove(&RNG, &P, &Q, &ID, &AD, NULL, &E, &Y);
 
     // Verify proof
-    if (FACTORING_ZK_verify(&N, &E, &Y) != FACTORING_ZK_OK)
+    if (FACTORING_ZK_verify(&N, &E, &Y, &ID, &AD) != FACTORING_ZK_OK)
     {
         printf("FAILURE FACTORING_ZK_verify\n");
         exit(EXIT_FAILURE);
diff --git a/test/smoke/test_schnorr_smoke.c b/test/smoke/test_schnorr_smoke.c
index 94d6e47..eae2e5e 100644
--- a/test/smoke/test_schnorr_smoke.c
+++ b/test/smoke/test_schnorr_smoke.c
@@ -29,6 +29,12 @@ int main()
     BIG_256_56 q;
     ECP_SECP256K1 G;
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char x_char[SGS_SECP256K1];
     octet X = {0, sizeof(x_char), x_char};
 
@@ -52,6 +58,9 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     BIG_256_56_rcopy(q, CURVE_Order_SECP256K1);
     BIG_256_56_randomnum(x, q, &RNG);
 
@@ -65,7 +74,7 @@ int main()
 
     SCHNORR_commit(&RNG, &R, &C);
 
-    SCHNORR_challenge(&V, &C, &E);
+    SCHNORR_challenge(&V, &C, &ID, &AD, &E);
 
     SCHNORR_prove(&R, &E, &X, &P);
 
diff --git a/test/unit/test_d_schnorr_challenge.c b/test/unit/test_d_schnorr_challenge.c
index 61d3041..4cf6ac9 100644
--- a/test/unit/test_d_schnorr_challenge.c
+++ b/test/unit/test_d_schnorr_challenge.c
@@ -24,6 +24,8 @@
 /* Double Schnorr's Proof challenge unit test */
 
 #define LINE_LEN 256
+#define IDLEN 16
+#define ADLEN 16
 
 int main(int argc, char **argv)
 {
@@ -49,6 +51,15 @@ int main(int argc, char **argv)
     octet V = {0, sizeof(v), v};
     const char *Vline = "V = ";
 
+    char id[IDLEN];
+    octet ID = {0, sizeof(id), id};
+    const char *IDline = "ID = ";
+
+    char ad[ADLEN];
+    octet AD = {0, sizeof(ad), ad};
+    octet *AD_ptr = NULL;
+    const char *ADline = "AD = ";
+
     char c[SFS_SECP256K1+1];
     octet C = {0, sizeof(c), c};
     const char *Cline = "C = ";
@@ -61,7 +72,7 @@ int main(int argc, char **argv)
     octet E = {0, sizeof(e), e};
 
     // Line terminating a test vector
-    const char *last_line = Eline;
+    const char *last_line = ADline;
 
     /* Test happy path using test vectors */
     fp = fopen(argv[1], "r");
@@ -75,6 +86,10 @@ int main(int argc, char **argv)
     {
         scan_int(&testNo, line, TESTline);
 
+        // Read ID and AD
+        scan_OCTET(fp, &ID, line, IDline);
+        scan_OCTET(fp, &AD, line, ADline);
+
         // Read inputs
         scan_OCTET(fp, &R, line, Rline);
         scan_OCTET(fp, &V, line, Vline);
@@ -85,11 +100,20 @@ int main(int argc, char **argv)
 
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            SCHNORR_D_challenge(&R, &V, &C, &E);
+            // Also input AD if it is not empty
+            if (AD.len > 0)
+            {
+                AD_ptr = &AD;
+            }
+
+            SCHNORR_D_challenge(&R, &V, &C, &ID, AD_ptr, &E);
             compare_OCT(fp, testNo, "SCHNORR_D_challenge", &E, &E_GOLDEN);
 
             // Mark that at least one test vector was executed
             test_run = 1;
+
+            // Restore AD_ptr
+            AD_ptr = NULL;
         }
     }
 
diff --git a/test/unit/test_factoring_zk_prove.c b/test/unit/test_factoring_zk_prove.c
index 5c9c3eb..9712dd5 100644
--- a/test/unit/test_factoring_zk_prove.c
+++ b/test/unit/test_factoring_zk_prove.c
@@ -24,6 +24,8 @@ under the License.
 #include "amcl/factoring_zk.h"
 
 #define LINE_LEN 2000
+#define IDLEN 16
+#define ADLEN 16
 
 int main(int argc, char **argv)
 {
@@ -65,6 +67,15 @@ int main(int argc, char **argv)
     octet N = {0, sizeof(n), n};
     const char *Nline = "N = ";
 
+    char id[IDLEN];
+    octet ID = {0, sizeof(id), id};
+    const char *IDline = "ID = ";
+
+    char ad[ADLEN];
+    octet AD = {0, sizeof(ad), ad};
+    octet *AD_ptr = NULL;
+    const char *ADline = "AD = ";
+
     char e[FACTORING_ZK_B];
     octet E = {0, sizeof(e), e};
 
@@ -85,6 +96,10 @@ int main(int argc, char **argv)
     {
         scan_int(&testNo, line, TESTline);
 
+        // Read ID and AD
+        scan_OCTET(fp, &ID, line, IDline);
+        scan_OCTET(fp, &AD, line, ADline);
+
         // Read modulus
         scan_OCTET(fp, &P, line, Pline);
         scan_OCTET(fp, &Q, line, Qline);
@@ -97,16 +112,24 @@ int main(int argc, char **argv)
         scan_OCTET(fp, &EGOLDEN, line, Eline);
         scan_OCTET(fp, &YGOLDEN, line, Yline);
 
-        // Read Y and run test
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            FACTORING_ZK_prove(NULL, &P, &Q, &R, &E, &Y);
+            // Also input AD if it is not empty
+            if (AD.len > 0)
+            {
+                AD_ptr = &AD;
+            }
+
+            FACTORING_ZK_prove(NULL, &P, &Q, &ID, AD_ptr, &R, &E, &Y);
 
             compare_OCT(fp, testNo, "FACTORING_ZK_prove E", &E, &EGOLDEN);
             compare_OCT(fp, testNo, "FACTORING_ZK_prove Y", &Y, &YGOLDEN);
 
             // Mark that at least one test vector was executed
             test_run = 1;
+
+            // Restore AD_ptr
+            AD_ptr = NULL;
         }
     }
 
diff --git a/test/unit/test_factoring_zk_verify.c b/test/unit/test_factoring_zk_verify.c
index 56ab562..f63a5ff 100644
--- a/test/unit/test_factoring_zk_verify.c
+++ b/test/unit/test_factoring_zk_verify.c
@@ -24,6 +24,8 @@ under the License.
 #include "amcl/factoring_zk.h"
 
 #define LINE_LEN 2000
+#define IDLEN 16
+#define ADLEN 16
 
 int main(int argc, char **argv)
 {
@@ -54,8 +56,17 @@ int main(int argc, char **argv)
     octet Y = {0, sizeof(y), y};
     const char *Yline = "Y = ";
 
+    char id[IDLEN];
+    octet ID = {0, sizeof(id), id};
+    const char *IDline = "ID = ";
+
+    char ad[IDLEN];
+    octet AD = {0, sizeof(ad), ad};
+    octet *AD_ptr = NULL;
+    const char *ADline = "AD = ";
+
     // Line terminating a test vector
-    const char *last_line = Yline;
+    const char *last_line = ADline;
 
     fp = fopen(argv[1], "r");
     if (fp == NULL)
@@ -70,13 +81,23 @@ int main(int argc, char **argv)
     {
         scan_int(&testNo, line, TESTline);
 
+        // Read ID and AD
+        scan_OCTET(fp, &ID, line, IDline);
+        scan_OCTET(fp, &AD, line, ADline);
+
         scan_OCTET(fp, &N, line, Nline);
         scan_OCTET(fp, &E, line, Eline);
         scan_OCTET(fp, &Y, line, Yline);
 
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            rc = FACTORING_ZK_verify(&N, &E, &Y);
+            // Also input AD if it is not empty
+            if (AD.len > 0)
+            {
+                AD_ptr = &AD;
+            }
+
+            rc = FACTORING_ZK_verify(&N, &E, &Y, &ID, AD_ptr);
             assert_tv(fp, testNo, "FACTORING_ZK_verify", rc == FACTORING_ZK_OK);
 
             // Mark that at least one test vector was executed
@@ -93,28 +114,28 @@ int main(int argc, char **argv)
     }
 
     /* Test unhappy path */
-    char *t[FS_2048 + 1];
+    char t[FS_2048 + 1];
     octet T = {0, sizeof(t), t};
 
     // Invalid E
     OCT_copy(&T, &E);
     T.val[0]++;
 
-    rc = FACTORING_ZK_verify(&N, &T, &Y);
+    rc = FACTORING_ZK_verify(&N, &T, &Y, &ID, &AD);
     assert(NULL, "FACTORING_ZK_verify. Invalid E", rc == FACTORING_ZK_FAIL);
 
     // E out of bounds
     OCT_copy(&T, &E);
     T.len++;
 
-    rc = FACTORING_ZK_verify(&N, &T, &Y);
+    rc = FACTORING_ZK_verify(&N, &T, &Y, &ID, &AD);
     assert(NULL, "FACTORING_ZK_verify. E out of bounds", rc == FACTORING_ZK_OUT_OF_BOUNDS);
 
     // Y out of bounds
     OCT_copy(&T, &Y);
     T.len++;
 
-    rc = FACTORING_ZK_verify(&N, &E, &T);
+    rc = FACTORING_ZK_verify(&N, &E, &T, &ID, &AD);
     assert(NULL, "FACTORING_ZK_verify. Y out of bounds", rc == FACTORING_ZK_OUT_OF_BOUNDS);
 
 
diff --git a/test/unit/test_schnorr_challenge.c b/test/unit/test_schnorr_challenge.c
index 8219ee0..480f2a9 100644
--- a/test/unit/test_schnorr_challenge.c
+++ b/test/unit/test_schnorr_challenge.c
@@ -24,6 +24,8 @@
 /* Schnorr's Proof challenge unit test */
 
 #define LINE_LEN 256
+#define IDLEN 16
+#define ADLEN 16
 
 int main(int argc, char **argv)
 {
@@ -45,6 +47,15 @@ int main(int argc, char **argv)
     octet V = {0, sizeof(v), v};
     const char *Vline = "V = ";
 
+    char id[IDLEN];
+    octet ID = {0, sizeof(id), id};
+    const char *IDline = "ID = ";
+
+    char ad[ADLEN];
+    octet AD = {0, sizeof(ad), ad};
+    octet *AD_ptr = NULL;
+    const char *ADline = "AD = ";
+
     char c[SFS_SECP256K1+1];
     octet C = {0, sizeof(c), c};
     const char *Cline = "C = ";
@@ -57,7 +68,7 @@ int main(int argc, char **argv)
     octet E = {0, sizeof(e), e};
 
     // Line terminating a test vector
-    const char *last_line = Eline;
+    const char *last_line = ADline;
 
     /* Test happy path using test vectors */
     fp = fopen(argv[1], "r");
@@ -71,6 +82,10 @@ int main(int argc, char **argv)
     {
         scan_int(&testNo, line, TESTline);
 
+        // Read ID and AD
+        scan_OCTET(fp, &ID, line, IDline);
+        scan_OCTET(fp, &AD, line, ADline);
+
         // Read inputs
         scan_OCTET(fp, &V, line, Vline);
         scan_OCTET(fp, &C, line, Cline);
@@ -80,11 +95,20 @@ int main(int argc, char **argv)
 
         if (!strncmp(line, last_line, strlen(last_line)))
         {
-            SCHNORR_challenge(&V, &C, &E);
+            // Also input AD if it is not empty
+            if (AD.len > 0)
+            {
+                AD_ptr = &AD;
+            }
+
+            SCHNORR_challenge(&V, &C, &ID, AD_ptr, &E);
             compare_OCT(fp, testNo, "SCHNORR_challenge", &E, &E_GOLDEN);
 
             // Mark that at least one test vector was executed
             test_run = 1;
+
+            // Restore AD_ptr
+            AD_ptr = NULL;
         }
     }
 
diff --git a/testVectors/factoring_zk/prove.json b/testVectors/factoring_zk/prove.json
index 72b3d83..574ac9b 100644
--- a/testVectors/factoring_zk/prove.json
+++ b/testVectors/factoring_zk/prove.json
@@ -1,92 +1,112 @@
 [
   {
     "TEST": 0,
-    "N": "ce75b4a3cb5146dfd14da01466a2dd66dca963f45dbde2d0967270a4e35721e63cd11fceb3033a61de8ee5461789423271047990510fdcd28064d0ba9e7e1e9f87283c39e4f26258b98f4df858c958e9e432c09a26b79d79be86b6408ae595b9c38cbdd2ad09a3cefea32031dc73fdfe2f52dc8397dd349c59cda78c4d8982c7b0b4ada1cef185bc5154758fb13b9abda2d0c351159631d13e2b6041c9deeca30851c1c95b3d8ddba70d201a54a6a6b84dc4548339d4e46c848d025c50dce14a7477e164ec7da52d177aeaf7ad1e89dce0a14e0ee2a0f04c83fcace34e35db8c76af9b3e9c0cb73b24df3a23cd2e02efca [...]
-    "P": "d84d9b6fa59e4232eeef668e6125c837c585a198f95c168540aa48811446e0ea02dbf3dfc42bd053398ecd8c46252d0318e746d1bc0278d37c6f0c9fe83c66e2c2e025581ad1fb48f7100b91e6748571102eab089be225a4a7225aed0585caf3ce7a7472628c159766d4a85ce6026a1ead325aa02b8328f5a978639e7c291507",
-    "Q": "f459a2bed24bf5fe36a984b659990296408703f86639c5420b5defed8f041c806a2b91cb494035f6eb3d815070331e8d9eb8786b4194fb658a52f21a89e316c6b85173df0312954e15281fa953a4e8d3ad69fb4ef723a7d188ff24d0563f03d3194835e8cf14822c30592036b5a1d9bd88597789f50bdaed877fa0f3f50a4d07",
-    "R": "f63a204ce35262895b297a6c776b5d34fdc84b0a77a019790e59cadc54f9a18579436b44ab4bf4fa8e8a4b2d0fdc124b548ef63db43d7d816e4ced61378ab88d8ad510a7f4b2c9b928265d07614ed5579dd87ccf10b8b76bb9604ed216cc5edc0b731ef329b4da0841af5cfdca593116ff41e5ea5a20d5e65e84c5048b257f0e50e37c7b2abd013981a97f0fc0760909336b7488f5a55e3623ecc8643fdb2d9b788993feedc454b41d544661465f80e1ae520d4419d406328f14a6686c46a6a3acbae39e3fdde0bc7840c004f7a61f9009eb9e1af82997c9221f3f79af1dcc9e99227731b4dbbad4278c12f84a01797e37 [...]
-    "E": "5a1d01f4012883a4f4b6a3a94d5cc6cd",
-    "Y": "f63a204ce35262895b297a6c776b5d34fdc84b0a77a019790e59cadc54f9a18579436b44ab4bf4fa8e8a4b2d0fdc124b548ef63db43d7d816e4ced61378ab88d8ad510a7f4b2c9b928265d07614ed5579dd87ccf10b8b76bb9604ed216cc5edc0b731ef329b4da0841af5cfdca593117a168e43c7447c43486cbdaa7116b3b6077c7ae13b7537078db2eb418da162fa5fe8a4c4c8e57019a54ca7beb78b8c488c06555a1b74709cd96c2f4c73c9fac1804892b09e22ca9ab3936802b8c85e7900b6e3e3f0bba301864d1727151c2196dc83b90529411a850de9372ddd6802e5504832506b1b3c428558cb79fb778a450a4 [...]
+    "N": "cb34ea830c9ad9b3b2d323063ae73331d1dd5bec2f19dd2cd850f74f90a54e9972692e52987008f9510b5f67ca952bf933b8735ed2c09fe3c94cbd9e1b27447e122da3e05579d567962cd1a30a53217352c9c683ff7b79034982283aa8e538da714b3153697e6841082b151317b4e0991a529b954b2cab79c07ae18c7be2f23882cb7db39f5cc8883979c0ec9cb7b22a4da23ca71a03357b002a5814226a71402cd8ce1eaf0fa349e2512c0e69baef3e72a747c4642f7d0ec3d26d226e55abead003aa272735ea6e7668314873c1ced0f37edd32fbe3527d209037412f2a3377b9865958d15c114e798fd352039db67534 [...]
+    "P": "fbf44adec35edc14bc7f070b622d489d9dbfe14ecaf98de4e566b289b1cef0ec8a434b2172a3cce9818b80719f937b38eb18bb901421dd861290be9467c2b176a4f5d75ae3ffc61bccad58a93dde4d3935e534f68373ea644753d5733a532c58452275f7eac8ffc4d4be91b0c9886206ff9d6f2c95c24cdc9e82b1a78dd8bc03",
+    "Q": "ce783cb6530f8a94c589dafcc213a81df0901207d39a9b8407e0291b4830e6ef05a4afd0397fdac499e3f1eb3ad091dc9cc139fbac15ef229f067207a3929757e4cec8b799b96df1d41bebbc4b87c88723916b726106f6ef0b5d6652cfcaefafd0324e347cdf4c3772e51e158ba9b531fabbebba1ff8c26a174b91756cf0176b",
+    "ID": "e7a3895ef3eb8ed5d614fdf11418e950",
+    "AD": "",
+    "R": "abe2e41bfde04328b36324e453fd1ac55914e0e630254eaf4923afd3179d53d280bef486587460ac258ae0ff7c28b38072dfd0d6cc225313c2f2538592c9d781c073236b23d6bb2f5625f1c905dbb9cd4749c962cb232c02d84985acf9bf0f3665fc80f342c4cceea043e7d9d3c5102778c32630fb2fdf3776b6c17241c5f7a6287d1c366d08e1351b9b4ee3e4d295013242c6fec6d8c1c9936375742f4b6f50a4705b5a5e62d759ff24a53917b988520cbc7c9d402bb9079d720fefeae28f5dc4696e936314f5fa21fcec698fb01cccde133d47d3c71db08c1d7eb13dd7bff8ec1348d859f0bfec4c209a48dbcd40754a [...]
+    "E": "bfbb7cae965db6b4a109cfd57fcef0f8",
+    "Y": "abe2e41bfde04328b36324e453fd1ac55914e0e630254eaf4923afd3179d53d280bef486587460ac258ae0ff7c28b38072dfd0d6cc225313c2f2538592c9d781c073236b23d6bb2f5625f1c905dbb9cd4749c962cb232c02d84985acf9bf0f3665fc80f342c4cceea043e7d9d3c51028d019dbe5758766b2deb23d109ad29bd1b881b298a482efdc9078cc093a5a31c8fe7abee8668e35d18aa3447fbac6c83accb62507d04ce7115a66df425927758ffc82d110ad9fc27ac2da70a93a0dfcfb06b442f5bbbae66d2429788f6bdde94b8459f1af353324743d8221f442192d8f0e615a3407a1d450d3d6817404f9c147fb [...]
   },
   {
     "TEST": 1,
-    "N": "93d0f2cf9dc162b67627795a1f166af4419a2a3a48e0c0872df7209c96ab8cd176f4d9711db59db1eeeb7205a7326d7a4c5bc9f074c3db60235cbcdf02e966af6d424025af98f7a4925a3565cfe7a37091386ab9136b39edb581db825aeea2a79891f0c442b9b362e5eee791f8309935938cb9d7f57a765c25baa37c580623973fe258bd23cc46bd615f6a4d7f58f291bf2f74bf21bdf958783803848f22f0fd9fe4e789816fed3fbd69d6db5b5c0ee291bf0b8d4228fed90abfa0fc41492606414b543733b646ab64686c8b97c08ab3f3d16f12b60ea7d70db9a3b82645b5eb86d8fe2d65473dc21b85c15df74823b16d [...]
-    "P": "b73c496a80a896637ce0073d083badff36cbdfcbfb17e030fbb3c334c68b16a8ec7fdaa56445713412955e30b3c471ce6eeec8d5ce7c21a73476e29f012055e717d90cdcdef7f4d8eaadec0476f9a0d99b3b90375fd1a63afdface4a06614cad86e9c73a2ac60126b5ae7ade17037246da5b52c47880f5c9a9a618151196e2a3",
-    "Q": "ce83f024158b64b30c5cd0563d41bae57a89ea2d0edcdf2ece08de5f674d33d4e1f4e7d97d7c116c4b23d9bf8fc6afa5cc92ad1fa916b33adb5cb6a688aa2a0c7dc713a9348bf2355261556ff6c2502ac994ac527d2c6108da86286384c0cdc0a139a7062165f84af80bb49b69f7abf0e78c14296c329437e56e7c3e92554b75",
-    "R": "8d4e2d47453bdba1a72810b3eb6dd2fd5f09deb6f53566ddfaa7bd4ed92603e0ae78d5607e484df7e69ec2cdba87c6fc0837b5c41cab9ae9f31cc8c80b3f10583d6ea9e82fcb394b5eef534c269188ba3543153b47f27a95596602b299cb0a5283940cf6123b34615feccdc07d41102f4bc813bb8456bd993dc1b1a76f340ea47d228fe25d0bed66e8d4095952efcdeced366170374709acefc7a8e8d919132306641c3420892ba7de51960819d01debf698e45321e818c5808dd310ab463e531d6cabea279c5c3254d337ab3e080c45ec8c4ef808ff3283f97ce0cf528b9ee14811b60b49ace20adfa565148e2c7b0186 [...]
-    "E": "64cb1686037045f18b0d070e90cab9fc",
-    "Y": "8d4e2d47453bdba1a72810b3eb6dd2fd5f09deb6f53566ddfaa7bd4ed92603e0ae78d5607e484df7e69ec2cdba87c6fc0837b5c41cab9ae9f31cc8c80b3f10583d6ea9e82fcb394b5eef534c269188ba3543153b47f27a95596602b299cb0a5283940cf6123b34615feccdc07d41102fe53c5bef67e0b7b3a456cbdb45e7848e9a389281172bed5768042a7e49f35ccfe3433620097ea200a11530bcfa44bf7480a2f4debe03c5e94a6f76f5136b17d54c4ba778a6abc108079c2b5077b05bc05be99cc749f7de8544ca143428686df17b104e67ca6eef7a6e6d9a967cf5b20a1444c882b47e0916e2a3ad2991732abfac [...]
+    "N": "f759a7b07fcae64cbd9f563f825d4f11cdfffdacd13f9dbccf30a4b5d15059b2342a405d76c15d414ae9f4b0b389194b8cac371b251527ae296fee9a901cb0da7fb45b19936235e3c1c5802eaf1f7d9047f851d9aef904ac7eaeceff87a66b14d0ec0f5498f50ad691f67d753ad871e8cab4e2be2b7c27f40f19924bc69ae3eb6b8920186b9ad43038adb0be980f763af68cec35b870bda2b78ba0935ad75b0dea6c1b91a1edbaf8bd1cb37bac1064dbc448302aef3facbce301560eb5776f6b39e371b7456c6ae14b1922e119ba01c92338e05d5b61c00c8c57dff954c2ee66a5f1f96eca48b03b4b80937e545d31006b [...]
+    "P": "fd35e7d6ac23386aacd604bdcd354a96ca74f412ce20b4b861a33cb8d561caeb4a7178ca43ad7db2c06e7c5dd8c7d54471a877e9da61795c68416b8a46c589cb27f4b1f330fee315d40c7da12feb50548bd48f692e74aaffe56d02fa79ef97bf95a826aee7d16ebc9fa59446219638136678bb675969716d8bce253518ebc335",
+    "Q": "fa1338e761766fc0df19f0d258ac55af7428ba2826eda247f7655d73f18391a640cb3930a5b00e92191cb39f4d4b0b6aabd17926ea5822f0e8cf5cc03524f78cb6bf5d0b4304a9f927714505c8a404c1eb9d6a1f46c84c18ebb75834385f2260ff1653d45c6b929aa6476f70fe2d63202a94d9b5ecf113828ecc7dd655e9a033",
+    "ID": "a2d9b81498c696e39eae07ac40a4d9d4",
+    "AD": "",
+    "R": "ee37dbf112733a8da098a52f59ef5241f0c0151b1c5684726fafd6ecc9ffaefc8cd56295529a3120c6fc3372595215084916ed8dbf14e66ef34b62ea543da10422fa66153a1999e5a676509f0ecd3efcb647cf7efc8bd1633316a129d3fae81b0e76bbef29fa68bb9e455a15d3325e66442b4679b2b916d241baf205d26d7e68c7df7f8d2ac5181bfc24440d830c85c8096d32c83c428a47cf7a3bb3f37d4838aae518cd8b395ddf677ee27b7a08bf3f38cc7193377f5b77b8c52edd80f156fd2ed8ec14c2b996a7122a26717dd3560bc2ef7f2d8a38268cbf2076e8223f85c8564ce5ae6b6221b7697d07d35a10963972 [...]
+    "E": "962e61395e24bed0ce8efeea7d12126b",
+    "Y": "ee37dbf112733a8da098a52f59ef5241f0c0151b1c5684726fafd6ecc9ffaefc8cd56295529a3120c6fc3372595215084916ed8dbf14e66ef34b62ea543da10422fa66153a1999e5a676509f0ecd3efcb647cf7efc8bd1633316a129d3fae81b0e76bbef29fa68bb9e455a15d3325e676b6b4df06e9cf5e1690198adddbe7792bb7dcad10d15229fcd084586aeea1eab0c469b3bb7042d5375a5db6a14c34418dda7b32b2a7704a33400dc5e2bbf7b6428940f6acd50db100e56ccffc45c107b8e28d5d2d875ffcce9c8f2515923358a8139ff7260bbdb37d36ed90c06c1801443369603925d516ede39991e855a710f21 [...]
   },
   {
     "TEST": 2,
-    "N": "af0a54ec7ef720ea2dcf3475ea2c0ed7fa3476d3348c07e8325f7fc092be6f5449b21ce25ebfe91ab97c5ba367da1166d609c3ed51b16584118f2f8b6f40c3f7ec0d8b94d251b0a69ebe487645e9d4adc2daf4e94dbfbc9ae90983a352575ea32a2ec2ffb87ce6258f55b983b14a2da9f2acfbabe473b51ad81a8463862e517f134f596aed8807f1d26169a7eb4784049d5a9dd1ffdc1360297425171bba4fd14b35b8dcf2ebb2179ca20b8144377fb5af5ccb85fc937febba4c84709cdbc6124db2ad2c9cb3d2db67e56d2e7eac069081242c94488a2cc36918c44e4c0b0f079ee7f7bbebae9ae50624867cec7636e4cb [...]
-    "P": "ca289f6f4def0506fca84c0bc6bec11e5f16c6deea932265f9ad31ef3400ccc0a33876bf2d726cc5ee295c74b809271409899ce38acc1787e530653f6b0f0adcea4b1bf51f7aaa2acd6ec4722e8abb792feed262e08d07c9f24c4b0294bc7b7bbc4c15b483f5fbc1d799a3b2daa7c7fe7c6597734a2d25257fe0477fd0e95883",
-    "Q": "dda8c1471c159d6f45a048a77d6572b95b7dda972a69cca455eb8531fde6738dbd3b142f423892186abb272d0cfb777093ab32838659a9acb4f2616ad5aaf6c720f66a689d60a8be33f58c2eb6ef181bfd70643ee34bd2e2c3bc0ddf076fa4da1b078bba0ca08fe7b6816cb12a1e3cf9fa4f812d3db4347d8efada6107c44623",
-    "R": "0487f922c1f17180e5d8c2c8247410dfbda6ae5376dccf498676e7e5c18d2b34d56901227031bdf921b9b20f27f83f2cd0c596a91a7237a5353fc61ca4731f81dc5338bfc01d78b28d4408687be801b82ef5c3fb4f5231176208a8f62c859c147ed0d021a4cb47c53fcfedd460279bd02ebb375a404b6482f30f4961d3a671d78dfee47363ccaaacac9246015cc91303a739a9ecf959303b12d1f525b90bf2333ed9b939791c8ae018c829279bc7b7d868cdfcc1f3f7427887eb037aaf1931d720194ac735dfe9fd800737a1e0a7e07bc953df6a244f671fc269b5153dab4814203a9b68271e2f252d2a5474aacf68059d [...]
-    "E": "990daf52d203180cc8f4ac34f877b706",
-    "Y": "0487f922c1f17180e5d8c2c8247410dfbda6ae5376dccf498676e7e5c18d2b34d56901227031bdf921b9b20f27f83f2cd0c596a91a7237a5353fc61ca4731f81dc5338bfc01d78b28d4408687be801b82ef5c3fb4f5231176208a8f62c859c147ed0d021a4cb47c53fcfedd460279bd12c1e020a6cc8195991e63b28be21a2e68ff9516494a3737f60b4606cd0a26ebf69a768ad227a78717c9248c3a3327db94653ce47878352ae191a59820b107aaeadf6c031739d9bb327e833a741c225845c613e7304becb09f44ae66df68817546a19af4ef0b4f3574c3b607a0c9f88d74860b255d2c666ba52836257fa52eba07c [...]
+    "N": "bf382b05e5d74380aa9236325cabd36400177bb2aae40d566d5e123b24cee2773418a97b99bed8b4b15bc7e9b5acb51be0b5c3422dcafade316c6cb340ffcb26b45c0434ff850a00bf9d779c804befe692d513e106a81548a22790681dc59d433bbe7f112fd5e92d4ed7cd1c0661333cd697159cfeba08ca554f27a0b3b8833feeaa5c3fc8fb1cd9d33f171a2aefef39c58251b1af663e60ad2cc801fa1c65cbd76f10000cb5966c91e3e39ee75451e4c8479743da5542b84fc012953bfdad12478107c2cd76e265df73046b2962ef7f9198f1859e269874fe83efb7299749f7d6b2b05978bcbe3902b863dad6b8b7d315 [...]
+    "P": "c873298e7ed143b583d3a2b92cab06409e7af394c492c629e598b84f5ef78503f6766eba90ac132e7fb09adc6f0697d7cf5ac4957eff5485155ac5a72b5c75ddaa74d9a0ccc73a77dff2b69e5e7fe362dfa3ad0350e0660e94b89b519f47adb0b681d2b6c6b7af044308332569c87da38b11990139f00028563ffc7ebc3fe175",
+    "Q": "f43627bf4714f38202801c52becbf21f3a1c60b5bdb8d9633bdfafaa7091741c5a018d440fd7ad990a424f1537d92f18068024a9ce28ec3c46a5b145550e6c6858ac87bbc0f25526d4000b3a15fe015f740e31405cbb07d29c62ab4ce40615e1d9805c357d2a18aca52c9566c2f5ae50d1b74154658a92813f1ad27c957ac923",
+    "ID": "22d759ee462c39de62307e5cb8d32da8",
+    "AD": "",
+    "R": "8b4b7e21fd90fe3ffef4e25890c052296447bc66507c240ce8da422210b5948e488b45f4eea6ca530163f416a6d40586154cae940c112a0ff93a19e75e588b79661d2f94a5281b7e433d1133d259285d05134b01b43d2a2e75adb0538f550cb94acab25ed5117053f9e2b44c9da5d6cba28512f0480e6a12a4a93e40b8291c08387c743f26320f0cdd6dce0f3040e39c0d7546d29a89d296322929169216f11cd382cc9fb6cecaae31320fc1203f286b5668795c4ca29adb3e5464ac11ebb6c5cda8d4e471928f99a3046bf09be36448ba9686e898a211ee8a4383852e1687de8a78afe6c6b3474ecbdafaf5872aa75970 [...]
+    "E": "dcdbc08a753fae9d19cb1cb057712bcd",
+    "Y": "8b4b7e21fd90fe3ffef4e25890c052296447bc66507c240ce8da422210b5948e488b45f4eea6ca530163f416a6d40586154cae940c112a0ff93a19e75e588b79661d2f94a5281b7e433d1133d259285d05134b01b43d2a2e75adb0538f550cb94acab25ed5117053f9e2b44c9da5d6cd222448172790b4f0739981e24f1792104412a43b4ac30af74ce2db378f046b3f35e8a51945947a54687b8a8cd463a3ac1abbb5e836c7139ed86f24ebad991ec4ba08461f7ac29763ca1da152688ed1cc5d342ee67d0cb12a67241edf8b89c47e0df36e1cebf7056dc6768f01eb8af746455eb485ab28f3966e4e0d6f5fefe0d2ba [...]
   },
   {
     "TEST": 3,
-    "N": "c1616e86d20f6d1e071d015197d17015ffe25a0acae2c145c98f1211841945a5cabbe1fd509ab9979d91cd7d1e2ced386edf69703393a7f2e9e06995c94c68650f42e1bf08e4288fda82a8af7780979f71834db67d6d287c4e443ba456ffee3170b88680a0e5dff71be6147c4f99ac36f68d9cdbef2e77d6df92c0d0822468135663393e4dd1839f725690fe93935f6e30943a4bb0e50634f683a1b3a4222e19d27397a86049fcb08221a21fe8e6932e685f3f96c95d8fbc31ec80707611408c2febd3517c6b84a2046cda046164c19eeb4b1ec481e2f671b51ee4b65ad037598820fa8518156a202d080eb56928114d81 [...]
-    "P": "e2376784de020425bfd5f5d6782d0efb83fffe56b8852a44a3887922825a085c8e1da9e930973ad081bd8977d9d087ae242cf574b999a2562af5c039b1520b256e003576bfbf361814476787c3ee162cddaf1c4bb93d7a001fb720c00285a2dd935eb06004a15375ffc2008d82c901da6ebe1a5e742c756dd27c7e16d6ebe229",
-    "Q": "dad74cc65dbdb03588c9ebf428b35a5415b89ecb9493065e29f6a8adbfa08dc0e3c03eaa9751075247b8853a39db922ef47f6d9aff1ec912e38241e0760cc3e2f2d66a3db6b9d8dcd75649b3d6bb9d8221bc03928a8b19539e78d92cf81067b85c3f1a7a9d9a24056b86be1c7013e813238dcb4c143d8fde8d38957f7319f083",
-    "R": "8a0c44338ce473c07020d60f82a570e04aed8a46731f454077f55c0f2529f9f34d62dc06f9dbd0475091beebae506dabe86de16e4498937d32bb2c6660ef5d2ba71e44c6e9bec3256c4c8fb58ab980300c04e5dbdc30fc070fbeca6b69f52720d807e3a0c8f2fdf3252336405665f301f95015467b850b846441edeadffb75cc097f22a1aa9840b502a2437a3bf58f3f1293a1067b171b2b40a8cc52198293520c9f7f637147dfdd0506e25726cca9c33a31352b429f51a070ea0bd624ac73758626a936fadb8cc6984bb8bf34c4f7f3626d20919522f06901eed441d01aba6392672dc840f5b1465667acd045da8c1f4f [...]
-    "E": "44cd0552d61292c7206dfe13b189c17d",
-    "Y": "8a0c44338ce473c07020d60f82a570e04aed8a46731f454077f55c0f2529f9f34d62dc06f9dbd0475091beebae506dabe86de16e4498937d32bb2c6660ef5d2ba71e44c6e9bec3256c4c8fb58ab980300c04e5dbdc30fc070fbeca6b69f52720d807e3a0c8f2fdf3252336405665f30270ec6b3224089d201571ade5a7bc47d41197adfb434474be307b4a39141c1e5aacd4ae8e72672c07604e4a628bb63b354ed361e10f977b0a897837b1fa8eaaa1da0ec4f530150c207cdce17d5b1f1cee586267fdb19f12aa5a7f3e8bcc6a2e833402cb752f6889043a5612faddf6ed3c7e29da208351f1159f1e6572a3be07e684 [...]
+    "N": "d9f7ca9b48e84159f3e894fc49aa2c9ef5586482b2613aa9a262277bd99d63e46137b6d5170a4991d0c9b960c93d35e92b01f79650950fa135130dff99ccf177c1df10a0167c71b149d466bc9637cc847bc7fde23b4f7ecd74cf477388af92cd7cbf4a747fe2defa800a65f46dcac01fd00b2841c5886d8b9dbf5db67199a42bb84e647219dfb533275cbdfd4909aab020b07d96bed74f1b34a5500ccfb08232a4b5defba6a4498a6803e91ba0cce82c2f0a4de221d6fe026c79192464bb2f9acaa2f81b1a22ae8f64b0e8a7f8cab2c157cfff27aa11ac7ff51489777b29651aef705299ceab66676c3baef87725946f32 [...]
+    "P": "f1eb373c4d062262a4ec49fe27b9a38ded1d64fbb91f2074f1a6d5cb014f2694e04d72724b18939c763b73ae0be1c08f3a2c6cae5faefba2e0260a2baca3a25ebae70f73e9dd24ba4d0cd1913881dc136dfb2d86df5e08b4ac73f6a06104127bdfc01aa9ecb962e47f36760d9beeb016cf90e3ed410a0052405a2cdc2fd3b3af",
+    "Q": "e6a7b03ba54696fe1d0dee5ae84a36d5a984c5a43da6f5a30831cd4d4dcba8629024c4065c5dad25cf6b5179d385203849ba5536d039190092b9ba493c303fb8d6b30785162870c224b09ceb82a8b99b64705c9312d759955026a145726782c0d7c93cd3fc94c3b238cee7be8dbbdb8b42386ad42990e74e1a28a1513b0d5841",
+    "ID": "31e74a93f7e016b37c22d19ad1a381c9",
+    "AD": "",
+    "R": "fcbc96f6758f3ff7935dc9c186488d7ec52d6d3b1b5757c175ba31e3289c1ec0eca771c885fe500ce7a30adfb158e0d4534676deba56166ee3cb59faf966cccd2f187aaa5f04f349ff29a2376db10767d505ec9266462ce9ae2aff7a9826c522eeabb454f8b690bcd9effd6b4abb6afafa9df2364a1de8eb3b01c3856129d2e023ce210c1cb6f12151c8806868bc4d9ac485e389db8d703971e1d5f012bfdcfbce0c17add22785c30acf2a131c4b8f44e01e79a2458395d638bbe4981aae104aa6580eecbc4c63149f6eb97a29a908c7c0b40dabfc5dc0bf2df65817092b93b3f889ec0d24d899daca4a6a5afdcc49ce66 [...]
+    "E": "668987d487a4df96dd1e43b8a97f0960",
+    "Y": "fcbc96f6758f3ff7935dc9c186488d7ec52d6d3b1b5757c175ba31e3289c1ec0eca771c885fe500ce7a30adfb158e0d4534676deba56166ee3cb59faf966cccd2f187aaa5f04f349ff29a2376db10767d505ec9266462ce9ae2aff7a9826c522eeabb454f8b690bcd9effd6b4abb6afbb7e65bcbbff6e8dd19e04a9b34228f788dd1cab5e158a91a12d1c3067d8fefd09a9d415cdf62134472698a570b6d6069bae7efc51daba58ad412ef32ff2360574d9148953718e4148e5ee5af64834a924bd45a33424e7de627a75e4574f698c8958525b3248dbe612f3b316bc6973f4eebb22152ed0db32133d9372342bb6e9573 [...]
   },
   {
     "TEST": 4,
-    "N": "9a2974504c77ed41ee64ebba990f0c632ec39b7b3146e6cb30007a174382aabfeb719ff37e2a7bf642b6aa5ab1891a7805374523cbc2cfd3fcc5509e55996435cf9f6357b7e4eee2e634540d93b63d838f13f31177bd3759c17787b9447a38690fb6739758783d4042abdf6ec889a77eec7d48d6d1232aed7accbe8b4809df1f51616cb77ed1ca7c63e324ea029d6a59a0a7727a5cb14ea2d25e107e1d1bf138be93efcf3d730061a1075bc4a29d665a3fa8bf4e07cf9529aa6b4b64a97cafd16adda99a772142276e4b6f4aadbe95e9c9fed2d1d00d72309afbf11f6a026df29d7e291fec2fc628513a7d0807ff9bae18 [...]
-    "P": "d7d35bb7453e2a7493e1013504211a43a218f61eb9861eaf9176ab12c6c8d9d48a1de09f9fc2f1bf87bfef1752225dcd026233ce014acf57b035566c1788a3b054b15c6686c0fc173702745de27a4a999887ec69d7dddd4971c37a2f7d4067fdfb81c3caae340f7da7db1abd07bc24cb5cb5ad5e6e0d22b07595badd3e38ac21",
-    "Q": "b6dba9f91bad2ff10f81d9f7ab36d1c375074be064625854db4af3b168b12d54ed71ced47195bb0cf14b608091f94890bd28eebe4f63f42659d6ea0c133ab967e0ea4ad68348a00c0d73025f58867ecd9beb72ed72f67b4f8e7d05c56632dc17b914f6716a6db72f300b6fe43709b0b45c5785cf40e179f607741dcda86aca99",
-    "R": "8f19e930bba3737e620b101014176f99eceb16d7ae563580d67bc35e1e2f5d5a9a22a0a5e0d291527335d0bcbd647fe603cb0b34dfcc5b865282d2fbae476e405630937699a7fdd4fbab13570f681a2495bf2aff51d0833cd435f05225ee824de716c616f83d33728effd79805dcdc96201e30f5faebdf24d3987528d20e90219128ee81bab618ef1faa722f300602b7b9742e2d87d065bdee371dc0ca5bde1af996e8c8c648f0bf220d903594eb1f98ccee309e612a62bac9158b5f62e54984757ae80f980faffce80bf6848d98eec4df5e394aae48069aff9e320bca070afd40bd8178563a9a8039432e982c4e392dad [...]
-    "E": "1ec41fded8ad0bfe1683718554e3a8b8",
-    "Y": "8f19e930bba3737e620b101014176f99eceb16d7ae563580d67bc35e1e2f5d5a9a22a0a5e0d291527335d0bcbd647fe603cb0b34dfcc5b865282d2fbae476e405630937699a7fdd4fbab13570f681a2495bf2aff51d0833cd435f05225ee824de716c616f83d33728effd79805dcdc9650082343403a1e5f6287e0c89c41141f8bb9f3657c718ef7a5cd7da09c68ce3084e98596d4c979546ae4e3fca4ef276b111829d64d0f00ec3683c8ca481d8329b0ab322666aff1a1c0f9ebcc861f716b46e9573c0424423af4eb34336cdbba1d8c70571c2423a9e89b38bc6ce3fa8f4438ec2f3d40e58f04099385111d9466a7df [...]
+    "N": "8e3cf993a1c425ee76b7e434db60f6747fcf396b9d8d99bbe4784dfde20c0fc90a16ad8962a2d76a551f6bec9ed946b5dd3a60e9864974800b5a4c567769bcc3bc8f56750381468755ef6611c4772d20779bf05c4f77e7c89396d2f0d84ad0977694dc8f88f16839f5855c27376363c2872e14be33c7c4e02c33e7cb5cf6dc6a87c9bbe7ca56836b7f6987679acccf23ec25625eb9974b3d069849ecc12e2a05b6af3427c6daf93053c9142d9211b75a5e4dc0a977efae23750fa912b0f50824779d8aebe535af1386f116bb6e46bc5853b9e3e2fcaad8e75bf3b5d76c2c358066f6743de8a518448d69814dfca1abcb38 [...]
+    "P": "c7b8e2319f1b61728e2b3fdd3ce51a7a43367668747bf3683377210576f1514c1d656dd58c317e25cfed53bcce146f9f4312510422e576cda55084f0789fc766b68e7f7103bff435f2215ce72934d6514b19435c3fe3e1547b0974baff6cbf599f27f7358002986c9251c61dcc03179fb117557306999382e75a08b418ee4f71",
+    "Q": "b6516fdbfadc2c92df85669a7c5e6eb4687757039e6db979dae21b582fb6699decd040c2b4476395b47b62de51052b02704ca3943bfee5f94ca40bfa77da6c25775e5db03249f43d9f11ed3de2f6e8db9d85bceee82894f116dc1b867f1e282220c1caa046372974f2051bd3f9fe28e24898ebd2be62603ca93c14054748790d",
+    "ID": "12d92edcc2ac52067833d02b0f4ada9d",
+    "AD": "",
+    "R": "e6bdfe9d01417e1cb140e254ea61dc87e85220977ff56a53709b0422a41e724d053c0f9f226139cee6585d75add63540987b10dd89fb607e4c7cc27150f9c23f23a53013d5092ddbb9eb4574828bff3e91d40c64e9b971f67f635082fca10b9825aaee7d08439c57f13d0630b9839120d8d902f9d8e39e3a7a1136cd9543c14a092f26ab9e669d332f7a0129ca2a36fac474a82070e28d3dd4c99d121e9df63e57a829c7c917e44b267a1f3317571642ba3ab32cc5f353ed148b1e30f5d4c6c5ccc3057d42968c2749c1aed9f49a3e7ed212db7896f13ea0287ba1914fe2ee650c2289fcdbf1dd7b36d69b34c740103463 [...]
+    "E": "3eea9a67be24e971533ceb60bfa969bf",
+    "Y": "e6bdfe9d01417e1cb140e254ea61dc87e85220977ff56a53709b0422a41e724d053c0f9f226139cee6585d75add63540987b10dd89fb607e4c7cc27150f9c23f23a53013d5092ddbb9eb4574828bff3e91d40c64e9b971f67f635082fca10b9825aaee7d08439c57f13d0630b983912136bd9eb52be23fb99f45e866e9d0bdd4fb306ce7b4795e6878b546b4a30b09a2d451d93010fe31af56b26543cc49cd0ea83dffc9d14a76d8a13cbfa6f26b84da9775d9e1156facb48512139eb8142c37d10b4ef95bb148e61ea5aa6d1f383128dca8434d845193e9533a043a6e072cf60bff51a48b8bb158671cffd246b43163c6 [...]
   },
   {
     "TEST": 5,
-    "N": "df8483fbd93b9cd5355a639fc00ef86e09aa335a121ad506c330430a500bd09ef56d2e04bcca99d723e30a21ecac256daa5d90e7ee6261ea3a92724a036361900a269d46666778ec2e23d6f5c0decbd6e23b57b93cbd89cfb6b7066ff82b8c7fcd1ceea83fd6a2a4c41a3d42971387181ea5986520c8c6eb65e46a127eec63127d1ff26e8bc6c3e38a9ca109ae395d07936ca6f6e91e6e16f132979941b0d0b15c11cfeac1c6b99ba76a7a11c935253ef13365a9308c1bb6bd7cbc756c1191fa183a96c3f0a20936f8723ac54f72bad19db7e58e37cb14a0ccf2b69fc7ab180edda66d398fc1423413b0b9e1275f94ddc8 [...]
-    "P": "ec257f666d157ae018ea8a87ced875a806d994da757744e281dfbeba20ea12f7f998d398a0fdc6a44973ff177549e760cbc8bfc2018a76c4fa1c244350a6da2521c871593566e4a9bf32966e5eaea9636a30f336e36f149fe38dafc125881eaacd1e735e9f503e1814da1fbaf65f8b0b617c8300cfd40c250faa766a8d5b1a0b",
-    "Q": "f24f362e65ca052f50e90d832869cdcbc25fc1f6d73a09eca192f370d09885ef3add1e0862cdf5165e17e57e8b1445c2d6bbacfc0b994d253aa1f81182db99a79942e74722b4deb0d887f9b305e54644d7231e7fa3c4b60496365b8ad8bc5d45a8937fdd106d2f9722be35776e0551d86c4ec7dcfab69f9a9e6086d1c9403ae1",
-    "R": "a79994b7575bd5fd5fd2263dda7796a2a0a5e15319f0aa00f94c2d854d56f364720efb7bc5e2d158e89a8d08176f86fe7c3bf7be8025fbeb8e1d136e604fd0112a9afaaa99dc421fea32fd17618c44815851c63bce6120a35ad2142d1873f5b9acd2944e047efb8f28057b4dc0f1778d08b069d30de91aea04b9f1b4cd16688026dd7028cfc9c1cb2b3d5aa30bed42f8fcbb435de035dd413c9072cc355370b764da9dbafcb6a7d0b5dc6e733b5f54c3252a83929eae8e4682e173eb6490f486cd9027f819f1a0e728c4223cd1241c8cc591f5b9d22f0989e5bbabf4a830da1d7ef2f672247866044b5f38ae1ccb297002 [...]
-    "E": "f395bfd4accf38d363ba43e1a7e1223f",
-    "Y": "a79994b7575bd5fd5fd2263dda7796a2a0a5e15319f0aa00f94c2d854d56f364720efb7bc5e2d158e89a8d08176f86fe7c3bf7be8025fbeb8e1d136e604fd0112a9afaaa99dc421fea32fd17618c44815851c63bce6120a35ad2142d1873f5b9acd2944e047efb8f28057b4dc0f1778ecff112a390cc1ab4fe1a1657952b0eb118644a5e57cc4a130d22878bade8fb62421ef80b7014a5a3f016716e7417ba5997156e941f6cd6eb45a7a5aab3c1dbe648cc955a473b3a74bd171f3fd17f271438b0409390e1d88dea06ba036e7c86565c939dd9151a3d0c94aa5095c182848161ce2abc0d04ca3cec9df3e3225115249f [...]
+    "N": "e87040f50d08517e8469a845117b733cc7eac10c985ac97ceaaa3299a8135a0f0ad5f67c5a919e64f11f67c0a1380251b37723997f0b2a13e53698b2bc26ec05f37fd10a9e6297b58723b3e00af74695c6adab8b117b2dbaf2db9c0334e1ef9c7f4c6ffb8c3d817455d03e6859e3c1dae621162ac4e2485e8154ff636fa18640ed39590adf4f471cc090ba8bfe211eaa86761b4be08babbdddf7d55d393ec08aba926f218ced2e6ed9be6991a05cc9e6231bf156f463264214e79ee8a35b303dc62e843de9b8928c2b2bf363d3bc20276c2283b138f32462373c191644f1343c613a0c06cd0bdf220ae2bd733694bd6151 [...]
+    "P": "ea23d672d6b119a7ed6891a97f5d9c4784c7436e949e2dc7f503a44e30cb90e5a4f7bc1dadc201414fd18b219d46fc52a9d74edc8abb2bdbc0aa776efd0ad944754975c81ba5058e243e279ee38123ac522c951ce92cf4d04afe1711c4444d8be16c9830f74f1d3dc59bc68c0200a06e9677b88167cea6d878184917aabe9a21",
+    "Q": "fe23bfa63f80ae6070093a7dd3331d6f1b68617bfa8db926cad170c5d8ed41d4137afee877baf1d50620cfaa015d8104fe4d545564d21f4deb243dafbc99a1786f472bee34493d27fe961564f486167b779146ca54f3aa3affb2555c4f5a58a3a3ab31d09b02fab8c41e05e156054fceca323cb6f104aaaf28bc2912129a8d19",
+    "ID": "d8e2c7cbab427128f54473e3d8bb2454",
+    "AD": "457f2b702207d41090b2f762553a1746",
+    "R": "7d98c9a22d9851be7c9d72674571acf6a1398fa6213d794dd6a5febf88eb60ec72eec65a01a6694610a71cff4491d0a8c1fc7f0b4edf115d2d3462fd83b609cbcd32fccb85eb2c3c710f4c5eaabb2a3124b5d5ee0aff661fa97d75189791c6c6c791a1df062835fabd593d2c463139a089d02ba86bf508009188d07838f7db0453bae614aeff8848a79180de022e42d89ade1530fab4786725d1e54d5bc0ace3bdf403130d83b7870a34ef666f0568fb967012d6e2db1535e9094e58bebb46042c4d0e57cac151b83f0afd62432212e8a835e252c79c39a900b594e58efc6ee3d20a4b2187124e7c2fde9a75038b4c1825 [...]
+    "E": "7a434ba48534f7bbd85c7f3ffabbcd05",
+    "Y": "7d98c9a22d9851be7c9d72674571acf6a1398fa6213d794dd6a5febf88eb60ec72eec65a01a6694610a71cff4491d0a8c1fc7f0b4edf115d2d3462fd83b609cbcd32fccb85eb2c3c710f4c5eaabb2a3124b5d5ee0aff661fa97d75189791c6c6c791a1df062835fabd593d2c463139a17302a4336e0149f7962a242277fc80fe50e6dadf5645f92e38cc00d805cad31e4ecbac808b2a1c74816f5e0856817a217f882dd396577ea1437b3d9fa5554bb35a5f5c7985f28b1035a12bc4e27e218e7190bdf5a781bfc4251dff3efa95e2c86cd56849c3b559315ccd196f9424448a626bfcc1a4c5a3a8f709963986c81befe5 [...]
   },
   {
     "TEST": 6,
-    "N": "a076625789fcd7c4ba510193eac82887ed4b3437b84fdaceaed55295877d2c8dc237a78c634e611831a7dc0036febf5c0653a8d0d2d04194bb0032d087f3abe7f0a634f5eabced93cc0ebd5ebc8564954c3959e74cffebf8ff90b700e7bbbf9284ffbcb93d4f4b842154c866998eff292290ffa74fd06f18afed03ab62c0a8a669dd7aaacaa51efd2df491285b0a7315828939be82ca12ea2a10e19021663a5c39ddcd4aa312d0404b1d970b1f314d01976b350560143c7a6612cd5a0176423f86e71def1efc85c12590712988a03b736b8320c3bf8ae37176f145c039daac8db0c5b4c4f4e185f4c72c0549e49c00e4d7 [...]
-    "P": "bac3519b58f7c0b98016b5762526d00219ee6d709f7d2c1e55dfd09dac291fa86e83afddfcfad22c62d2f004f06afad7818a9247390c2b6138cc8314a449dc2d476739fe88f755c84e81f2b38c7d334efc6e59d411eb4f27ece7cbb0ac132f65cd5e803e39331d3363c2697894d020be235bb432433dc2878f98f8b49268711f",
-    "Q": "dbf305a919e2cf076033272f07ff83c1a8c8021e0d1724dec78eb27596d5b6e946ab65072d12b7f7dcfd6baeaf6a203813332732d82685f8d759a05f0d2b663c1524a06716f66e9b67d0feaecff644bf3e473f40cf978c445ca2e756d00ebc68c574b0116ca2d4f8aa6703abeea6d7709dee6d3caaa69597a40c85b80a4e2553",
-    "R": "3f15979a379f5be81ff9a84e941c5e0b43fffec300db89bea29d8edb4ab4f0f57fd0f915e5e584d6d468cf6e8647c135357b32382071fc328e4e1279970ced8d1b1401e55aab72b527c57f1faeed8ad595957733354e3e3e192859b727fc6366ea49fd9b53124bc86b312fcbfbf728f6e3ed5df6ec0a3c5215d3947ae1c0dd61ddaff004fc7f0e0bed78b6d2f5391d63c0ff227169189da0a90ed07b24722c215025a25a67acc80e8659587e77ac2968d8340f07deb7e6673e57a6d5438149a90139ce0ee0594dd6114be2ab43177d07fde11c2d3236fa992f34f0372925dc4de89987346f66621b148ea110a0ea92dc89 [...]
-    "E": "5d1b7a06ae31c9be54f8eceb715ef46a",
-    "Y": "3f15979a379f5be81ff9a84e941c5e0b43fffec300db89bea29d8edb4ab4f0f57fd0f915e5e584d6d468cf6e8647c135357b32382071fc328e4e1279970ced8d1b1401e55aab72b527c57f1faeed8ad595957733354e3e3e192859b727fc6366ea49fd9b53124bc86b312fcbfbf728f777d942c3809772a9f14ab50838d93bff055b73c5811555a195ef49e66a75ae003cadba99f2b5fa4849b06bfbada7ad254153bdf16822f4fed091b589cdab4d11cd910873575c1b03a360be13ef2597012b6e22195e49bb9dbb604b3d8e160de0623bb66658610d51e07bf344462a638318821f183caa5c133a7d0f0d92dbc923d9 [...]
+    "N": "adb574ee57524a8d1385480fae12bd766000638ced1632dd18c86126d498706cbe5b9cff7e9c1b49b4825f07922fa8dbb5905e90ccaeaa5b7db37067a685d70745d24d957e74789c916c2b05e414ab8e7a3a1661d81feb0b0dbfa9a0d42c1b32098fdd52a7e38e4f4041e3223e6949a8a9264dae8e2b9a32c14dc456f74bc3e2951c634161f7076e58f6bc098a26ff59427cdc4bbc86266a2136924c6e4cc5ef9dfc30c9da62f2b1b0aa8b42e03c276f2c747fd11087a56cb0b8bc34011f78f02238f350bee0289440a2c79db94214fd2ecff0d796f890e2b469900643cc06f8b38778d6d069ff0801ca193a072cb1e873 [...]
+    "P": "c7ae96199eef0e4875daeee4afc2988fb3bb9ae99484becd0b67cac2197519405452a38e69743e3f578d3ccf141751b6a16eaf570a79ef62b5bf15d8d1e3fd8b1de31780a6fff9ba9031fb74105fd909aef8ca09195c62d52f41dce1f314da7d2fb5917f0a8cb04e2cff252be1aacd1077464adfaa9cf970dae1f1eaf6138e0b",
+    "Q": "deb38f318c26e49fa1a3a3d526550cec03e9ce78aece952c36a6382d4c03b3468ff2320466a5a5131461f9a35ff594875d5b34e6c04f2b663f36081b65dd7309ab8c7704bebac7d7178b4459c9d214f89e83e871d9cd69ec8ae4591b339b26466ef996188c7c289520d4ff22b7a1e9c0c0b4997ed16cf4d5ac214fa8032c1297",
+    "ID": "0e7b424b712d46520107031e19a12d44",
+    "AD": "4e166153586bdabddf94f018ea2d4ecf",
+    "R": "a12e72b2c6c596d029e159b01c09f22153b683d80a1c36fce5a46cbdba667a8d108739eb03fe97aaa446aea1dbdfa7e1b8813835eab5a7d3de6b226eb6cbb2e829859a354fb90df2600bd746f00a9a09792875c5311c228798ec1d6db184f50f97828db64a492ca1070ad285f9e875ecd51756c6f32ef1d69ded010043c993cf1339167b92a34297fa619a5e22461f6ee7b166d51854fcd1b8c274a494ad79569299961416601e71f96f3cfb5de9441283d397a46130b2b73a637f6a2c9f1c40db1361a80a758800abfbccbcc68e9e8f5bdd85ba77019bf93d78d6c563e007c27fe12178935ebed7553b61507de4ad5117 [...]
+    "E": "79bb3bf69dcb5a5926e9d3ea426aaa5e",
+    "Y": "a12e72b2c6c596d029e159b01c09f22153b683d80a1c36fce5a46cbdba667a8d108739eb03fe97aaa446aea1dbdfa7e1b8813835eab5a7d3de6b226eb6cbb2e829859a354fb90df2600bd746f00a9a09792875c5311c228798ec1d6db184f50f97828db64a492ca1070ad285f9e875ed9df0a7083db6a99c7c1b496a2f7e131eb18a2bdc2bad29ef5dcb3fa5b888b338571dbed396efa8a29b55e12a0f5cc0b2099cfc473428c5872e551583f10241de7ae0287d15659b4c608444eb385044f3d5464ae34a8944582250cea7ad9fc90f06a20098ec8f7c78e536b2b287705d2c19794fb9a781060575225838ddd94ef0e6 [...]
   },
   {
     "TEST": 7,
-    "N": "8f29503b99e578a7b2b30505454dc18d4c1aab950176ac0486c7d66caaf88d0600ccfb68c0bbc8689d0120e08fe2250eeab099f175ec8fee8355af26c58430fbf7c934666383caaf65fb56d8bf91a9379989890d12718d82f890af92113fc323f24ad3a9fc09cd28835d74f0ce3de0975b0be178a595342c16499deb6a2b34cc836d4b217cf0f53e114a22ce556c209053f4057da4a6501382b39a4a4d8ad7cd750c6db396fe1fa24ecd112a75a05035d861e239e1b991fcd0909058b93a19a6d9f8ac33c8b911300565ad568ba61cd203c7c546b0c13e363d69127a4ed1f1a623d1712b2b2118a00e78de46bde0f5c7e0 [...]
-    "P": "c17fab739dfeae6f8dc38e15257ce6374ed386e59e5a1f5cfdaa69148932f018e80cbe889615dba72acac07b855b85593720aca496703df9e625783b6eda29ac917b4cad4e59a769e15aad62bdf4ed5117444b86f38e0b8c77e759859454c4e144910278d6906e432aa4f202ad0855ef307e4ece9138f747c00d4c57dcee17fb",
-    "Q": "bd67452cc88a4262d1bcdb50243e789bf6dfdfdb8c55e328acbe521c577627be20dc453f9eef0d77fe8dea1fad66e5b21752a918cc2c6597ee99ad0035882c1ce81e3f442112a075f76504964328748fc895c392f6bbc3ef0311a9d14d4f206e60e8ebf712ff5376ccf679349db2525034e0d103dbd4dec4cdb2496a375c8c81",
-    "R": "5228b956c53f2bd72812707d7fc89059628d29e6ffd9fdbd25adca2731437e9216bd4b973897662695f207e0fc0f4cd859239598914c23306b713d061df5abf52983ee7e78173388b90a4ba0e419509e6f4bc9ad38520fa7a702afbf28b57300a90b8bd7e1cc60fbb804c89b6ba9cd879d76edfd24ce921948fd8e7f54ffe3b266f56bbf1aad42b71733e862a913e4a16dcf6aca5750afdd9f76920c6bdfa8db3ccce5e06376848371356d3c29bcbe1ad156a440a622d45b052df0f457756470c241d4997e5c92c2c8b9ca77be91a063377c1db2abd9185e433fc77cbb896a6e2c74aa7798e2fae2f60607e237b67f301a [...]
-    "E": "34b3fc80fe7a672116b81b594f7589eb",
-    "Y": "5228b956c53f2bd72812707d7fc89059628d29e6ffd9fdbd25adca2731437e9216bd4b973897662695f207e0fc0f4cd859239598914c23306b713d061df5abf52983ee7e78173388b90a4ba0e419509e6f4bc9ad38520fa7a702afbf28b57300a90b8bd7e1cc60fbb804c89b6ba9cd87ec4b0c043ec080f4b3c16b983dec9f4b7164ccfcef822cdfebf45a9604877f0da24f2fe501330bd94fc426ff9725e2df02a66307b5558e3b8c3892ce9c81a9c53c38d3b224f908ae3e32acb06c79188a9c679f46aaf1064823f27e51682a7ea4c872b4ce9aae9c23b837e83a1d14ebdb731870e847265187300ee2dc15f5f114bf [...]
+    "N": "e93a35529e6e9617611f2dc4559928806925dca03727e50fa6b7a8dd76ba812e2a234d7594593707c261a50ee2747f48b69480e7f084178084299d314e4d2df818258d8948e4bede3daf06503be8ae677ed8fb48c8f29bc3e68f93e430450ed2171148fa951b95dc535b74ae55513cbab03c4945cc1a8b7de69653855220f8cfdb81a0794852a22e82cc65626e3cc5553089fed5a8f44f4fe580702e28f3331aff4a574e2bb4ee8c3577e4059b90e256a4b4155cc3fc90a85697759c96a81658eaeecbbbf9d3de0ed123802167649fefc2c75f5bda4dc6c599b33b684888482ca75c6982b5bd47469622f2e98a3bd49aa9 [...]
+    "P": "e9e957ad4c72e032529b821abd2feada4ad7cbe06acbdce43014af4f5645cb1f04f020fbd0850380c02be19e05b1a333f7324ae28c4df8f5e2b1126a6cb33477eebaf529017157eabbc68fb6148842cfaf5dff410c0c13c324fcfd5efcd2e33fb1e9878a87131c832d8f25ef58483515b22421459ec237ee00c7cb46cd49a9ab",
+    "Q": "ff4053e41b0b1f5a5e39b9cf959579b87182f82a3f37a2d991d977b4223d0bab15ed2c15aaf416cd9fcc4bf7c0c46f2315211daf453d6aaf824f16234322c3633bc10510b0828c157b945bbabfb46ea0a6441ea2b24a6d0e66cbb11383b2cc628c76ab15b97596509dbc7776485baa1be3f8a14bb6203ea1edd2d0e4cd5211e5",
+    "ID": "524fe90cf3a7111d71ce250a75ccac35",
+    "AD": "708dadc070e02989b2d2e320413418ba",
+    "R": "baeee2b1408ad40f6437bf1566520b4f01bbb15e97af79e03d37f0cc9a58aaa1b2028ad2adafe571d7343f80b867402e76d8ccf36294f99ca00054c33368988e3c285c74a660673f336d973aa08a187a6e7bbbf6daaaffe60912e811014f09f3ac8a3e8a553867aea6f4b76a9b087fd61fe86eeea3a466530a6cc4effcc44d06209ca19eaf5a1d1c83e88f7543f3e9c0cde44b09d5410dbb2e601408bacefc6969d03f23d470f11233e871fbc159d7ae1a15a90dbf1e925cfe561bcb8f85d5c3ed4686eb9940009cf3a43505a9c6a3d70090f63b2b1ad3ba58761daa8754a54956ec450fa18e44c35e680e2d6811a8dbd5 [...]
+    "E": "7b98941e6106453aac9cfc48b00c1a90",
+    "Y": "baeee2b1408ad40f6437bf1566520b4f01bbb15e97af79e03d37f0cc9a58aaa1b2028ad2adafe571d7343f80b867402e76d8ccf36294f99ca00054c33368988e3c285c74a660673f336d973aa08a187a6e7bbbf6daaaffe60912e811014f09f3ac8a3e8a553867aea6f4b76a9b087fd70c130021822a530ecd8fb16601276b01ac314ca7f754850cbf7dfc000362125bd8886541c687fd30f4e6f5eb9c541807f14b25e26a0fcc1ff3c23c1f7be1ab52fc478c2fedbec53799c3833042dcabeea07c827bbef46cfa8a0e6ab7810f2ffd66718018efd203808788f657a94d76c045cb2c82c39f8f7446b5996e4f46adff1d [...]
   },
   {
     "TEST": 8,
-    "N": "d77740b95e58950d36da70fda9a62f267cef22b3ae65309a01bf1fc4989366bd51cf1e01266f6db00c1e61e624cf3d0bf3fa9a867efd3b597078af93ce18f1558ea6e51dad51dc1caeaeecb081ee2694e6939e1ef8cc23a894b2708efe60f561602bec2b4592bd56a9a1678d4c7ea10e27686febe2cbc4fa4554d21dc3cc5b5417ffa70578851e93f4dc0971bc8b4aa6fff3889c0ca1c818aab1d482e548e3a622a433faf381a91fea1360c28dea074588bc3f9727cd45a2e1542b0c4325d03db55b86cb6591ebe474cc2251e01068fd19e277f0b12db73602a267e8318ef413fca7bbc1ffe1a03ee8f1616797bea5ccc9 [...]
-    "P": "e584910a27e37285e0b4f8c1749efa3e470aa68c0a129f46b194579a48d62f59af6c196376d455617939a7e4dd122ef7c4c1751faeb7521bc1d1e54ce7bb51a93fd4750ac1c8046caddd1875b4d688a920295c1ac1d15247813c507f6c81991683998d12ec6c562c6b9edeecac8b156b4202158b467a6b8210f390ecc6c404b3",
-    "Q": "f0539f3de385d8aea8caed1c97ab6de347d72a69bf612d126472377c88083cafab12047bac62974fe0897df40b18e8719e4bc328a9ea44d2d22a32acdcfd9a253cd324e90f5f77f280843c1ad3aa9d847e88e46fc65183a0e5e20a80c09d7064d98944c12e9c2a56e9de862267f80ae730ee030d9739baf96f2e32ca1ac2e91d",
-    "R": "049fe77d314e2fafd1f3fe98997d524d4caea68cf580f786082fb36e2cd65f6b7ae59d8666690405e4ed22f5b6822705f912bdecf5603bd47bd0768293204e45cd15663ca279485c2119b1273d9a51b5e6a7417d820ed0de5e76b3f1052d5b86aba863e56407565275e68048622c67256f9ffc230341130b80b7477aeee99f8d5877eef1026b4eefaab11c4b662b7c5937b700a9c4222a427c4487c86c2f2aa2f2ea0148d149e5bb8aa3badaef95338bcaeced5c968dbd8fca29d1d9c9c8f6270054383d3fb1f89c251f5a3c64242d443dfacc45cd585aeb5b42820798ff663e5a7e9c37eea96ad3cabeb0c2821b3b6559 [...]
-    "E": "6757e73e5432e13a043c3d74cc7b1eb1",
-    "Y": "049fe77d314e2fafd1f3fe98997d524d4caea68cf580f786082fb36e2cd65f6b7ae59d8666690405e4ed22f5b6822705f912bdecf5603bd47bd0768293204e45cd15663ca279485c2119b1273d9a51b5e6a7417d820ed0de5e76b3f1052d5b86aba863e56407565275e68048622c67262d4b4c70e0c956438842100979dd69a72cafef6e2a73175736aa2b1860a10dd7d886c982db8ace56ce5742367173f2e0a3648a1bdd4f8cfd753391bbe991d94bbddfd0e0d5f9ecfe5db156e630d838c3d41ae8fc3094dffe0019943422d6c364acd5d0a9ba4490dc154d174e577c3236d34be6372c02a4d59d9ce3cdee2ddc7d55 [...]
+    "N": "b4900aec2ca6608f45d7dc60222487a87afa4db3672184e2d32e5320bb17baed48252182b7567e918ad261686567895b04344e42f7aa0a123d544eba4797b47c6ce61ba194e9db536d825d01bacdbb09241c0c32729375f6cd49feb8366d29406891d20ad7aba43f7311c67c777fb7f91d1b9c9f65c0702a937b6799bba96d96a2f8ce96e0e5b079b807ad62db5f601831b5111b047896e029cbb09ffca56bc5c085f68b51c86dcf989a98491bfd659ae952d528c0c7f57c723c5b7c7e399155f070c2a108f39dd1d3e6973630b535da026bb41931c575446867ff815c09e976fe5f63f86f333066898a60e01ddccc3971 [...]
+    "P": "f98ed5006c1a39abc6a2523731f7c4b668202beb06b47022001a20b47287e1e1e015e2f390bae4f5971c468d4029ae758142b461fff6263f902f03d7ddc03388b6994be599f9073b1e684536ae0de4f35e7f71c01e7c5a7e233d317029417c1e03a759e43c623b7658e912a05fccd2a41d1aba73426ea35b41fe9bfd6e6ec9ef",
+    "Q": "b93943e6def94995ce914c899e6fbca47f2cce1034ddd733734dfce640b5fd02e9ff19d13d0f3dbae422c91cbcf49771fdcb90bc1bb6bcdc20ac832edab7c6b9421acfb0ed9955c4b90b52f084721fa20f44da87f0ad5ae73983cfcdc0a5ddc6690595a24d8d9756f3790b4f92e98b9dde28a3890bf7471bd2062382722349e5",
+    "ID": "1bf2d93fb729a2cee216ec87525a35db",
+    "AD": "125bdb51807f9fc496ba89fca8d6e3eb",
+    "R": "003b5c4170ed418cd8025d5ffbb3c33802481e4a79953dd66b070c885c214210535d83c2da68d5de61a8f4b7080621df0ed5e1337c416541e6817d41a53491066e0f2bdafbb7b562493fe84858e556f15d21bf55909d309cc25812acd82cfc3885ed5bba95b6c983051be45b26e7336e96ebb57f4a7328873db6740019606b543967c0af9d18a5396ca49f045fa532296ef7f809785d5a46a1ea74412716500a8eb23bfc6f8894b945ae752ae764e7657614c32a9aa821ed149980003d49494e313bc0c284ccf67c0730024670b5a216360c990e051990f66dbdf78f3b171a8f27b614c3903a9c00fe42f4c5e70157db63 [...]
+    "E": "da7a0e3229d5d2d33f6d12e6093169cb",
+    "Y": "003b5c4170ed418cd8025d5ffbb3c33802481e4a79953dd66b070c885c214210535d83c2da68d5de61a8f4b7080621df0ed5e1337c416541e6817d41a53491066e0f2bdafbb7b562493fe84858e556f15d21bf55909d309cc25812acd82cfc3885ed5bba95b6c983051be45b26e7337009f9662c421a436a0d8d13a8c9cf2e3a84c2325f9f63e03473308ae0bca69728afdb36674c25f5fa38b8a662c1e662ad1f7d473ce8539a9b8b6d487531deae9b31467f0f632c074add9e47594b88148813aacf5c402b1d9a659e628c9d86a42a0d1baf9572fd345c12db38594ddfb8f72c5050c53d10ffd937d5bde0d0ca69aa0b [...]
   },
   {
     "TEST": 9,
-    "N": "b635b2ff8acd87a3571cc2eec71a162a6507513a613007e4fd412c907bb8f156ddcd674fcf8ec0b6caabc007b366678a51ff608fae75b56eb8cb1068766d01ea02684ec19d49f3ab8f2b6ec05d0288c50031df5c62603a1a5aecf6130a7646534ce796adda861ac29875b7860bd57fffda23f5a6e9cc247689c6e23762a152c369d405b0a1fa3870febaaaa242d39a81aa3c728abd64d467ec2d9c6f6f93bbbf8604dd7a2d0bcf77a4e0656977479ecc1cf48ff6050043c9aa828baf18e496143099b337e0bed4db54f115163b4550725113704205520c1e049cc35297764211114c404700454147be2788274b2bb80e62 [...]
-    "P": "bc096669fa0f7c79dccdd461e75fb7d150ddd5de418fce1fd9e5364fe46476309dd2e00d4bbfe3dfb36b8084aeeb541ce4dac7d8d1d25ca82b0c8afe580a4dc753f927e790726cd945a2286e7b1f4a205ed85c61969413e63762cbe95bcbf51721c3d8e2d01ce901a8022bdbb23233690ab15b3bebe732a957d1eb04c3e90d57",
-    "Q": "f81124fa2b7b1c1c0e12fe77478346e1438fd837b401a57a2b87f8147ad201cf8881b49cb9a10a401e8e5d938c2d4fa4e80124adb34907d3dc4a3b655913095116fbec29dcc4c0d55f215fdb35286197f4374485967576eccb425d02e049051e89d5432058b24b60371e542d1da2b53d5688646270946dd09d34aebb7c046c6b",
-    "R": "cb3cd78705e012ce0a2f4de82b8ad38d2a1cc08e4ba3ff1f7be604e307167862114cf3c676b6a758e1b3541689b11f1c5f238fb525b03d249776ee51b34883b998305acaa411c3eccf42a64c5fa37775482d651c8c3d20b6a6ceab52061fe2c24ed82f6fe2ed1488d9ac6da862e3d0cef60a3fec3c65d01700d324cac7b48795e81b983ed0d486fd070e085f9079a786ed4d71f9dc1e563e58bee0d1fa1174071e810568db9d5c97f277150747ee4e8c8a67bf2820d021b04bf65e54b0200acb06101eee6764b13651e04c28f112ceb3cae1a7d09bee16b06fd198368de0d6ec72efee5e7447d25b4d11dccd0077240c51 [...]
-    "E": "cb6a200f485d51dede5a8f948f7049ad",
-    "Y": "cb3cd78705e012ce0a2f4de82b8ad38d2a1cc08e4ba3ff1f7be604e307167862114cf3c676b6a758e1b3541689b11f1c5f238fb525b03d249776ee51b34883b998305acaa411c3eccf42a64c5fa37775482d651c8c3d20b6a6ceab52061fe2c24ed82f6fe2ed1488d9ac6da862e3d0d05090160fb7e362597431d503eda7c95392dece002e9f6359249bf0908a50d17fe39c612701ec365f637527d40c43a51c63c11bb1496afbe188f755d330c3488dda31a552759b8c3b3f82c18b3bd3e176b69e4bb24e5e18567443db414f9bbffe3ada6bb06e84059a0cfe35338c54e7138a6a9eab3f9bd8d935b06f2841300068dd [...]
+    "N": "cd87b69f1216b9b52f798bbbb715e0067cd4591e14fe7885a5d69f287e89a2c92171a67606cfa9827c995ea1997eeff0a7bf48a8369ca6cc0127978ef646a2ddf6bb8c4e77a6dbc78222854def3d5c4a20822ad4eea4dd8aa7c6a225df3a484669a701a246f5744bee1b5b07e0ce049f5d9783a356394350a186b8ff5cdbb4fef7d15dd2cdeae687df94a7d78912016ed68993545f74accd61bdff3d30e5411423d0865b2b81048fca4ed718b9a49b68c38d72a4ab5ad0ee6c2c6116189be390d5048d28b68e15e25f210cd55b9daadaf679a1b1f6d4a5d15109cc82df409f851ac9529d66c6db4bf53fdec57214d90072 [...]
+    "P": "e735a07265cd102f45c74d98567451e797988dff14f97d910b432d854a269d71e8b71635bed3d77f3e483466ae52547321cec4b4b939f28397e04984a3e3f78f8f4bacb4b93910eb71af3d2f0f7bc3ee4e75f64d885d1e847c66312740765c3009a1e68b7b8b30ff81c3b6348b9762134b79435c39d1f49c17d63d048a1dfba7",
+    "Q": "e391398c6927e1dff5fc1560f375e2d120229af8b2ab337abe277dc86d84a3ffd734b5cec423daabb8d204b7ffbe92b5df64066083b8c5cd4cca5fcf5547720774099857d3b9154a6a24050de0aa0d38f742cc2788e7c438debd4c7ee9deb53cb818811c89439137cd9e75d58bf8b46b9b6cec359d4d8c77b8f953ae8ca08ddf",
+    "ID": "cd982bfb73fd1a58586ffb77c0e46287",
+    "AD": "f1dfa719cc2b533845ab3681fc793cc6",
+    "R": "cfdf3733122ff1d3dfbc9cbd16e8178f3db69a9c9804b81462d761da1177ff96c87d3c4d3cd471240c28a9a9b3f9bfee11f7ba9230821437b9a4cf72e061bb44f5f54304d60fcc27437670a5fa4944ac2df559732be7e5f693def6982d96f87494cf668af706ece68bac64c1ef056849ab3430dae73f4a9d143ca83382a0412776434fb4923313afbdc3d27d385cc0792b64ec1f947a22b635088b7fdfa92203d888bbb8a37828916e65744879c8c263517bbd36d750c551f203189379aa3d6aabb38e722b6172af3cc1a84ded9f3c2e85395b881dfd3694de66cf7701f4e71b0b1ab3cd0d067075fcc2c99e0e674ba58d [...]
+    "E": "d3528f90a1c79f0c47221372f2e8f712",
+    "Y": "cfdf3733122ff1d3dfbc9cbd16e8178f3db69a9c9804b81462d761da1177ff96c87d3c4d3cd471240c28a9a9b3f9bfee11f7ba9230821437b9a4cf72e061bb44f5f54304d60fcc27437670a5fa4944ac2df559732be7e5f693def6982d96f87494cf668af706ece68bac64c1ef05684b25ea0b8204fe3a389fcb21296620eaa72277d0c8f22cdfdf9831600325edf79e5c177c892639daa3213f51dde67329010c65be8dbba03d3a1e63888c9b1cd01873752836c156a602777330c378f0ed77444f930dc0e91922462661204175edbd0dc5778ad105ce0d34c479cc72821287b913c38f40a3e10ce1929cf890a6759c58 [...]
   }
-]
+]
\ No newline at end of file
diff --git a/testVectors/factoring_zk/prove.txt b/testVectors/factoring_zk/prove.txt
index 00421c3..821418e 100644
--- a/testVectors/factoring_zk/prove.txt
+++ b/testVectors/factoring_zk/prove.txt
@@ -1,79 +1,100 @@
 TEST = 0,
-N = ce75b4a3cb5146dfd14da01466a2dd66dca963f45dbde2d0967270a4e35721e63cd11fceb3033a61de8ee5461789423271047990510fdcd28064d0ba9e7e1e9f87283c39e4f26258b98f4df858c958e9e432c09a26b79d79be86b6408ae595b9c38cbdd2ad09a3cefea32031dc73fdfe2f52dc8397dd349c59cda78c4d8982c7b0b4ada1cef185bc5154758fb13b9abda2d0c351159631d13e2b6041c9deeca30851c1c95b3d8ddba70d201a54a6a6b84dc4548339d4e46c848d025c50dce14a7477e164ec7da52d177aeaf7ad1e89dce0a14e0ee2a0f04c83fcace34e35db8c76af9b3e9c0cb73b24df3a23cd2e02efcafd333d [...]
-P = d84d9b6fa59e4232eeef668e6125c837c585a198f95c168540aa48811446e0ea02dbf3dfc42bd053398ecd8c46252d0318e746d1bc0278d37c6f0c9fe83c66e2c2e025581ad1fb48f7100b91e6748571102eab089be225a4a7225aed0585caf3ce7a7472628c159766d4a85ce6026a1ead325aa02b8328f5a978639e7c291507,
-Q = f459a2bed24bf5fe36a984b659990296408703f86639c5420b5defed8f041c806a2b91cb494035f6eb3d815070331e8d9eb8786b4194fb658a52f21a89e316c6b85173df0312954e15281fa953a4e8d3ad69fb4ef723a7d188ff24d0563f03d3194835e8cf14822c30592036b5a1d9bd88597789f50bdaed877fa0f3f50a4d07,
-R = f63a204ce35262895b297a6c776b5d34fdc84b0a77a019790e59cadc54f9a18579436b44ab4bf4fa8e8a4b2d0fdc124b548ef63db43d7d816e4ced61378ab88d8ad510a7f4b2c9b928265d07614ed5579dd87ccf10b8b76bb9604ed216cc5edc0b731ef329b4da0841af5cfdca593116ff41e5ea5a20d5e65e84c5048b257f0e50e37c7b2abd013981a97f0fc0760909336b7488f5a55e3623ecc8643fdb2d9b788993feedc454b41d544661465f80e1ae520d4419d406328f14a6686c46a6a3acbae39e3fdde0bc7840c004f7a61f9009eb9e1af82997c9221f3f79af1dcc9e99227731b4dbbad4278c12f84a01797e3790fe52 [...]
-E = 5a1d01f4012883a4f4b6a3a94d5cc6cd,
-Y = f63a204ce35262895b297a6c776b5d34fdc84b0a77a019790e59cadc54f9a18579436b44ab4bf4fa8e8a4b2d0fdc124b548ef63db43d7d816e4ced61378ab88d8ad510a7f4b2c9b928265d07614ed5579dd87ccf10b8b76bb9604ed216cc5edc0b731ef329b4da0841af5cfdca593117a168e43c7447c43486cbdaa7116b3b6077c7ae13b7537078db2eb418da162fa5fe8a4c4c8e57019a54ca7beb78b8c488c06555a1b74709cd96c2f4c73c9fac1804892b09e22ca9ab3936802b8c85e7900b6e3e3f0bba301864d1727151c2196dc83b90529411a850de9372ddd6802e5504832506b1b3c428558cb79fb778a450a4794731 [...]
+N = cb34ea830c9ad9b3b2d323063ae73331d1dd5bec2f19dd2cd850f74f90a54e9972692e52987008f9510b5f67ca952bf933b8735ed2c09fe3c94cbd9e1b27447e122da3e05579d567962cd1a30a53217352c9c683ff7b79034982283aa8e538da714b3153697e6841082b151317b4e0991a529b954b2cab79c07ae18c7be2f23882cb7db39f5cc8883979c0ec9cb7b22a4da23ca71a03357b002a5814226a71402cd8ce1eaf0fa349e2512c0e69baef3e72a747c4642f7d0ec3d26d226e55abead003aa272735ea6e7668314873c1ced0f37edd32fbe3527d209037412f2a3377b9865958d15c114e798fd352039db6753478a950 [...]
+P = fbf44adec35edc14bc7f070b622d489d9dbfe14ecaf98de4e566b289b1cef0ec8a434b2172a3cce9818b80719f937b38eb18bb901421dd861290be9467c2b176a4f5d75ae3ffc61bccad58a93dde4d3935e534f68373ea644753d5733a532c58452275f7eac8ffc4d4be91b0c9886206ff9d6f2c95c24cdc9e82b1a78dd8bc03,
+Q = ce783cb6530f8a94c589dafcc213a81df0901207d39a9b8407e0291b4830e6ef05a4afd0397fdac499e3f1eb3ad091dc9cc139fbac15ef229f067207a3929757e4cec8b799b96df1d41bebbc4b87c88723916b726106f6ef0b5d6652cfcaefafd0324e347cdf4c3772e51e158ba9b531fabbebba1ff8c26a174b91756cf0176b,
+ID = e7a3895ef3eb8ed5d614fdf11418e950,
+AD = ,
+R = abe2e41bfde04328b36324e453fd1ac55914e0e630254eaf4923afd3179d53d280bef486587460ac258ae0ff7c28b38072dfd0d6cc225313c2f2538592c9d781c073236b23d6bb2f5625f1c905dbb9cd4749c962cb232c02d84985acf9bf0f3665fc80f342c4cceea043e7d9d3c5102778c32630fb2fdf3776b6c17241c5f7a6287d1c366d08e1351b9b4ee3e4d295013242c6fec6d8c1c9936375742f4b6f50a4705b5a5e62d759ff24a53917b988520cbc7c9d402bb9079d720fefeae28f5dc4696e936314f5fa21fcec698fb01cccde133d47d3c71db08c1d7eb13dd7bff8ec1348d859f0bfec4c209a48dbcd40754a45535a [...]
+E = bfbb7cae965db6b4a109cfd57fcef0f8,
+Y = abe2e41bfde04328b36324e453fd1ac55914e0e630254eaf4923afd3179d53d280bef486587460ac258ae0ff7c28b38072dfd0d6cc225313c2f2538592c9d781c073236b23d6bb2f5625f1c905dbb9cd4749c962cb232c02d84985acf9bf0f3665fc80f342c4cceea043e7d9d3c51028d019dbe5758766b2deb23d109ad29bd1b881b298a482efdc9078cc093a5a31c8fe7abee8668e35d18aa3447fbac6c83accb62507d04ce7115a66df425927758ffc82d110ad9fc27ac2da70a93a0dfcfb06b442f5bbbae66d2429788f6bdde94b8459f1af353324743d8221f442192d8f0e615a3407a1d450d3d6817404f9c147fb6ac738 [...]
 
 TEST = 1,
-N = 93d0f2cf9dc162b67627795a1f166af4419a2a3a48e0c0872df7209c96ab8cd176f4d9711db59db1eeeb7205a7326d7a4c5bc9f074c3db60235cbcdf02e966af6d424025af98f7a4925a3565cfe7a37091386ab9136b39edb581db825aeea2a79891f0c442b9b362e5eee791f8309935938cb9d7f57a765c25baa37c580623973fe258bd23cc46bd615f6a4d7f58f291bf2f74bf21bdf958783803848f22f0fd9fe4e789816fed3fbd69d6db5b5c0ee291bf0b8d4228fed90abfa0fc41492606414b543733b646ab64686c8b97c08ab3f3d16f12b60ea7d70db9a3b82645b5eb86d8fe2d65473dc21b85c15df74823b16dcb19e6 [...]
-P = b73c496a80a896637ce0073d083badff36cbdfcbfb17e030fbb3c334c68b16a8ec7fdaa56445713412955e30b3c471ce6eeec8d5ce7c21a73476e29f012055e717d90cdcdef7f4d8eaadec0476f9a0d99b3b90375fd1a63afdface4a06614cad86e9c73a2ac60126b5ae7ade17037246da5b52c47880f5c9a9a618151196e2a3,
-Q = ce83f024158b64b30c5cd0563d41bae57a89ea2d0edcdf2ece08de5f674d33d4e1f4e7d97d7c116c4b23d9bf8fc6afa5cc92ad1fa916b33adb5cb6a688aa2a0c7dc713a9348bf2355261556ff6c2502ac994ac527d2c6108da86286384c0cdc0a139a7062165f84af80bb49b69f7abf0e78c14296c329437e56e7c3e92554b75,
-R = 8d4e2d47453bdba1a72810b3eb6dd2fd5f09deb6f53566ddfaa7bd4ed92603e0ae78d5607e484df7e69ec2cdba87c6fc0837b5c41cab9ae9f31cc8c80b3f10583d6ea9e82fcb394b5eef534c269188ba3543153b47f27a95596602b299cb0a5283940cf6123b34615feccdc07d41102f4bc813bb8456bd993dc1b1a76f340ea47d228fe25d0bed66e8d4095952efcdeced366170374709acefc7a8e8d919132306641c3420892ba7de51960819d01debf698e45321e818c5808dd310ab463e531d6cabea279c5c3254d337ab3e080c45ec8c4ef808ff3283f97ce0cf528b9ee14811b60b49ace20adfa565148e2c7b01866a3dc6 [...]
-E = 64cb1686037045f18b0d070e90cab9fc,
-Y = 8d4e2d47453bdba1a72810b3eb6dd2fd5f09deb6f53566ddfaa7bd4ed92603e0ae78d5607e484df7e69ec2cdba87c6fc0837b5c41cab9ae9f31cc8c80b3f10583d6ea9e82fcb394b5eef534c269188ba3543153b47f27a95596602b299cb0a5283940cf6123b34615feccdc07d41102fe53c5bef67e0b7b3a456cbdb45e7848e9a389281172bed5768042a7e49f35ccfe3433620097ea200a11530bcfa44bf7480a2f4debe03c5e94a6f76f5136b17d54c4ba778a6abc108079c2b5077b05bc05be99cc749f7de8544ca143428686df17b104e67ca6eef7a6e6d9a967cf5b20a1444c882b47e0916e2a3ad2991732abfacfdb8ed [...]
+N = f759a7b07fcae64cbd9f563f825d4f11cdfffdacd13f9dbccf30a4b5d15059b2342a405d76c15d414ae9f4b0b389194b8cac371b251527ae296fee9a901cb0da7fb45b19936235e3c1c5802eaf1f7d9047f851d9aef904ac7eaeceff87a66b14d0ec0f5498f50ad691f67d753ad871e8cab4e2be2b7c27f40f19924bc69ae3eb6b8920186b9ad43038adb0be980f763af68cec35b870bda2b78ba0935ad75b0dea6c1b91a1edbaf8bd1cb37bac1064dbc448302aef3facbce301560eb5776f6b39e371b7456c6ae14b1922e119ba01c92338e05d5b61c00c8c57dff954c2ee66a5f1f96eca48b03b4b80937e545d31006b81f60a [...]
+P = fd35e7d6ac23386aacd604bdcd354a96ca74f412ce20b4b861a33cb8d561caeb4a7178ca43ad7db2c06e7c5dd8c7d54471a877e9da61795c68416b8a46c589cb27f4b1f330fee315d40c7da12feb50548bd48f692e74aaffe56d02fa79ef97bf95a826aee7d16ebc9fa59446219638136678bb675969716d8bce253518ebc335,
+Q = fa1338e761766fc0df19f0d258ac55af7428ba2826eda247f7655d73f18391a640cb3930a5b00e92191cb39f4d4b0b6aabd17926ea5822f0e8cf5cc03524f78cb6bf5d0b4304a9f927714505c8a404c1eb9d6a1f46c84c18ebb75834385f2260ff1653d45c6b929aa6476f70fe2d63202a94d9b5ecf113828ecc7dd655e9a033,
+ID = a2d9b81498c696e39eae07ac40a4d9d4,
+AD = ,
+R = ee37dbf112733a8da098a52f59ef5241f0c0151b1c5684726fafd6ecc9ffaefc8cd56295529a3120c6fc3372595215084916ed8dbf14e66ef34b62ea543da10422fa66153a1999e5a676509f0ecd3efcb647cf7efc8bd1633316a129d3fae81b0e76bbef29fa68bb9e455a15d3325e66442b4679b2b916d241baf205d26d7e68c7df7f8d2ac5181bfc24440d830c85c8096d32c83c428a47cf7a3bb3f37d4838aae518cd8b395ddf677ee27b7a08bf3f38cc7193377f5b77b8c52edd80f156fd2ed8ec14c2b996a7122a26717dd3560bc2ef7f2d8a38268cbf2076e8223f85c8564ce5ae6b6221b7697d07d35a10963972738e5f [...]
+E = 962e61395e24bed0ce8efeea7d12126b,
+Y = ee37dbf112733a8da098a52f59ef5241f0c0151b1c5684726fafd6ecc9ffaefc8cd56295529a3120c6fc3372595215084916ed8dbf14e66ef34b62ea543da10422fa66153a1999e5a676509f0ecd3efcb647cf7efc8bd1633316a129d3fae81b0e76bbef29fa68bb9e455a15d3325e676b6b4df06e9cf5e1690198adddbe7792bb7dcad10d15229fcd084586aeea1eab0c469b3bb7042d5375a5db6a14c34418dda7b32b2a7704a33400dc5e2bbf7b6428940f6acd50db100e56ccffc45c107b8e28d5d2d875ffcce9c8f2515923358a8139ff7260bbdb37d36ed90c06c1801443369603925d516ede39991e855a710f21e513a9 [...]
 
 TEST = 2,
-N = af0a54ec7ef720ea2dcf3475ea2c0ed7fa3476d3348c07e8325f7fc092be6f5449b21ce25ebfe91ab97c5ba367da1166d609c3ed51b16584118f2f8b6f40c3f7ec0d8b94d251b0a69ebe487645e9d4adc2daf4e94dbfbc9ae90983a352575ea32a2ec2ffb87ce6258f55b983b14a2da9f2acfbabe473b51ad81a8463862e517f134f596aed8807f1d26169a7eb4784049d5a9dd1ffdc1360297425171bba4fd14b35b8dcf2ebb2179ca20b8144377fb5af5ccb85fc937febba4c84709cdbc6124db2ad2c9cb3d2db67e56d2e7eac069081242c94488a2cc36918c44e4c0b0f079ee7f7bbebae9ae50624867cec7636e4cb9e7c71 [...]
-P = ca289f6f4def0506fca84c0bc6bec11e5f16c6deea932265f9ad31ef3400ccc0a33876bf2d726cc5ee295c74b809271409899ce38acc1787e530653f6b0f0adcea4b1bf51f7aaa2acd6ec4722e8abb792feed262e08d07c9f24c4b0294bc7b7bbc4c15b483f5fbc1d799a3b2daa7c7fe7c6597734a2d25257fe0477fd0e95883,
-Q = dda8c1471c159d6f45a048a77d6572b95b7dda972a69cca455eb8531fde6738dbd3b142f423892186abb272d0cfb777093ab32838659a9acb4f2616ad5aaf6c720f66a689d60a8be33f58c2eb6ef181bfd70643ee34bd2e2c3bc0ddf076fa4da1b078bba0ca08fe7b6816cb12a1e3cf9fa4f812d3db4347d8efada6107c44623,
-R = 0487f922c1f17180e5d8c2c8247410dfbda6ae5376dccf498676e7e5c18d2b34d56901227031bdf921b9b20f27f83f2cd0c596a91a7237a5353fc61ca4731f81dc5338bfc01d78b28d4408687be801b82ef5c3fb4f5231176208a8f62c859c147ed0d021a4cb47c53fcfedd460279bd02ebb375a404b6482f30f4961d3a671d78dfee47363ccaaacac9246015cc91303a739a9ecf959303b12d1f525b90bf2333ed9b939791c8ae018c829279bc7b7d868cdfcc1f3f7427887eb037aaf1931d720194ac735dfe9fd800737a1e0a7e07bc953df6a244f671fc269b5153dab4814203a9b68271e2f252d2a5474aacf68059d64cf85 [...]
-E = 990daf52d203180cc8f4ac34f877b706,
-Y = 0487f922c1f17180e5d8c2c8247410dfbda6ae5376dccf498676e7e5c18d2b34d56901227031bdf921b9b20f27f83f2cd0c596a91a7237a5353fc61ca4731f81dc5338bfc01d78b28d4408687be801b82ef5c3fb4f5231176208a8f62c859c147ed0d021a4cb47c53fcfedd460279bd12c1e020a6cc8195991e63b28be21a2e68ff9516494a3737f60b4606cd0a26ebf69a768ad227a78717c9248c3a3327db94653ce47878352ae191a59820b107aaeadf6c031739d9bb327e833a741c225845c613e7304becb09f44ae66df68817546a19af4ef0b4f3574c3b607a0c9f88d74860b255d2c666ba52836257fa52eba07cc8f84f [...]
+N = bf382b05e5d74380aa9236325cabd36400177bb2aae40d566d5e123b24cee2773418a97b99bed8b4b15bc7e9b5acb51be0b5c3422dcafade316c6cb340ffcb26b45c0434ff850a00bf9d779c804befe692d513e106a81548a22790681dc59d433bbe7f112fd5e92d4ed7cd1c0661333cd697159cfeba08ca554f27a0b3b8833feeaa5c3fc8fb1cd9d33f171a2aefef39c58251b1af663e60ad2cc801fa1c65cbd76f10000cb5966c91e3e39ee75451e4c8479743da5542b84fc012953bfdad12478107c2cd76e265df73046b2962ef7f9198f1859e269874fe83efb7299749f7d6b2b05978bcbe3902b863dad6b8b7d31538bb0c [...]
+P = c873298e7ed143b583d3a2b92cab06409e7af394c492c629e598b84f5ef78503f6766eba90ac132e7fb09adc6f0697d7cf5ac4957eff5485155ac5a72b5c75ddaa74d9a0ccc73a77dff2b69e5e7fe362dfa3ad0350e0660e94b89b519f47adb0b681d2b6c6b7af044308332569c87da38b11990139f00028563ffc7ebc3fe175,
+Q = f43627bf4714f38202801c52becbf21f3a1c60b5bdb8d9633bdfafaa7091741c5a018d440fd7ad990a424f1537d92f18068024a9ce28ec3c46a5b145550e6c6858ac87bbc0f25526d4000b3a15fe015f740e31405cbb07d29c62ab4ce40615e1d9805c357d2a18aca52c9566c2f5ae50d1b74154658a92813f1ad27c957ac923,
+ID = 22d759ee462c39de62307e5cb8d32da8,
+AD = ,
+R = 8b4b7e21fd90fe3ffef4e25890c052296447bc66507c240ce8da422210b5948e488b45f4eea6ca530163f416a6d40586154cae940c112a0ff93a19e75e588b79661d2f94a5281b7e433d1133d259285d05134b01b43d2a2e75adb0538f550cb94acab25ed5117053f9e2b44c9da5d6cba28512f0480e6a12a4a93e40b8291c08387c743f26320f0cdd6dce0f3040e39c0d7546d29a89d296322929169216f11cd382cc9fb6cecaae31320fc1203f286b5668795c4ca29adb3e5464ac11ebb6c5cda8d4e471928f99a3046bf09be36448ba9686e898a211ee8a4383852e1687de8a78afe6c6b3474ecbdafaf5872aa7597051d6b1 [...]
+E = dcdbc08a753fae9d19cb1cb057712bcd,
+Y = 8b4b7e21fd90fe3ffef4e25890c052296447bc66507c240ce8da422210b5948e488b45f4eea6ca530163f416a6d40586154cae940c112a0ff93a19e75e588b79661d2f94a5281b7e433d1133d259285d05134b01b43d2a2e75adb0538f550cb94acab25ed5117053f9e2b44c9da5d6cd222448172790b4f0739981e24f1792104412a43b4ac30af74ce2db378f046b3f35e8a51945947a54687b8a8cd463a3ac1abbb5e836c7139ed86f24ebad991ec4ba08461f7ac29763ca1da152688ed1cc5d342ee67d0cb12a67241edf8b89c47e0df36e1cebf7056dc6768f01eb8af746455eb485ab28f3966e4e0d6f5fefe0d2ba832e1e [...]
 
 TEST = 3,
-N = c1616e86d20f6d1e071d015197d17015ffe25a0acae2c145c98f1211841945a5cabbe1fd509ab9979d91cd7d1e2ced386edf69703393a7f2e9e06995c94c68650f42e1bf08e4288fda82a8af7780979f71834db67d6d287c4e443ba456ffee3170b88680a0e5dff71be6147c4f99ac36f68d9cdbef2e77d6df92c0d0822468135663393e4dd1839f725690fe93935f6e30943a4bb0e50634f683a1b3a4222e19d27397a86049fcb08221a21fe8e6932e685f3f96c95d8fbc31ec80707611408c2febd3517c6b84a2046cda046164c19eeb4b1ec481e2f671b51ee4b65ad037598820fa8518156a202d080eb56928114d81578aeb [...]
-P = e2376784de020425bfd5f5d6782d0efb83fffe56b8852a44a3887922825a085c8e1da9e930973ad081bd8977d9d087ae242cf574b999a2562af5c039b1520b256e003576bfbf361814476787c3ee162cddaf1c4bb93d7a001fb720c00285a2dd935eb06004a15375ffc2008d82c901da6ebe1a5e742c756dd27c7e16d6ebe229,
-Q = dad74cc65dbdb03588c9ebf428b35a5415b89ecb9493065e29f6a8adbfa08dc0e3c03eaa9751075247b8853a39db922ef47f6d9aff1ec912e38241e0760cc3e2f2d66a3db6b9d8dcd75649b3d6bb9d8221bc03928a8b19539e78d92cf81067b85c3f1a7a9d9a24056b86be1c7013e813238dcb4c143d8fde8d38957f7319f083,
-R = 8a0c44338ce473c07020d60f82a570e04aed8a46731f454077f55c0f2529f9f34d62dc06f9dbd0475091beebae506dabe86de16e4498937d32bb2c6660ef5d2ba71e44c6e9bec3256c4c8fb58ab980300c04e5dbdc30fc070fbeca6b69f52720d807e3a0c8f2fdf3252336405665f301f95015467b850b846441edeadffb75cc097f22a1aa9840b502a2437a3bf58f3f1293a1067b171b2b40a8cc52198293520c9f7f637147dfdd0506e25726cca9c33a31352b429f51a070ea0bd624ac73758626a936fadb8cc6984bb8bf34c4f7f3626d20919522f06901eed441d01aba6392672dc840f5b1465667acd045da8c1f4f2ff743 [...]
-E = 44cd0552d61292c7206dfe13b189c17d,
-Y = 8a0c44338ce473c07020d60f82a570e04aed8a46731f454077f55c0f2529f9f34d62dc06f9dbd0475091beebae506dabe86de16e4498937d32bb2c6660ef5d2ba71e44c6e9bec3256c4c8fb58ab980300c04e5dbdc30fc070fbeca6b69f52720d807e3a0c8f2fdf3252336405665f30270ec6b3224089d201571ade5a7bc47d41197adfb434474be307b4a39141c1e5aacd4ae8e72672c07604e4a628bb63b354ed361e10f977b0a897837b1fa8eaaa1da0ec4f530150c207cdce17d5b1f1cee586267fdb19f12aa5a7f3e8bcc6a2e833402cb752f6889043a5612faddf6ed3c7e29da208351f1159f1e6572a3be07e684de5d48 [...]
+N = d9f7ca9b48e84159f3e894fc49aa2c9ef5586482b2613aa9a262277bd99d63e46137b6d5170a4991d0c9b960c93d35e92b01f79650950fa135130dff99ccf177c1df10a0167c71b149d466bc9637cc847bc7fde23b4f7ecd74cf477388af92cd7cbf4a747fe2defa800a65f46dcac01fd00b2841c5886d8b9dbf5db67199a42bb84e647219dfb533275cbdfd4909aab020b07d96bed74f1b34a5500ccfb08232a4b5defba6a4498a6803e91ba0cce82c2f0a4de221d6fe026c79192464bb2f9acaa2f81b1a22ae8f64b0e8a7f8cab2c157cfff27aa11ac7ff51489777b29651aef705299ceab66676c3baef87725946f32658059 [...]
+P = f1eb373c4d062262a4ec49fe27b9a38ded1d64fbb91f2074f1a6d5cb014f2694e04d72724b18939c763b73ae0be1c08f3a2c6cae5faefba2e0260a2baca3a25ebae70f73e9dd24ba4d0cd1913881dc136dfb2d86df5e08b4ac73f6a06104127bdfc01aa9ecb962e47f36760d9beeb016cf90e3ed410a0052405a2cdc2fd3b3af,
+Q = e6a7b03ba54696fe1d0dee5ae84a36d5a984c5a43da6f5a30831cd4d4dcba8629024c4065c5dad25cf6b5179d385203849ba5536d039190092b9ba493c303fb8d6b30785162870c224b09ceb82a8b99b64705c9312d759955026a145726782c0d7c93cd3fc94c3b238cee7be8dbbdb8b42386ad42990e74e1a28a1513b0d5841,
+ID = 31e74a93f7e016b37c22d19ad1a381c9,
+AD = ,
+R = fcbc96f6758f3ff7935dc9c186488d7ec52d6d3b1b5757c175ba31e3289c1ec0eca771c885fe500ce7a30adfb158e0d4534676deba56166ee3cb59faf966cccd2f187aaa5f04f349ff29a2376db10767d505ec9266462ce9ae2aff7a9826c522eeabb454f8b690bcd9effd6b4abb6afafa9df2364a1de8eb3b01c3856129d2e023ce210c1cb6f12151c8806868bc4d9ac485e389db8d703971e1d5f012bfdcfbce0c17add22785c30acf2a131c4b8f44e01e79a2458395d638bbe4981aae104aa6580eecbc4c63149f6eb97a29a908c7c0b40dabfc5dc0bf2df65817092b93b3f889ec0d24d899daca4a6a5afdcc49ce66a87fa4 [...]
+E = 668987d487a4df96dd1e43b8a97f0960,
+Y = fcbc96f6758f3ff7935dc9c186488d7ec52d6d3b1b5757c175ba31e3289c1ec0eca771c885fe500ce7a30adfb158e0d4534676deba56166ee3cb59faf966cccd2f187aaa5f04f349ff29a2376db10767d505ec9266462ce9ae2aff7a9826c522eeabb454f8b690bcd9effd6b4abb6afbb7e65bcbbff6e8dd19e04a9b34228f788dd1cab5e158a91a12d1c3067d8fefd09a9d415cdf62134472698a570b6d6069bae7efc51daba58ad412ef32ff2360574d9148953718e4148e5ee5af64834a924bd45a33424e7de627a75e4574f698c8958525b3248dbe612f3b316bc6973f4eebb22152ed0db32133d9372342bb6e9573656409 [...]
 
 TEST = 4,
-N = 9a2974504c77ed41ee64ebba990f0c632ec39b7b3146e6cb30007a174382aabfeb719ff37e2a7bf642b6aa5ab1891a7805374523cbc2cfd3fcc5509e55996435cf9f6357b7e4eee2e634540d93b63d838f13f31177bd3759c17787b9447a38690fb6739758783d4042abdf6ec889a77eec7d48d6d1232aed7accbe8b4809df1f51616cb77ed1ca7c63e324ea029d6a59a0a7727a5cb14ea2d25e107e1d1bf138be93efcf3d730061a1075bc4a29d665a3fa8bf4e07cf9529aa6b4b64a97cafd16adda99a772142276e4b6f4aadbe95e9c9fed2d1d00d72309afbf11f6a026df29d7e291fec2fc628513a7d0807ff9bae18ffc698 [...]
-P = d7d35bb7453e2a7493e1013504211a43a218f61eb9861eaf9176ab12c6c8d9d48a1de09f9fc2f1bf87bfef1752225dcd026233ce014acf57b035566c1788a3b054b15c6686c0fc173702745de27a4a999887ec69d7dddd4971c37a2f7d4067fdfb81c3caae340f7da7db1abd07bc24cb5cb5ad5e6e0d22b07595badd3e38ac21,
-Q = b6dba9f91bad2ff10f81d9f7ab36d1c375074be064625854db4af3b168b12d54ed71ced47195bb0cf14b608091f94890bd28eebe4f63f42659d6ea0c133ab967e0ea4ad68348a00c0d73025f58867ecd9beb72ed72f67b4f8e7d05c56632dc17b914f6716a6db72f300b6fe43709b0b45c5785cf40e179f607741dcda86aca99,
-R = 8f19e930bba3737e620b101014176f99eceb16d7ae563580d67bc35e1e2f5d5a9a22a0a5e0d291527335d0bcbd647fe603cb0b34dfcc5b865282d2fbae476e405630937699a7fdd4fbab13570f681a2495bf2aff51d0833cd435f05225ee824de716c616f83d33728effd79805dcdc96201e30f5faebdf24d3987528d20e90219128ee81bab618ef1faa722f300602b7b9742e2d87d065bdee371dc0ca5bde1af996e8c8c648f0bf220d903594eb1f98ccee309e612a62bac9158b5f62e54984757ae80f980faffce80bf6848d98eec4df5e394aae48069aff9e320bca070afd40bd8178563a9a8039432e982c4e392dadd27f3e [...]
-E = 1ec41fded8ad0bfe1683718554e3a8b8,
-Y = 8f19e930bba3737e620b101014176f99eceb16d7ae563580d67bc35e1e2f5d5a9a22a0a5e0d291527335d0bcbd647fe603cb0b34dfcc5b865282d2fbae476e405630937699a7fdd4fbab13570f681a2495bf2aff51d0833cd435f05225ee824de716c616f83d33728effd79805dcdc9650082343403a1e5f6287e0c89c41141f8bb9f3657c718ef7a5cd7da09c68ce3084e98596d4c979546ae4e3fca4ef276b111829d64d0f00ec3683c8ca481d8329b0ab322666aff1a1c0f9ebcc861f716b46e9573c0424423af4eb34336cdbba1d8c70571c2423a9e89b38bc6ce3fa8f4438ec2f3d40e58f04099385111d9466a7dfccd5c0 [...]
+N = 8e3cf993a1c425ee76b7e434db60f6747fcf396b9d8d99bbe4784dfde20c0fc90a16ad8962a2d76a551f6bec9ed946b5dd3a60e9864974800b5a4c567769bcc3bc8f56750381468755ef6611c4772d20779bf05c4f77e7c89396d2f0d84ad0977694dc8f88f16839f5855c27376363c2872e14be33c7c4e02c33e7cb5cf6dc6a87c9bbe7ca56836b7f6987679acccf23ec25625eb9974b3d069849ecc12e2a05b6af3427c6daf93053c9142d9211b75a5e4dc0a977efae23750fa912b0f50824779d8aebe535af1386f116bb6e46bc5853b9e3e2fcaad8e75bf3b5d76c2c358066f6743de8a518448d69814dfca1abcb3801cffc [...]
+P = c7b8e2319f1b61728e2b3fdd3ce51a7a43367668747bf3683377210576f1514c1d656dd58c317e25cfed53bcce146f9f4312510422e576cda55084f0789fc766b68e7f7103bff435f2215ce72934d6514b19435c3fe3e1547b0974baff6cbf599f27f7358002986c9251c61dcc03179fb117557306999382e75a08b418ee4f71,
+Q = b6516fdbfadc2c92df85669a7c5e6eb4687757039e6db979dae21b582fb6699decd040c2b4476395b47b62de51052b02704ca3943bfee5f94ca40bfa77da6c25775e5db03249f43d9f11ed3de2f6e8db9d85bceee82894f116dc1b867f1e282220c1caa046372974f2051bd3f9fe28e24898ebd2be62603ca93c14054748790d,
+ID = 12d92edcc2ac52067833d02b0f4ada9d,
+AD = ,
+R = e6bdfe9d01417e1cb140e254ea61dc87e85220977ff56a53709b0422a41e724d053c0f9f226139cee6585d75add63540987b10dd89fb607e4c7cc27150f9c23f23a53013d5092ddbb9eb4574828bff3e91d40c64e9b971f67f635082fca10b9825aaee7d08439c57f13d0630b9839120d8d902f9d8e39e3a7a1136cd9543c14a092f26ab9e669d332f7a0129ca2a36fac474a82070e28d3dd4c99d121e9df63e57a829c7c917e44b267a1f3317571642ba3ab32cc5f353ed148b1e30f5d4c6c5ccc3057d42968c2749c1aed9f49a3e7ed212db7896f13ea0287ba1914fe2ee650c2289fcdbf1dd7b36d69b34c740103463771108 [...]
+E = 3eea9a67be24e971533ceb60bfa969bf,
+Y = e6bdfe9d01417e1cb140e254ea61dc87e85220977ff56a53709b0422a41e724d053c0f9f226139cee6585d75add63540987b10dd89fb607e4c7cc27150f9c23f23a53013d5092ddbb9eb4574828bff3e91d40c64e9b971f67f635082fca10b9825aaee7d08439c57f13d0630b983912136bd9eb52be23fb99f45e866e9d0bdd4fb306ce7b4795e6878b546b4a30b09a2d451d93010fe31af56b26543cc49cd0ea83dffc9d14a76d8a13cbfa6f26b84da9775d9e1156facb48512139eb8142c37d10b4ef95bb148e61ea5aa6d1f383128dca8434d845193e9533a043a6e072cf60bff51a48b8bb158671cffd246b43163c690aa52 [...]
 
 TEST = 5,
-N = df8483fbd93b9cd5355a639fc00ef86e09aa335a121ad506c330430a500bd09ef56d2e04bcca99d723e30a21ecac256daa5d90e7ee6261ea3a92724a036361900a269d46666778ec2e23d6f5c0decbd6e23b57b93cbd89cfb6b7066ff82b8c7fcd1ceea83fd6a2a4c41a3d42971387181ea5986520c8c6eb65e46a127eec63127d1ff26e8bc6c3e38a9ca109ae395d07936ca6f6e91e6e16f132979941b0d0b15c11cfeac1c6b99ba76a7a11c935253ef13365a9308c1bb6bd7cbc756c1191fa183a96c3f0a20936f8723ac54f72bad19db7e58e37cb14a0ccf2b69fc7ab180edda66d398fc1423413b0b9e1275f94ddc84ef95b [...]
-P = ec257f666d157ae018ea8a87ced875a806d994da757744e281dfbeba20ea12f7f998d398a0fdc6a44973ff177549e760cbc8bfc2018a76c4fa1c244350a6da2521c871593566e4a9bf32966e5eaea9636a30f336e36f149fe38dafc125881eaacd1e735e9f503e1814da1fbaf65f8b0b617c8300cfd40c250faa766a8d5b1a0b,
-Q = f24f362e65ca052f50e90d832869cdcbc25fc1f6d73a09eca192f370d09885ef3add1e0862cdf5165e17e57e8b1445c2d6bbacfc0b994d253aa1f81182db99a79942e74722b4deb0d887f9b305e54644d7231e7fa3c4b60496365b8ad8bc5d45a8937fdd106d2f9722be35776e0551d86c4ec7dcfab69f9a9e6086d1c9403ae1,
-R = a79994b7575bd5fd5fd2263dda7796a2a0a5e15319f0aa00f94c2d854d56f364720efb7bc5e2d158e89a8d08176f86fe7c3bf7be8025fbeb8e1d136e604fd0112a9afaaa99dc421fea32fd17618c44815851c63bce6120a35ad2142d1873f5b9acd2944e047efb8f28057b4dc0f1778d08b069d30de91aea04b9f1b4cd16688026dd7028cfc9c1cb2b3d5aa30bed42f8fcbb435de035dd413c9072cc355370b764da9dbafcb6a7d0b5dc6e733b5f54c3252a83929eae8e4682e173eb6490f486cd9027f819f1a0e728c4223cd1241c8cc591f5b9d22f0989e5bbabf4a830da1d7ef2f672247866044b5f38ae1ccb297002e4429b [...]
-E = f395bfd4accf38d363ba43e1a7e1223f,
-Y = a79994b7575bd5fd5fd2263dda7796a2a0a5e15319f0aa00f94c2d854d56f364720efb7bc5e2d158e89a8d08176f86fe7c3bf7be8025fbeb8e1d136e604fd0112a9afaaa99dc421fea32fd17618c44815851c63bce6120a35ad2142d1873f5b9acd2944e047efb8f28057b4dc0f1778ecff112a390cc1ab4fe1a1657952b0eb118644a5e57cc4a130d22878bade8fb62421ef80b7014a5a3f016716e7417ba5997156e941f6cd6eb45a7a5aab3c1dbe648cc955a473b3a74bd171f3fd17f271438b0409390e1d88dea06ba036e7c86565c939dd9151a3d0c94aa5095c182848161ce2abc0d04ca3cec9df3e3225115249f8667e2 [...]
+N = e87040f50d08517e8469a845117b733cc7eac10c985ac97ceaaa3299a8135a0f0ad5f67c5a919e64f11f67c0a1380251b37723997f0b2a13e53698b2bc26ec05f37fd10a9e6297b58723b3e00af74695c6adab8b117b2dbaf2db9c0334e1ef9c7f4c6ffb8c3d817455d03e6859e3c1dae621162ac4e2485e8154ff636fa18640ed39590adf4f471cc090ba8bfe211eaa86761b4be08babbdddf7d55d393ec08aba926f218ced2e6ed9be6991a05cc9e6231bf156f463264214e79ee8a35b303dc62e843de9b8928c2b2bf363d3bc20276c2283b138f32462373c191644f1343c613a0c06cd0bdf220ae2bd733694bd6151c4c0ab [...]
+P = ea23d672d6b119a7ed6891a97f5d9c4784c7436e949e2dc7f503a44e30cb90e5a4f7bc1dadc201414fd18b219d46fc52a9d74edc8abb2bdbc0aa776efd0ad944754975c81ba5058e243e279ee38123ac522c951ce92cf4d04afe1711c4444d8be16c9830f74f1d3dc59bc68c0200a06e9677b88167cea6d878184917aabe9a21,
+Q = fe23bfa63f80ae6070093a7dd3331d6f1b68617bfa8db926cad170c5d8ed41d4137afee877baf1d50620cfaa015d8104fe4d545564d21f4deb243dafbc99a1786f472bee34493d27fe961564f486167b779146ca54f3aa3affb2555c4f5a58a3a3ab31d09b02fab8c41e05e156054fceca323cb6f104aaaf28bc2912129a8d19,
+ID = d8e2c7cbab427128f54473e3d8bb2454,
+AD = 457f2b702207d41090b2f762553a1746,
+R = 7d98c9a22d9851be7c9d72674571acf6a1398fa6213d794dd6a5febf88eb60ec72eec65a01a6694610a71cff4491d0a8c1fc7f0b4edf115d2d3462fd83b609cbcd32fccb85eb2c3c710f4c5eaabb2a3124b5d5ee0aff661fa97d75189791c6c6c791a1df062835fabd593d2c463139a089d02ba86bf508009188d07838f7db0453bae614aeff8848a79180de022e42d89ade1530fab4786725d1e54d5bc0ace3bdf403130d83b7870a34ef666f0568fb967012d6e2db1535e9094e58bebb46042c4d0e57cac151b83f0afd62432212e8a835e252c79c39a900b594e58efc6ee3d20a4b2187124e7c2fde9a75038b4c1825c5e93f [...]
+E = 7a434ba48534f7bbd85c7f3ffabbcd05,
+Y = 7d98c9a22d9851be7c9d72674571acf6a1398fa6213d794dd6a5febf88eb60ec72eec65a01a6694610a71cff4491d0a8c1fc7f0b4edf115d2d3462fd83b609cbcd32fccb85eb2c3c710f4c5eaabb2a3124b5d5ee0aff661fa97d75189791c6c6c791a1df062835fabd593d2c463139a17302a4336e0149f7962a242277fc80fe50e6dadf5645f92e38cc00d805cad31e4ecbac808b2a1c74816f5e0856817a217f882dd396577ea1437b3d9fa5554bb35a5f5c7985f28b1035a12bc4e27e218e7190bdf5a781bfc4251dff3efa95e2c86cd56849c3b559315ccd196f9424448a626bfcc1a4c5a3a8f709963986c81befe5f6bd7b [...]
 
 TEST = 6,
-N = a076625789fcd7c4ba510193eac82887ed4b3437b84fdaceaed55295877d2c8dc237a78c634e611831a7dc0036febf5c0653a8d0d2d04194bb0032d087f3abe7f0a634f5eabced93cc0ebd5ebc8564954c3959e74cffebf8ff90b700e7bbbf9284ffbcb93d4f4b842154c866998eff292290ffa74fd06f18afed03ab62c0a8a669dd7aaacaa51efd2df491285b0a7315828939be82ca12ea2a10e19021663a5c39ddcd4aa312d0404b1d970b1f314d01976b350560143c7a6612cd5a0176423f86e71def1efc85c12590712988a03b736b8320c3bf8ae37176f145c039daac8db0c5b4c4f4e185f4c72c0549e49c00e4d7475ccc [...]
-P = bac3519b58f7c0b98016b5762526d00219ee6d709f7d2c1e55dfd09dac291fa86e83afddfcfad22c62d2f004f06afad7818a9247390c2b6138cc8314a449dc2d476739fe88f755c84e81f2b38c7d334efc6e59d411eb4f27ece7cbb0ac132f65cd5e803e39331d3363c2697894d020be235bb432433dc2878f98f8b49268711f,
-Q = dbf305a919e2cf076033272f07ff83c1a8c8021e0d1724dec78eb27596d5b6e946ab65072d12b7f7dcfd6baeaf6a203813332732d82685f8d759a05f0d2b663c1524a06716f66e9b67d0feaecff644bf3e473f40cf978c445ca2e756d00ebc68c574b0116ca2d4f8aa6703abeea6d7709dee6d3caaa69597a40c85b80a4e2553,
-R = 3f15979a379f5be81ff9a84e941c5e0b43fffec300db89bea29d8edb4ab4f0f57fd0f915e5e584d6d468cf6e8647c135357b32382071fc328e4e1279970ced8d1b1401e55aab72b527c57f1faeed8ad595957733354e3e3e192859b727fc6366ea49fd9b53124bc86b312fcbfbf728f6e3ed5df6ec0a3c5215d3947ae1c0dd61ddaff004fc7f0e0bed78b6d2f5391d63c0ff227169189da0a90ed07b24722c215025a25a67acc80e8659587e77ac2968d8340f07deb7e6673e57a6d5438149a90139ce0ee0594dd6114be2ab43177d07fde11c2d3236fa992f34f0372925dc4de89987346f66621b148ea110a0ea92dc89306b5f [...]
-E = 5d1b7a06ae31c9be54f8eceb715ef46a,
-Y = 3f15979a379f5be81ff9a84e941c5e0b43fffec300db89bea29d8edb4ab4f0f57fd0f915e5e584d6d468cf6e8647c135357b32382071fc328e4e1279970ced8d1b1401e55aab72b527c57f1faeed8ad595957733354e3e3e192859b727fc6366ea49fd9b53124bc86b312fcbfbf728f777d942c3809772a9f14ab50838d93bff055b73c5811555a195ef49e66a75ae003cadba99f2b5fa4849b06bfbada7ad254153bdf16822f4fed091b589cdab4d11cd910873575c1b03a360be13ef2597012b6e22195e49bb9dbb604b3d8e160de0623bb66658610d51e07bf344462a638318821f183caa5c133a7d0f0d92dbc923d9ccb659 [...]
+N = adb574ee57524a8d1385480fae12bd766000638ced1632dd18c86126d498706cbe5b9cff7e9c1b49b4825f07922fa8dbb5905e90ccaeaa5b7db37067a685d70745d24d957e74789c916c2b05e414ab8e7a3a1661d81feb0b0dbfa9a0d42c1b32098fdd52a7e38e4f4041e3223e6949a8a9264dae8e2b9a32c14dc456f74bc3e2951c634161f7076e58f6bc098a26ff59427cdc4bbc86266a2136924c6e4cc5ef9dfc30c9da62f2b1b0aa8b42e03c276f2c747fd11087a56cb0b8bc34011f78f02238f350bee0289440a2c79db94214fd2ecff0d796f890e2b469900643cc06f8b38778d6d069ff0801ca193a072cb1e8739d17c3 [...]
+P = c7ae96199eef0e4875daeee4afc2988fb3bb9ae99484becd0b67cac2197519405452a38e69743e3f578d3ccf141751b6a16eaf570a79ef62b5bf15d8d1e3fd8b1de31780a6fff9ba9031fb74105fd909aef8ca09195c62d52f41dce1f314da7d2fb5917f0a8cb04e2cff252be1aacd1077464adfaa9cf970dae1f1eaf6138e0b,
+Q = deb38f318c26e49fa1a3a3d526550cec03e9ce78aece952c36a6382d4c03b3468ff2320466a5a5131461f9a35ff594875d5b34e6c04f2b663f36081b65dd7309ab8c7704bebac7d7178b4459c9d214f89e83e871d9cd69ec8ae4591b339b26466ef996188c7c289520d4ff22b7a1e9c0c0b4997ed16cf4d5ac214fa8032c1297,
+ID = 0e7b424b712d46520107031e19a12d44,
+AD = 4e166153586bdabddf94f018ea2d4ecf,
+R = a12e72b2c6c596d029e159b01c09f22153b683d80a1c36fce5a46cbdba667a8d108739eb03fe97aaa446aea1dbdfa7e1b8813835eab5a7d3de6b226eb6cbb2e829859a354fb90df2600bd746f00a9a09792875c5311c228798ec1d6db184f50f97828db64a492ca1070ad285f9e875ecd51756c6f32ef1d69ded010043c993cf1339167b92a34297fa619a5e22461f6ee7b166d51854fcd1b8c274a494ad79569299961416601e71f96f3cfb5de9441283d397a46130b2b73a637f6a2c9f1c40db1361a80a758800abfbccbcc68e9e8f5bdd85ba77019bf93d78d6c563e007c27fe12178935ebed7553b61507de4ad5117542020 [...]
+E = 79bb3bf69dcb5a5926e9d3ea426aaa5e,
+Y = a12e72b2c6c596d029e159b01c09f22153b683d80a1c36fce5a46cbdba667a8d108739eb03fe97aaa446aea1dbdfa7e1b8813835eab5a7d3de6b226eb6cbb2e829859a354fb90df2600bd746f00a9a09792875c5311c228798ec1d6db184f50f97828db64a492ca1070ad285f9e875ed9df0a7083db6a99c7c1b496a2f7e131eb18a2bdc2bad29ef5dcb3fa5b888b338571dbed396efa8a29b55e12a0f5cc0b2099cfc473428c5872e551583f10241de7ae0287d15659b4c608444eb385044f3d5464ae34a8944582250cea7ad9fc90f06a20098ec8f7c78e536b2b287705d2c19794fb9a781060575225838ddd94ef0e6438893 [...]
 
 TEST = 7,
-N = 8f29503b99e578a7b2b30505454dc18d4c1aab950176ac0486c7d66caaf88d0600ccfb68c0bbc8689d0120e08fe2250eeab099f175ec8fee8355af26c58430fbf7c934666383caaf65fb56d8bf91a9379989890d12718d82f890af92113fc323f24ad3a9fc09cd28835d74f0ce3de0975b0be178a595342c16499deb6a2b34cc836d4b217cf0f53e114a22ce556c209053f4057da4a6501382b39a4a4d8ad7cd750c6db396fe1fa24ecd112a75a05035d861e239e1b991fcd0909058b93a19a6d9f8ac33c8b911300565ad568ba61cd203c7c546b0c13e363d69127a4ed1f1a623d1712b2b2118a00e78de46bde0f5c7e0199f72 [...]
-P = c17fab739dfeae6f8dc38e15257ce6374ed386e59e5a1f5cfdaa69148932f018e80cbe889615dba72acac07b855b85593720aca496703df9e625783b6eda29ac917b4cad4e59a769e15aad62bdf4ed5117444b86f38e0b8c77e759859454c4e144910278d6906e432aa4f202ad0855ef307e4ece9138f747c00d4c57dcee17fb,
-Q = bd67452cc88a4262d1bcdb50243e789bf6dfdfdb8c55e328acbe521c577627be20dc453f9eef0d77fe8dea1fad66e5b21752a918cc2c6597ee99ad0035882c1ce81e3f442112a075f76504964328748fc895c392f6bbc3ef0311a9d14d4f206e60e8ebf712ff5376ccf679349db2525034e0d103dbd4dec4cdb2496a375c8c81,
-R = 5228b956c53f2bd72812707d7fc89059628d29e6ffd9fdbd25adca2731437e9216bd4b973897662695f207e0fc0f4cd859239598914c23306b713d061df5abf52983ee7e78173388b90a4ba0e419509e6f4bc9ad38520fa7a702afbf28b57300a90b8bd7e1cc60fbb804c89b6ba9cd879d76edfd24ce921948fd8e7f54ffe3b266f56bbf1aad42b71733e862a913e4a16dcf6aca5750afdd9f76920c6bdfa8db3ccce5e06376848371356d3c29bcbe1ad156a440a622d45b052df0f457756470c241d4997e5c92c2c8b9ca77be91a063377c1db2abd9185e433fc77cbb896a6e2c74aa7798e2fae2f60607e237b67f301ad26e38 [...]
-E = 34b3fc80fe7a672116b81b594f7589eb,
-Y = 5228b956c53f2bd72812707d7fc89059628d29e6ffd9fdbd25adca2731437e9216bd4b973897662695f207e0fc0f4cd859239598914c23306b713d061df5abf52983ee7e78173388b90a4ba0e419509e6f4bc9ad38520fa7a702afbf28b57300a90b8bd7e1cc60fbb804c89b6ba9cd87ec4b0c043ec080f4b3c16b983dec9f4b7164ccfcef822cdfebf45a9604877f0da24f2fe501330bd94fc426ff9725e2df02a66307b5558e3b8c3892ce9c81a9c53c38d3b224f908ae3e32acb06c79188a9c679f46aaf1064823f27e51682a7ea4c872b4ce9aae9c23b837e83a1d14ebdb731870e847265187300ee2dc15f5f114bf65e375 [...]
+N = e93a35529e6e9617611f2dc4559928806925dca03727e50fa6b7a8dd76ba812e2a234d7594593707c261a50ee2747f48b69480e7f084178084299d314e4d2df818258d8948e4bede3daf06503be8ae677ed8fb48c8f29bc3e68f93e430450ed2171148fa951b95dc535b74ae55513cbab03c4945cc1a8b7de69653855220f8cfdb81a0794852a22e82cc65626e3cc5553089fed5a8f44f4fe580702e28f3331aff4a574e2bb4ee8c3577e4059b90e256a4b4155cc3fc90a85697759c96a81658eaeecbbbf9d3de0ed123802167649fefc2c75f5bda4dc6c599b33b684888482ca75c6982b5bd47469622f2e98a3bd49aa9f5d4ae [...]
+P = e9e957ad4c72e032529b821abd2feada4ad7cbe06acbdce43014af4f5645cb1f04f020fbd0850380c02be19e05b1a333f7324ae28c4df8f5e2b1126a6cb33477eebaf529017157eabbc68fb6148842cfaf5dff410c0c13c324fcfd5efcd2e33fb1e9878a87131c832d8f25ef58483515b22421459ec237ee00c7cb46cd49a9ab,
+Q = ff4053e41b0b1f5a5e39b9cf959579b87182f82a3f37a2d991d977b4223d0bab15ed2c15aaf416cd9fcc4bf7c0c46f2315211daf453d6aaf824f16234322c3633bc10510b0828c157b945bbabfb46ea0a6441ea2b24a6d0e66cbb11383b2cc628c76ab15b97596509dbc7776485baa1be3f8a14bb6203ea1edd2d0e4cd5211e5,
+ID = 524fe90cf3a7111d71ce250a75ccac35,
+AD = 708dadc070e02989b2d2e320413418ba,
+R = baeee2b1408ad40f6437bf1566520b4f01bbb15e97af79e03d37f0cc9a58aaa1b2028ad2adafe571d7343f80b867402e76d8ccf36294f99ca00054c33368988e3c285c74a660673f336d973aa08a187a6e7bbbf6daaaffe60912e811014f09f3ac8a3e8a553867aea6f4b76a9b087fd61fe86eeea3a466530a6cc4effcc44d06209ca19eaf5a1d1c83e88f7543f3e9c0cde44b09d5410dbb2e601408bacefc6969d03f23d470f11233e871fbc159d7ae1a15a90dbf1e925cfe561bcb8f85d5c3ed4686eb9940009cf3a43505a9c6a3d70090f63b2b1ad3ba58761daa8754a54956ec450fa18e44c35e680e2d6811a8dbd5f57567 [...]
+E = 7b98941e6106453aac9cfc48b00c1a90,
+Y = baeee2b1408ad40f6437bf1566520b4f01bbb15e97af79e03d37f0cc9a58aaa1b2028ad2adafe571d7343f80b867402e76d8ccf36294f99ca00054c33368988e3c285c74a660673f336d973aa08a187a6e7bbbf6daaaffe60912e811014f09f3ac8a3e8a553867aea6f4b76a9b087fd70c130021822a530ecd8fb16601276b01ac314ca7f754850cbf7dfc000362125bd8886541c687fd30f4e6f5eb9c541807f14b25e26a0fcc1ff3c23c1f7be1ab52fc478c2fedbec53799c3833042dcabeea07c827bbef46cfa8a0e6ab7810f2ffd66718018efd203808788f657a94d76c045cb2c82c39f8f7446b5996e4f46adff1dce0f6c [...]
 
 TEST = 8,
-N = d77740b95e58950d36da70fda9a62f267cef22b3ae65309a01bf1fc4989366bd51cf1e01266f6db00c1e61e624cf3d0bf3fa9a867efd3b597078af93ce18f1558ea6e51dad51dc1caeaeecb081ee2694e6939e1ef8cc23a894b2708efe60f561602bec2b4592bd56a9a1678d4c7ea10e27686febe2cbc4fa4554d21dc3cc5b5417ffa70578851e93f4dc0971bc8b4aa6fff3889c0ca1c818aab1d482e548e3a622a433faf381a91fea1360c28dea074588bc3f9727cd45a2e1542b0c4325d03db55b86cb6591ebe474cc2251e01068fd19e277f0b12db73602a267e8318ef413fca7bbc1ffe1a03ee8f1616797bea5ccc9732462 [...]
-P = e584910a27e37285e0b4f8c1749efa3e470aa68c0a129f46b194579a48d62f59af6c196376d455617939a7e4dd122ef7c4c1751faeb7521bc1d1e54ce7bb51a93fd4750ac1c8046caddd1875b4d688a920295c1ac1d15247813c507f6c81991683998d12ec6c562c6b9edeecac8b156b4202158b467a6b8210f390ecc6c404b3,
-Q = f0539f3de385d8aea8caed1c97ab6de347d72a69bf612d126472377c88083cafab12047bac62974fe0897df40b18e8719e4bc328a9ea44d2d22a32acdcfd9a253cd324e90f5f77f280843c1ad3aa9d847e88e46fc65183a0e5e20a80c09d7064d98944c12e9c2a56e9de862267f80ae730ee030d9739baf96f2e32ca1ac2e91d,
-R = 049fe77d314e2fafd1f3fe98997d524d4caea68cf580f786082fb36e2cd65f6b7ae59d8666690405e4ed22f5b6822705f912bdecf5603bd47bd0768293204e45cd15663ca279485c2119b1273d9a51b5e6a7417d820ed0de5e76b3f1052d5b86aba863e56407565275e68048622c67256f9ffc230341130b80b7477aeee99f8d5877eef1026b4eefaab11c4b662b7c5937b700a9c4222a427c4487c86c2f2aa2f2ea0148d149e5bb8aa3badaef95338bcaeced5c968dbd8fca29d1d9c9c8f6270054383d3fb1f89c251f5a3c64242d443dfacc45cd585aeb5b42820798ff663e5a7e9c37eea96ad3cabeb0c2821b3b65593d068d [...]
-E = 6757e73e5432e13a043c3d74cc7b1eb1,
-Y = 049fe77d314e2fafd1f3fe98997d524d4caea68cf580f786082fb36e2cd65f6b7ae59d8666690405e4ed22f5b6822705f912bdecf5603bd47bd0768293204e45cd15663ca279485c2119b1273d9a51b5e6a7417d820ed0de5e76b3f1052d5b86aba863e56407565275e68048622c67262d4b4c70e0c956438842100979dd69a72cafef6e2a73175736aa2b1860a10dd7d886c982db8ace56ce5742367173f2e0a3648a1bdd4f8cfd753391bbe991d94bbddfd0e0d5f9ecfe5db156e630d838c3d41ae8fc3094dffe0019943422d6c364acd5d0a9ba4490dc154d174e577c3236d34be6372c02a4d59d9ce3cdee2ddc7d55fc3a14 [...]
+N = b4900aec2ca6608f45d7dc60222487a87afa4db3672184e2d32e5320bb17baed48252182b7567e918ad261686567895b04344e42f7aa0a123d544eba4797b47c6ce61ba194e9db536d825d01bacdbb09241c0c32729375f6cd49feb8366d29406891d20ad7aba43f7311c67c777fb7f91d1b9c9f65c0702a937b6799bba96d96a2f8ce96e0e5b079b807ad62db5f601831b5111b047896e029cbb09ffca56bc5c085f68b51c86dcf989a98491bfd659ae952d528c0c7f57c723c5b7c7e399155f070c2a108f39dd1d3e6973630b535da026bb41931c575446867ff815c09e976fe5f63f86f333066898a60e01ddccc3971cd220a [...]
+P = f98ed5006c1a39abc6a2523731f7c4b668202beb06b47022001a20b47287e1e1e015e2f390bae4f5971c468d4029ae758142b461fff6263f902f03d7ddc03388b6994be599f9073b1e684536ae0de4f35e7f71c01e7c5a7e233d317029417c1e03a759e43c623b7658e912a05fccd2a41d1aba73426ea35b41fe9bfd6e6ec9ef,
+Q = b93943e6def94995ce914c899e6fbca47f2cce1034ddd733734dfce640b5fd02e9ff19d13d0f3dbae422c91cbcf49771fdcb90bc1bb6bcdc20ac832edab7c6b9421acfb0ed9955c4b90b52f084721fa20f44da87f0ad5ae73983cfcdc0a5ddc6690595a24d8d9756f3790b4f92e98b9dde28a3890bf7471bd2062382722349e5,
+ID = 1bf2d93fb729a2cee216ec87525a35db,
+AD = 125bdb51807f9fc496ba89fca8d6e3eb,
+R = 003b5c4170ed418cd8025d5ffbb3c33802481e4a79953dd66b070c885c214210535d83c2da68d5de61a8f4b7080621df0ed5e1337c416541e6817d41a53491066e0f2bdafbb7b562493fe84858e556f15d21bf55909d309cc25812acd82cfc3885ed5bba95b6c983051be45b26e7336e96ebb57f4a7328873db6740019606b543967c0af9d18a5396ca49f045fa532296ef7f809785d5a46a1ea74412716500a8eb23bfc6f8894b945ae752ae764e7657614c32a9aa821ed149980003d49494e313bc0c284ccf67c0730024670b5a216360c990e051990f66dbdf78f3b171a8f27b614c3903a9c00fe42f4c5e70157db63a66771 [...]
+E = da7a0e3229d5d2d33f6d12e6093169cb,
+Y = 003b5c4170ed418cd8025d5ffbb3c33802481e4a79953dd66b070c885c214210535d83c2da68d5de61a8f4b7080621df0ed5e1337c416541e6817d41a53491066e0f2bdafbb7b562493fe84858e556f15d21bf55909d309cc25812acd82cfc3885ed5bba95b6c983051be45b26e7337009f9662c421a436a0d8d13a8c9cf2e3a84c2325f9f63e03473308ae0bca69728afdb36674c25f5fa38b8a662c1e662ad1f7d473ce8539a9b8b6d487531deae9b31467f0f632c074add9e47594b88148813aacf5c402b1d9a659e628c9d86a42a0d1baf9572fd345c12db38594ddfb8f72c5050c53d10ffd937d5bde0d0ca69aa0be21d80 [...]
 
 TEST = 9,
-N = b635b2ff8acd87a3571cc2eec71a162a6507513a613007e4fd412c907bb8f156ddcd674fcf8ec0b6caabc007b366678a51ff608fae75b56eb8cb1068766d01ea02684ec19d49f3ab8f2b6ec05d0288c50031df5c62603a1a5aecf6130a7646534ce796adda861ac29875b7860bd57fffda23f5a6e9cc247689c6e23762a152c369d405b0a1fa3870febaaaa242d39a81aa3c728abd64d467ec2d9c6f6f93bbbf8604dd7a2d0bcf77a4e0656977479ecc1cf48ff6050043c9aa828baf18e496143099b337e0bed4db54f115163b4550725113704205520c1e049cc35297764211114c404700454147be2788274b2bb80e6221100a [...]
-P = bc096669fa0f7c79dccdd461e75fb7d150ddd5de418fce1fd9e5364fe46476309dd2e00d4bbfe3dfb36b8084aeeb541ce4dac7d8d1d25ca82b0c8afe580a4dc753f927e790726cd945a2286e7b1f4a205ed85c61969413e63762cbe95bcbf51721c3d8e2d01ce901a8022bdbb23233690ab15b3bebe732a957d1eb04c3e90d57,
-Q = f81124fa2b7b1c1c0e12fe77478346e1438fd837b401a57a2b87f8147ad201cf8881b49cb9a10a401e8e5d938c2d4fa4e80124adb34907d3dc4a3b655913095116fbec29dcc4c0d55f215fdb35286197f4374485967576eccb425d02e049051e89d5432058b24b60371e542d1da2b53d5688646270946dd09d34aebb7c046c6b,
-R = cb3cd78705e012ce0a2f4de82b8ad38d2a1cc08e4ba3ff1f7be604e307167862114cf3c676b6a758e1b3541689b11f1c5f238fb525b03d249776ee51b34883b998305acaa411c3eccf42a64c5fa37775482d651c8c3d20b6a6ceab52061fe2c24ed82f6fe2ed1488d9ac6da862e3d0cef60a3fec3c65d01700d324cac7b48795e81b983ed0d486fd070e085f9079a786ed4d71f9dc1e563e58bee0d1fa1174071e810568db9d5c97f277150747ee4e8c8a67bf2820d021b04bf65e54b0200acb06101eee6764b13651e04c28f112ceb3cae1a7d09bee16b06fd198368de0d6ec72efee5e7447d25b4d11dccd0077240c511855da [...]
-E = cb6a200f485d51dede5a8f948f7049ad,
-Y = cb3cd78705e012ce0a2f4de82b8ad38d2a1cc08e4ba3ff1f7be604e307167862114cf3c676b6a758e1b3541689b11f1c5f238fb525b03d249776ee51b34883b998305acaa411c3eccf42a64c5fa37775482d651c8c3d20b6a6ceab52061fe2c24ed82f6fe2ed1488d9ac6da862e3d0d05090160fb7e362597431d503eda7c95392dece002e9f6359249bf0908a50d17fe39c612701ec365f637527d40c43a51c63c11bb1496afbe188f755d330c3488dda31a552759b8c3b3f82c18b3bd3e176b69e4bb24e5e18567443db414f9bbffe3ada6bb06e84059a0cfe35338c54e7138a6a9eab3f9bd8d935b06f2841300068dd6ab3c3 [...]
+N = cd87b69f1216b9b52f798bbbb715e0067cd4591e14fe7885a5d69f287e89a2c92171a67606cfa9827c995ea1997eeff0a7bf48a8369ca6cc0127978ef646a2ddf6bb8c4e77a6dbc78222854def3d5c4a20822ad4eea4dd8aa7c6a225df3a484669a701a246f5744bee1b5b07e0ce049f5d9783a356394350a186b8ff5cdbb4fef7d15dd2cdeae687df94a7d78912016ed68993545f74accd61bdff3d30e5411423d0865b2b81048fca4ed718b9a49b68c38d72a4ab5ad0ee6c2c6116189be390d5048d28b68e15e25f210cd55b9daadaf679a1b1f6d4a5d15109cc82df409f851ac9529d66c6db4bf53fdec57214d90072a44bce [...]
+P = e735a07265cd102f45c74d98567451e797988dff14f97d910b432d854a269d71e8b71635bed3d77f3e483466ae52547321cec4b4b939f28397e04984a3e3f78f8f4bacb4b93910eb71af3d2f0f7bc3ee4e75f64d885d1e847c66312740765c3009a1e68b7b8b30ff81c3b6348b9762134b79435c39d1f49c17d63d048a1dfba7,
+Q = e391398c6927e1dff5fc1560f375e2d120229af8b2ab337abe277dc86d84a3ffd734b5cec423daabb8d204b7ffbe92b5df64066083b8c5cd4cca5fcf5547720774099857d3b9154a6a24050de0aa0d38f742cc2788e7c438debd4c7ee9deb53cb818811c89439137cd9e75d58bf8b46b9b6cec359d4d8c77b8f953ae8ca08ddf,
+ID = cd982bfb73fd1a58586ffb77c0e46287,
+AD = f1dfa719cc2b533845ab3681fc793cc6,
+R = cfdf3733122ff1d3dfbc9cbd16e8178f3db69a9c9804b81462d761da1177ff96c87d3c4d3cd471240c28a9a9b3f9bfee11f7ba9230821437b9a4cf72e061bb44f5f54304d60fcc27437670a5fa4944ac2df559732be7e5f693def6982d96f87494cf668af706ece68bac64c1ef056849ab3430dae73f4a9d143ca83382a0412776434fb4923313afbdc3d27d385cc0792b64ec1f947a22b635088b7fdfa92203d888bbb8a37828916e65744879c8c263517bbd36d750c551f203189379aa3d6aabb38e722b6172af3cc1a84ded9f3c2e85395b881dfd3694de66cf7701f4e71b0b1ab3cd0d067075fcc2c99e0e674ba58debe6cb [...]
+E = d3528f90a1c79f0c47221372f2e8f712,
+Y = cfdf3733122ff1d3dfbc9cbd16e8178f3db69a9c9804b81462d761da1177ff96c87d3c4d3cd471240c28a9a9b3f9bfee11f7ba9230821437b9a4cf72e061bb44f5f54304d60fcc27437670a5fa4944ac2df559732be7e5f693def6982d96f87494cf668af706ece68bac64c1ef05684b25ea0b8204fe3a389fcb21296620eaa72277d0c8f22cdfdf9831600325edf79e5c177c892639daa3213f51dde67329010c65be8dbba03d3a1e63888c9b1cd01873752836c156a602777330c378f0ed77444f930dc0e91922462661204175edbd0dc5778ad105ce0d34c479cc72821287b913c38f40a3e10ce1929cf890a6759c58661e22 [...]
+
diff --git a/testVectors/factoring_zk/verify.json b/testVectors/factoring_zk/verify.json
index 187e156..2635d28 100644
--- a/testVectors/factoring_zk/verify.json
+++ b/testVectors/factoring_zk/verify.json
@@ -1,62 +1,82 @@
 [
   {
     "TEST": 0,
-    "N": "d981ab0cfb7d18b54f1f1beeb67d7515d1ccf4062cd59e39210f276bd8217ea4166ae6a6cdec62259459c649044b366fe77ae947f64f5710e6fcd8fca570e435d59613d1274d706c9a7e85a6b58bd237ed274c2abe9ed02e9b180dd129dce1e25e30814840e1bf6535ae5bc412bc7e94aa08e95922bba7d31b2284fcf4534b6f3e7b33b92609c44bcccee8c873ee99cba7e74f10890f58595784c6e6adcbafdcf05a9d281b9d8e77f14a0f4989f7c75f650360b32130e316b1da0b2d788c6ad79d3d55e96289ea842c8f2af541fab531612a6f6635b49882865a25d1feef2fd0cc324e10c2495f38d9df46bb23b73781bf [...]
-    "E": "b13ef239ecbf6a8e4939c6f1057dc1f5",
-    "Y": "1929051b404e4e986b88ed2f451170a0324d156dd17d520b41535e30e1693946360bc17bbba42a979da6273025a03f2437a12df96b1a7d4e24505ada2484072740d6d01a861e10357b0a9732010147b27179034ea5cd9c741ae43c741b003385e4d2a08200a0c7defc29106876610b11a073679aab0648d47510fecdaa84d27981fcf744a2d6736d90df76f4821726ca12909f9022fb9e9e56f27fea1c1a4bcc05b1a05e06b53fd0c6264d268c1028cc57f4618e44aa25125a6f0bf6b9bf801739ecd7e42e7aebfc80c0370e603a764090f1e22d50a9dffe5b7a34c3e933f52c30b76906a8317318a5e82f25795dc1c51d [...]
+    "N": "b46b4f104b3e14b8e8576e99d8658a58bacea337c74f4211249312f7bf81d0d82d87d4ae983ed4791939ac5712b02273b3bc655b4330c1b1a0e9b6b6280df2a96b522bf5edf11c600c3afbeb6c0eb54c0a01af95baa47626ae83e22208f25da7df758d394b52a9676c94a307a4f91d77188a87af19adab355a2a04ec64f24b01db2e99b92c09c1ba1a2cb0616ac2154fe46a8044355e41264d1e590faa51500ab066ffa8909c64ebc4caddca6bd7f4bd3771e659cb9339932a84168d91fd3fa053255fe10b562f608cb31014dbc73caefaeb788bccae6ba3f38dd8a0f26d54c06ce81f8676eba16faae9531d5911dbf02f [...]
+    "E": "63fc977a14f6027281891f04d5a05dbe",
+    "Y": "b8652f6bde94b5b9407afdd77daa7575aa96badd41ffda3c0c9b00b9a65dcceea85f13d8fac0c79b71f302fe84094b8d815dde4aeeb69c293b14f98b90d65f4e85aa446fa61430d720897345b9d361b8e623063782abed9acde3acbd055c325adb4136418f0f1ed01cd8d029a155d7b58e80ced90a6c3b3b806004be6f73af74fc90d854ae0c43e8aec1332a89e3ddf29793958a58dfd1793c5b066edf3ff29a854df6c1846f1af228a8a34b61423a825a3c4682bd120eb34ad175fea59b185622189e4857a1f5133c3d23de795a11e7c59671daf1e90a7d16d532e6cb4925417778da4e1e7e5c0870814a13a45dd5e5d5 [...]
+    "ID": "30b8b171bbe9e37fef9f7c5cb6e9bfa6",
+    "AD": ""
   },
   {
     "TEST": 1,
-    "N": "afe95357cac16036dfea2e05a8bb34055fb6ced95e1435651269de2c908f76b72413f8f5f1b6f6a75f806dda194bd003f25b15411a0492057d6a8e3723a56ddc7c9df3628ff320438b20eb59de27e047b1b8f42da7a99b3df04ae7436a98374fa9478344f0dad616852eb20b44bd7c873b610e0a3a9790bfd67daa6c44de9d8b78e3b6e3e0d7d75770a3c4b763b7395393308ed2571c5a109587faaf39f2023ba142e16034c012fa7b995174dc4769d6e77564dee352e30b1814b5d952efb728eae8766c8dad907c1109c4e56e3d4ea359fed5d190e7acef304b055e77e43cd5f0b313f007d24bc162da8c5106bc4886ae [...]
-    "E": "1961f2da157aa4deefbdd31befa49774",
-    "Y": "19e032b23bf3f86eda180ffd2d6a289afb4e219591894312e66cbb1fcee656f9eed6f896eba77efd2f1f847129377bf1e2576711e20ae758af8171d16a17a353c8a14a223eb156c0a38ef9f502cceb85ec620e9e6c2bf35cf4c431fc8b55b74a0a32dfc8c99a2e13f9b1589bb38b6135ebc9f50d5aee4dd469428af1c62e55090fd86582fbe7623ef55a6147f7cd50ec8ff37a02357678dbde62ef6b3fbd6fe32edfb08bcd4f31651d7a339364eec9d1cbc84c0ad9f9182b3bf67b4011234e4438dbc84b5d255b17781fe5b0a1fc59726e4bf4481ff255592b117e3b5d5dafd6e5f3139dc84ca095e9c2e38e1fb75208e8 [...]
+    "N": "d84668a676d3a2dc18a41b4f0251ce99a88b44443b68b4c4631d809f1f0a75877f207e4d6ef010ae0f87ef4975ed3fc4860931f606520d454e63c6864686a4a9051593df15aea6d9d6fbcb26128293b04614c32bda1f3617b059fa9cb0d7b8dfaff27ea2ccc3f5812497c6d0bd4425b394f6afb9d17be10976391aa768ab7e816c3e8ffe86e69ee49975c42fff9232571c9b0640bdf51600dd345ded6ae39833b9b79b5cab26e148ac8f93cbce906c1757fed5d3a032e076b9c5b43d115016027e536a02bce481ca685066daa62bebfe7a9462ee212632f86e8d51a876bdf8217fbdbcc1ee2e266e2c990a223a07723a3e [...]
+    "E": "217b7ec2b4b7989657ed0cce063c40eb",
+    "Y": "2e6df258ef91c0820c8d02deb6b01fb95d9885ae0986fd35b4f034d3e7b3fae1747951b8a737d34be923cc80e24e99d183fc3807ad1286235fb2c81278f38b40692eb1aff605bece6bb0a8ce26039fe8f18ea66de076d4845927daf68866f54e15ab9c98c2397acfb832889f290ea06e9d39042880cf7c7b4545bc864ebbe96ac681f37efebaa47a515d635f1af9a5e99e6b24c2f43537bbd638d1baeae484facdd20f8a3657c32e5f5f47d5f316c0df40c973c1fd6cc6ea0d4152c481a6d3e2a155067bf70d38fee5e24dc59d2b4bbe1ad6a6f2a10287ab5c8721058d50caa8d3103fffd62a4cc9f4942f3ac826a39ed1 [...]
+    "ID": "0f26489b9b47ecef39644db2fb2ced45",
+    "AD": ""
   },
   {
     "TEST": 2,
-    "N": "d75c176e0599ab297337d3baf9a3b407df6c7c20bb7f65982532833183efbd1704c9d3d1f2e55dae2506f8a98521c54301daad4f6d8ae36352f6cd30ce9a517d4b6c7c2d8b5f30d6e35e1c047b005e969c56a35a9860cc5ccf2805f4ac19e152bdd8a0cad971639805b9ec32bd11044b65ec3d27a1d0eb392ab460ac3e724a0138d693dcac8f412bd79a78afceb382854691dc35ec3eff1c5315fd1c3126d7833856be0278d1e339ec9bf7dbf025609f0335ea16cbf52cc34dac637490cdf99a139982a3918b4f2007dbedf06f76f768610830c488dfe4cb2f947576d3c5da25dcde685ca831ba3e2c303ae010024d6464 [...]
-    "E": "0884e7991b5498f98353f89851df6703",
-    "Y": "fc1f149e24fe6a703f3217dddd621de85fc2c16ad2d025a3119e7605ebb99c86429069a757d7323f3a76dd6d588d1e47ab917cbc97f75d1c3c92b3ff60b770488f84b4b3fd762bfc47dbcf21d94bb79670c8d1352984ac38354cedfaa8364cead99349dfdd529f6f6783bfb1069c0285e2a5e9bfe1f3b1955b2907beb245388908b13e289cdfd602667649f3c70d398a1ffe181b72b2bbfaf761fd127164d427b103a10c5edf727937433d555e58015f7adef2ba2c798aabadfe0f4f35e27d2b614696c698fa0edf6e0817b03caef5d16bded2b39a662fe54025fb19f78c15938dc7215be969f4aa2e41dc3965c06aa657 [...]
+    "N": "b7cf6b628df737ccb8e5bc1e4a9ad306e75ba646656010f39157216be5696cab868bf159af662145690b6df2935585309ac87d1a3b55185faf25d4b2a72e29d7025947a9bca6f196d92c7e15a327a7e94a046206d74e24dfe61fb8a54392f33c43e5a6202639510dc74567058f743017669a318fab412b34be4048a4c80c2c8462bc0ff19cba4ba5885858565b705feec60781de56c309d7f245b1921aec974e1c64dec515e161a4a58d7cf015cca792721201f2d2f64a2b6c97a48350de5a293972ca6ec0ffcf14a0b2b50902487bd5670410ec5bd43975e69fb234007cde62004ab295fd9c0f630f88ab1b577ecf8a76 [...]
+    "E": "453b55121b958b27a748c0139be0e825",
+    "Y": "ca36480031b115db26e6b0b13c9e9b3b99d43f169caf2aaf5511590fbf0c9d6eeb225dd50ab06da8d22fafe9f3eeb2abd69e5dfe821de8a3c1e6ed461cef591ea59dd7d14d1d9796a33c09ec9b0ec13c2bf156fcb917d75ea74f1841ec1aa8982a6e5f6ea83e46152af02d6da53c8c1787a9c1749293d5c45f9db8e7c9888185f41099713c94622188a7ee7940fc11b8b8c8c762937ca636eaf4399bcc848f0b643bf5aac4891a0ccc0404816743a0f9bc5adc7f8a32aa377c60be5b19b0bf313cd49eac0e2b3e82037cf6f3902adb55454f7f07792deb2231bd322860950cbe57c7d8ed3fcad1a3e7d52bb541c174c52f [...]
+    "ID": "298bc3f166694819af3fe7df57fdef26",
+    "AD": ""
   },
   {
     "TEST": 3,
-    "N": "d27c6a3c3f93003a706709391de7388d9a1411505c118f291f89d875f4a9a14fbd563198013bdfde16391bc5bda87d5d9b883b709c3b8a0835d0678e73c95487fdc2d05052c2ff33e4f12c5b8527b7f0dfcaab7ce457402fb86dba149fa45ab2490630d79b28b29f3532f7e733c9e15f2e4b306445c073f88bb4a4f64054c59b457cdc280146cdaa125465e36ad9809a5841ed300df5d6ec727df9c2159fdb5ee9174b2e2e438dd54fd792522932373ab96fbc46cde6a75b1f3a67b29d870e14f83df0e8cdc6fdf03fbb67e201cba5e05718116e58f4569d1967fa56b3f1387442de3ab7c1a61908e4ce6b91846a24b3c8 [...]
-    "E": "653d6b51eea5c46a9deab3f2bb6720cc",
-    "Y": "0287b78ad176a05bd75b0f5619f1035ebb61252d5de912ce7d02a4ad111695173d3ffdac942195d993580a6ca0a6e1975fbcec57837c1d99e2da97fd4de832827d3ee45e5a53a1cee3dead8ddfd31db8132ac78c967c886bc816a67da841286721481a8ffc3fbfbceaf5cff6630a9fdaf419c1132810c0cac21a969da21b17777b73668471b0a191cf8f3de59cc378e14509262f85d9771e73be4f55281797013d5e0cac55e55d16c8ff3b3257511c1b5e40f110e3d817946254c2789a11fec8d1333d0f0fc7300cdaeeae1e641b78e8b9498b1d88995743b98403b21c36e561fe53f74330560b296dc8cd7a473f1b3ed3 [...]
+    "N": "ea0c5d956002195ad66c7d5cee2f989e8d1fa09c0b2819952175e03e502d2808402ca67bba843952461197fb65a3bb6311aeb2f787d1c9c123822ca994d5f6ea926ece20496acb9739b22ab11424bb8a9fe35ba63f5910f6db95ad595707aa1492ea236ffcc7e5e0a53d08b330099821ac420bf9acbb906916bf0e3d775a93df03d6566327ae3791429fa5b65e3f4fafca3c05809020e5fa7a847b3098a24b96d92919a561120dd02630a4b44eb275530c3e4885a87cf1fa5713a186fd2548c5a8b86ff6c5b7c633f4a73e084ac78ef8a3823489c1b7f3ecb8eb5a345e637d14c434405e071731db4a6b88553a5d4f557f [...]
+    "E": "bbdc6ecf4e8ccc0a86cf5b8d9916c460",
+    "Y": "d473068fe28f0f752ea5753ce6937125966467f50a1e36d8bab0691e437873429589a6f52fad939f11ec260a51187e790330e633df343535c5b615818421d1e641d6a2bcf6a954dc805990afa137cacd3a310fa75b33d41c9672065267089069d36b45330870ec1aa1b4f735349ba7ad771e5468cde369310b8828627c34e5147d07f2a63c34169f1a4a1884437edfa37d56ad0b12e0131169a68db94ace2e99d794b5f488ea3dcca0bb3cfdec2b7cef62c968387b06daddb65ce125e31b6e09aa8d45397675a345d6131efe2066e8bb51f39733ca342c36309dbbf7e8038d3fcacee8dab23af0e8c48fadf44e4c0b7acf [...]
+    "ID": "935eeaa00d74148b691a21c149666856",
+    "AD": ""
   },
   {
     "TEST": 4,
-    "N": "a07cad84c98a7f14953d58bccd56bba517a600967d5104293c10d5ecdf7ef3c2bb52c3cae87ddea4b9947caecaae6d3df8458d79d62cc3454a955da7fe1cfebba8b041ce44fe3b293a6581e954005c01d8bbc9bf9b0887f1c9e617a7f5f0288c4c4be6a2c27dd11302735e2e4cc62bec93874c35ef148198df58c6e46b64d7b11506960da622c3b655d409755ec4b6dd3a45be34ad0d116e9bc667af9c6584d5cb30a62061c9bd9332251dad3c16d390dcc9cfb00b7a8c7a6409690917291da042ce3d9d0c7b25eb3b1c60c7dfb33726aa2380ba385e3233ffb7e02a1520a4cee0c67cff18101a85ada848785c2742208a [...]
-    "E": "a5a0cb8a862b4a1acd24e773c2e3dd5c",
-    "Y": "26b1317331919561795ba423e203fa5aa1086356513b3ae57fc54d329dca2236fd4099c743840ba0013889dc6337cde2c88aa05f7882797f54f59b2a067c3d5ba9dc860772a452a8a7f6a910259117e7fed62b5c840879d1420ddf5939e62360f0ef261115d27a16ae3e5f8890f3c88a278b5430bf0317b479e81e51272c28322d9df1f57071cb5b296ca936f1625ce120de45cc8ed69b5524fe60ad854e6aaa42bb7ca5be3b13abec1ab8f9c07e7f0810ce402cd16203307fe8d9f13ceebeb843e4cc3c3cf29614138095fe2896d0a5984c5101e597bff5defa60f4de1da4ecf6593bcbc4642cb571a467572c54c84a4c [...]
+    "N": "c7af6135d867d3fb466045b527064f485e97ece7521c07529a7b1d68d83cef19a0051c7fa75a7887d6928a86160a72c23eb40e02f3a80991525634dfbbc969ca39866df32d11c846074c4febba03eebd7a2d21022f57b27321305a8b203c1988d64a5e23e57cccf192d91e91650b2baf32373dd4cc125ed6c57582c7fe0a9b4b979ef0cf42832999cd810f1d47019fe22dc93cc80ab46c317df21ba392d06c9926ce9d0a5b5ccf96bbee5bde32739a3a76d02a4addac77b87ccd7dd815ecb412fb186ac2ea01ef60c6c52fd2f0db26dbdda5b6f78f322f3302e3bdee4d311cd495b4ed7554b191cda6a1c6631628c9bc9e [...]
+    "E": "839a75357001679b99b6f343d936af51",
+    "Y": "94f5f9b16d0651fda0ab7bc20bc930de001569ecf644a9e95f2b283886fc04f37c942081c7d365999b6939f2b01355b73e9910fbcbee5d47f0ee4a68350efc5ca777e35cdaf95c68566b2949639de88480d45e7f6c8da1be7ce72231e784cd7c24b58edae4b582bb0e20b4ec7890383f81c968d362a0e50f10b5b0b6a640ffdfdc4e72067e3875de4053c0d86fd0a8f7bca5536469495f0e0bfba60c4415ee709f3d58160ace0b51083ebf9c78d1dac21f803fcb6f32154076863519364c39adf43f903922ee8a62d1164f9148723c50a079d5073749d643f0b10f552a9c83043e63733aadee3909d545d883763da8f48f [...]
+    "ID": "e3275288bb0d8b647a4da6547fc6b2ed",
+    "AD": ""
   },
   {
     "TEST": 5,
-    "N": "afc831ea675d15771f53af90aa029c5765271325272b9a4d8e7619e6150e1c970d186109ce9a1f81e690bf758899366087dd71ca580327f9a7410ed1b6ae9f1cff0045cb653e0a7adc11ea715fc91799bbd2efa598e286758a6640af031d03e0ab8ba95a88eff3ee4cc673c22eb1c2df9a408e9c23221a0b98f3b3f0d8614bc06086eb2301ffc3d64c9365aa3a289ec7554532d95034010d464d2ac4af644f8f855befbd2191ed15bfe2377bc00f4cd8a8ff183d25522a514c8fa70b0a4ca7ec3791ab927306c03c64beaa4f1b5083663621a5b3b90d73f6c5ce95f087c0e068a0cf47b663e6a5e5508a6ebf93c6ef6a7c [...]
-    "E": "5a12c5fe22020692daac9310b77fc932",
-    "Y": "6f59640bb4df701334ff22f64f217d4356dfae7cd3d1affbee5a40e74aa09dcebf731656889a6d42f2346c76b0c1c9444ec849e1a77a24d60b5d9f28be283281311ba362d9fada5ed90e0c1fc4b11fbb7033837be6a61a99b8750b562409046385ea98b1cdb625e228f767a4a7d89ee4d9ad752c18d7df52041b5dc60c3b909810ea579a197bf880166317f2a6214caaf4bedd436b68469ebf05f1b2065183f1ec6059bbb8139f95af022456f3079d7a7c4716e322f57e625b60fdcb486ea3a5713ba66ae7e4660158cbfa09c619ef06a9f844c3bba634e338f41a49f7a7bed2fed941852014682c25a2850e887d254680 [...]
+    "N": "99fcf22beea4f23f1b41440b84feb6d511ddbcef2172fb83e9a2ca90c6b0f77c82f6b66215d0b21cc70134455dd3d4d135da63b36708339592306050b8a4c00c481533f55897cff7e0450b66dd78e846460a1ba4bbf478efda9c80d30422f9a5a3dbedc3845ba63129075703dc86880570b960812f3fdc59fa636859db36c8bb6357f43bc3001f59a45adeab4e474819e64b20c8939d04edb8ef231444e131c34107bf3d79fc8972e7a6d455efd03365a84e7cd00a89f5fd56f4e425c7dd9aa6f3c5027d113aa50f429a5efde5992ec7ea7f3bca718efa5bf02e1d03888fd2829569cc6069756b506a9c4a6b4ca0ef99e0 [...]
+    "E": "b825c144bd40e4137c25df8e96a8f354",
+    "Y": "a254c24e1f1c1ac762fa6b1246a58f9695433b48d79a584e6595030b0decd4c53784b8f0c5af425b29e7207450dc13892515e85c028a779d7918cf87bd0354a17185fad676d08c86667912657ae59452d6d8affdacf936245207191081d49cf4ee29813e566d8fb8d31b89f310e481d1c86378b70598524f80339a91c2d5d82b3bde5197eba6a57fdeaa3ea968fe35060ad85f73c2ce1fd82f5dfb842818c620844ac15ed53ca78250fcbb6ae90116c19cb420154e006f01ef4ba1048faa0f2254d12efdd3c3d4d5b05bcb7721543b9c315244d4654d906730b3e74c19f8cf15b959f59f30a59cdc140d0949597e85e7f7 [...]
+    "ID": "56f33ff94f46e351c28d7a17be7150a6",
+    "AD": "2b46cbcf3ad49eeabb725232e60c3359"
   },
   {
     "TEST": 6,
-    "N": "9a8e517be783c53ec6e7c066ffec3f8d5a1f69e7655f9a55694b2873ed8bc80631a848ec4fc9d39f68e45b0e73e8deb340219ab8fff0631b9a7539cd14ba497f7f509388029e83082d0d989e80f15a8f98088fac2c5eafa3b047bb4a62aee9db407f8fae19a4da71cd6a0a26cd9663d7b65d4e65a96c25648cf57f6dc96101898c92b70157f45cb93901c8a51d0322f33701e66a5e5d1a1cbd649e004902b6c707f2cc89aadd2cacd7891b824bcbc70b30c68727e2041983f5c206f9ac910919439837d8708d755eff01f5605605059f5ec5b17c9ea71ec60e83ad67160ab299602b9bcec2638376c8124b847c11491ea0 [...]
-    "E": "1383c19eceb4d0afb02c52f3ae2c2ea2",
-    "Y": "79ba4e6669599e9a085224761f086af63dbb4a9e5088fb6b04d820daea7b06af93e78036ad169903cd77720ecd24603e6a354b0c32490ae342e429d2b06fd25908f7478e64f7f7117e6bf32386a04ed338ceae946ac4cfc843c89444c84bcbcb5771fd6d5d1edbd6bdd336dbbd7ae816a4012b70b12e8df7e5571696f500ea994e87a5ee0958670d6f03bbc09024d2881f2c0ba0ae3bc21cffce5538842ff39c7d37b435c8446effe309bd8cc8f6aa359e9cdfae46f8dc42d0e96525cad6bff55151738cd6a71150e6c7b0a8bde944b3b2a6ad91f1f6cd14fc215e27ca2df0583df572d4e770311b7b235a58426afd1e1b [...]
+    "N": "ad010617d87a02038a15416ea95aeeba779fab4d2ec6f901cabd64371bee9b3ee248d96664c6ba1b21eb948351156554acc0d8834597f97e1a8375dc40182f204bd038b38c01e6765eef443e1214be34c37698da9898d2c7d9f2047e4a5e0c13a5e138cbb8e98311ece92bcacfda37e9af0e21445f9f622fd648aecff07f200b659ddece43abe0d44907eb546a1d9fdf1a042cf224af1aca1a7c0d1b789396c284b03bfb497b720b43a1c3761ce4e4319366464618e616e0d35f2e034b513d47a2ea6f71a7a34e57557b7577a283aab302c3c51d61da933c32dfdd24de39c3cfd1b95d036a557135084444e2088b72f068 [...]
+    "E": "99830632995e718e44087aec67a6a62f",
+    "Y": "00f2b463e01071a48b724d1da60d5c6b7af47d2c0c4c7d19d51a6a6167a9d9a93bcfb4ea911c9977d0c38a726a221787288de4ea95129300697839d1d4f33f516b9974a1fd032a2f2fe655a43cef4fdeb3fab141290363d5cac925444845535ef4e43b9ccaf2fb9b69071f8bc36ce7e22499a688f2297a5053a7f55a4cae6c0dff63538f6ae1d0c7153ed122b2fd02532e79db693d7ee390cd179d80970a6629d668557d19e8d1ce9edbb6fece81c2a1dda9c4bc85513c7cac0fc2e7e052071ae7354308da7b946501a3352ca25df4e1c308a20c0628cae778c9c2e631b71654e9ba52e514fa6e009d7eeb863a8d814913 [...]
+    "ID": "e9e4fadb27c465383f289aaacdcc6f27",
+    "AD": "707eb11f830c21ad8a9b883dce3f579c"
   },
   {
     "TEST": 7,
-    "N": "ca85a46f5e4c83c8709b90f05a3f9aea7d42be2f2a3047ef627b27d0cd5fd0673affa926e6538b4fdd576f24eee65fa12560d5ee0385271dc988aab5b26c0095165d92aabadddd2e5292e2ec4d7184e08bcf4fe69b39ff2880e11c7394e9ae8b6b5fc7b425365e4e75d5ed1f22843e815ed57278d72fa84966fb78196d5f85a99eab1139b874faca85ea4a1ea38fe939bfca60ef350eee8e5a0c272b910ccea8ebb6342daebdc7aa085baaa8b7a64a0dbef3fb7a8c1577f17532c5d1a78297966da439646f554d7d85e5ae066a56c3c1254b2d9063c9c330b4940c2bfd04f487fee5fbe3c9f17b02670f77141110e260fa [...]
-    "E": "9237f4b75ada192bdd9445bfc408f29a",
-    "Y": "3dd29b293bd3402df0db2346ed6e11fca3f218f7cd473e7766dfda035f67e5b16c311e88794ce046ad323446e21a8de6c94228041dedbe7a92742632b2a3cab7fae1c2bd3ab1f984fb65a73bfd9cb4d256c948c620d39bff94b59a5a45f03b45953a3eda64bcf63c80fc60579dbc3a5572a3324d37f00c24193fe8fd05d87b0d97cb1c6d59e21b6f2c4b23fa50bb6b81a348a808cf33aad13a739d2f368c4f16b0b3e82bef01632ea44b5f06f01237f9ee16251a0b4fae82279749b3b6f40ff52aca325b5bccba3934a7cf2b8b0a612c809265673e3b84a7bb6cf3621fa815fee5181e334abc00475a3470b546b627bbd1 [...]
+    "N": "aeeb1456d6d2812d814545d7adab170cf37ebfc3f20092024eff93263f92166d7842388567b19eeb3a40f11c08607c3e28a90f9a0a1c5c3d4952dd620de0808a20c01d5d0d70e863ae7c1575b23d6871a757f882114a9abb2058395897dba0add0de65228392477af6bbd0022e5a04095e17b7723cbe27ca8f54921f4388e8d601f14adad51e38fb216ef55dc0aa58eec4bc0eb2902f3c07410474c39fdf2ae4cab7e8fbd7fdf96ff57ac810aa8900adee6ec144016df2e53a7f900efd7a8528238fb82bf43117e6335a304dbde9e7fdea73223c7a34d711222a92d585f7744117a8da3e18bab41212c2af92fa2e56ac4b [...]
+    "E": "314145d410d8107b44693938694452aa",
+    "Y": "2b48d3c5f3eb912a41b82efd4fee5bc2a9dca9ad56ff18a89d0141e49c8aaf52ed291161568587f46a665bef9c22882e0ba878fd6711896351535a051cf55c7c6e0ae2ac44d54428de570583b5ab9f61d993539816e9c0426242ee76205393a2b795c5a2ad871d008bce80f4f0486ef5d338a1581500d4ce280735078be6766285f64c8ed5730ad02ee565c174195b904aa2d48d76e2ff35cf235ac5296954c55b1b446e3c87c394bfefe25026f9ceedd74c943b2124cc1a5e778afd78af4f2ed855a923c5e28d8da336a4ac85cf1a06503ec2f61607bb2b51770e6f6b6037791d58a3cfe82bc9e8739426599469d92a9d [...]
+    "ID": "97ace0e961fc82705b20c5d26ad480b3",
+    "AD": "7dad537b94892e44ef41a90ca0b33fe2"
   },
   {
     "TEST": 8,
-    "N": "de75a437b27e8f4dd0dc179c433d8dd300c6a7e6691362ff675523c4a7a13e8138be13135f262c12b50a7dd9236587290565db74242fa76ddcc6c84f10c561bb04b74d25ec40cd479ecd4ffb0b7aa91a95255bc66e670e823cbc948097611202f91197413a25e3292de842521f93a713c89c172f7c6b2d1097c1d613dca1d417ffcd70fef89426f4d167775fe2e99259a1f1eea8aacaf2b5f2b120d77182cbeb47c1f27614782bb77ec10b870d2c8e0c1753608b5df446ca91ad1d4e9548582649f52e08d86902d5ff45a7fcfb6faae1e68a093c831d993091175f57ad0b26e8a12927e7e92456302b63674121174498dd [...]
-    "E": "5935605d46ecb8e96f04cb4e648401bf",
-    "Y": "c6e5bdb826aa640cd449f7fda005b0bd70d86b6a0efa149dfdc1efd08ef64669fc4d4d3382a4c55c2d7a0fdfdf5c86a2359d089acf4329d4ab93e3316e947467e6f402f2931b59ba974573f6bbab490c0b5741f762f2f4f8105e36defaa2c1248f06d1ccb5840a366086a4758363504b7a7bbad3e4b71f7f3eb21fc713b3654004ab2d24ce43f5066b75df9b3e16bb1f1a8b447953692e78ad4041088f1203bb7468361b601984818a8c0c90981a272c20767aa654a93b945a2a2190770536963edaf9026faba03d007b7c2d14d04c180eb6ad27b8811c35ba229a188730e74e1a201a263c8f0d99f0a3fb64ef5fa11146 [...]
+    "N": "8c2da477e750bd713a2796ac183eddaff0781a8f09714b200dde75055b8dee2ba50467e54c5efddb3ffa260976b21f11234c26741e0b0f94ec63afe240ec7420c7fd78e409968879e730e82ad534f9b5c7fe5957826f7b8c02b84d2ccb2250e8e91d5ba4fec7b90b937add07ebfd2506841f8e9dfcde2aad215b603a57b7a672d6275dfb627736c3b515a3e642506e7b214f901fba9393b70246e92a5854fa9ab1b67daccf340eae0db34678fba5545953c18c7b3b3dfb5e2cf0bf366a1b76df2fd0acf86c7b5a7a54c741a2893000a69730b3e45dfb68c16d29ddf86241f2fedd4793d724ecb924bfc0b4a7aed8f9606a [...]
+    "E": "cd8cce9eb8a98d3637cb1c74b9baa945",
+    "Y": "dc2a134983c8ab020f14bb5df0a0a3c9b327daac28fe82d2868c20f7964ba6b0f1f931bc5b2cb831a4750481dae4bad967164d39fcbd77bc5122e8864cb4b8ec607e4a5af4efdd14c8574a1c669ad95e1fdc6ec9a0d67f222eb1583c1274faeb5989247d4499ed058a9756cad55668a39007f0f0fc465abe3490c245d094d9ca5726c0a084f90fdb19acaccdacbdff88f2a2d1854e4f1fa8024e6946dd37006eec7d6fc3e1a270ccfda8ab44c7aaf7f44199b3bc66694d170ce930bb5ddd3b114e3d3c1f5bb7660e09f859e1828d6a0b58912b6ee3d8750d1dba62ab1093f564ade503d29675a7efe06b831eb1178ac21f [...]
+    "ID": "b271cc0aea454a2331fd0583839bdf3a",
+    "AD": "92f4dea8b52f438fc422ab2d7290a99c"
   },
   {
     "TEST": 9,
-    "N": "d0ba83c1fa21923a611bb2429a33ffd1859f9091e3c240fbaa7bfe86c0dca9a78ba32ea4186f95679346f8413b3e67e9dae8d8fac37da7f97641a3b6503e815705d374301e4e3cf525329e203d6a3c0602cd1a115a751ab6b8b6c3b40d907b74c06043e1a7e83a3996cebec9b64bbff0f5fc346f4e61abc7656643b4c8396626dc35c547466769eec17f698c2b5dc7a8a571fbb1610783b40f144da0100ac900894e9542a5221d321527a6ca627b52f75307c11b8eec39cd61b11297725e94dd5e413a29087a62cb7dbc46ebf88ee920f9aa6914e78fd6bd26f7b7098f453a5fa9527694f0a9c9e6bcd112f68d80e3c02f [...]
-    "E": "1af00b986751fe1812fd44c0d8bda7d5",
-    "Y": "0e82ce65c510ed609f0be69b93bc77a5aedb6357fb6b2f17485047a9ab82c044a07d4bcc357c1df95261f695ecb97a8aaf04479597474e54f78ecd7a4006accdf39c7a470aa1b2d8cc698d46ce7c3bd670dbb62879c7c9980bb6992b17a0e62b533db747eee02f33981c1a01022e695f3064b0e0034c131cb3a3c28e3235130a21038c4fb5f8d9be4b4385b983ac369e186d4ce9102978f203cd699441d73cfc5fe913c1196c5ae06536e432ca7180e9724d771907067cc4a8e9369f4dcd6381e69ea7a94c9a9641a1b28bdc1c917420d00aaebfb95e0a89adff5663fcc423f6b02a35022ec5a9e48462def915998ec0c2 [...]
+    "N": "ab1a8594d89f84b6915e4018dbbdc1666d46dd3f5b5b5d3446a3b75a7cb596f4f4c4c66ee175b8e8ba5c558da783bb17317ebd5f0a2353ab4da4b5844a4ce46edede2529532ed09ae3da28cd020eff7893065858217372ca3ad5c402b5dd62763c4d672294c254fa27f934e30f9f8b1a8680c30446e0f74fd88ef9c125fa77881b27e0782ab6123a073e5e4c13d2136f4af3fdb19b36807747f48e6d58549d7d480b068160c3e4703a42a9c20767e5702651bb97496b3d03a853e448e2762290b44f722e979e964d9b28794966105e302feb5d5d44adb8631d04bad001661bea32adbaf78903b08bedaff2f8a484c5500a [...]
+    "E": "9b2b8a98185b747bff3588843ba793b1",
+    "Y": "4190f140d23bc22cdd20a040a66603dedb6fb639eb9b3a1b3f2362a9ed0f3287e05ed08e28b9df4eac93731eed61cf3a49a876e0b523b333cc60f282480b2e7488d1484db440352669141568e212f74622144d3157f7c96464a1df606c0bf2a290bf1d1fe48a84774fb381f6234ffe18b11fecd98d5972d83082d1569c136524bde00ff78c2b0a931aed7b2ab47cb075ca103e24f62e4d9cfbcde6fbe925a72db2e9c3011cb5274eb596161d3ab743a78c95d9c78225f337855c4600f98c66298c8302505ea74ee07e21a6b53eab7d3370d5b22a68537e69658609708af1b35b425a5fe019436d843f5dda09d61484932b [...]
+    "ID": "dd0ef2ad578e73591ac0f4402520ddda",
+    "AD": "1cfb385c01d989933d5680832a17a535"
   }
-]
+]
\ No newline at end of file
diff --git a/testVectors/factoring_zk/verify.txt b/testVectors/factoring_zk/verify.txt
index bead0af..4c27ee9 100644
--- a/testVectors/factoring_zk/verify.txt
+++ b/testVectors/factoring_zk/verify.txt
@@ -1,49 +1,70 @@
 TEST = 0,
-N = d981ab0cfb7d18b54f1f1beeb67d7515d1ccf4062cd59e39210f276bd8217ea4166ae6a6cdec62259459c649044b366fe77ae947f64f5710e6fcd8fca570e435d59613d1274d706c9a7e85a6b58bd237ed274c2abe9ed02e9b180dd129dce1e25e30814840e1bf6535ae5bc412bc7e94aa08e95922bba7d31b2284fcf4534b6f3e7b33b92609c44bcccee8c873ee99cba7e74f10890f58595784c6e6adcbafdcf05a9d281b9d8e77f14a0f4989f7c75f650360b32130e316b1da0b2d788c6ad79d3d55e96289ea842c8f2af541fab531612a6f6635b49882865a25d1feef2fd0cc324e10c2495f38d9df46bb23b73781bfd489da [...]
-E = b13ef239ecbf6a8e4939c6f1057dc1f5,
-Y = 1929051b404e4e986b88ed2f451170a0324d156dd17d520b41535e30e1693946360bc17bbba42a979da6273025a03f2437a12df96b1a7d4e24505ada2484072740d6d01a861e10357b0a9732010147b27179034ea5cd9c741ae43c741b003385e4d2a08200a0c7defc29106876610b11a073679aab0648d47510fecdaa84d27981fcf744a2d6736d90df76f4821726ca12909f9022fb9e9e56f27fea1c1a4bcc05b1a05e06b53fd0c6264d268c1028cc57f4618e44aa25125a6f0bf6b9bf801739ecd7e42e7aebfc80c0370e603a764090f1e22d50a9dffe5b7a34c3e933f52c30b76906a8317318a5e82f25795dc1c51dcd6d4c [...]
+N = b46b4f104b3e14b8e8576e99d8658a58bacea337c74f4211249312f7bf81d0d82d87d4ae983ed4791939ac5712b02273b3bc655b4330c1b1a0e9b6b6280df2a96b522bf5edf11c600c3afbeb6c0eb54c0a01af95baa47626ae83e22208f25da7df758d394b52a9676c94a307a4f91d77188a87af19adab355a2a04ec64f24b01db2e99b92c09c1ba1a2cb0616ac2154fe46a8044355e41264d1e590faa51500ab066ffa8909c64ebc4caddca6bd7f4bd3771e659cb9339932a84168d91fd3fa053255fe10b562f608cb31014dbc73caefaeb788bccae6ba3f38dd8a0f26d54c06ce81f8676eba16faae9531d5911dbf02f7852ba [...]
+E = 63fc977a14f6027281891f04d5a05dbe,
+Y = b8652f6bde94b5b9407afdd77daa7575aa96badd41ffda3c0c9b00b9a65dcceea85f13d8fac0c79b71f302fe84094b8d815dde4aeeb69c293b14f98b90d65f4e85aa446fa61430d720897345b9d361b8e623063782abed9acde3acbd055c325adb4136418f0f1ed01cd8d029a155d7b58e80ced90a6c3b3b806004be6f73af74fc90d854ae0c43e8aec1332a89e3ddf29793958a58dfd1793c5b066edf3ff29a854df6c1846f1af228a8a34b61423a825a3c4682bd120eb34ad175fea59b185622189e4857a1f5133c3d23de795a11e7c59671daf1e90a7d16d532e6cb4925417778da4e1e7e5c0870814a13a45dd5e5d5322711 [...]
+ID = 30b8b171bbe9e37fef9f7c5cb6e9bfa6,
+AD = ,
 
 TEST = 1,
-N = afe95357cac16036dfea2e05a8bb34055fb6ced95e1435651269de2c908f76b72413f8f5f1b6f6a75f806dda194bd003f25b15411a0492057d6a8e3723a56ddc7c9df3628ff320438b20eb59de27e047b1b8f42da7a99b3df04ae7436a98374fa9478344f0dad616852eb20b44bd7c873b610e0a3a9790bfd67daa6c44de9d8b78e3b6e3e0d7d75770a3c4b763b7395393308ed2571c5a109587faaf39f2023ba142e16034c012fa7b995174dc4769d6e77564dee352e30b1814b5d952efb728eae8766c8dad907c1109c4e56e3d4ea359fed5d190e7acef304b055e77e43cd5f0b313f007d24bc162da8c5106bc4886ae5b2289 [...]
-E = 1961f2da157aa4deefbdd31befa49774,
-Y = 19e032b23bf3f86eda180ffd2d6a289afb4e219591894312e66cbb1fcee656f9eed6f896eba77efd2f1f847129377bf1e2576711e20ae758af8171d16a17a353c8a14a223eb156c0a38ef9f502cceb85ec620e9e6c2bf35cf4c431fc8b55b74a0a32dfc8c99a2e13f9b1589bb38b6135ebc9f50d5aee4dd469428af1c62e55090fd86582fbe7623ef55a6147f7cd50ec8ff37a02357678dbde62ef6b3fbd6fe32edfb08bcd4f31651d7a339364eec9d1cbc84c0ad9f9182b3bf67b4011234e4438dbc84b5d255b17781fe5b0a1fc59726e4bf4481ff255592b117e3b5d5dafd6e5f3139dc84ca095e9c2e38e1fb75208e86be794 [...]
+N = d84668a676d3a2dc18a41b4f0251ce99a88b44443b68b4c4631d809f1f0a75877f207e4d6ef010ae0f87ef4975ed3fc4860931f606520d454e63c6864686a4a9051593df15aea6d9d6fbcb26128293b04614c32bda1f3617b059fa9cb0d7b8dfaff27ea2ccc3f5812497c6d0bd4425b394f6afb9d17be10976391aa768ab7e816c3e8ffe86e69ee49975c42fff9232571c9b0640bdf51600dd345ded6ae39833b9b79b5cab26e148ac8f93cbce906c1757fed5d3a032e076b9c5b43d115016027e536a02bce481ca685066daa62bebfe7a9462ee212632f86e8d51a876bdf8217fbdbcc1ee2e266e2c990a223a07723a3e499465 [...]
+E = 217b7ec2b4b7989657ed0cce063c40eb,
+Y = 2e6df258ef91c0820c8d02deb6b01fb95d9885ae0986fd35b4f034d3e7b3fae1747951b8a737d34be923cc80e24e99d183fc3807ad1286235fb2c81278f38b40692eb1aff605bece6bb0a8ce26039fe8f18ea66de076d4845927daf68866f54e15ab9c98c2397acfb832889f290ea06e9d39042880cf7c7b4545bc864ebbe96ac681f37efebaa47a515d635f1af9a5e99e6b24c2f43537bbd638d1baeae484facdd20f8a3657c32e5f5f47d5f316c0df40c973c1fd6cc6ea0d4152c481a6d3e2a155067bf70d38fee5e24dc59d2b4bbe1ad6a6f2a10287ab5c8721058d50caa8d3103fffd62a4cc9f4942f3ac826a39ed1f9e802 [...]
+ID = 0f26489b9b47ecef39644db2fb2ced45,
+AD = ,
 
 TEST = 2,
-N = d75c176e0599ab297337d3baf9a3b407df6c7c20bb7f65982532833183efbd1704c9d3d1f2e55dae2506f8a98521c54301daad4f6d8ae36352f6cd30ce9a517d4b6c7c2d8b5f30d6e35e1c047b005e969c56a35a9860cc5ccf2805f4ac19e152bdd8a0cad971639805b9ec32bd11044b65ec3d27a1d0eb392ab460ac3e724a0138d693dcac8f412bd79a78afceb382854691dc35ec3eff1c5315fd1c3126d7833856be0278d1e339ec9bf7dbf025609f0335ea16cbf52cc34dac637490cdf99a139982a3918b4f2007dbedf06f76f768610830c488dfe4cb2f947576d3c5da25dcde685ca831ba3e2c303ae010024d6464e3c041 [...]
-E = 0884e7991b5498f98353f89851df6703,
-Y = fc1f149e24fe6a703f3217dddd621de85fc2c16ad2d025a3119e7605ebb99c86429069a757d7323f3a76dd6d588d1e47ab917cbc97f75d1c3c92b3ff60b770488f84b4b3fd762bfc47dbcf21d94bb79670c8d1352984ac38354cedfaa8364cead99349dfdd529f6f6783bfb1069c0285e2a5e9bfe1f3b1955b2907beb245388908b13e289cdfd602667649f3c70d398a1ffe181b72b2bbfaf761fd127164d427b103a10c5edf727937433d555e58015f7adef2ba2c798aabadfe0f4f35e27d2b614696c698fa0edf6e0817b03caef5d16bded2b39a662fe54025fb19f78c15938dc7215be969f4aa2e41dc3965c06aa657154f10 [...]
+N = b7cf6b628df737ccb8e5bc1e4a9ad306e75ba646656010f39157216be5696cab868bf159af662145690b6df2935585309ac87d1a3b55185faf25d4b2a72e29d7025947a9bca6f196d92c7e15a327a7e94a046206d74e24dfe61fb8a54392f33c43e5a6202639510dc74567058f743017669a318fab412b34be4048a4c80c2c8462bc0ff19cba4ba5885858565b705feec60781de56c309d7f245b1921aec974e1c64dec515e161a4a58d7cf015cca792721201f2d2f64a2b6c97a48350de5a293972ca6ec0ffcf14a0b2b50902487bd5670410ec5bd43975e69fb234007cde62004ab295fd9c0f630f88ab1b577ecf8a76c29cf2 [...]
+E = 453b55121b958b27a748c0139be0e825,
+Y = ca36480031b115db26e6b0b13c9e9b3b99d43f169caf2aaf5511590fbf0c9d6eeb225dd50ab06da8d22fafe9f3eeb2abd69e5dfe821de8a3c1e6ed461cef591ea59dd7d14d1d9796a33c09ec9b0ec13c2bf156fcb917d75ea74f1841ec1aa8982a6e5f6ea83e46152af02d6da53c8c1787a9c1749293d5c45f9db8e7c9888185f41099713c94622188a7ee7940fc11b8b8c8c762937ca636eaf4399bcc848f0b643bf5aac4891a0ccc0404816743a0f9bc5adc7f8a32aa377c60be5b19b0bf313cd49eac0e2b3e82037cf6f3902adb55454f7f07792deb2231bd322860950cbe57c7d8ed3fcad1a3e7d52bb541c174c52f07c11a [...]
+ID = 298bc3f166694819af3fe7df57fdef26,
+AD = ,
 
 TEST = 3,
-N = d27c6a3c3f93003a706709391de7388d9a1411505c118f291f89d875f4a9a14fbd563198013bdfde16391bc5bda87d5d9b883b709c3b8a0835d0678e73c95487fdc2d05052c2ff33e4f12c5b8527b7f0dfcaab7ce457402fb86dba149fa45ab2490630d79b28b29f3532f7e733c9e15f2e4b306445c073f88bb4a4f64054c59b457cdc280146cdaa125465e36ad9809a5841ed300df5d6ec727df9c2159fdb5ee9174b2e2e438dd54fd792522932373ab96fbc46cde6a75b1f3a67b29d870e14f83df0e8cdc6fdf03fbb67e201cba5e05718116e58f4569d1967fa56b3f1387442de3ab7c1a61908e4ce6b91846a24b3c865b726 [...]
-E = 653d6b51eea5c46a9deab3f2bb6720cc,
-Y = 0287b78ad176a05bd75b0f5619f1035ebb61252d5de912ce7d02a4ad111695173d3ffdac942195d993580a6ca0a6e1975fbcec57837c1d99e2da97fd4de832827d3ee45e5a53a1cee3dead8ddfd31db8132ac78c967c886bc816a67da841286721481a8ffc3fbfbceaf5cff6630a9fdaf419c1132810c0cac21a969da21b17777b73668471b0a191cf8f3de59cc378e14509262f85d9771e73be4f55281797013d5e0cac55e55d16c8ff3b3257511c1b5e40f110e3d817946254c2789a11fec8d1333d0f0fc7300cdaeeae1e641b78e8b9498b1d88995743b98403b21c36e561fe53f74330560b296dc8cd7a473f1b3ed378bfa3 [...]
+N = ea0c5d956002195ad66c7d5cee2f989e8d1fa09c0b2819952175e03e502d2808402ca67bba843952461197fb65a3bb6311aeb2f787d1c9c123822ca994d5f6ea926ece20496acb9739b22ab11424bb8a9fe35ba63f5910f6db95ad595707aa1492ea236ffcc7e5e0a53d08b330099821ac420bf9acbb906916bf0e3d775a93df03d6566327ae3791429fa5b65e3f4fafca3c05809020e5fa7a847b3098a24b96d92919a561120dd02630a4b44eb275530c3e4885a87cf1fa5713a186fd2548c5a8b86ff6c5b7c633f4a73e084ac78ef8a3823489c1b7f3ecb8eb5a345e637d14c434405e071731db4a6b88553a5d4f557f5c1b88 [...]
+E = bbdc6ecf4e8ccc0a86cf5b8d9916c460,
+Y = d473068fe28f0f752ea5753ce6937125966467f50a1e36d8bab0691e437873429589a6f52fad939f11ec260a51187e790330e633df343535c5b615818421d1e641d6a2bcf6a954dc805990afa137cacd3a310fa75b33d41c9672065267089069d36b45330870ec1aa1b4f735349ba7ad771e5468cde369310b8828627c34e5147d07f2a63c34169f1a4a1884437edfa37d56ad0b12e0131169a68db94ace2e99d794b5f488ea3dcca0bb3cfdec2b7cef62c968387b06daddb65ce125e31b6e09aa8d45397675a345d6131efe2066e8bb51f39733ca342c36309dbbf7e8038d3fcacee8dab23af0e8c48fadf44e4c0b7acf20678c [...]
+ID = 935eeaa00d74148b691a21c149666856,
+AD = ,
 
 TEST = 4,
-N = a07cad84c98a7f14953d58bccd56bba517a600967d5104293c10d5ecdf7ef3c2bb52c3cae87ddea4b9947caecaae6d3df8458d79d62cc3454a955da7fe1cfebba8b041ce44fe3b293a6581e954005c01d8bbc9bf9b0887f1c9e617a7f5f0288c4c4be6a2c27dd11302735e2e4cc62bec93874c35ef148198df58c6e46b64d7b11506960da622c3b655d409755ec4b6dd3a45be34ad0d116e9bc667af9c6584d5cb30a62061c9bd9332251dad3c16d390dcc9cfb00b7a8c7a6409690917291da042ce3d9d0c7b25eb3b1c60c7dfb33726aa2380ba385e3233ffb7e02a1520a4cee0c67cff18101a85ada848785c2742208ae926dc [...]
-E = a5a0cb8a862b4a1acd24e773c2e3dd5c,
-Y = 26b1317331919561795ba423e203fa5aa1086356513b3ae57fc54d329dca2236fd4099c743840ba0013889dc6337cde2c88aa05f7882797f54f59b2a067c3d5ba9dc860772a452a8a7f6a910259117e7fed62b5c840879d1420ddf5939e62360f0ef261115d27a16ae3e5f8890f3c88a278b5430bf0317b479e81e51272c28322d9df1f57071cb5b296ca936f1625ce120de45cc8ed69b5524fe60ad854e6aaa42bb7ca5be3b13abec1ab8f9c07e7f0810ce402cd16203307fe8d9f13ceebeb843e4cc3c3cf29614138095fe2896d0a5984c5101e597bff5defa60f4de1da4ecf6593bcbc4642cb571a467572c54c84a4cd8f9c5 [...]
+N = c7af6135d867d3fb466045b527064f485e97ece7521c07529a7b1d68d83cef19a0051c7fa75a7887d6928a86160a72c23eb40e02f3a80991525634dfbbc969ca39866df32d11c846074c4febba03eebd7a2d21022f57b27321305a8b203c1988d64a5e23e57cccf192d91e91650b2baf32373dd4cc125ed6c57582c7fe0a9b4b979ef0cf42832999cd810f1d47019fe22dc93cc80ab46c317df21ba392d06c9926ce9d0a5b5ccf96bbee5bde32739a3a76d02a4addac77b87ccd7dd815ecb412fb186ac2ea01ef60c6c52fd2f0db26dbdda5b6f78f322f3302e3bdee4d311cd495b4ed7554b191cda6a1c6631628c9bc9eefcbc3 [...]
+E = 839a75357001679b99b6f343d936af51,
+Y = 94f5f9b16d0651fda0ab7bc20bc930de001569ecf644a9e95f2b283886fc04f37c942081c7d365999b6939f2b01355b73e9910fbcbee5d47f0ee4a68350efc5ca777e35cdaf95c68566b2949639de88480d45e7f6c8da1be7ce72231e784cd7c24b58edae4b582bb0e20b4ec7890383f81c968d362a0e50f10b5b0b6a640ffdfdc4e72067e3875de4053c0d86fd0a8f7bca5536469495f0e0bfba60c4415ee709f3d58160ace0b51083ebf9c78d1dac21f803fcb6f32154076863519364c39adf43f903922ee8a62d1164f9148723c50a079d5073749d643f0b10f552a9c83043e63733aadee3909d545d883763da8f48fa8e039 [...]
+ID = e3275288bb0d8b647a4da6547fc6b2ed,
+AD = ,
 
 TEST = 5,
-N = afc831ea675d15771f53af90aa029c5765271325272b9a4d8e7619e6150e1c970d186109ce9a1f81e690bf758899366087dd71ca580327f9a7410ed1b6ae9f1cff0045cb653e0a7adc11ea715fc91799bbd2efa598e286758a6640af031d03e0ab8ba95a88eff3ee4cc673c22eb1c2df9a408e9c23221a0b98f3b3f0d8614bc06086eb2301ffc3d64c9365aa3a289ec7554532d95034010d464d2ac4af644f8f855befbd2191ed15bfe2377bc00f4cd8a8ff183d25522a514c8fa70b0a4ca7ec3791ab927306c03c64beaa4f1b5083663621a5b3b90d73f6c5ce95f087c0e068a0cf47b663e6a5e5508a6ebf93c6ef6a7c49c77f [...]
-E = 5a12c5fe22020692daac9310b77fc932,
-Y = 6f59640bb4df701334ff22f64f217d4356dfae7cd3d1affbee5a40e74aa09dcebf731656889a6d42f2346c76b0c1c9444ec849e1a77a24d60b5d9f28be283281311ba362d9fada5ed90e0c1fc4b11fbb7033837be6a61a99b8750b562409046385ea98b1cdb625e228f767a4a7d89ee4d9ad752c18d7df52041b5dc60c3b909810ea579a197bf880166317f2a6214caaf4bedd436b68469ebf05f1b2065183f1ec6059bbb8139f95af022456f3079d7a7c4716e322f57e625b60fdcb486ea3a5713ba66ae7e4660158cbfa09c619ef06a9f844c3bba634e338f41a49f7a7bed2fed941852014682c25a2850e887d254680272a16 [...]
+N = 99fcf22beea4f23f1b41440b84feb6d511ddbcef2172fb83e9a2ca90c6b0f77c82f6b66215d0b21cc70134455dd3d4d135da63b36708339592306050b8a4c00c481533f55897cff7e0450b66dd78e846460a1ba4bbf478efda9c80d30422f9a5a3dbedc3845ba63129075703dc86880570b960812f3fdc59fa636859db36c8bb6357f43bc3001f59a45adeab4e474819e64b20c8939d04edb8ef231444e131c34107bf3d79fc8972e7a6d455efd03365a84e7cd00a89f5fd56f4e425c7dd9aa6f3c5027d113aa50f429a5efde5992ec7ea7f3bca718efa5bf02e1d03888fd2829569cc6069756b506a9c4a6b4ca0ef99e0dfb46a [...]
+E = b825c144bd40e4137c25df8e96a8f354,
+Y = a254c24e1f1c1ac762fa6b1246a58f9695433b48d79a584e6595030b0decd4c53784b8f0c5af425b29e7207450dc13892515e85c028a779d7918cf87bd0354a17185fad676d08c86667912657ae59452d6d8affdacf936245207191081d49cf4ee29813e566d8fb8d31b89f310e481d1c86378b70598524f80339a91c2d5d82b3bde5197eba6a57fdeaa3ea968fe35060ad85f73c2ce1fd82f5dfb842818c620844ac15ed53ca78250fcbb6ae90116c19cb420154e006f01ef4ba1048faa0f2254d12efdd3c3d4d5b05bcb7721543b9c315244d4654d906730b3e74c19f8cf15b959f59f30a59cdc140d0949597e85e7f7d49001 [...]
+ID = 56f33ff94f46e351c28d7a17be7150a6,
+AD = 2b46cbcf3ad49eeabb725232e60c3359,
 
 TEST = 6,
-N = 9a8e517be783c53ec6e7c066ffec3f8d5a1f69e7655f9a55694b2873ed8bc80631a848ec4fc9d39f68e45b0e73e8deb340219ab8fff0631b9a7539cd14ba497f7f509388029e83082d0d989e80f15a8f98088fac2c5eafa3b047bb4a62aee9db407f8fae19a4da71cd6a0a26cd9663d7b65d4e65a96c25648cf57f6dc96101898c92b70157f45cb93901c8a51d0322f33701e66a5e5d1a1cbd649e004902b6c707f2cc89aadd2cacd7891b824bcbc70b30c68727e2041983f5c206f9ac910919439837d8708d755eff01f5605605059f5ec5b17c9ea71ec60e83ad67160ab299602b9bcec2638376c8124b847c11491ea0b68eb1 [...]
-E = 1383c19eceb4d0afb02c52f3ae2c2ea2,
-Y = 79ba4e6669599e9a085224761f086af63dbb4a9e5088fb6b04d820daea7b06af93e78036ad169903cd77720ecd24603e6a354b0c32490ae342e429d2b06fd25908f7478e64f7f7117e6bf32386a04ed338ceae946ac4cfc843c89444c84bcbcb5771fd6d5d1edbd6bdd336dbbd7ae816a4012b70b12e8df7e5571696f500ea994e87a5ee0958670d6f03bbc09024d2881f2c0ba0ae3bc21cffce5538842ff39c7d37b435c8446effe309bd8cc8f6aa359e9cdfae46f8dc42d0e96525cad6bff55151738cd6a71150e6c7b0a8bde944b3b2a6ad91f1f6cd14fc215e27ca2df0583df572d4e770311b7b235a58426afd1e1bebb40e [...]
+N = ad010617d87a02038a15416ea95aeeba779fab4d2ec6f901cabd64371bee9b3ee248d96664c6ba1b21eb948351156554acc0d8834597f97e1a8375dc40182f204bd038b38c01e6765eef443e1214be34c37698da9898d2c7d9f2047e4a5e0c13a5e138cbb8e98311ece92bcacfda37e9af0e21445f9f622fd648aecff07f200b659ddece43abe0d44907eb546a1d9fdf1a042cf224af1aca1a7c0d1b789396c284b03bfb497b720b43a1c3761ce4e4319366464618e616e0d35f2e034b513d47a2ea6f71a7a34e57557b7577a283aab302c3c51d61da933c32dfdd24de39c3cfd1b95d036a557135084444e2088b72f068631748 [...]
+E = 99830632995e718e44087aec67a6a62f,
+Y = 00f2b463e01071a48b724d1da60d5c6b7af47d2c0c4c7d19d51a6a6167a9d9a93bcfb4ea911c9977d0c38a726a221787288de4ea95129300697839d1d4f33f516b9974a1fd032a2f2fe655a43cef4fdeb3fab141290363d5cac925444845535ef4e43b9ccaf2fb9b69071f8bc36ce7e22499a688f2297a5053a7f55a4cae6c0dff63538f6ae1d0c7153ed122b2fd02532e79db693d7ee390cd179d80970a6629d668557d19e8d1ce9edbb6fece81c2a1dda9c4bc85513c7cac0fc2e7e052071ae7354308da7b946501a3352ca25df4e1c308a20c0628cae778c9c2e631b71654e9ba52e514fa6e009d7eeb863a8d814913128755 [...]
+ID = e9e4fadb27c465383f289aaacdcc6f27,
+AD = 707eb11f830c21ad8a9b883dce3f579c,
 
 TEST = 7,
-N = ca85a46f5e4c83c8709b90f05a3f9aea7d42be2f2a3047ef627b27d0cd5fd0673affa926e6538b4fdd576f24eee65fa12560d5ee0385271dc988aab5b26c0095165d92aabadddd2e5292e2ec4d7184e08bcf4fe69b39ff2880e11c7394e9ae8b6b5fc7b425365e4e75d5ed1f22843e815ed57278d72fa84966fb78196d5f85a99eab1139b874faca85ea4a1ea38fe939bfca60ef350eee8e5a0c272b910ccea8ebb6342daebdc7aa085baaa8b7a64a0dbef3fb7a8c1577f17532c5d1a78297966da439646f554d7d85e5ae066a56c3c1254b2d9063c9c330b4940c2bfd04f487fee5fbe3c9f17b02670f77141110e260fa2eac84 [...]
-E = 9237f4b75ada192bdd9445bfc408f29a,
-Y = 3dd29b293bd3402df0db2346ed6e11fca3f218f7cd473e7766dfda035f67e5b16c311e88794ce046ad323446e21a8de6c94228041dedbe7a92742632b2a3cab7fae1c2bd3ab1f984fb65a73bfd9cb4d256c948c620d39bff94b59a5a45f03b45953a3eda64bcf63c80fc60579dbc3a5572a3324d37f00c24193fe8fd05d87b0d97cb1c6d59e21b6f2c4b23fa50bb6b81a348a808cf33aad13a739d2f368c4f16b0b3e82bef01632ea44b5f06f01237f9ee16251a0b4fae82279749b3b6f40ff52aca325b5bccba3934a7cf2b8b0a612c809265673e3b84a7bb6cf3621fa815fee5181e334abc00475a3470b546b627bbd1c94ad7 [...]
+N = aeeb1456d6d2812d814545d7adab170cf37ebfc3f20092024eff93263f92166d7842388567b19eeb3a40f11c08607c3e28a90f9a0a1c5c3d4952dd620de0808a20c01d5d0d70e863ae7c1575b23d6871a757f882114a9abb2058395897dba0add0de65228392477af6bbd0022e5a04095e17b7723cbe27ca8f54921f4388e8d601f14adad51e38fb216ef55dc0aa58eec4bc0eb2902f3c07410474c39fdf2ae4cab7e8fbd7fdf96ff57ac810aa8900adee6ec144016df2e53a7f900efd7a8528238fb82bf43117e6335a304dbde9e7fdea73223c7a34d711222a92d585f7744117a8da3e18bab41212c2af92fa2e56ac4b195221 [...]
+E = 314145d410d8107b44693938694452aa,
+Y = 2b48d3c5f3eb912a41b82efd4fee5bc2a9dca9ad56ff18a89d0141e49c8aaf52ed291161568587f46a665bef9c22882e0ba878fd6711896351535a051cf55c7c6e0ae2ac44d54428de570583b5ab9f61d993539816e9c0426242ee76205393a2b795c5a2ad871d008bce80f4f0486ef5d338a1581500d4ce280735078be6766285f64c8ed5730ad02ee565c174195b904aa2d48d76e2ff35cf235ac5296954c55b1b446e3c87c394bfefe25026f9ceedd74c943b2124cc1a5e778afd78af4f2ed855a923c5e28d8da336a4ac85cf1a06503ec2f61607bb2b51770e6f6b6037791d58a3cfe82bc9e8739426599469d92a9ddb5656 [...]
+ID = 97ace0e961fc82705b20c5d26ad480b3,
+AD = 7dad537b94892e44ef41a90ca0b33fe2,
 
 TEST = 8,
-N = de75a437b27e8f4dd0dc179c433d8dd300c6a7e6691362ff675523c4a7a13e8138be13135f262c12b50a7dd9236587290565db74242fa76ddcc6c84f10c561bb04b74d25ec40cd479ecd4ffb0b7aa91a95255bc66e670e823cbc948097611202f91197413a25e3292de842521f93a713c89c172f7c6b2d1097c1d613dca1d417ffcd70fef89426f4d167775fe2e99259a1f1eea8aacaf2b5f2b120d77182cbeb47c1f27614782bb77ec10b870d2c8e0c1753608b5df446ca91ad1d4e9548582649f52e08d86902d5ff45a7fcfb6faae1e68a093c831d993091175f57ad0b26e8a12927e7e92456302b63674121174498ddcf1d16 [...]
-E = 5935605d46ecb8e96f04cb4e648401bf,
-Y = c6e5bdb826aa640cd449f7fda005b0bd70d86b6a0efa149dfdc1efd08ef64669fc4d4d3382a4c55c2d7a0fdfdf5c86a2359d089acf4329d4ab93e3316e947467e6f402f2931b59ba974573f6bbab490c0b5741f762f2f4f8105e36defaa2c1248f06d1ccb5840a366086a4758363504b7a7bbad3e4b71f7f3eb21fc713b3654004ab2d24ce43f5066b75df9b3e16bb1f1a8b447953692e78ad4041088f1203bb7468361b601984818a8c0c90981a272c20767aa654a93b945a2a2190770536963edaf9026faba03d007b7c2d14d04c180eb6ad27b8811c35ba229a188730e74e1a201a263c8f0d99f0a3fb64ef5fa11146938ded [...]
+N = 8c2da477e750bd713a2796ac183eddaff0781a8f09714b200dde75055b8dee2ba50467e54c5efddb3ffa260976b21f11234c26741e0b0f94ec63afe240ec7420c7fd78e409968879e730e82ad534f9b5c7fe5957826f7b8c02b84d2ccb2250e8e91d5ba4fec7b90b937add07ebfd2506841f8e9dfcde2aad215b603a57b7a672d6275dfb627736c3b515a3e642506e7b214f901fba9393b70246e92a5854fa9ab1b67daccf340eae0db34678fba5545953c18c7b3b3dfb5e2cf0bf366a1b76df2fd0acf86c7b5a7a54c741a2893000a69730b3e45dfb68c16d29ddf86241f2fedd4793d724ecb924bfc0b4a7aed8f9606a394d9e [...]
+E = cd8cce9eb8a98d3637cb1c74b9baa945,
+Y = dc2a134983c8ab020f14bb5df0a0a3c9b327daac28fe82d2868c20f7964ba6b0f1f931bc5b2cb831a4750481dae4bad967164d39fcbd77bc5122e8864cb4b8ec607e4a5af4efdd14c8574a1c669ad95e1fdc6ec9a0d67f222eb1583c1274faeb5989247d4499ed058a9756cad55668a39007f0f0fc465abe3490c245d094d9ca5726c0a084f90fdb19acaccdacbdff88f2a2d1854e4f1fa8024e6946dd37006eec7d6fc3e1a270ccfda8ab44c7aaf7f44199b3bc66694d170ce930bb5ddd3b114e3d3c1f5bb7660e09f859e1828d6a0b58912b6ee3d8750d1dba62ab1093f564ade503d29675a7efe06b831eb1178ac21f39315b [...]
+ID = b271cc0aea454a2331fd0583839bdf3a,
+AD = 92f4dea8b52f438fc422ab2d7290a99c,
 
 TEST = 9,
-N = d0ba83c1fa21923a611bb2429a33ffd1859f9091e3c240fbaa7bfe86c0dca9a78ba32ea4186f95679346f8413b3e67e9dae8d8fac37da7f97641a3b6503e815705d374301e4e3cf525329e203d6a3c0602cd1a115a751ab6b8b6c3b40d907b74c06043e1a7e83a3996cebec9b64bbff0f5fc346f4e61abc7656643b4c8396626dc35c547466769eec17f698c2b5dc7a8a571fbb1610783b40f144da0100ac900894e9542a5221d321527a6ca627b52f75307c11b8eec39cd61b11297725e94dd5e413a29087a62cb7dbc46ebf88ee920f9aa6914e78fd6bd26f7b7098f453a5fa9527694f0a9c9e6bcd112f68d80e3c02f1c50cc [...]
-E = 1af00b986751fe1812fd44c0d8bda7d5,
-Y = 0e82ce65c510ed609f0be69b93bc77a5aedb6357fb6b2f17485047a9ab82c044a07d4bcc357c1df95261f695ecb97a8aaf04479597474e54f78ecd7a4006accdf39c7a470aa1b2d8cc698d46ce7c3bd670dbb62879c7c9980bb6992b17a0e62b533db747eee02f33981c1a01022e695f3064b0e0034c131cb3a3c28e3235130a21038c4fb5f8d9be4b4385b983ac369e186d4ce9102978f203cd699441d73cfc5fe913c1196c5ae06536e432ca7180e9724d771907067cc4a8e9369f4dcd6381e69ea7a94c9a9641a1b28bdc1c917420d00aaebfb95e0a89adff5663fcc423f6b02a35022ec5a9e48462def915998ec0c227c607 [...]
+N = ab1a8594d89f84b6915e4018dbbdc1666d46dd3f5b5b5d3446a3b75a7cb596f4f4c4c66ee175b8e8ba5c558da783bb17317ebd5f0a2353ab4da4b5844a4ce46edede2529532ed09ae3da28cd020eff7893065858217372ca3ad5c402b5dd62763c4d672294c254fa27f934e30f9f8b1a8680c30446e0f74fd88ef9c125fa77881b27e0782ab6123a073e5e4c13d2136f4af3fdb19b36807747f48e6d58549d7d480b068160c3e4703a42a9c20767e5702651bb97496b3d03a853e448e2762290b44f722e979e964d9b28794966105e302feb5d5d44adb8631d04bad001661bea32adbaf78903b08bedaff2f8a484c5500a47554b [...]
+E = 9b2b8a98185b747bff3588843ba793b1,
+Y = 4190f140d23bc22cdd20a040a66603dedb6fb639eb9b3a1b3f2362a9ed0f3287e05ed08e28b9df4eac93731eed61cf3a49a876e0b523b333cc60f282480b2e7488d1484db440352669141568e212f74622144d3157f7c96464a1df606c0bf2a290bf1d1fe48a84774fb381f6234ffe18b11fecd98d5972d83082d1569c136524bde00ff78c2b0a931aed7b2ab47cb075ca103e24f62e4d9cfbcde6fbe925a72db2e9c3011cb5274eb596161d3ab743a78c95d9c78225f337855c4600f98c66298c8302505ea74ee07e21a6b53eab7d3370d5b22a68537e69658609708af1b35b425a5fe019436d843f5dda09d61484932bd49af4 [...]
+ID = dd0ef2ad578e73591ac0f4402520ddda,
+AD = 1cfb385c01d989933d5680832a17a535,
+
diff --git a/testVectors/schnorr/challenge.json b/testVectors/schnorr/challenge.json
index 6ae10c6..b6a6ff5 100644
--- a/testVectors/schnorr/challenge.json
+++ b/testVectors/schnorr/challenge.json
@@ -1,62 +1,82 @@
 [
   {
     "TEST": 0,
-    "V": "024befbda22712d24c29cfe072212c5f2bb8ed43037d15ec5526170d10ac5e1d8f",
-    "C": "02a060df93699381bd5bc0bdcabe1e29866ac264b391f8fac09b631fee054523ec",
-    "E": "1d7b7e6cd635756d5014aaf2bd2e49161a383c44d68e945d89708ab1970b1d2f"
+    "V": "03c4e1855e5a0784bef9bb7ddc36f8dc2da6662a6443b4429266681943fb93b76b",
+    "C": "0229c5b60e0e3f3298dd3b0c090393a77161be92f9ab446ce103f7928293556325",
+    "E": "72470568ba42a1f395874483800cdb0f7cd1d74e550f476fe8bd00a910a43d89",
+    "ID": "ddfa4ce8ba4eb4ce3a9e85ff8a597d4a",
+    "AD": ""
   },
   {
     "TEST": 1,
-    "V": "023a3b7ad30d56d2b5edefcd06964b1c87921debd8efc23cbd299163641f9da65e",
-    "C": "03ec83eec4d3b2dd04ccb7deab01daa37b118463fdbed344adce88cba587194272",
-    "E": "558ce01071d543b36223d1e3c5be2dc3982877591fadd8376041d4e1e97eb680"
+    "V": "03791b3200f8590630ca3e43d0c13653bd17797f605b6a964d9dc513f92556b90e",
+    "C": "0314fa950d98212826f0af0acbcb64aeb671de4fda7cf813e3c1a0fa6ba15497c2",
+    "E": "1faaaf805a78d7d077d09c25de23158b7f2b05a1ac8d3508e76e959990de5da9",
+    "ID": "e6513d21d4bdac0e2225fcee5fc70882",
+    "AD": ""
   },
   {
     "TEST": 2,
-    "V": "03a78f4cd189e187e45726bdf281189a6509e4f9dc5a78bef07a57b95ccebdd3d0",
-    "C": "0268c30c3ead3feb588be06092d4c3331869d136f6327194d63d3b22c9400f7e87",
-    "E": "535f237ec6171866f486704a58ad2fb2c2b8e371f4f259b0ae5dcadb2c8aa11b"
+    "V": "03068dc0ad4aa0de5fdc584bf0c60f480614cae40f63c6857181132110438079e6",
+    "C": "02f1ac9f3bfa370e73da6d7c01aff1677be8c214adfc05ee164db9d3c7750f58f8",
+    "E": "09ca506983461796d06835e5bafb180f9621df7604ed88c895752121af49bd7d",
+    "ID": "64c03cd8b578e70c57ca5348be1a1320",
+    "AD": ""
   },
   {
     "TEST": 3,
-    "V": "0387c22492a00a0e784c7af84498d35beb3d49f620149a24b7377641e1d397117a",
-    "C": "0311981b3ba59825ac30c924826cba7d173f3ecfb426b54403232decb8e4b88e7c",
-    "E": "7ccf0a25c78182cb612454e5348622b934b908db5f689f0063c84cb25c521f8c"
+    "V": "023c71c88abd5d66e6dc41168f3ee44b6e8d8180309b216653261e491a19552e38",
+    "C": "02b7e6856389728b09cc4cdbe1649061fee09973207687ba036abd028151a1e99d",
+    "E": "d7a0a7765a99930b002c73d0d260ca3921b27923c547951c779f8aee8b5abb3b",
+    "ID": "c164da3fa78d42407450982b1701f64e",
+    "AD": ""
   },
   {
     "TEST": 4,
-    "V": "02a8ffc6d0a5cbad015470ad45b6b8a256a07b8662ca098e43d4a6545bd3f51853",
-    "C": "0390dd9958c350509c575133774305d3faee5dc4aef4522ba2d1f7a38b9549223e",
-    "E": "dd8952312c27a9c53ef719dfd8c1b09196fd174c685a1413f9ce535df4a44d70"
+    "V": "02fa5f0016e46f8b5f339a46c4c25de8b527fb6824b1f859f20619d016dd58e36c",
+    "C": "0371f807cebdc3c1bb9fbeb9168c91248d6c24289e06ca001de2d8348baf6fb90e",
+    "E": "c699d59b4e1f4e03d934b7c6d532bffdfaf2066291861eb8b41572b71fc3c17a",
+    "ID": "5fe038405254fede5fd901eeedc445f0",
+    "AD": ""
   },
   {
     "TEST": 5,
-    "V": "037179e513c1bc256571748b3c0a084a818fd5fb397170fdc72d4086020419280c",
-    "C": "0245a380cac8cd4310fd380b98f50d1ad157e1a6888b9eb61ba0b4058c23368f8b",
-    "E": "b36e1e916b60e5d84b6b0b0239fefba7e048b87d494675ffab33d66dbb729eb0"
+    "V": "035cb223c6ebd4c338fef485058f370279a0f67ff519f4348f24b188259134f0f3",
+    "C": "03b8c1205f605e441b1e617aef085946560d6fcbd238fdacb545a583c94b8cb2dd",
+    "E": "6a3a02bcc5c833b3f34e4e04f29d34da7485b2504d55a7a6a97b518c81b4fc71",
+    "ID": "2b68aa2631a9564972dcb3cbd7f9ed3d",
+    "AD": "d48cbbf78bd74a2c26e57d2354c9225a"
   },
   {
     "TEST": 6,
-    "V": "03fc8cca2a6b921305c0ee781cb90811af4748e942784cf997ddbbadff9ac2d0f3",
-    "C": "03ef8b07dc855b317d83f0820946bf25a57152f4611ae617a541c164fcd2843549",
-    "E": "0e7bc742909ee7fa9a8e2614b31c7af5a3956035875158cb0d361c098dff413b"
+    "V": "025345ca601fe14205ed9cd31514c252ed26a4cf6036af1de95076dcc167768c23",
+    "C": "032035339b6cba6446c2c81d29c6afe204d6ada0b636f487150a7959f0014c9377",
+    "E": "4ac5512263b781b0be01d0774a4d7b8cebb059b330540cbe805e7213cb30fbc8",
+    "ID": "e2283fbb76c2765eb88c8680d98525ee",
+    "AD": "6f3678b8dcc8f1b57608367c18076d43"
   },
   {
     "TEST": 7,
-    "V": "026b37df8eee2941d1ea61c9326856b11a2cd283eb3c073525853da7209952e665",
-    "C": "03b69dce44644dda96c60592269023eb2754d3bbb59b0ed61ab3f4e7533a993b65",
-    "E": "5d0e07222d70f0095b528e4a42629e4f22c1215eabafe5f69c546dff71ecd1f2"
+    "V": "0231994000293db76ee3403eaffc3e524d7aad7eb347a26eeba1ffb9576e9030f8",
+    "C": "036b84067e7d74302a932c73b55d4b41e4ba361857b0081fc668d8a6fbbe27e689",
+    "E": "b1d2c1156a3a77a610bc95fd313fc6498c231cad039b6ffce674694c72a00fb2",
+    "ID": "ced168e07cdf38765ab691510e9f06ae",
+    "AD": "2b972ace06c1956b6410d3f9bb21461c"
   },
   {
     "TEST": 8,
-    "V": "028b03a6e46a6c9f18005ede8fc4316293d54487cb1b1e5d3b0ba1e6934b09b535",
-    "C": "0287e3704ac6408a030dccebc2bf70b3cdb2ae9d140bfb9339839ae3a1bbc499b3",
-    "E": "bcf10843f4b318df8001199f78a0f7c7127e9818905abe490dbdb30a1b941581"
+    "V": "020f0d1431c74358682de3467bd363466c0725e588af837a3d8f340a4286d9ff57",
+    "C": "03ae3b1014391deb514e3b3bc798f9d77980888fb6c0497125494c423ea02838f8",
+    "E": "e1af4adc2b3854e1c8405adbdffec39a02e0464217af90e6c6239e274a9cb09b",
+    "ID": "798fafd60415b818d4075394c0b1bfdb",
+    "AD": "aa40c4178a5af48ad56d692516677eca"
   },
   {
     "TEST": 9,
-    "V": "030d2ffd9d6f540f18525d7eb3807eb9353af58b4b988fdfa5e7633d8d182d9bf7",
-    "C": "03a53642e0238a01e04633e4a6fb8c83015cc6f9db7213b8715b6446c220f6017e",
-    "E": "30c2250aa7c31cb43b4a9df3e0597e340595f192269ed38c4778713b7d1376c0"
+    "V": "025101370b069de8131800b15ec74854b0a8d21611336a53f020708c8ee84c2fed",
+    "C": "024d55b47c8182c7fb9d926323dd9ba785d101f6c354a2be18d7928d73d9c6958c",
+    "E": "5e76c14ba93e72462bddc3f16efbb575147210fd3deca55350c59ae5afff6e09",
+    "ID": "f1ba4a6b31acc1e72d3f4a2deecf9ed9",
+    "AD": "6193b0e56bf856f17ec1c75ae1a4f210"
   }
 ]
\ No newline at end of file
diff --git a/testVectors/schnorr/challenge.txt b/testVectors/schnorr/challenge.txt
index 0699b09..f532bb8 100644
--- a/testVectors/schnorr/challenge.txt
+++ b/testVectors/schnorr/challenge.txt
@@ -1,50 +1,70 @@
 TEST = 0,
-V = 024befbda22712d24c29cfe072212c5f2bb8ed43037d15ec5526170d10ac5e1d8f,
-C = 02a060df93699381bd5bc0bdcabe1e29866ac264b391f8fac09b631fee054523ec,
-E = 1d7b7e6cd635756d5014aaf2bd2e49161a383c44d68e945d89708ab1970b1d2f,
+V = 03c4e1855e5a0784bef9bb7ddc36f8dc2da6662a6443b4429266681943fb93b76b,
+C = 0229c5b60e0e3f3298dd3b0c090393a77161be92f9ab446ce103f7928293556325,
+E = 72470568ba42a1f395874483800cdb0f7cd1d74e550f476fe8bd00a910a43d89,
+ID = ddfa4ce8ba4eb4ce3a9e85ff8a597d4a,
+AD = ,
 
 TEST = 1,
-V = 023a3b7ad30d56d2b5edefcd06964b1c87921debd8efc23cbd299163641f9da65e,
-C = 03ec83eec4d3b2dd04ccb7deab01daa37b118463fdbed344adce88cba587194272,
-E = 558ce01071d543b36223d1e3c5be2dc3982877591fadd8376041d4e1e97eb680,
+V = 03791b3200f8590630ca3e43d0c13653bd17797f605b6a964d9dc513f92556b90e,
+C = 0314fa950d98212826f0af0acbcb64aeb671de4fda7cf813e3c1a0fa6ba15497c2,
+E = 1faaaf805a78d7d077d09c25de23158b7f2b05a1ac8d3508e76e959990de5da9,
+ID = e6513d21d4bdac0e2225fcee5fc70882,
+AD = ,
 
 TEST = 2,
-V = 03a78f4cd189e187e45726bdf281189a6509e4f9dc5a78bef07a57b95ccebdd3d0,
-C = 0268c30c3ead3feb588be06092d4c3331869d136f6327194d63d3b22c9400f7e87,
-E = 535f237ec6171866f486704a58ad2fb2c2b8e371f4f259b0ae5dcadb2c8aa11b,
+V = 03068dc0ad4aa0de5fdc584bf0c60f480614cae40f63c6857181132110438079e6,
+C = 02f1ac9f3bfa370e73da6d7c01aff1677be8c214adfc05ee164db9d3c7750f58f8,
+E = 09ca506983461796d06835e5bafb180f9621df7604ed88c895752121af49bd7d,
+ID = 64c03cd8b578e70c57ca5348be1a1320,
+AD = ,
 
 TEST = 3,
-V = 0387c22492a00a0e784c7af84498d35beb3d49f620149a24b7377641e1d397117a,
-C = 0311981b3ba59825ac30c924826cba7d173f3ecfb426b54403232decb8e4b88e7c,
-E = 7ccf0a25c78182cb612454e5348622b934b908db5f689f0063c84cb25c521f8c,
+V = 023c71c88abd5d66e6dc41168f3ee44b6e8d8180309b216653261e491a19552e38,
+C = 02b7e6856389728b09cc4cdbe1649061fee09973207687ba036abd028151a1e99d,
+E = d7a0a7765a99930b002c73d0d260ca3921b27923c547951c779f8aee8b5abb3b,
+ID = c164da3fa78d42407450982b1701f64e,
+AD = ,
 
 TEST = 4,
-V = 02a8ffc6d0a5cbad015470ad45b6b8a256a07b8662ca098e43d4a6545bd3f51853,
-C = 0390dd9958c350509c575133774305d3faee5dc4aef4522ba2d1f7a38b9549223e,
-E = dd8952312c27a9c53ef719dfd8c1b09196fd174c685a1413f9ce535df4a44d70,
+V = 02fa5f0016e46f8b5f339a46c4c25de8b527fb6824b1f859f20619d016dd58e36c,
+C = 0371f807cebdc3c1bb9fbeb9168c91248d6c24289e06ca001de2d8348baf6fb90e,
+E = c699d59b4e1f4e03d934b7c6d532bffdfaf2066291861eb8b41572b71fc3c17a,
+ID = 5fe038405254fede5fd901eeedc445f0,
+AD = ,
 
 TEST = 5,
-V = 037179e513c1bc256571748b3c0a084a818fd5fb397170fdc72d4086020419280c,
-C = 0245a380cac8cd4310fd380b98f50d1ad157e1a6888b9eb61ba0b4058c23368f8b,
-E = b36e1e916b60e5d84b6b0b0239fefba7e048b87d494675ffab33d66dbb729eb0,
+V = 035cb223c6ebd4c338fef485058f370279a0f67ff519f4348f24b188259134f0f3,
+C = 03b8c1205f605e441b1e617aef085946560d6fcbd238fdacb545a583c94b8cb2dd,
+E = 6a3a02bcc5c833b3f34e4e04f29d34da7485b2504d55a7a6a97b518c81b4fc71,
+ID = 2b68aa2631a9564972dcb3cbd7f9ed3d,
+AD = d48cbbf78bd74a2c26e57d2354c9225a,
 
 TEST = 6,
-V = 03fc8cca2a6b921305c0ee781cb90811af4748e942784cf997ddbbadff9ac2d0f3,
-C = 03ef8b07dc855b317d83f0820946bf25a57152f4611ae617a541c164fcd2843549,
-E = 0e7bc742909ee7fa9a8e2614b31c7af5a3956035875158cb0d361c098dff413b,
+V = 025345ca601fe14205ed9cd31514c252ed26a4cf6036af1de95076dcc167768c23,
+C = 032035339b6cba6446c2c81d29c6afe204d6ada0b636f487150a7959f0014c9377,
+E = 4ac5512263b781b0be01d0774a4d7b8cebb059b330540cbe805e7213cb30fbc8,
+ID = e2283fbb76c2765eb88c8680d98525ee,
+AD = 6f3678b8dcc8f1b57608367c18076d43,
 
 TEST = 7,
-V = 026b37df8eee2941d1ea61c9326856b11a2cd283eb3c073525853da7209952e665,
-C = 03b69dce44644dda96c60592269023eb2754d3bbb59b0ed61ab3f4e7533a993b65,
-E = 5d0e07222d70f0095b528e4a42629e4f22c1215eabafe5f69c546dff71ecd1f2,
+V = 0231994000293db76ee3403eaffc3e524d7aad7eb347a26eeba1ffb9576e9030f8,
+C = 036b84067e7d74302a932c73b55d4b41e4ba361857b0081fc668d8a6fbbe27e689,
+E = b1d2c1156a3a77a610bc95fd313fc6498c231cad039b6ffce674694c72a00fb2,
+ID = ced168e07cdf38765ab691510e9f06ae,
+AD = 2b972ace06c1956b6410d3f9bb21461c,
 
 TEST = 8,
-V = 028b03a6e46a6c9f18005ede8fc4316293d54487cb1b1e5d3b0ba1e6934b09b535,
-C = 0287e3704ac6408a030dccebc2bf70b3cdb2ae9d140bfb9339839ae3a1bbc499b3,
-E = bcf10843f4b318df8001199f78a0f7c7127e9818905abe490dbdb30a1b941581,
+V = 020f0d1431c74358682de3467bd363466c0725e588af837a3d8f340a4286d9ff57,
+C = 03ae3b1014391deb514e3b3bc798f9d77980888fb6c0497125494c423ea02838f8,
+E = e1af4adc2b3854e1c8405adbdffec39a02e0464217af90e6c6239e274a9cb09b,
+ID = 798fafd60415b818d4075394c0b1bfdb,
+AD = aa40c4178a5af48ad56d692516677eca,
 
 TEST = 9,
-V = 030d2ffd9d6f540f18525d7eb3807eb9353af58b4b988fdfa5e7633d8d182d9bf7,
-C = 03a53642e0238a01e04633e4a6fb8c83015cc6f9db7213b8715b6446c220f6017e,
-E = 30c2250aa7c31cb43b4a9df3e0597e340595f192269ed38c4778713b7d1376c0,
+V = 025101370b069de8131800b15ec74854b0a8d21611336a53f020708c8ee84c2fed,
+C = 024d55b47c8182c7fb9d926323dd9ba785d101f6c354a2be18d7928d73d9c6958c,
+E = 5e76c14ba93e72462bddc3f16efbb575147210fd3deca55350c59ae5afff6e09,
+ID = f1ba4a6b31acc1e72d3f4a2deecf9ed9,
+AD = 6193b0e56bf856f17ec1c75ae1a4f210,
 
diff --git a/testVectors/schnorr/dchallenge.json b/testVectors/schnorr/dchallenge.json
index 751694d..7b7c57c 100644
--- a/testVectors/schnorr/dchallenge.json
+++ b/testVectors/schnorr/dchallenge.json
@@ -1,72 +1,92 @@
 [
   {
     "TEST": 0,
-    "R": "02fce97b3461044ccb1cfda6653e3307cc0404e634bd042e9ed42abc114a7fae12",
-    "V": "03a7aa6833de71fe8157742cda5fec88ae20e9daa420363a8bee9baaac05baf53d",
-    "C": "03b93be23c0f9283a0cd97e3f41247aa26926cd4345e4a622abc0ccf7e9a5a7396",
-    "E": "377641844b33e90b6d0fc4fbcfd9bfc06dc1667e5211d8e231256f098fd0dcd6"
+    "R": "038f6876d53b3b8f858feaf34ea139354cc2daf210162f8d89258e36cc89d1ea15",
+    "V": "03f17f5e29ec8dc9de0a3284fed2d925efceaba371eb9625bff8dc2b60f78e767d",
+    "C": "03d68c95f6691138a14674ae80a31f1cb1ef1da3deb693c4c326c57516d1492dd9",
+    "E": "fa45c59892d02bd2e32059b4a3c39a2e822e245de49eff26c4f9d8004565cfd3",
+    "ID": "d0085a45525d1436e41889b7b6cae7db",
+    "AD": ""
   },
   {
     "TEST": 1,
-    "R": "03e9f81d0e6c24199940612ab91ebaa6dce5d2d3f1d084e8ca6f5e297c9c5a6dc1",
-    "V": "03f25c7a101353776030a55deffe291c10c977192e86f6c285afb80e5391cd7cc8",
-    "C": "024989f21a8234221ddf2eba3b634da8bb96c7d5681a366356a98afb9670207a45",
-    "E": "5b95c4f3ba9c18c54b3877a24e74363bbf7df8434d59c54332955941f5f0cb06"
+    "R": "03203ca28db780126db0551ee203f5fdc1a51e2152185eeefaca5abe854cf9e5f6",
+    "V": "03f1bf89af15b7f5c1e7cd4f64377cafc61edf2fefc1ee1a06ba60423aaf387f86",
+    "C": "03abba83dd5f78cd4c6ec8b56003226fbc78389692eea912826c7ec326aaa854df",
+    "E": "a5120e188ee5159db3a53d9033564e7f9f2d6abe26bd7932761820c835285f24",
+    "ID": "916500443089980b552495ea07205280",
+    "AD": ""
   },
   {
     "TEST": 2,
-    "R": "03a7e24af1dc8d18f1f1e29f1394d8d0a8e90d6c4c26de91bea4bfe1e71ebfa1f6",
-    "V": "02e8abc8a4759b17f0203e06688bff8abcb9f9664066b63a84a1cdbf3d1ec83871",
-    "C": "031a4e2b1c88faa7b2d33c174bce726589effa301fa28eb20de8d20930f0808478",
-    "E": "96631591ff2ab6d5f75c7350a01e562f419ea124519650892bc52ec4a1f9ec56"
+    "R": "038123e9c9495c7c0586715bcb95730d34228ded11cbcd303c9d89306d49a02900",
+    "V": "03f72ee114d5945f60bc781575568b96d5296d61fb15775fb9be63c7f7d5b5b2ba",
+    "C": "029909e097e12eb3ae0e9afd11b3ed44ff645cbaac2b967c404ca55986a6743af6",
+    "E": "a9180558479fa9f5157d26c63b1d434d44902095c7ea2eadeb3fc9cd9ca0374e",
+    "ID": "5e452e6dd894d61567d9e475b6c2d230",
+    "AD": ""
   },
   {
     "TEST": 3,
-    "R": "0345276ef03da95891d8ab5fec315a99c1d2a0b73e5c6428d2c4783d76ea12e8e5",
-    "V": "03294ea766113835c1295a89dfa2d72c9133693705232f6961ab112320e13b393b",
-    "C": "031f7196fbe48c4fb565c096aa221ad50531e1e4fe86d849402b050e479601afb2",
-    "E": "9dadd46409bc914c556aeadfe4354357fbc1015936e09e4e0bc104ba83c88999"
+    "R": "024d05a823ab116021580039cb43a964c24289163fca16772b36018a528dff639d",
+    "V": "03e7b821d69776c189e02c853accb62ed61f1dd7e34b976b79a2ae5fb95ab6b3e2",
+    "C": "02c7b222f108cc7aa566237e7743519196d36aa7d93e99ab9e4c7d5b35afca4448",
+    "E": "5a83f414fb278146866addaee6c90ba4d2fa879c302808137ca06870a25821b7",
+    "ID": "06609e8b9b7fb626bb7f2ea8b47f4582",
+    "AD": ""
   },
   {
     "TEST": 4,
-    "R": "03c5014eefdd3f846f5e44fe27c0b373ea4f8063f0190f134c1daeac38cb99018d",
-    "V": "027f1738999c2ba46a69ca139c0231e1bae9d72f7b005116ef326dbf1c159be802",
-    "C": "023a42f0ac7af46fc1347b085b6c0393630aaafde82c9ea8ff3f19dfe76b439bc9",
-    "E": "ecd14eab141fedf4ff74a99b04be0b0a3ecee7f61dfd9ade62607d72ca5603c4"
+    "R": "03453c2a1183008506540c1eb410953699ab6a95591cceb8e38761d897c845761d",
+    "V": "037f93df77762c37d253f1afe663322f12f970f23a6a2d204682e13aa76c99b538",
+    "C": "03eb1236bc465f35669a0f98649fa852bce6f5bb8770d9096f31fad5cce1767d6d",
+    "E": "748ff317b056c57b4fd366678f266d16fcf94f69bfe877fba4393d267f93b658",
+    "ID": "7486107a9dbcde68c8e388e24129d9c5",
+    "AD": ""
   },
   {
     "TEST": 5,
-    "R": "021982e226d514f6b456ce6dd34207e3614c75c7212c1e4aafc8466db3b7f46d7b",
-    "V": "02e63eb2a216d4b599e3a3744931a994f9ec42e7a1206f7f1da3d02179470d2349",
-    "C": "0370ae390278ed2b8e2c60f5ae07620bf152b561c07555cd47e7b5f0bc633eef30",
-    "E": "4fc268495304a9cae32c7034a61e8f06a66daf2eb2de39fbb14898eef3f0a2f0"
+    "R": "0253090ba3693f7f8865c9d2e7fbabcf19c24b27b03237dc11b653277a18821271",
+    "V": "03df3271f482174215145c57515c291ccd3cc258cf9e6b99e9e533f36b22a7f073",
+    "C": "0304e404f060065805140a3107c32962d925f3199e48a40f476080b0d7bad112b4",
+    "E": "7d0b02747cb75a23135d75717e1717d3524c1c8896cf8b976f0fcdcba142a35f",
+    "ID": "9d914a43ecf839b2843e54a42fe4c009",
+    "AD": "2164c3ae3e3436b841e740cf809b2795"
   },
   {
     "TEST": 6,
-    "R": "02505dd9744db3c1c7f32766c5982f60528a94f5e196beb71a055455a8d565a9fb",
-    "V": "036049148cb142e8ee3ec967e0fb26407fe896f490ccbb98a9cc4692a5b1353b0e",
-    "C": "02ba916da7a61ddbd7e4d0e83586bdb9835157b5e194075f7cc68ecbb3255c0862",
-    "E": "89e69d2a6efd2f0a73ab58720ed4c9f26857f41095ef4ff6078251fb5c0fc7a8"
+    "R": "0393f5387d1e20fc0472b388662238a2a2239e9c5516115f13abc57f7f58430dbf",
+    "V": "038e0b62ea7798093e7c512136b69d096cd00c1c84393bf5bb5947bc930f0db31c",
+    "C": "02f4bb70005ac5adc974a2ce6093ed2269fef48c8c9f45913ab3684c1fcea90bf4",
+    "E": "b0134e65f16518ba896f98363dc5fecd920d9490d57cdbd5f937242f039066d6",
+    "ID": "3a7e76440dd7adf8cd622e24c8e4f199",
+    "AD": "c47299eaa266b0c1a920deab65fa7cdf"
   },
   {
     "TEST": 7,
-    "R": "03c885c69fb95055bb5a69f166024462de5ac80edb1b0a5c7d78ca5f7cf755ed72",
-    "V": "0224484bebb5b98fbe8c2e2e036e47117df3e7cb8aea0e33cb85313175c355f2a0",
-    "C": "03d555668d044c595b0b88eb4e24187fc3126f223e8d2c1eb719503ab6bf4bac79",
-    "E": "278333b0429c722e43f44db99ccdf61c72b8540191d73cd34dc961104df2ac68"
+    "R": "0309f0fb8c0e32bb1dcdb5cd810ae1c0b0e1c5418c1f29cb7b7696c139dd37611e",
+    "V": "03bb6b807b0be4262af130e34e663f7682032a3eab2fce282c56a7ea35b89c0f96",
+    "C": "03cdc87374f522dcff6c16d7be17a432066b7065646c0c6e67d6fe58c5db0dd6a4",
+    "E": "d933e039daf386d798cf38f4d5fcea4e587fcd386bac0eeceb92a241b354d71b",
+    "ID": "e08c5e4e3eb08d0c54ab91f1bbb472a2",
+    "AD": "b5c96c751c18209f8ff8bf369a5ddfc2"
   },
   {
     "TEST": 8,
-    "R": "0241b9c2cbd4cdd8c14e875daa25371dddad0843daf46c4e50516eae3a4c93f1da",
-    "V": "03d5d6a159ea9eb3740c273ca73b570c4532b6865365ceaff9d49ccaae254ff79d",
-    "C": "028cdc49a1c1e62cb0080a08668e38c9dd45cf1f70cb1edac7a787c43de33a9f13",
-    "E": "7b5cbf866b40fcf8685eea11dccd0aeaf712daaf79a7593392e0c8072d7bc41e"
+    "R": "0217571b58356c8dcc258e8ce7787d90d0557f911cea7747ad97cb1416ff06d57c",
+    "V": "025c264cdf73fcfaf7f6afba17009807271b15f85062022c1cc0c3c74e03da35de",
+    "C": "03b86b7c0b3ca05fd8975af66f3b9a2f5ab338205aa8dbace6f9a2dce12085ae31",
+    "E": "583c9d20a4df474615d0ee2f8762e16ec23db022f1f05d55a3166b95f3009bff",
+    "ID": "ee99fe3e0e15220ffcfe792fdd9c1498",
+    "AD": "748cf346cf2817b826446cf6af22a503"
   },
   {
     "TEST": 9,
-    "R": "03608303184489be2160b83396fabb2941cb75554f7705ed9b20a723f0e35ab5e9",
-    "V": "0331443c4928d41e51f066f9c19ffe16d3136d952d541c5726a8b69acb88da2c11",
-    "C": "02f6ce8a1ea47a2736b5274328a8a49e5cf38dbf896f86396223a219df68f49588",
-    "E": "f3626cb346393399732569f32e4efffad65a76d27762bb7fef9efdccce0671bf"
+    "R": "02e3a46f35ce40e59194a7dd349cd701c9940f58a6d75824094e15c00598f66525",
+    "V": "032459eb39f986ec51c24717d6c211717f8d8bb24a951148c2324e410d15528a81",
+    "C": "036152bf63d0f3cd012afb9326c260a757c148f30f7de60db2c7819f4eaf74a9ec",
+    "E": "9616c3a9c752ecca4bf58eca5ed8853f8c0296f318b98ee7dbefe327d55742bd",
+    "ID": "b910c484dbc541799639071705b90234",
+    "AD": "9b5fa9d07790980f318bf3a705f5bc58"
   }
 ]
\ No newline at end of file
diff --git a/testVectors/schnorr/dchallenge.txt b/testVectors/schnorr/dchallenge.txt
index cf10987..10cf669 100644
--- a/testVectors/schnorr/dchallenge.txt
+++ b/testVectors/schnorr/dchallenge.txt
@@ -1,60 +1,80 @@
 TEST = 0,
-R = 02fce97b3461044ccb1cfda6653e3307cc0404e634bd042e9ed42abc114a7fae12,
-V = 03a7aa6833de71fe8157742cda5fec88ae20e9daa420363a8bee9baaac05baf53d,
-C = 03b93be23c0f9283a0cd97e3f41247aa26926cd4345e4a622abc0ccf7e9a5a7396,
-E = 377641844b33e90b6d0fc4fbcfd9bfc06dc1667e5211d8e231256f098fd0dcd6,
+R = 038f6876d53b3b8f858feaf34ea139354cc2daf210162f8d89258e36cc89d1ea15,
+V = 03f17f5e29ec8dc9de0a3284fed2d925efceaba371eb9625bff8dc2b60f78e767d,
+C = 03d68c95f6691138a14674ae80a31f1cb1ef1da3deb693c4c326c57516d1492dd9,
+E = fa45c59892d02bd2e32059b4a3c39a2e822e245de49eff26c4f9d8004565cfd3,
+ID = d0085a45525d1436e41889b7b6cae7db,
+AD = ,
 
 TEST = 1,
-R = 03e9f81d0e6c24199940612ab91ebaa6dce5d2d3f1d084e8ca6f5e297c9c5a6dc1,
-V = 03f25c7a101353776030a55deffe291c10c977192e86f6c285afb80e5391cd7cc8,
-C = 024989f21a8234221ddf2eba3b634da8bb96c7d5681a366356a98afb9670207a45,
-E = 5b95c4f3ba9c18c54b3877a24e74363bbf7df8434d59c54332955941f5f0cb06,
+R = 03203ca28db780126db0551ee203f5fdc1a51e2152185eeefaca5abe854cf9e5f6,
+V = 03f1bf89af15b7f5c1e7cd4f64377cafc61edf2fefc1ee1a06ba60423aaf387f86,
+C = 03abba83dd5f78cd4c6ec8b56003226fbc78389692eea912826c7ec326aaa854df,
+E = a5120e188ee5159db3a53d9033564e7f9f2d6abe26bd7932761820c835285f24,
+ID = 916500443089980b552495ea07205280,
+AD = ,
 
 TEST = 2,
-R = 03a7e24af1dc8d18f1f1e29f1394d8d0a8e90d6c4c26de91bea4bfe1e71ebfa1f6,
-V = 02e8abc8a4759b17f0203e06688bff8abcb9f9664066b63a84a1cdbf3d1ec83871,
-C = 031a4e2b1c88faa7b2d33c174bce726589effa301fa28eb20de8d20930f0808478,
-E = 96631591ff2ab6d5f75c7350a01e562f419ea124519650892bc52ec4a1f9ec56,
+R = 038123e9c9495c7c0586715bcb95730d34228ded11cbcd303c9d89306d49a02900,
+V = 03f72ee114d5945f60bc781575568b96d5296d61fb15775fb9be63c7f7d5b5b2ba,
+C = 029909e097e12eb3ae0e9afd11b3ed44ff645cbaac2b967c404ca55986a6743af6,
+E = a9180558479fa9f5157d26c63b1d434d44902095c7ea2eadeb3fc9cd9ca0374e,
+ID = 5e452e6dd894d61567d9e475b6c2d230,
+AD = ,
 
 TEST = 3,
-R = 0345276ef03da95891d8ab5fec315a99c1d2a0b73e5c6428d2c4783d76ea12e8e5,
-V = 03294ea766113835c1295a89dfa2d72c9133693705232f6961ab112320e13b393b,
-C = 031f7196fbe48c4fb565c096aa221ad50531e1e4fe86d849402b050e479601afb2,
-E = 9dadd46409bc914c556aeadfe4354357fbc1015936e09e4e0bc104ba83c88999,
+R = 024d05a823ab116021580039cb43a964c24289163fca16772b36018a528dff639d,
+V = 03e7b821d69776c189e02c853accb62ed61f1dd7e34b976b79a2ae5fb95ab6b3e2,
+C = 02c7b222f108cc7aa566237e7743519196d36aa7d93e99ab9e4c7d5b35afca4448,
+E = 5a83f414fb278146866addaee6c90ba4d2fa879c302808137ca06870a25821b7,
+ID = 06609e8b9b7fb626bb7f2ea8b47f4582,
+AD = ,
 
 TEST = 4,
-R = 03c5014eefdd3f846f5e44fe27c0b373ea4f8063f0190f134c1daeac38cb99018d,
-V = 027f1738999c2ba46a69ca139c0231e1bae9d72f7b005116ef326dbf1c159be802,
-C = 023a42f0ac7af46fc1347b085b6c0393630aaafde82c9ea8ff3f19dfe76b439bc9,
-E = ecd14eab141fedf4ff74a99b04be0b0a3ecee7f61dfd9ade62607d72ca5603c4,
+R = 03453c2a1183008506540c1eb410953699ab6a95591cceb8e38761d897c845761d,
+V = 037f93df77762c37d253f1afe663322f12f970f23a6a2d204682e13aa76c99b538,
+C = 03eb1236bc465f35669a0f98649fa852bce6f5bb8770d9096f31fad5cce1767d6d,
+E = 748ff317b056c57b4fd366678f266d16fcf94f69bfe877fba4393d267f93b658,
+ID = 7486107a9dbcde68c8e388e24129d9c5,
+AD = ,
 
 TEST = 5,
-R = 021982e226d514f6b456ce6dd34207e3614c75c7212c1e4aafc8466db3b7f46d7b,
-V = 02e63eb2a216d4b599e3a3744931a994f9ec42e7a1206f7f1da3d02179470d2349,
-C = 0370ae390278ed2b8e2c60f5ae07620bf152b561c07555cd47e7b5f0bc633eef30,
-E = 4fc268495304a9cae32c7034a61e8f06a66daf2eb2de39fbb14898eef3f0a2f0,
+R = 0253090ba3693f7f8865c9d2e7fbabcf19c24b27b03237dc11b653277a18821271,
+V = 03df3271f482174215145c57515c291ccd3cc258cf9e6b99e9e533f36b22a7f073,
+C = 0304e404f060065805140a3107c32962d925f3199e48a40f476080b0d7bad112b4,
+E = 7d0b02747cb75a23135d75717e1717d3524c1c8896cf8b976f0fcdcba142a35f,
+ID = 9d914a43ecf839b2843e54a42fe4c009,
+AD = 2164c3ae3e3436b841e740cf809b2795,
 
 TEST = 6,
-R = 02505dd9744db3c1c7f32766c5982f60528a94f5e196beb71a055455a8d565a9fb,
-V = 036049148cb142e8ee3ec967e0fb26407fe896f490ccbb98a9cc4692a5b1353b0e,
-C = 02ba916da7a61ddbd7e4d0e83586bdb9835157b5e194075f7cc68ecbb3255c0862,
-E = 89e69d2a6efd2f0a73ab58720ed4c9f26857f41095ef4ff6078251fb5c0fc7a8,
+R = 0393f5387d1e20fc0472b388662238a2a2239e9c5516115f13abc57f7f58430dbf,
+V = 038e0b62ea7798093e7c512136b69d096cd00c1c84393bf5bb5947bc930f0db31c,
+C = 02f4bb70005ac5adc974a2ce6093ed2269fef48c8c9f45913ab3684c1fcea90bf4,
+E = b0134e65f16518ba896f98363dc5fecd920d9490d57cdbd5f937242f039066d6,
+ID = 3a7e76440dd7adf8cd622e24c8e4f199,
+AD = c47299eaa266b0c1a920deab65fa7cdf,
 
 TEST = 7,
-R = 03c885c69fb95055bb5a69f166024462de5ac80edb1b0a5c7d78ca5f7cf755ed72,
-V = 0224484bebb5b98fbe8c2e2e036e47117df3e7cb8aea0e33cb85313175c355f2a0,
-C = 03d555668d044c595b0b88eb4e24187fc3126f223e8d2c1eb719503ab6bf4bac79,
-E = 278333b0429c722e43f44db99ccdf61c72b8540191d73cd34dc961104df2ac68,
+R = 0309f0fb8c0e32bb1dcdb5cd810ae1c0b0e1c5418c1f29cb7b7696c139dd37611e,
+V = 03bb6b807b0be4262af130e34e663f7682032a3eab2fce282c56a7ea35b89c0f96,
+C = 03cdc87374f522dcff6c16d7be17a432066b7065646c0c6e67d6fe58c5db0dd6a4,
+E = d933e039daf386d798cf38f4d5fcea4e587fcd386bac0eeceb92a241b354d71b,
+ID = e08c5e4e3eb08d0c54ab91f1bbb472a2,
+AD = b5c96c751c18209f8ff8bf369a5ddfc2,
 
 TEST = 8,
-R = 0241b9c2cbd4cdd8c14e875daa25371dddad0843daf46c4e50516eae3a4c93f1da,
-V = 03d5d6a159ea9eb3740c273ca73b570c4532b6865365ceaff9d49ccaae254ff79d,
-C = 028cdc49a1c1e62cb0080a08668e38c9dd45cf1f70cb1edac7a787c43de33a9f13,
-E = 7b5cbf866b40fcf8685eea11dccd0aeaf712daaf79a7593392e0c8072d7bc41e,
+R = 0217571b58356c8dcc258e8ce7787d90d0557f911cea7747ad97cb1416ff06d57c,
+V = 025c264cdf73fcfaf7f6afba17009807271b15f85062022c1cc0c3c74e03da35de,
+C = 03b86b7c0b3ca05fd8975af66f3b9a2f5ab338205aa8dbace6f9a2dce12085ae31,
+E = 583c9d20a4df474615d0ee2f8762e16ec23db022f1f05d55a3166b95f3009bff,
+ID = ee99fe3e0e15220ffcfe792fdd9c1498,
+AD = 748cf346cf2817b826446cf6af22a503,
 
 TEST = 9,
-R = 03608303184489be2160b83396fabb2941cb75554f7705ed9b20a723f0e35ab5e9,
-V = 0331443c4928d41e51f066f9c19ffe16d3136d952d541c5726a8b69acb88da2c11,
-C = 02f6ce8a1ea47a2736b5274328a8a49e5cf38dbf896f86396223a219df68f49588,
-E = f3626cb346393399732569f32e4efffad65a76d27762bb7fef9efdccce0671bf,
+R = 02e3a46f35ce40e59194a7dd349cd701c9940f58a6d75824094e15c00598f66525,
+V = 032459eb39f986ec51c24717d6c211717f8d8bb24a951148c2324e410d15528a81,
+C = 036152bf63d0f3cd012afb9326c260a757c148f30f7de60db2c7819f4eaf74a9ec,
+E = 9616c3a9c752ecca4bf58eca5ed8853f8c0296f318b98ee7dbefe327d55742bd,
+ID = b910c484dbc541799639071705b90234,
+AD = 9b5fa9d07790980f318bf3a705f5bc58,
 


[incubator-milagro-MPC] 05/06: Add benchmark and examples

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 1fa363bc8db0f049ab86f1de948035bda1783990
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Thu May 14 23:43:43 2020 +0100

    Add benchmark and examples
---
 benchmark/bench_d_schnorr.c     |  15 +++++-
 benchmark/bench_factoring_zk.c  |  16 +++++-
 benchmark/bench_schnorr.c       |  14 +++++-
 examples/example_d_schnorr.c    |  24 +++++++--
 examples/example_factoring_zk.c |  14 +++++-
 examples/example_full.c         | 108 ++++++++++++++++++++++++++++++----------
 examples/example_schnorr.c      |  12 ++++-
 7 files changed, 165 insertions(+), 38 deletions(-)

diff --git a/benchmark/bench_d_schnorr.c b/benchmark/bench_d_schnorr.c
index edf4226..9523191 100644
--- a/benchmark/bench_d_schnorr.c
+++ b/benchmark/bench_d_schnorr.c
@@ -27,6 +27,10 @@ under the License.
 #define MIN_TIME    5.0
 #define MIN_ITERS   10
 
+// ID and AD
+char *ID_str = "unique_identifier_123";
+char *AD_hex = "d7d3155616778fb436a1eb2070892205";
+
 // Proof input V = s.R + l.G
 char *S_hex = "803ccd21cddad626e15f21b1ad787949e9beef08e6e68a9e00df59dec16ed290";
 char *L_hex = "0c5afd75c3d8255e6c91dc4aac664337e1a87f74b40f35746fb8a81311715b31";
@@ -57,6 +61,12 @@ int main()
     char v[SFS_SECP256K1+1];
     octet V = {0, sizeof(v), v};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char a[SGS_SECP256K1];
     octet A = {0, sizeof(a), a};
 
@@ -76,6 +86,9 @@ int main()
     octet U = {0, sizeof(u), u};
 
     // Load values
+    OCT_jstring(&ID, ID_str);
+    OCT_fromHex(&AD, AD_hex);
+
     OCT_fromHex(&S, S_hex);
     OCT_fromHex(&L, L_hex);
     OCT_fromHex(&R, R_hex);
@@ -113,7 +126,7 @@ int main()
     start=clock();
     do
     {
-        SCHNORR_D_challenge(&R, &V, &C, &E);
+        SCHNORR_D_challenge(&R, &V, &C, &ID, &AD, &E);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
diff --git a/benchmark/bench_factoring_zk.c b/benchmark/bench_factoring_zk.c
index 0a7445c..fa46877 100644
--- a/benchmark/bench_factoring_zk.c
+++ b/benchmark/bench_factoring_zk.c
@@ -27,6 +27,9 @@ under the License.
 #define MIN_TIME 5.0
 #define MIN_ITERS 10
 
+char *ID_str = "unique_identifier_123";
+char *AD_hex = "d7d3155616778fb436a1eb2070892205";
+
 char *P_hex = "e008507e09c24d756280f3d94912fb9ac16c0a8a1757ee01a350736acfc7f65880f87eca55d6680253383fc546d03fd9ebab7d8fa746455180888cb7c17edf58d3327296468e5ab736374bc9a0fa02606ed5d3a4a5fb1677891f87fbf3c655c3e0549a86b17b7ddce07c8f73e253105e59f5d3ed2c7ba5bdf8495df40ae71a7f";
 char *Q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df71c28707f32b961d160ca938e9cf909cd77c4f8c630aec34b67714cbfd4942d7147c509db131bc2d6a667eb30df146f64b710f8f5247848b0a75738a38772e31014fd63f0b769209928d586499616dcc90700b393156e12eea7e15a835";
 char *N_hex = "c0870b552afb6c8c09f79e39ad6ca17ca93085c2cd7a726ade69574961ff9ce8ad33c7dda2e0703a3b0010c2e5bb7552c74164ce8dd011d85e5969090df53fe10e39cbe530704da32ff07228a6b6da34a5929e8a231c3080d812dc6e93affd81682339a6aee192927c582da8941bebf46e13c4ea3918a1477951fa66d367e70d8551b1869316d48317e0702d7bce242a326000f3dc763c44eba2044a1df713a94c1339edd464b145dcadf94e6e61be73dc270c878e1a28be720df2209202d00e101c3b255b757eaf547acd863d51eb676b851511b3dadeda926714719dceddd3af7908893ae65f2b95ee5c4d36cc6 [...]
@@ -49,6 +52,12 @@ int main()
     char n[FS_2048];
     octet N = {0, sizeof(n), n};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char r[FS_2048];
     octet R = {0, sizeof(r), r};
 
@@ -59,6 +68,9 @@ int main()
     octet Y = {0, sizeof(y), y};
 
     // Load values
+    OCT_jstring(&ID, ID_str);
+    OCT_fromHex(&AD, AD_hex);
+
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
     OCT_fromHex(&N, N_hex);
@@ -73,7 +85,7 @@ int main()
     start = clock();
     do
     {
-        FACTORING_ZK_prove(NULL, &P, &Q, &R, &E, &Y);
+        FACTORING_ZK_prove(NULL, &P, &Q, &ID, &AD, &R, &E, &Y);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
@@ -87,7 +99,7 @@ int main()
     start = clock();
     do
     {
-        rc = FACTORING_ZK_verify(&N, &E, &Y);
+        rc = FACTORING_ZK_verify(&N, &E, &Y, &ID, &AD);
         iterations++;
         elapsed = (clock() - start) / (double)CLOCKS_PER_SEC;
     }
diff --git a/benchmark/bench_schnorr.c b/benchmark/bench_schnorr.c
index 91185ff..49ae5da 100644
--- a/benchmark/bench_schnorr.c
+++ b/benchmark/bench_schnorr.c
@@ -27,6 +27,9 @@ under the License.
 #define MIN_TIME    5.0
 #define MIN_ITERS   10
 
+char *ID_str = "unique_identifier_123";
+char *AD_hex = "d7d3155616778fb436a1eb2070892205";
+
 char *R_hex = "803ccd21cddad626e15f21b1ad787949e9beef08e6e68a9e00df59dec16ed290";
 char *X_hex = "fab4ce512dff74bd9c71c89a14de5b877af45dca0329ee3fcb72611c0784fef3";
 char *V_hex = "032cf4b348c9d00718f01ed98923e164df53b5e8bc4c2250662ed2df784e1784f4";
@@ -45,6 +48,12 @@ int main()
     char v[SFS_SECP256K1+1];
     octet V = {0, sizeof(v), v};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char r[SGS_SECP256K1];
     octet R = {0, sizeof(r), r};
 
@@ -58,6 +67,9 @@ int main()
     octet P = {0, sizeof(p), p};
 
     // Load values
+    OCT_jstring(&ID, ID_str);
+    OCT_fromHex(&AD, AD_hex);
+
     OCT_fromHex(&R, R_hex);
     OCT_fromHex(&X, X_hex);
     OCT_fromHex(&V, V_hex);
@@ -85,7 +97,7 @@ int main()
     start=clock();
     do
     {
-        SCHNORR_challenge(&V, &C, &E);
+        SCHNORR_challenge(&V, &C, &ID, &AD, &E);
         iterations++;
         elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
     }
diff --git a/examples/example_d_schnorr.c b/examples/example_d_schnorr.c
index 552f157..cca1a59 100644
--- a/examples/example_d_schnorr.c
+++ b/examples/example_d_schnorr.c
@@ -44,6 +44,12 @@ int main()
     char v[SFS_SECP256K1+1];
     octet V = {0, sizeof(v), v};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char a[SGS_SECP256K1];
     octet A = {0, sizeof(a), a};
 
@@ -71,6 +77,10 @@ int main()
     ECP_SECP256K1_generator(&G);
     ECP_SECP256K1_generator(&ECPR);
 
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     // Generate public R
     BIG_256_56_randomnum(r, q, &RNG);
     ECP_SECP256K1_mul(&ECPR, r);
@@ -91,14 +101,18 @@ int main()
     ECP_SECP256K1_toOctet(&V, &G, 1);
 
     printf("Double Schnorr's Proof of knowledge of a DLOG. V = s.R + l.G\n");
-    printf("\ts = ");
+    printf("\ts  = ");
     OCT_output(&S);
-    printf("\tl = ");
+    printf("\tl  = ");
     OCT_output(&L);
-    printf("\tR = ");
+    printf("\tR  = ");
     OCT_output(&R);
-    printf("\tV = ");
+    printf("\tV  = ");
     OCT_output(&V);
+    printf("\tID = ");
+    OCT_output(&ID);
+    printf("\tAD = ");
+    OCT_output(&AD);
 
     printf("\nGenerate a commitment C = a.R + b.G\n");
     rc = SCHNORR_D_commit(&RNG, &R, &A, &B, &C);
@@ -116,7 +130,7 @@ int main()
     OCT_output(&C);
 
     printf("\nGenerate a challenge from the public parameters\n");
-    SCHNORR_D_challenge(&R, &V, &C, &E);
+    SCHNORR_D_challenge(&R, &V, &C, &ID, &AD, &E);
 
     printf("\te = ");
     OCT_output(&E);
diff --git a/examples/example_factoring_zk.c b/examples/example_factoring_zk.c
index 3a4741a..f36aaf3 100644
--- a/examples/example_factoring_zk.c
+++ b/examples/example_factoring_zk.c
@@ -36,6 +36,12 @@ int main()
     char n[FS_2048];
     octet N = {0, sizeof(n), n};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char e[FACTORING_ZK_B];
     octet E = {0, sizeof(e), e};
 
@@ -47,6 +53,10 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     // Load RSA modulus
     OCT_fromHex(&P, P_hex);
     OCT_fromHex(&Q, Q_hex);
@@ -62,7 +72,7 @@ int main()
 
     // ZK proof
     printf("\nGenerate proof\n");
-    FACTORING_ZK_prove(&RNG, &P, &Q, NULL, &E, &Y);
+    FACTORING_ZK_prove(&RNG, &P, &Q, &ID, &AD, NULL, &E, &Y);
 
     printf("\tE = ");
     OCT_output(&E);
@@ -73,7 +83,7 @@ int main()
 
     // Verify proof
     printf("\nVerify prove (E, Y) for integer N\n");
-    if(FACTORING_ZK_verify(&N, &E, &Y) == FACTORING_ZK_OK)
+    if(FACTORING_ZK_verify(&N, &E, &Y, &ID, &AD) == FACTORING_ZK_OK)
     {
         printf("\tSuccess!\n");
     }
diff --git a/examples/example_full.c b/examples/example_full.c
index c45dd69..0727b5f 100644
--- a/examples/example_full.c
+++ b/examples/example_full.c
@@ -49,6 +49,10 @@ char *A_Q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c
 char *B_P_hex = "efa013403e9ea93daf97f1dd4b42eba602410e048852b20cd448d51793ac2ee725e79eaac82d22cdd6cfb966cba62904a26da47d7a6085fba194e24eddbc92f66a0bd990c8cb9abf98fff48d52d33215d68f6f030cd9440f85987b2ab44332646ea38bc218fedc83a24cf57b7615c0fc9289778f7ba60f4ed71c7c3c571054fb";
 char *B_Q_hex = "f95b9d7027be3950de9a050eba7301d5234ad89bf260d47e94a724b49759ab9a8fca22fe484e5e5ddf0845734cd3322d271e146e1e6eed6e16a2740c294097cd65deeacbfa563cce42065720836d421bcfd73c6dcab3aa0c4d480ac445e9ba11fb7825559b29ab4f9f6f079acbd0dc5c38702f386b3c95107540195a4508401b";
 
+// Unique identifiers for actors
+char *alice_id = "alice_unique_id";
+char *bob_id   = "bob_unique_id";
+
 int generate_key_material(csprng *RNG, key_material *km, octet *P, octet *Q)
 {
     int rc;
@@ -118,7 +122,7 @@ int generate_key_material(csprng *RNG, key_material *km, octet *P, octet *Q)
     return MPC_OK;
 }
 
-void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *E, octet *Y)
+void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *E, octet *Y, octet *ID, octet *AD)
 {
     char r[EGS_SECP256K1];
     octet R = {0, sizeof(r), r};
@@ -135,7 +139,7 @@ void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *
     /* Prove knowledge of DLOG PK = s.G */
 
     SCHNORR_commit(RNG, &R, C);
-    SCHNORR_challenge(km->PK, C, &S_E);
+    SCHNORR_challenge(km->PK, C, ID, AD, &S_E);
     SCHNORR_prove(&R, &S_E, km->SK, P);
 
     printf("\n\tProve knowledge of ECDSA sk\n");
@@ -145,6 +149,10 @@ void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *
     OCT_output(&S_E);
     printf("\t\tP = ");
     OCT_output(P);
+    printf("\t\tID = ");
+    OCT_output(ID);
+    printf("\t\tAD = ");
+    OCT_output(AD);
 
     OCT_clear(&R);
 
@@ -153,7 +161,7 @@ void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *
     FF_2048_toOctet(&M_P, km->paillier_sk.p, HFLEN_2048);
     FF_2048_toOctet(&M_Q, km->paillier_sk.q, HFLEN_2048);
 
-    FACTORING_ZK_prove(RNG, &M_P, &M_Q, NULL, E, Y);
+    FACTORING_ZK_prove(RNG, &M_P, &M_Q, ID, AD, NULL, E, Y);
 
     printf("\n\tProve knowledge of the Paillier Secret Key\n");
     printf("\t\tE = ");
@@ -165,7 +173,7 @@ void key_material_zkp(csprng *RNG, key_material *km, octet *C, octet *P, octet *
     OCT_clear(&M_Q);
 }
 
-int key_material_verify_zkp(key_material *km, octet *C, octet *P, octet *E, octet *Y)
+int key_material_verify_zkp(key_material *km, octet *C, octet *P, octet *E, octet *Y, octet *ID, octet *AD)
 {
     int rc;
 
@@ -178,7 +186,7 @@ int key_material_verify_zkp(key_material *km, octet *C, octet *P, octet *E, octe
     /* Verify Schnorr Proof for counterparty PK */
     printf("\n\tVerify Proof of knowledge of ECDSA sk\n");
 
-    SCHNORR_challenge(km->CPK, C, &S_E);
+    SCHNORR_challenge(km->CPK, C, ID, AD, &S_E);
     rc = SCHNORR_verify(km->CPK, C, &S_E, P);
     if (rc != SCHNORR_OK)
     {
@@ -192,7 +200,7 @@ int key_material_verify_zkp(key_material *km, octet *C, octet *P, octet *E, octe
 
     PAILLIER_PK_toOctet(&N, &km->paillier_cpk);
 
-    rc = FACTORING_ZK_verify(&N, E, Y);
+    rc = FACTORING_ZK_verify(&N, E, Y, ID, AD);
     if (rc != FACTORING_ZK_OK)
     {
         return rc;
@@ -206,7 +214,8 @@ int key_material_verify_zkp(key_material *km, octet *C, octet *P, octet *E, octe
 /* Key Setup.
  *
  * Step 1.  Generate ECDSA key pair, Paillier key pair and Bit Commitment modulus
- * Setp 1A. Commit to ECDSA public Key, generating commitment and decommitment values.
+ * Setp 1A. Commit to ECDSA public Key, generating commitment and decommitment values. Send nonce
+ *          for liveliness.
  * Step 1B. Transmit Paillier public key, Bit Commitment public modulus and the commitment value
  *
  * Upon receipt of the commitment value from the other party:
@@ -227,6 +236,15 @@ void key_setup(csprng *RNG, key_material *alice_km, key_material *bob_km)
     char safe_q[HFS_2048];
     octet SAFE_Q = {0, sizeof(safe_q), safe_q};
 
+    // Octets for NIZKP ID and AD
+    char id[2][32];
+    octet A_ID = {0, sizeof(id[0]), id[0]};
+    octet B_ID = {0, sizeof(id[1]), id[1]};
+
+    char ad[2][32];
+    octet A_AD = {0, sizeof(ad[0]), ad[0]};
+    octet B_AD = {0, sizeof(ad[1]), ad[1]};
+
     // Octets for Non Malleable Commitments
     char commit_r[2][SHA256];
     octet A_COMMIT_R = {0, sizeof(commit_r[0]), commit_r[0]};
@@ -257,10 +275,13 @@ void key_setup(csprng *RNG, key_material *alice_km, key_material *bob_km)
     char paillier_pk[FS_2048];
     octet PAILLIER_PK = {0, sizeof(paillier_pk), paillier_pk};
 
-    /* Alice - generate key material and commitment */
+    /* Alice - generate key material, commitment and AD*/
 
     printf("\n[Alice] Generate key material\n");
 
+    OCT_jstring(&A_ID, alice_id);
+    OCT_rand(&B_AD, RNG, B_AD.len);
+
     OCT_fromHex(&SAFE_P, A_P_hex);
     OCT_fromHex(&SAFE_Q, A_Q_hex);
 
@@ -287,10 +308,13 @@ void key_setup(csprng *RNG, key_material *alice_km, key_material *bob_km)
     PAILLIER_PK_fromOctet(&bob_km->paillier_cpk, &PAILLIER_PK);
     COMMITMENTS_BC_export_public_modulus(&bob_km->bc_cpm, &alice_km->bc_sm);
 
-    /* Bob - generate key material and commitment */
+    /* Bob - generate key material, commitment and AD */
 
     printf("\n[Bob] Generate key material\n");
 
+    OCT_jstring(&B_ID, bob_id);
+    OCT_rand(&A_AD, RNG, A_AD.len);
+
     OCT_fromHex(&SAFE_P, B_P_hex);
     OCT_fromHex(&SAFE_Q, B_Q_hex);
 
@@ -372,21 +396,21 @@ void key_setup(csprng *RNG, key_material *alice_km, key_material *bob_km)
     /* Alice - generate key material ZKP */
 
     printf("\n[Alice] Prove correctness of key material\n");
-    key_material_zkp(RNG, alice_km, &A_KZKP_C, &A_KZKP_P, &A_KZKP_E, &A_KZKP_Y);
+    key_material_zkp(RNG, alice_km, &A_KZKP_C, &A_KZKP_P, &A_KZKP_E, &A_KZKP_Y, &A_ID, &A_AD);
 
     printf("\n[Alice] Transmit C, P, E, Y\n");
 
     /* Bob - generate key material ZKP */
 
     printf("\n[Bob] Prove correctness of key material\n");
-    key_material_zkp(RNG, bob_km, &B_KZKP_C, &B_KZKP_P, &B_KZKP_E, &B_KZKP_Y);
+    key_material_zkp(RNG, bob_km, &B_KZKP_C, &B_KZKP_P, &B_KZKP_E, &B_KZKP_Y, &B_ID, &B_AD);
 
     printf("\n[Bob] Transmit C, P, E, Y\n");
 
     /* Alice/Bob - verify key material ZKP */
 
     printf("\n[Alice] Verify Key Material ZKP\n");
-    rc = key_material_verify_zkp(alice_km, &B_KZKP_C, &B_KZKP_P, &B_KZKP_E, &B_KZKP_Y);
+    rc = key_material_verify_zkp(alice_km, &B_KZKP_C, &B_KZKP_P, &B_KZKP_E, &B_KZKP_Y, &B_ID, &B_AD);
     if (rc != MPC_OK)
     {
         printf("\n FAILURE invalid ZKP for Bob key material. rc %d\n", rc);
@@ -394,7 +418,7 @@ void key_setup(csprng *RNG, key_material *alice_km, key_material *bob_km)
     }
 
     printf("\n[Bob] Verify Key Material ZKP\n");
-    rc = key_material_verify_zkp(bob_km, &A_KZKP_C, &A_KZKP_P, &A_KZKP_E, &A_KZKP_Y);
+    rc = key_material_verify_zkp(bob_km, &A_KZKP_C, &A_KZKP_P, &A_KZKP_E, &A_KZKP_Y, &A_ID, &A_AD);
     if (rc != MPC_OK)
     {
         printf("\n FAILURE invalid ZKP for Alice key material. rc %d\n", rc);
@@ -763,7 +787,8 @@ void mtawc(csprng *RNG, key_material *alice_km, key_material *bob_km, octet *K,
 /* Phase 5 interactive proof of consistency of the signature shares
  *
  * Step 1.  Each player generates random values phi and rho and commitments
- *          V, A and commits to the value (V, A)
+ *          V, A and commits to the value (V, A). It also generates a nonce
+ *          for liveliness
  * Step 2.  The values (V, A) are decommited and the players prove they are
  *          well formed
  * Step 2A. The well formedness proofs are transmitted and verified
@@ -803,6 +828,15 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
     octet T2 = {0, sizeof(t[1]), t[1]};
     octet *T[2] = {&T1, &T2};
 
+    // Octets for NIZKP ID and AD
+    char id[2][32];
+    octet A_ID = {0, sizeof(id[0]), id[0]};
+    octet B_ID = {0, sizeof(id[1]), id[1]};
+
+    char ad[2][32];
+    octet A_AD = {0, sizeof(ad[0]), ad[0]};
+    octet B_AD = {0, sizeof(ad[1]), ad[1]};
+
     // Octets for Non Malleable Commitments
     char double_ecp[2 * EFS_SECP256K1 + 2];
     octet DOUBLE_ECP = {0, sizeof(double_ecp), double_ecp};
@@ -857,6 +891,9 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\n[Alice] Generate commitment (V, A) for Phase5 proof and nm commit to it\n");
 
+    OCT_jstring(&A_ID, alice_id);
+    OCT_rand(&B_AD, RNG, B_AD.len);
+
     rc = MPC_PHASE5_commit(RNG, RP1, S1, &PHI1, &RHO1, &V1, &A1);
     if (rc != MPC_OK)
     {
@@ -891,6 +928,9 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\n[Bob] Generate commitment (V, A) for Phase5 proof and nm commit to it\n");
 
+    OCT_jstring(&B_ID, bob_id);
+    OCT_rand(&A_AD, RNG, A_AD.len);
+
     rc = MPC_PHASE5_commit(RNG, RP2, S2, &PHI2, &RHO2, &V2, &A2);
     if (rc != MPC_OK)
     {
@@ -956,7 +996,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
     printf("\n[Alice] Generate DSchnorr Proof for PHI, SK, V\n");
 
     SCHNORR_D_commit(RNG, RP1, &SCHNORR_A1, &SCHNORR_B1, &SCHNORR_D1);
-    SCHNORR_D_challenge(RP1, &V1, &SCHNORR_D1, &SCHNORR_E1);
+    SCHNORR_D_challenge(RP1, &V1, &SCHNORR_D1, &A_ID, &A_AD, &SCHNORR_E1);
     SCHNORR_D_prove(&SCHNORR_A1, &SCHNORR_B1, &SCHNORR_E1, S1, &PHI1, &SCHNORR_T1, &SCHNORR_U1);
 
     printf("\tD = ");
@@ -971,7 +1011,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
     printf("\n[Alice] Generate Schnorr Proof for A, RHO\n");
 
     SCHNORR_commit(RNG, &SCHNORR_R1, &SCHNORR_C1);
-    SCHNORR_challenge(&A1, &SCHNORR_C1, &SCHNORR_E1);
+    SCHNORR_challenge(&A1, &SCHNORR_C1, &A_ID, &A_AD, &SCHNORR_E1);
     SCHNORR_prove(&SCHNORR_R1, &SCHNORR_E1, &RHO1, &SCHNORR_P1);
 
     printf("\tC = ");
@@ -986,7 +1026,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
     printf("\n[Bob] Generate DSchnorr Proof for PHI, SK, V\n");
 
     SCHNORR_D_commit(RNG, RP2, &SCHNORR_A2, &SCHNORR_B2, &SCHNORR_D2);
-    SCHNORR_D_challenge(RP2, &V2, &SCHNORR_D2, &SCHNORR_E2);
+    SCHNORR_D_challenge(RP2, &V2, &SCHNORR_D2, &B_ID, &B_AD, &SCHNORR_E2);
     SCHNORR_D_prove(&SCHNORR_A2, &SCHNORR_B2, &SCHNORR_E2, S2, &PHI2, &SCHNORR_T2, &SCHNORR_U2);
 
     printf("\tC = ");
@@ -1001,7 +1041,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
     printf("\n[Bob] Generate Schnorr Proof for A, RHO\n");
 
     SCHNORR_commit(RNG, &SCHNORR_R2, &SCHNORR_C2);
-    SCHNORR_challenge(&A2, &SCHNORR_C2, &SCHNORR_E2);
+    SCHNORR_challenge(&A2, &SCHNORR_C2, &B_ID, &B_AD, &SCHNORR_E2);
     SCHNORR_prove(&SCHNORR_R2, &SCHNORR_E2, &RHO2, &SCHNORR_P2);
 
     printf("\tC = ");
@@ -1017,7 +1057,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\tVerify Proof for V\n");
 
-    SCHNORR_D_challenge(RP2, &V2, &SCHNORR_D2, &SCHNORR_E2);
+    SCHNORR_D_challenge(RP2, &V2, &SCHNORR_D2, &B_ID, &B_AD, &SCHNORR_E2);
     printf("\t\tE = ");
     OCT_output(&SCHNORR_E2);
 
@@ -1032,7 +1072,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\n\tVerify Proof for A\n");
 
-    SCHNORR_challenge(&A2, &SCHNORR_C2, &SCHNORR_E2);
+    SCHNORR_challenge(&A2, &SCHNORR_C2, &B_ID, &B_AD, &SCHNORR_E2);
     printf("\t\tE = ");
     OCT_output(&SCHNORR_E2);
 
@@ -1049,7 +1089,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\tVerify Proof for V\n");
 
-    SCHNORR_D_challenge(RP1, &V1, &SCHNORR_D1, &SCHNORR_E1);
+    SCHNORR_D_challenge(RP1, &V1, &SCHNORR_D1, &A_ID, &A_AD, &SCHNORR_E1);
     printf("\t\tE = ");
     OCT_output(&SCHNORR_E1);
 
@@ -1064,7 +1104,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 
     printf("\n\tVerify Proof for A\n");
 
-    SCHNORR_challenge(&A1, &SCHNORR_C1, &SCHNORR_E1);
+    SCHNORR_challenge(&A1, &SCHNORR_C1, &A_ID, &A_AD, &SCHNORR_E1);
     printf("\t\tE = ");
     OCT_output(&SCHNORR_E1);
 
@@ -1180,6 +1220,7 @@ void phase5(csprng *RNG, octet *RP1, octet *RP2, octet *R1, octet *R2, octet *HM
 /* Signature.
  *
  * Step 1.  Each player generates random k, gamma and commits to gamma.G
+ *          It also generates a nonce for liveliness
  * Step 2.  Each player performs a MTA with shares k_i, gamma_j
  * Step 2A. Each player performs a MTAWC with shares k_i, sk_j
  * Step 3.  Each player sums the output of the MTA runs with the product k_i * gamma_i
@@ -1212,6 +1253,15 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
     octet GAMMAPT1 = {0, sizeof(gammapt[0]), gammapt[0]};
     octet GAMMAPT2 = {0, sizeof(gammapt[1]), gammapt[1]};
 
+    // Octets for NIZKP ID and AD
+    char id[2][32];
+    octet A_ID = {0, sizeof(id[0]), id[0]};
+    octet B_ID = {0, sizeof(id[1]), id[1]};
+
+    char ad[2][32];
+    octet A_AD = {0, sizeof(ad[0]), ad[0]};
+    octet B_AD = {0, sizeof(ad[1]), ad[1]};
+
     // Octets for Non Malleable Commitments
     char commit_r[2][SHA256];
     octet A_COMMIT_R = {0, sizeof(commit_r[0]), commit_r[0]};
@@ -1288,6 +1338,9 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
 
     printf("\n[Alice] Generate random K and GAMMA and commit to GAMMA.G\n");
 
+    OCT_jstring(&A_ID, alice_id);
+    OCT_rand(&B_AD, RNG, B_AD.len);
+
     BIG_256_56_randomnum(k1, q, RNG);
     BIG_256_56_toBytes(K1.val, k1);
     K1.len = EGS_SECP256K1;
@@ -1318,6 +1371,9 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
 
     printf("\n[Bob] Generate random K and GAMMA and commit to GAMMA.G\n");
 
+    OCT_jstring(&B_ID, bob_id);
+    OCT_rand(&A_AD, RNG, A_AD.len);
+
     BIG_256_56_randomnum(k2, q, RNG);
     BIG_256_56_toBytes(K2.val, k2);
     K2.len = EGS_SECP256K1;
@@ -1403,7 +1459,7 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
     printf("\n[Alice] Generate Schnorr Proof for DLOG GAMMA, GAMMA.G\n");
 
     SCHNORR_commit(RNG, &SCHNORR_R1, &SCHNORR_C1);
-    SCHNORR_challenge(&GAMMAPT1, &SCHNORR_C1, &SCHNORR_E1);
+    SCHNORR_challenge(&GAMMAPT1, &SCHNORR_C1, &A_ID, &A_AD, &SCHNORR_E1);
     SCHNORR_prove(&SCHNORR_R1, &SCHNORR_E1, &GAMMA1, &SCHNORR_P1);
 
     printf("\tC = ");
@@ -1420,7 +1476,7 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
     printf("\n[Bob] Generate Schnorr Proof for DLOG GAMMA, GAMMA.G\n");
 
     SCHNORR_commit(RNG, &SCHNORR_R2, &SCHNORR_C2);
-    SCHNORR_challenge(&GAMMAPT2, &SCHNORR_C2, &SCHNORR_E2);
+    SCHNORR_challenge(&GAMMAPT2, &SCHNORR_C2, &B_ID, &B_AD, &SCHNORR_E2);
     SCHNORR_prove(&SCHNORR_R2, &SCHNORR_E2, &GAMMA2, &SCHNORR_P2);
 
     printf("\tC = ");
@@ -1448,7 +1504,7 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
     printf("\n[Alice] Verify Schnorr Proof for GAMMA.G\n");
 
     OCT_clear(&SCHNORR_E2);
-    SCHNORR_challenge(&GAMMAPT2, &SCHNORR_C2, &SCHNORR_E2);
+    SCHNORR_challenge(&GAMMAPT2, &SCHNORR_C2, &B_ID, &B_AD, &SCHNORR_E2);
 
     printf("\tE = ");
     OCT_output(&SCHNORR_E2);
@@ -1478,7 +1534,7 @@ void signature(csprng *RNG, octet *M, key_material *alice_km, key_material *bob_
     printf("\n[Bob] Verify Schnorr Proof for GAMMA.G\n");
 
     OCT_clear(&SCHNORR_E1);
-    SCHNORR_challenge(&GAMMAPT1, &SCHNORR_C1, &SCHNORR_E1);
+    SCHNORR_challenge(&GAMMAPT1, &SCHNORR_C1, &A_ID, &A_AD, &SCHNORR_E1);
 
     printf("\tE = ");
     OCT_output(&SCHNORR_E1);
diff --git a/examples/example_schnorr.c b/examples/example_schnorr.c
index 6ecc719..3dad6e8 100644
--- a/examples/example_schnorr.c
+++ b/examples/example_schnorr.c
@@ -35,6 +35,12 @@ int main()
     char v[SFS_SECP256K1+1];
     octet V = {0, sizeof(v), v};
 
+    char id[32];
+    octet ID = {0, sizeof(id), id};
+
+    char ad[32];
+    octet AD = {0, sizeof(ad), ad};
+
     char r[SGS_SECP256K1];
     octet R = {0, sizeof(r), r};
 
@@ -52,6 +58,10 @@ int main()
     csprng RNG;
     RAND_seed(&RNG, 32, seed);
 
+    // Generate ID and AD
+    OCT_rand(&ID, &RNG, ID.len);
+    OCT_rand(&AD, &RNG, AD.len);
+
     // Generate DLOG
     BIG_256_56_rcopy(q, CURVE_Order_SECP256K1);
     BIG_256_56_randomnum(x, q, &RNG);
@@ -79,7 +89,7 @@ int main()
     OCT_output(&C);
 
     printf("\nGenerate a challenge from the public parameters\n");
-    SCHNORR_challenge(&V, &C, &E);
+    SCHNORR_challenge(&V, &C, &ID, &AD, &E);
 
     printf("\te = ");
     OCT_output(&E);


[incubator-milagro-MPC] 06/06: update python wrappers

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit 739cfe6ee667c908a4fe598bc634d5426a596c25
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Thu May 14 23:43:57 2020 +0100

    update python wrappers
---
 python/amcl/core_utils.py               |  2 ++
 python/amcl/factoring_zk.py             | 48 +++++++++++++++++++++----------
 python/amcl/schnorr.py                  | 25 +++++++++++------
 python/benchmark/bench_schnorr.py       | 14 +++++----
 python/benchmark/bench_zk_factoring.py  | 20 +++++++------
 python/examples/example_full.py         | 43 +++++++++++++++++-----------
 python/examples/example_schnorr.py      | 24 ++++++++++------
 python/examples/example_zk_factoring.py | 16 +++++++----
 python/test/CMakeLists.txt              |  2 +-
 python/test/test_schnorr.py             | 11 ++++++--
 python/test/test_zk_factoring.py        | 50 +++++++++++++++++++++------------
 11 files changed, 167 insertions(+), 88 deletions(-)

diff --git a/python/amcl/core_utils.py b/python/amcl/core_utils.py
index 4b09d65..cfad037 100644
--- a/python/amcl/core_utils.py
+++ b/python/amcl/core_utils.py
@@ -197,6 +197,8 @@ def generate_random(rng, length):
 
     """
     random_value1, random_value1_val = make_octet(length)
+    _ = random_value1_val # Suppress warning
+
     _libamcl_core.generateRandom(rng, random_value1)
 
     random_value = to_str(random_value1)
diff --git a/python/amcl/factoring_zk.py b/python/amcl/factoring_zk.py
index d4eb3d6..32b8f3f 100644
--- a/python/amcl/factoring_zk.py
+++ b/python/amcl/factoring_zk.py
@@ -28,8 +28,8 @@ from . import core_utils
 
 _ffi = core_utils._ffi
 _ffi.cdef("""
-void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *R, octet *E, octet *Y);
-int FACTORING_ZK_verify(octet *N, octet *E, octet *Y);
+void FACTORING_ZK_prove(csprng *RNG, octet *P, octet *Q, octet *ID, octet *AD, octet *R, octet *E, octet *Y);
+int FACTORING_ZK_verify(octet *N, octet *E, octet *Y, octet *ID, octet *AD);
 """)
 
 if (platform.system() == 'Windows'):
@@ -51,7 +51,7 @@ OK   = 0
 FAIL = 91
 
 
-def prove(rng, p, q, r=None):
+def prove(rng, p, q, id, ad=None, r=None):
     """Generate factoring knowledge proof
 
 
@@ -62,6 +62,8 @@ def prove(rng, p, q, r=None):
               number generator instance
         p   : First prime factor of n. HFS_2048 bytes long
         q   : Second prime factor of n. HFS_2048 bytes long
+        id  : Unique identifier of the prover
+        ad  : Additional data to bind in the proof. Optional
         r   : Deterministic value for r. FS_2048 bytes long
 
     Returns::
@@ -79,13 +81,20 @@ def prove(rng, p, q, r=None):
         _ = r_val # Suppress warning
         rng = _ffi.NULL
 
-    p_oct, p_val = core_utils.make_octet(None, p)
-    q_oct, q_val = core_utils.make_octet(None, q)
-    e_oct, e_val = core_utils.make_octet(B)
-    y_oct, y_val = core_utils.make_octet(FS_2048)
-    _ = p_val, q_val, e_val, y_val # Suppress warnings
+    if ad is None:
+        ad_oct = _ffi.NULL
+    else:
+        ad_oct, ad_val = core_utils.make_octet(None, ad)
+        _ = ad_val # Suppress warning
+
+    p_oct, p_val   = core_utils.make_octet(None, p)
+    q_oct, q_val   = core_utils.make_octet(None, q)
+    e_oct, e_val   = core_utils.make_octet(B)
+    y_oct, y_val   = core_utils.make_octet(FS_2048)
+    id_oct, id_val = core_utils.make_octet(None, id)
+    _ = p_val, q_val, e_val, y_val, id_val # Suppress warnings
 
-    _libamcl_mpc.FACTORING_ZK_prove(rng, p_oct, q_oct, r_oct, e_oct, y_oct)
+    _libamcl_mpc.FACTORING_ZK_prove(rng, p_oct, q_oct, id_oct, ad_oct, r_oct, e_oct, y_oct)
 
     # Clear memory
     core_utils.clear_octet(p_oct)
@@ -94,7 +103,7 @@ def prove(rng, p, q, r=None):
     return core_utils.to_str(e_oct), core_utils.to_str(y_oct)
 
 
-def verify(n, e, y):
+def verify(n, e, y, id, ad=None):
     """Verify knowledge of factoring proof
 
     Args::
@@ -102,6 +111,8 @@ def verify(n, e, y):
         n : public modulus
         e : First component of the factoring proof. B bytes long
         y : Second component of the factoring proof. FS_2048 bytes long
+        id  : Unique identifier of the prover
+        ad  : Additional data to bind in the challenge. Optional
 
     Returns::
 
@@ -110,11 +121,18 @@ def verify(n, e, y):
     Raises:
 
     """
-    n_oct, n_val = core_utils.make_octet(None, n)
-    e_oct, e_val = core_utils.make_octet(None, e)
-    y_oct, y_val = core_utils.make_octet(None, y)
-    _ = n_val, e_val, y_val # Suppress warning
+    if ad is None:
+        ad_oct = _ffi.NULL
+    else:
+        ad_oct, ad_val = core_utils.make_octet(None, ad)
+        _ = ad_val # Suppress warning
+
+    n_oct, n_val   = core_utils.make_octet(None, n)
+    e_oct, e_val   = core_utils.make_octet(None, e)
+    y_oct, y_val   = core_utils.make_octet(None, y)
+    id_oct, id_val = core_utils.make_octet(None, id)
+    _ = n_val, e_val, y_val, id_val # Suppress warning
 
-    rc = _libamcl_mpc.FACTORING_ZK_verify(n_oct, e_oct, y_oct)
+    rc = _libamcl_mpc.FACTORING_ZK_verify(n_oct, e_oct, y_oct, id_oct, ad_oct)
 
     return rc
diff --git a/python/amcl/schnorr.py b/python/amcl/schnorr.py
index d6c462c..49b57d3 100644
--- a/python/amcl/schnorr.py
+++ b/python/amcl/schnorr.py
@@ -30,7 +30,7 @@ _ffi = core_utils._ffi
 _ffi.cdef("""
 extern void SCHNORR_random_challenge(csprng *RNG, octet *E);
 extern void SCHNORR_commit(csprng *RNG, octet *R, octet *C);
-extern void SCHNORR_challenge(const octet *V, const octet *C, octet *E);
+extern void SCHNORR_challenge(const octet *V, const octet *C, octet *ID, octet *AD, octet *E);
 extern void SCHNORR_prove(const octet *R, const octet *E, const octet *X, octet *P);
 extern int SCHNORR_verify(octet *V, octet *C, const octet *E, const octet *P);
 """)
@@ -121,7 +121,7 @@ def commit(rng, r=None):
     return r, core_utils.to_str(C)
 
 
-def challenge(V, C):
+def challenge(V, C, ID, AD=None):
     """Generate a deterministic challenge for the Schnorr's Proof
 
     Generates a deterministic value r in [0, .., q] suitable as a
@@ -130,8 +130,10 @@ def challenge(V, C):
 
     Args::
 
-        V : Public ECP of the DLOG. V = x.G
-        C : Commitment for the Schnorr's Proof
+        V  : Public ECP of the DLOG. V = x.G
+        C  : Commitment for the Schnorr's Proof
+        ID : Unique idenitifier of the prover
+        AD : Additional data to bind in the challenge. Optional
 
     Returns::
 
@@ -140,14 +142,21 @@ def challenge(V, C):
     Raises:
 
     """
-    V_oct, V_val = core_utils.make_octet(None, V)
-    C_oct, C_val = core_utils.make_octet(None, C)
-    _ = V_val, C_val # Suppress warning
+    if AD is None:
+        AD_oct = _ffi.NULL
+    else:
+        AD_oct, AD_val = core_utils.make_octet(None, AD)
+        _ = AD_val # Suppress warning
+
+    V_oct, V_val   = core_utils.make_octet(None, V)
+    C_oct, C_val   = core_utils.make_octet(None, C)
+    ID_oct, ID_val = core_utils.make_octet(None, ID)
+    _ = V_val, C_val, ID_val # Suppress warning
 
     e, e_val = core_utils.make_octet(EGS)
     _ = e_val # Suppress warning
 
-    _libamcl_mpc.SCHNORR_challenge(V_oct, C_oct, e)
+    _libamcl_mpc.SCHNORR_challenge(V_oct, C_oct, ID_oct, AD_oct, e)
 
     return core_utils.to_str(e)
 
diff --git a/python/benchmark/bench_schnorr.py b/python/benchmark/bench_schnorr.py
index ba95584..e70e68c 100755
--- a/python/benchmark/bench_schnorr.py
+++ b/python/benchmark/bench_schnorr.py
@@ -30,14 +30,18 @@ r_hex = "803ccd21cddad626e15f21b1ad787949e9beef08e6e68a9e00df59dec16ed290"
 x_hex = "fab4ce512dff74bd9c71c89a14de5b877af45dca0329ee3fcb72611c0784fef3"
 V_hex = "032cf4b348c9d00718f01ed98923e164df53b5e8bc4c2250662ed2df784e1784f4"
 
+ID = b"unique_user_identifier"
+AD_hex = "d7d3155616778fb436a1eb2070892205" 
+
 if __name__ == "__main__":
-    r = bytes.fromhex(r_hex)
-    x = bytes.fromhex(x_hex)
-    V = bytes.fromhex(V_hex)
+    r  = bytes.fromhex(r_hex)
+    x  = bytes.fromhex(x_hex)
+    V  = bytes.fromhex(V_hex)
+    AD = bytes.fromhex(AD_hex)
 
     # Generate quantities for benchmark
     r, C = schnorr.commit(None, r)
-    e = schnorr.challenge(V, C)
+    e = schnorr.challenge(V, C, ID, AD=AD)
     p = schnorr.prove(r, e, x)
 
     # Check consistency of the generated quantities
@@ -47,7 +51,7 @@ if __name__ == "__main__":
     fncall = lambda: schnorr.commit(None, r)
     time_func("commit   ", fncall, unit="us")
 
-    fncall = lambda: schnorr.challenge(V, C)
+    fncall = lambda: schnorr.challenge(V, C, ID, AD=AD)
     time_func("challenge", fncall, unit="us")
 
     fncall = lambda: schnorr.prove(r, e, x)
diff --git a/python/benchmark/bench_zk_factoring.py b/python/benchmark/bench_zk_factoring.py
index f9ab584..342f067 100755
--- a/python/benchmark/bench_zk_factoring.py
+++ b/python/benchmark/bench_zk_factoring.py
@@ -31,19 +31,23 @@ q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df7
 n_hex = "c0870b552afb6c8c09f79e39ad6ca17ca93085c2cd7a726ade69574961ff9ce8ad33c7dda2e0703a3b0010c2e5bb7552c74164ce8dd011d85e5969090df53fe10e39cbe530704da32ff07228a6b6da34a5929e8a231c3080d812dc6e93affd81682339a6aee192927c582da8941bebf46e13c4ea3918a1477951fa66d367e70d8551b1869316d48317e0702d7bce242a326000f3dc763c44eba2044a1df713a94c1339edd464b145dcadf94e6e61be73dc270c878e1a28be720df2209202d00e101c3b255b757eaf547acd863d51eb676b851511b3dadeda926714719dceddd3af7908893ae65f2b95ee5c4d36cc6862cbe [...]
 r_hex = "c05f6c79e81fab2f1aa6af48dc5afa89a21c0aee03e93944cacfefef1be90f41ec8c2055760beafa9ed87dd67dbd56b33a2568dfec62a03f06c4f8449a93eee858507f4b602bf305e1c9968d9f5b6dc3120c27e053a1d7e51590e0bacb8d36c27bccce1a57c1e3aeb0832905d4e2bb8eaee883b4df042d8660cf3e0c9777b6be34c18bef02347f92cb71f372f61c018860211932dd46de8f925212d7afe6dd2f3cda05f8d5a6bd1b138b66c5efd7fca31f926c721f6d4207b97fc01cdf325da21233f6df37adbcd67472b332f7490a4a96e0fef31beef55b9446067b8e8d807384e3d31051c7a1f27296a6ae111b30c3d1f [...]
 
+uid = b"unique_user_identifier"
+ad_hex = "d7d3155616778fb436a1eb2070892205" 
+
 if __name__ == "__main__":
-    p = bytes.fromhex(p_hex)
-    q = bytes.fromhex(q_hex)
-    n = bytes.fromhex(n_hex)
-    r = bytes.fromhex(r_hex)
+    p =  bytes.fromhex(p_hex)
+    q =  bytes.fromhex(q_hex)
+    n =  bytes.fromhex(n_hex)
+    r =  bytes.fromhex(r_hex)
+    ad = bytes.fromhex(ad_hex)
 
     # Generate quantities for benchmark
-    e, y = factoring_zk.prove(None, p, q, r)
-    assert factoring_zk.verify(n, e, y) == factoring_zk.OK
+    e, y = factoring_zk.prove(None, p, q, uid, ad=ad, r=r)
+    assert factoring_zk.verify(n, e, y, uid, ad=ad) == factoring_zk.OK
 
     # Run benchmark
-    fncall = lambda: factoring_zk.prove(None, p, q, r)
+    fncall = lambda: factoring_zk.prove(None, p, q, uid, ad=ad, r=r)
     time_func("prove ", fncall)
 
-    fncall = lambda: factoring_zk.verify(n, e, y)
+    fncall = lambda: factoring_zk.verify(n, e, y, uid, ad=ad)
     time_func("verify", fncall)
diff --git a/python/examples/example_full.py b/python/examples/example_full.py
index cece81b..f8b0448 100755
--- a/python/examples/example_full.py
+++ b/python/examples/example_full.py
@@ -66,7 +66,7 @@ def generate_key_material(rng, player):
     return key_material
 
 
-def generate_key_material_zkp(rng, key_material):
+def generate_key_material_zkp(rng, key_material, ID, AD=None):
     """ Generate ZK Proofs for key material
 
     Generate a commitment to the ECDSA PK, a Schnorr's
@@ -98,19 +98,19 @@ def generate_key_material_zkp(rng, key_material):
 
     # Generate Schnorr's proof for ECDSA PK
     sr, sc = schnorr.commit(rng)
-    e = schnorr.challenge(key_material['ecdsa_pk'], sc)
+    e = schnorr.challenge(key_material['ecdsa_pk'], sc, ID, AD=AD)
     sp = schnorr.prove(sr, e, key_material['ecdsa_sk'])
 
     # Generate ZKP of knowledge of factorization for
     # Paillier key pair
     psk_p, psk_q = mpc.mpc_dump_paillier_sk(key_material['paillier_sk'])
 
-    fe, fy = factoring_zk.prove(rng, psk_p, psk_q)
+    fe, fy = factoring_zk.prove(rng, psk_p, psk_q, ID, ad=AD)
 
     return r, c, sc, sp, fe, fy
 
 
-def verify_key_material(key_material, r, c, sc, sp, fe, fy, player):
+def verify_key_material(key_material, r, c, sc, sp, fe, fy, player, ID, AD=None):
     """ Verify key material
 
     Verify the conunterparty key material using the
@@ -137,13 +137,13 @@ def verify_key_material(key_material, r, c, sc, sp, fe, fy, player):
     assert rc == commitments.OK, f"[{player}] Failure decommitting ecdsa_pk. rc {rc}"
 
     # Verify ECDSA PK Schnorr's proof
-    e = schnorr.challenge(key_material['ecdsa_pk'], sc)
+    e = schnorr.challenge(key_material['ecdsa_pk'], sc, ID, AD=AD)
     rc = schnorr.verify(key_material['ecdsa_pk'], sc, e, sp)
     assert rc == schnorr.OK, f"[{player}] Invalid ECDSA PK Schnorr Proof. rc {rc}"
 
     # Verify factoring ZKP
     n = mpc.paillier_pk_to_octet(key_material['paillier_pk'])
-    rc = factoring_zk.verify(n, fe, fy)
+    rc = factoring_zk.verify(n, fe, fy, ID, ad=AD)
     assert rc == factoring_zk.OK, f"[{player}] Invalid Factoring ZKP. rc {rc}"
 
 
@@ -152,6 +152,9 @@ if __name__ == "__main__":
     rng = core_utils.create_csprng(seed)
 
 
+    alice_id = b"alice_unique_identifier"
+    bob_id   = b"bob_unique_identifier"
+
     ### Key setup ###
 
     print("Setup Key Material\n")
@@ -160,12 +163,16 @@ if __name__ == "__main__":
     key_material1 = generate_key_material(rng, "Alice")
     key_material2 = generate_key_material(rng, "Bob")
 
+    # Generate and exchange nonce for liveliness
+    alice_ad = core_utils.generate_random(rng, 32)
+    bob_ad   = core_utils.generate_random(rng, 32)
+
     print("[Alice] Generate ECDSA and Paillier key pairs")
     print("[Bob] Generate ECDSA and Paillier key pairs")
 
     # Generate key material ZKP
-    r1, c1, sc1, sp1, fe1, fy1 = generate_key_material_zkp(rng, key_material1)
-    r2, c2, sc2, sp2, fe2, fy2 = generate_key_material_zkp(rng, key_material2)
+    r1, c1, sc1, sp1, fe1, fy1 = generate_key_material_zkp(rng, key_material1, alice_id, AD = alice_ad)
+    r2, c2, sc2, sp2, fe2, fy2 = generate_key_material_zkp(rng, key_material2, bob_id,   AD = bob_ad)
 
     print("[Alice] Generate commitment to ECDSA PK and ZKPs")
     print("[Bob] Generate commitment to ECDSA PK and ZKPs")
@@ -190,10 +197,10 @@ if __name__ == "__main__":
     }
 
     print("[Alice] Verify ZKP")
-    verify_key_material(c_key_material1, r2, c2, sc2, sp2, fe2, fy2, "Alice")
+    verify_key_material(c_key_material1, r2, c2, sc2, sp2, fe2, fy2, "Alice", bob_id, AD=bob_ad)
 
     print("[Bob] Verify ZKP")
-    verify_key_material(c_key_material2, r1, c1, sc1, sp1, fe1, fy1, "Bob")
+    verify_key_material(c_key_material2, r1, c1, sc1, sp1, fe1, fy1, "Bob", alice_id, AD=alice_ad)
 
     # Recombine full ECDSA PK
     rc, ecdsa_full_pk1 = mpc.mpc_sum_pk(key_material1['ecdsa_pk'], c_key_material1['ecdsa_pk'])
@@ -208,7 +215,7 @@ if __name__ == "__main__":
     # Message
     M = b'test message'
 
-    print(f"\nSign message '{M.encode('utf-8')}'")
+    print(f"\nSign message '{M.decode('utf-8')}'")
 
     # Generate k, gamma and gamma.G
     print("[Alice] Generate k, gamma and gamma.G")
@@ -219,13 +226,17 @@ if __name__ == "__main__":
     GAMMA2, gamma2 = mpc.mpc_ecdsa_key_pair_generate(rng)
     k2 = mpc.mpc_k_generate(rng)
 
-    ## Commit to GAMMA1, GAMMA2
+    ## Commit to GAMMA1, GAMMA2 and exchange nonces for liveliness
     print("[Alice] Commit to GAMMA1")
     GAMMAR1, GAMMAC1 = commitments.nm_commit(rng, GAMMA1)
 
+    bob_ad = core_utils.generate_random(rng, 32)
+
     print("[Bob] Commit to GAMMA2")
     GAMMAR2, GAMMAC2 = commitments.nm_commit(rng, GAMMA2)
 
+    alice_ad = core_utils.generate_random(rng, 32)
+
     ## Engage in MTA with k_i, gamma_j
 
     # k1, gamma2
@@ -275,12 +286,12 @@ if __name__ == "__main__":
     # Generate Schnorr's Proofs
     print("[Alice] Generate Schnorr's Proof")
     GAMMA_schnorr_r1, GAMMA_schnorr_c1 = schnorr.commit(rng)
-    GAMMA_schnorr_e1 = schnorr.challenge(GAMMA1, GAMMA_schnorr_c1)
+    GAMMA_schnorr_e1 = schnorr.challenge(GAMMA1, GAMMA_schnorr_c1, alice_id, AD = alice_ad)
     GAMMA_schnorr_p1 = schnorr.prove(GAMMA_schnorr_r1, GAMMA_schnorr_e1, gamma1)
 
     print("[Bob] Generate Schnorr's Proof")
     GAMMA_schnorr_r2, GAMMA_schnorr_c2 = schnorr.commit(rng)
-    GAMMA_schnorr_e2 = schnorr.challenge(GAMMA2, GAMMA_schnorr_c2)
+    GAMMA_schnorr_e2 = schnorr.challenge(GAMMA2, GAMMA_schnorr_c2, bob_id, AD = bob_ad)
     GAMMA_schnorr_p2 = schnorr.prove(GAMMA_schnorr_r2, GAMMA_schnorr_e2, gamma2)
 
     print("[Alice] Transmit decommitment and Schnorr Proof for GAMMA1")
@@ -290,14 +301,14 @@ if __name__ == "__main__":
     rc = commitments.nm_decommit(GAMMA2, GAMMAR2, GAMMAC2)
     assert rc == commitments.OK, f'[Alice] Error decommitting GAMMA2. rc {rc}'
 
-    GAMMA_schnorr_e2 = schnorr.challenge(GAMMA2, GAMMA_schnorr_c2)
+    GAMMA_schnorr_e2 = schnorr.challenge(GAMMA2, GAMMA_schnorr_c2, bob_id, AD=bob_ad)
     rc = schnorr.verify(GAMMA2, GAMMA_schnorr_c2, GAMMA_schnorr_e2, GAMMA_schnorr_p2)
     assert rc == schnorr.OK, f'[Alice] Error verifying Schnorr proof for GAMMA2'
 
     rc = commitments.nm_decommit(GAMMA1, GAMMAR1, GAMMAC1)
     assert rc == commitments.OK, f'[Bob] Error decommitting GAMMA1. rc {rc}'
 
-    GAMMA_schnorr_e1 = schnorr.challenge(GAMMA1, GAMMA_schnorr_c1)
+    GAMMA_schnorr_e1 = schnorr.challenge(GAMMA1, GAMMA_schnorr_c1, alice_id, AD=alice_ad)
     rc = schnorr.verify(GAMMA1, GAMMA_schnorr_c1, GAMMA_schnorr_e1, GAMMA_schnorr_p1)
     assert rc == schnorr.OK, f'[Bob] Error verifying Schnorr proof for GAMMA1'
 
diff --git a/python/examples/example_schnorr.py b/python/examples/example_schnorr.py
index 0e12cd2..b6592d4 100755
--- a/python/examples/example_schnorr.py
+++ b/python/examples/example_schnorr.py
@@ -31,19 +31,25 @@ seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
 x_hex = "fab4ce512dff74bd9c71c89a14de5b877af45dca0329ee3fcb72611c0784fef3"
 V_hex = "032cf4b348c9d00718f01ed98923e164df53b5e8bc4c2250662ed2df784e1784f4"
 
+ID = b"unique_user_identifier"
+
 if __name__ == "__main__":
     seed = bytes.fromhex(seed_hex)
 
-    x = bytes.fromhex(x_hex)
-    V = bytes.fromhex(V_hex)
+    x  = bytes.fromhex(x_hex)
+    V  = bytes.fromhex(V_hex)
 
     # random number generator
     rng = core_utils.create_csprng(seed)
 
+    AD = core_utils.generate_random(rng, 32)
+
     print("Example Schnorr Protocol")
     print("DLOG: V = x.G")
-    print(f"\tx = {x_hex}")
-    print(f"\tV = {V_hex}")
+    print(f"\tx  = {x_hex}")
+    print(f"\tV  = {V_hex}")
+    print(f"\tID = {ID.decode('utf-8')}")
+    print(f"\tAD = {AD.hex()}")
 
     # Generate commitment C = r.G, r random in [0, ..., q]
     r, C = schnorr.commit(rng)
@@ -52,10 +58,10 @@ if __name__ == "__main__":
     print(f"\tr = {r.hex()}")
     print(f"\tC = {C.hex()}")
 
-    # Generate deterministic challenge e = H(G, V, C)
-    e = schnorr.challenge(V, C)
+    # Generate deterministic challenge e = H(G, V, C, ID, AD)
+    e = schnorr.challenge(V, C, ID, AD = AD)
 
-    print("\n[Prover] Deterministic Challenge e = H(G, V, C)")
+    print("\n[Prover] Deterministic Challenge e = H(G, V, C, ID, AD)")
     print(f"\te = {e.hex()}")
 
     # Generate proof p = r - ex mod q
@@ -65,8 +71,8 @@ if __name__ == "__main__":
     print(f"\tp = {p.hex()}")
 
     # Verifier regenerates deterministic challenge
-    e = schnorr.challenge(V, C)
-    print("\n[Verifier] Deterministic Challenge e = H(G, V, C)")
+    e = schnorr.challenge(V, C, ID, AD = AD)
+    print("\n[Verifier] Deterministic Challenge e = H(G, V, C, ID, AD)")
     print(f"\te = {e.hex()}")
 
     # Verify
diff --git a/python/examples/example_zk_factoring.py b/python/examples/example_zk_factoring.py
index 08d6f6a..bf80508 100755
--- a/python/examples/example_zk_factoring.py
+++ b/python/examples/example_zk_factoring.py
@@ -32,6 +32,8 @@ p_hex = "e008507e09c24d756280f3d94912fb9ac16c0a8a1757ee01a350736acfc7f65880f87ec
 q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df71c28707f32b961d160ca938e9cf909cd77c4f8c630aec34b67714cbfd4942d7147c509db131bc2d6a667eb30df146f64b710f8f5247848b0a75738a38772e31014fd63f0b769209928d586499616dcc90700b393156e12eea7e15a835"
 n_hex = "c0870b552afb6c8c09f79e39ad6ca17ca93085c2cd7a726ade69574961ff9ce8ad33c7dda2e0703a3b0010c2e5bb7552c74164ce8dd011d85e5969090df53fe10e39cbe530704da32ff07228a6b6da34a5929e8a231c3080d812dc6e93affd81682339a6aee192927c582da8941bebf46e13c4ea3918a1477951fa66d367e70d8551b1869316d48317e0702d7bce242a326000f3dc763c44eba2044a1df713a94c1339edd464b145dcadf94e6e61be73dc270c878e1a28be720df2209202d00e101c3b255b757eaf547acd863d51eb676b851511b3dadeda926714719dceddd3af7908893ae65f2b95ee5c4d36cc6862cbe [...]
 
+uid = b"unique_user_identifier"
+
 if __name__ == "__main__":
     seed = bytes.fromhex(seed_hex)
     rng = core_utils.create_csprng(seed)
@@ -40,21 +42,25 @@ if __name__ == "__main__":
     q = bytes.fromhex(q_hex)
     n = bytes.fromhex(n_hex)
 
+    ad = core_utils.generate_random(rng, 32)
+
     print("Example ZK Proof of Knowledge of factoring")
     print("Parameters")
-    print(f"\tP = {p.hex()}")
-    print(f"\tQ = {q.hex()}")
-    print(f"\tN = {n.hex()}")
+    print(f"\tP  = {p.hex()}")
+    print(f"\tQ  = {q.hex()}")
+    print(f"\tN  = {n.hex()}")
+    print(f"\tID = {uid.decode('utf-8')}")
+    print(f"\tAD = {ad.hex()}")
 
     # Prove
-    e, y = factoring_zk.prove(rng, p, q, None)
+    e, y = factoring_zk.prove(rng, p, q, uid, ad=ad)
 
     print("\nGenerate proof")
     print(f"\tE = {e.hex()}")
     print(f"\tY = {y.hex()}")
 
     # Verify
-    ec = factoring_zk.verify(n, e, y)
+    ec = factoring_zk.verify(n, e, y, uid, ad=ad)
 
     print("\nVerify proof")
     if ec == factoring_zk.OK:
diff --git a/python/test/CMakeLists.txt b/python/test/CMakeLists.txt
index ced24cd..77def9b 100644
--- a/python/test/CMakeLists.txt
+++ b/python/test/CMakeLists.txt
@@ -60,9 +60,9 @@ file(COPY ${GCM_TV} DESTINATION "${PROJECT_BINARY_DIR}/python/test/gcm/")
 if(NOT CMAKE_BUILD_TYPE STREQUAL "ASan")
   add_python_test(test_python_aes              test_aes.py)
   add_python_test(test_python_mpc_mta          test_mta.py)
+  add_python_test(test_python_mpc_ecdsa        test_ecdsa.py)
   add_python_test(test_python_mpc_r            test_r.py)
   add_python_test(test_python_mpc_s            test_s.py)
-  add_python_test(test_python_mpc_ecdsa        test_ecdsa.py)
   add_python_test(test_python_mpc_schnorr      test_schnorr.py)
   add_python_test(test_python_mpc_nm_commit    test_nm_commit.py)
   add_python_test(test_python_mpc_zk_factoring test_zk_factoring.py)
diff --git a/python/test/test_schnorr.py b/python/test/test_schnorr.py
index 766c37f..9423265 100755
--- a/python/test/test_schnorr.py
+++ b/python/test/test_schnorr.py
@@ -78,12 +78,17 @@ class TestChallenge(unittest.TestCase):
         """ Test using test vectors """
 
         for vector in self.tv:
-            V = bytes.fromhex(vector["V"])
-            C = bytes.fromhex(vector["C"])
+            V  = bytes.fromhex(vector["V"])
+            C  = bytes.fromhex(vector["C"])
+            ID = bytes.fromhex(vector["ID"])
+            AD = bytes.fromhex(vector["AD"])
+
+            if not AD:
+                AD = None
 
             e_golden = bytes.fromhex(vector["E"])
 
-            e = schnorr.challenge(V, C)
+            e = schnorr.challenge(V, C, ID, AD=AD)
 
             self.assertEqual(e, e_golden)
 
diff --git a/python/test/test_zk_factoring.py b/python/test/test_zk_factoring.py
index 7218de5..42f2ea0 100755
--- a/python/test/test_zk_factoring.py
+++ b/python/test/test_zk_factoring.py
@@ -30,11 +30,21 @@ from amcl import core_utils, factoring_zk
 
 seed_hex = "78d0fb6705ce77dee47d03eb5b9c5d30"
 
-p_hex = "e008507e09c24d756280f3d94912fb9ac16c0a8a1757ee01a350736acfc7f65880f87eca55d6680253383fc546d03fd9ebab7d8fa746455180888cb7c17edf58d3327296468e5ab736374bc9a0fa02606ed5d3a4a5fb1677891f87fbf3c655c3e0549a86b17b7ddce07c8f73e253105e59f5d3ed2c7ba5bdf8495df40ae71a7f"
-q_hex = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df71c28707f32b961d160ca938e9cf909cd77c4f8c630aec34b67714cbfd4942d7147c509db131bc2d6a667eb30df146f64b710f8f5247848b0a75738a38772e31014fd63f0b769209928d586499616dcc90700b393156e12eea7e15a835"
+p_hex  = "e008507e09c24d756280f3d94912fb9ac16c0a8a1757ee01a350736acfc7f65880f87eca55d6680253383fc546d03fd9ebab7d8fa746455180888cb7c17edf58d3327296468e5ab736374bc9a0fa02606ed5d3a4a5fb1677891f87fbf3c655c3e0549a86b17b7ddce07c8f73e253105e59f5d3ed2c7ba5bdf8495df40ae71a7f"
+q_hex  = "dbffe278edd44c2655714e5a4cc82e66e46063f9ab69df9d0ed20eb3d7f2d8c7d985df71c28707f32b961d160ca938e9cf909cd77c4f8c630aec34b67714cbfd4942d7147c509db131bc2d6a667eb30df146f64b710f8f5247848b0a75738a38772e31014fd63f0b769209928d586499616dcc90700b393156e12eea7e15a835"
+id_str = "unique_identifier"
+ad_hex = "d7d3155616778fb436a1eb2070892205"
 
-e_hex = "32c670610e73c428785944ab7b582371"
-y_hex = "b4ebebd6177b2eb04149aa463ede7ba2216657e3b4de42f496c0d493b4d734131e63edcde042d951b9bf285622b9d69e9ee170156deeb173725032a952068e68b18f69bd4e52677d48d846055988877ce9e97b962f01e3f425f3101a6a589f020c858b1ee5ae8f79e4c63ce2356d8a9aa703100b3b3588d0aae7d7857b672d1beb25afc90a93045837aca1c39511816d4fc84ad0db35edf9adac810c46965868e79a5eb9509f9d7c315c5439daf561b312c0dd276263464409aef75a65c157277ba0bcef2cb1929995ba6749a8c54187cf2a9cfc9febc40bee8b149973590f9d34ae8c79111792e92b5fcdbd993f6ce8ad1 [...]
+e_hex = "5812ec82060d2a3eab3c967a2d710223"
+y_hex = "b4ebebd6177b2eb04149aa463ede7ba2216657e3b4de42f496c0d493b4d734131e63edcde042d951b9bf285622b9d69e9ee170156deeb173725032a952068e68b18f69bd4e52677d48d846055988877ce9e97b962f01e3f425f3101a6a589f020c858b1ee5ae8f79e4c63ce2356d8a9ae7b4e925357bc7aa2fb609c7cb6578b209f3993868c4e569dafeed4bc0a590453b6159819eed28dc7d2d25011641fa7312076813d85751fd23c75f5182e0c97d2fc8dce58d53a5ec2df3ec2ba08a063f6f9de97a8174c442acbd627dd864df41d1e322267c5674bd5459a3f12afad2b26fe5116a110b243cf8a78ce61d8eed22afd [...]
+
+
+def process_tv(vector):
+    for key, val in vector.items():
+        if key != "TEST":
+            vector[key] = bytes.fromhex(val)
+    
+    return vector
 
 
 class TestProve(unittest.TestCase):
@@ -45,24 +55,27 @@ class TestProve(unittest.TestCase):
         seed = bytes.fromhex(seed_hex)
         self.rng = core_utils.create_csprng(seed)
 
-        self.p = bytes.fromhex(p_hex)
-        self.q = bytes.fromhex(q_hex)
-        self.e = bytes.fromhex(e_hex)
-        self.y = bytes.fromhex(y_hex)
+        self.p  = bytes.fromhex(p_hex)
+        self.q  = bytes.fromhex(q_hex)
+        self.e  = bytes.fromhex(e_hex)
+        self.y  = bytes.fromhex(y_hex)
+        self.id = id_str.encode('utf-8')
+        self.ad = bytes.fromhex(ad_hex)
 
         with open("factoring_zk/prove.json", "r") as f:
             self.tv = json.load(f)
 
         for vector in self.tv:
-            for key, val in vector.items():
-                if key != "TEST":
-                    vector[key] = bytes.fromhex(val)
+            process_tv(vector)
 
     def test_tv(self):
         """ test using test vectors """
 
         for vector in self.tv:
-            e, y = factoring_zk.prove(None, vector['P'], vector['Q'], vector['R'])
+            if not vector['AD']:
+                vector['AD'] = None
+
+            e, y = factoring_zk.prove(None, vector['P'], vector['Q'], vector['ID'], ad=vector['AD'], r=vector['R'])
 
             self.assertEqual(e, vector['E'])
             self.assertEqual(y, vector['Y'])
@@ -70,7 +83,7 @@ class TestProve(unittest.TestCase):
     def test_random(self):
         """ test using PRNG """
 
-        e, y = factoring_zk.prove(self.rng, self.p, self.q)
+        e, y = factoring_zk.prove(self.rng, self.p, self.q, self.id, ad=self.ad)
 
         self.assertEqual(e, self.e)
         self.assertEqual(y, self.y)
@@ -83,22 +96,23 @@ class TestVerify(unittest.TestCase):
             self.tv = json.load(f)
 
         for vector in self.tv:
-            for key, val in vector.items():
-                if key != "TEST":
-                    vector[key] = bytes.fromhex(val)
+            process_tv(vector)
 
     def test_tv(self):
         """ test using test vectors """
 
         for vector in self.tv:
-            ec = factoring_zk.verify(vector['N'], vector['E'], vector['Y'])
+            if not vector['AD']:
+                vector['AD'] = None
+
+            ec = factoring_zk.verify(vector['N'], vector['E'], vector['Y'], vector['ID'], ad=vector['AD'])
 
             self.assertEqual(ec, factoring_zk.OK)
 
     def test_failure(self):
         """ Test error codes are propagated correctly """
 
-        ec = factoring_zk.verify(self.tv[0]['Y'], self.tv[0]['E'], self.tv[0]['N'])
+        ec = factoring_zk.verify(self.tv[0]['Y'], self.tv[0]['E'], self.tv[0]['N'], self.tv[0]['ID'])
 
         self.assertEqual(ec, factoring_zk.FAIL)
 


[incubator-milagro-MPC] 01/06: Add bounds check in factoring nizkp verify

Posted by sa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sandreoli pushed a commit to branch review-ncc
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-MPC.git

commit c6d3d5ab373b2fd18681be2b13217326c5b5102b
Author: Samuele Andreoli <sa...@yahoo.it>
AuthorDate: Wed May 13 14:33:27 2020 +0100

    Add bounds check in factoring nizkp verify
---
 include/amcl/factoring_zk.h          |  8 +++++---
 src/factoring_zk.c                   | 12 +++++++++++-
 test/unit/test_factoring_zk_verify.c | 24 ++++++++++++++++++++++--
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/include/amcl/factoring_zk.h b/include/amcl/factoring_zk.h
index c0cd9e5..d4db1ac 100644
--- a/include/amcl/factoring_zk.h
+++ b/include/amcl/factoring_zk.h
@@ -43,10 +43,12 @@ extern "C"
 #define HFS_2048 MODBYTES_1024_58 * HFLEN_2048 /**< Half 2048 field size in bytes */
 #endif
 
-#define FACTORING_ZK_B 16 /**< Security parameter, length in bytes */
+#define FACTORING_ZK_A FS_2048  /**< Proof, length in bytes */
+#define FACTORING_ZK_B 16       /**< Security parameter, length in bytes */
 
-#define FACTORING_ZK_OK   0  /**< Proof successfully verified */
-#define FACTORING_ZK_FAIL 91 /**< Invalid proof */
+#define FACTORING_ZK_OK   0           /**< Proof successfully verified */
+#define FACTORING_ZK_FAIL 91          /**< Invalid proof */
+#define FACTORING_ZK_OUT_OF_BOUNDS 92 /**< Invalid proof bounds */
 
 /** \brief Prove knowledge of the modulus m in ZK
  *
diff --git a/src/factoring_zk.c b/src/factoring_zk.c
index 2e8ad99..7578733 100644
--- a/src/factoring_zk.c
+++ b/src/factoring_zk.c
@@ -241,7 +241,17 @@ int FACTORING_ZK_verify(octet *N, octet *E, octet *Y)
     char w[FS_2048];
     octet W = {0, sizeof(w), w};
 
-    // 0 <= Y <= A by construction
+    // Check bounds for 0 <= Y < A
+    if(Y->len > FACTORING_ZK_A)
+    {
+        return FACTORING_ZK_OUT_OF_BOUNDS;
+    }
+
+    // Check bounds for 0 <= E < B
+    if(E->len > FACTORING_ZK_B)
+    {
+        return FACTORING_ZK_OUT_OF_BOUNDS;
+    }
 
     // Process N in the hash function H(N, ?)
     HASH256_init(&sha);
diff --git a/test/unit/test_factoring_zk_verify.c b/test/unit/test_factoring_zk_verify.c
index c142f7c..56ab562 100644
--- a/test/unit/test_factoring_zk_verify.c
+++ b/test/unit/test_factoring_zk_verify.c
@@ -93,11 +93,31 @@ int main(int argc, char **argv)
     }
 
     /* Test unhappy path */
-    E.val[0]++;
+    char *t[FS_2048 + 1];
+    octet T = {0, sizeof(t), t};
 
-    rc = FACTORING_ZK_verify(&N, &E, &Y);
+    // Invalid E
+    OCT_copy(&T, &E);
+    T.val[0]++;
+
+    rc = FACTORING_ZK_verify(&N, &T, &Y);
     assert(NULL, "FACTORING_ZK_verify. Invalid E", rc == FACTORING_ZK_FAIL);
 
+    // E out of bounds
+    OCT_copy(&T, &E);
+    T.len++;
+
+    rc = FACTORING_ZK_verify(&N, &T, &Y);
+    assert(NULL, "FACTORING_ZK_verify. E out of bounds", rc == FACTORING_ZK_OUT_OF_BOUNDS);
+
+    // Y out of bounds
+    OCT_copy(&T, &Y);
+    T.len++;
+
+    rc = FACTORING_ZK_verify(&N, &E, &T);
+    assert(NULL, "FACTORING_ZK_verify. Y out of bounds", rc == FACTORING_ZK_OUT_OF_BOUNDS);
+
+
     printf("SUCCESS\n");
     exit(EXIT_SUCCESS);
 }