aboutsummaryrefslogtreecommitdiff
path: root/crypto.c
diff options
context:
space:
mode:
authorÖzgür Kesim <oec-taler@kesim.org>2024-01-14 21:42:10 +0100
committerÖzgür Kesim <oec-taler@kesim.org>2024-01-14 21:42:10 +0100
commite095416bc2e299afc1bde1f33382845b7baf4c01 (patch)
tree1229ab1f64b524a105dae63262f151e8cf1074f0 /crypto.c
parent09af66c165035dcabde8f5c529877dbd6c296e91 (diff)
lift code to recent GNUNET version; uncrustify
Diffstat (limited to 'crypto.c')
-rw-r--r--crypto.c1853
1 files changed, 928 insertions, 925 deletions
diff --git a/crypto.c b/crypto.c
index ac45f8a..28bfa91 100644
--- a/crypto.c
+++ b/crypto.c
@@ -38,49 +38,52 @@
* programm.
*/
#define ASSERT_GCRY(cmd, rc) do { \
- if (0 != rc) { \
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, \
- "libbrandt", \
- "`%s' failed at %s:%d with error: %s\n", \
- cmd, \
- __FILE__, \
- __LINE__, \
- gcry_strerror (rc)); \
- GNUNET_abort_ (); \
- } \
+ if (0 != rc) { \
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, \
+ "libbrandt", \
+ "`%s' failed at %s:%d with error: %s\n", \
+ cmd, \
+ __FILE__, \
+ __LINE__, \
+ gcry_strerror (rc)); \
+ GNUNET_abort_ (); \
+ } \
} while (0)
-struct zkp_challenge_dl {
- struct ec_mpi g;
- struct ec_mpi v;
- struct ec_mpi a;
+struct zkp_challenge_dl
+{
+ struct ec_mpi g;
+ struct ec_mpi v;
+ struct ec_mpi a;
};
-struct zkp_challenge_2dle {
- struct ec_mpi g1;
- struct ec_mpi g2;
- struct ec_mpi v;
- struct ec_mpi w;
- struct ec_mpi a;
- struct ec_mpi b;
+struct zkp_challenge_2dle
+{
+ struct ec_mpi g1;
+ struct ec_mpi g2;
+ struct ec_mpi v;
+ struct ec_mpi w;
+ struct ec_mpi a;
+ struct ec_mpi b;
};
-struct zkp_challenge_0og {
- struct ec_mpi g;
- struct ec_mpi alpha;
- struct ec_mpi beta;
- struct ec_mpi a1;
- struct ec_mpi a2;
- struct ec_mpi b1;
- struct ec_mpi b2;
+struct zkp_challenge_0og
+{
+ struct ec_mpi g;
+ struct ec_mpi alpha;
+ struct ec_mpi beta;
+ struct ec_mpi a1;
+ struct ec_mpi a2;
+ struct ec_mpi b1;
+ struct ec_mpi b2;
};
-gcry_ctx_t ec_ctx = NULL;
+gcry_ctx_t ec_ctx = NULL;
gcry_mpi_point_t ec_gen = NULL;
gcry_mpi_point_t ec_zero = NULL;
-gcry_mpi_t ec_n = NULL;
+gcry_mpi_t ec_n = NULL;
/**
@@ -92,20 +95,20 @@ gcry_mpi_t ec_n = NULL;
void
brandt_crypto_init ()
{
- gcry_error_t rc;
+ gcry_error_t rc;
- rc = gcry_mpi_ec_new (&ec_ctx, NULL, CURVE);
- ASSERT_GCRY ("gcry_mpi_ec_new", rc);
+ rc = gcry_mpi_ec_new (&ec_ctx, NULL, CURVE);
+ ASSERT_GCRY ("gcry_mpi_ec_new", rc);
- ec_gen = gcry_mpi_ec_get_point ("g", ec_ctx, 0);
- brandt_assert (NULL != ec_gen);
+ ec_gen = gcry_mpi_ec_get_point ("g", ec_ctx, 0);
+ brandt_assert (NULL != ec_gen);
- ec_zero = gcry_mpi_point_new (0);
- brandt_assert (NULL != ec_zero);
- gcry_mpi_ec_sub (ec_zero, ec_gen, ec_gen, ec_ctx);
+ ec_zero = gcry_mpi_point_new (0);
+ brandt_assert (NULL != ec_zero);
+ gcry_mpi_ec_sub (ec_zero, ec_gen, ec_gen, ec_ctx);
- ec_n = gcry_mpi_ec_get_mpi ("n", ec_ctx, 1);
- brandt_assert (NULL != ec_n);
+ ec_n = gcry_mpi_ec_get_mpi ("n", ec_ctx, 1);
+ brandt_assert (NULL != ec_n);
}
@@ -120,34 +123,34 @@ brandt_crypto_init ()
void
ec_skey_create (gcry_mpi_t skey)
{
- gcry_mpi_t ret;
- gcry_sexp_t s_keyparam;
- gcry_sexp_t priv_sexp;
- gcry_sexp_t priv_key;
- gcry_sexp_t priv_key2;
- gcry_error_t rc;
-
- rc = gcry_sexp_build (&s_keyparam, NULL, "(genkey(ecc(curve \"" CURVE "\")"
- "(flags)))");
- ASSERT_GCRY ("gcry_sexp_build", rc);
-
- rc = gcry_pk_genkey (&priv_sexp, s_keyparam);
- ASSERT_GCRY ("gcry_pk_genkey", rc);
- gcry_sexp_release (s_keyparam);
-
- priv_key = gcry_sexp_find_token (priv_sexp, "private-key", 11);
- brandt_assert (NULL != priv_key);
- gcry_sexp_release (priv_sexp);
-
- priv_key2 = gcry_sexp_find_token (priv_key, "d", 1);
- brandt_assert (NULL != priv_key2);
- gcry_sexp_release (priv_key);
-
- ret = gcry_sexp_nth_mpi (priv_key2, 1, GCRYMPI_FMT_USG);
- brandt_assert (NULL != ret);
- gcry_sexp_release (priv_key2);
-
- gcry_mpi_snatch (skey, ret);
+ gcry_mpi_t ret;
+ gcry_sexp_t s_keyparam;
+ gcry_sexp_t priv_sexp;
+ gcry_sexp_t priv_key;
+ gcry_sexp_t priv_key2;
+ gcry_error_t rc;
+
+ rc = gcry_sexp_build (&s_keyparam, NULL, "(genkey(ecc(curve \"" CURVE "\")"
+ "(flags)))");
+ ASSERT_GCRY ("gcry_sexp_build", rc);
+
+ rc = gcry_pk_genkey (&priv_sexp, s_keyparam);
+ ASSERT_GCRY ("gcry_pk_genkey", rc);
+ gcry_sexp_release (s_keyparam);
+
+ priv_key = gcry_sexp_find_token (priv_sexp, "private-key", 11);
+ brandt_assert (NULL != priv_key);
+ gcry_sexp_release (priv_sexp);
+
+ priv_key2 = gcry_sexp_find_token (priv_key, "d", 1);
+ brandt_assert (NULL != priv_key2);
+ gcry_sexp_release (priv_key);
+
+ ret = gcry_sexp_nth_mpi (priv_key2, 1, GCRYMPI_FMT_USG);
+ brandt_assert (NULL != ret);
+ gcry_sexp_release (priv_key2);
+
+ gcry_mpi_snatch (skey, ret);
}
@@ -162,20 +165,20 @@ ec_skey_create (gcry_mpi_t skey)
void
ec_keypair_create (gcry_mpi_point_t pkey, gcry_mpi_t skey)
{
- gcry_mpi_t sk;
+ gcry_mpi_t sk;
- if (NULL == pkey)
- {
- GNUNET_break (NULL != pkey);
- return;
- }
- sk = (NULL == skey) ? gcry_mpi_new (256) : skey;
+ if (NULL == pkey)
+ {
+ GNUNET_break (NULL != pkey);
+ return;
+ }
+ sk = (NULL == skey) ? gcry_mpi_new (256) : skey;
- ec_skey_create (sk);
- gcry_mpi_ec_mul (pkey, sk, ec_gen, ec_ctx);
+ ec_skey_create (sk);
+ gcry_mpi_ec_mul (pkey, sk, ec_gen, ec_ctx);
- if (NULL == skey)
- gcry_mpi_release (sk);
+ if (NULL == skey)
+ gcry_mpi_release (sk);
}
@@ -187,16 +190,16 @@ ec_keypair_create (gcry_mpi_point_t pkey, gcry_mpi_t skey)
* @param[in] base which base point should be used to calculate the public key
*/
void
-ec_keypair_create_base (gcry_mpi_point_t pkey,
- gcry_mpi_t skey,
+ec_keypair_create_base (gcry_mpi_point_t pkey,
+ gcry_mpi_t skey,
const gcry_mpi_point_t base)
{
- brandt_assert (NULL != pkey);
- brandt_assert (NULL != skey);
- brandt_assert (NULL != base);
+ brandt_assert (NULL != pkey);
+ brandt_assert (NULL != skey);
+ brandt_assert (NULL != base);
- ec_skey_create (skey);
- gcry_mpi_ec_mul (pkey, skey, base, ec_ctx);
+ ec_skey_create (skey);
+ gcry_mpi_ec_mul (pkey, skey, base, ec_ctx);
}
@@ -209,13 +212,13 @@ ec_keypair_create_base (gcry_mpi_point_t pkey,
void
ec_point_copy (gcry_mpi_point_t dst, const gcry_mpi_point_t src)
{
- gcry_mpi_t x = gcry_mpi_new (256);
- gcry_mpi_t y = gcry_mpi_new (256);
- gcry_mpi_t z = gcry_mpi_new (256);
+ gcry_mpi_t x = gcry_mpi_new (256);
+ gcry_mpi_t y = gcry_mpi_new (256);
+ gcry_mpi_t z = gcry_mpi_new (256);
- brandt_assert (dst && src);
- gcry_mpi_point_get (x, y, z, src);
- gcry_mpi_point_snatch_set (dst, x, y, z);
+ brandt_assert (dst && src);
+ gcry_mpi_point_get (x, y, z, src);
+ gcry_mpi_point_snatch_set (dst, x, y, z);
}
@@ -230,32 +233,32 @@ ec_point_copy (gcry_mpi_point_t dst, const gcry_mpi_point_t src)
int
ec_point_cmp (const gcry_mpi_point_t a, const gcry_mpi_point_t b)
{
- int ret = 1;
- gcry_mpi_t ax = gcry_mpi_new (256);
- gcry_mpi_t bx = gcry_mpi_new (256);
- gcry_mpi_t ay = gcry_mpi_new (256);
- gcry_mpi_t by = gcry_mpi_new (256);
-
- brandt_assert (a && b);
- if (!ax || !bx || !ay || !by)
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
- "libbrandt",
- "could not init point in point_cmp\n");
- return 1;
- }
-
- if (!gcry_mpi_ec_get_affine (ax, ay, a, ec_ctx) &&
- !gcry_mpi_ec_get_affine (bx, by, b, ec_ctx))
- {
- ret = gcry_mpi_cmp (ax, bx) || gcry_mpi_cmp (ay, by);
- }
-
- gcry_mpi_release (ax);
- gcry_mpi_release (bx);
- gcry_mpi_release (ay);
- gcry_mpi_release (by);
- return ret;
+ int ret = 1;
+ gcry_mpi_t ax = gcry_mpi_new (256);
+ gcry_mpi_t bx = gcry_mpi_new (256);
+ gcry_mpi_t ay = gcry_mpi_new (256);
+ gcry_mpi_t by = gcry_mpi_new (256);
+
+ brandt_assert (a && b);
+ if (! ax || ! bx || ! ay || ! by)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
+ "libbrandt",
+ "could not init point in point_cmp\n");
+ return 1;
+ }
+
+ if (! gcry_mpi_ec_get_affine (ax, ay, a, ec_ctx) &&
+ ! gcry_mpi_ec_get_affine (bx, by, b, ec_ctx))
+ {
+ ret = gcry_mpi_cmp (ax, bx) || gcry_mpi_cmp (ay, by);
+ }
+
+ gcry_mpi_release (ax);
+ gcry_mpi_release (bx);
+ gcry_mpi_release (ay);
+ gcry_mpi_release (by);
+ return ret;
}
@@ -269,37 +272,37 @@ ec_point_cmp (const gcry_mpi_point_t a, const gcry_mpi_point_t b)
void
mpi_serialize (struct ec_mpi *dst, gcry_mpi_t src)
{
- size_t rsize = 0;
-
- if (gcry_mpi_get_flag (src, GCRYMPI_FLAG_OPAQUE))
- { /* Store opaque MPIs left aligned. Used by Ed25519 point compression */
- unsigned int nbits;
- const void *vp = gcry_mpi_get_opaque (src, &nbits);
-
- brandt_assert (vp);
- rsize = (nbits + 7) / 8;
- if (rsize > sizeof (struct ec_mpi))
- rsize = sizeof (struct ec_mpi);
- memcpy (dst, vp, rsize);
- if (rsize < sizeof (struct ec_mpi))
- memset (((char *)dst) + rsize, 0, sizeof (struct ec_mpi) - rsize);
- }
- else
- { /* Store regular MPIs as unsigned ints right aligned into the buffer. */
- char *cp = (char *)dst;
- gcry_error_t rc;
-
- rc = gcry_mpi_print (GCRYMPI_FMT_USG, (void *)dst,
- sizeof (struct ec_mpi), &rsize, src);
- ASSERT_GCRY ("gcry_mpi_print", rc);
-
- /* Shift the output to the right, if shorter than available space */
- if (rsize && rsize < sizeof (struct ec_mpi))
- {
- memmove (&cp[sizeof (struct ec_mpi) - rsize], dst, rsize);
- memset (dst, 0, sizeof (struct ec_mpi) - rsize);
- }
- }
+ size_t rsize = 0;
+
+ if (gcry_mpi_get_flag (src, GCRYMPI_FLAG_OPAQUE))
+ { /* Store opaque MPIs left aligned. Used by Ed25519 point compression */
+ unsigned int nbits;
+ const void *vp = gcry_mpi_get_opaque (src, &nbits);
+
+ brandt_assert (vp);
+ rsize = (nbits + 7) / 8;
+ if (rsize > sizeof (struct ec_mpi))
+ rsize = sizeof (struct ec_mpi);
+ memcpy (dst, vp, rsize);
+ if (rsize < sizeof (struct ec_mpi))
+ memset (((char *) dst) + rsize, 0, sizeof (struct ec_mpi) - rsize);
+ }
+ else
+ { /* Store regular MPIs as unsigned ints right aligned into the buffer. */
+ char *cp = (char *) dst;
+ gcry_error_t rc;
+
+ rc = gcry_mpi_print (GCRYMPI_FMT_USG, (void *) dst,
+ sizeof (struct ec_mpi), &rsize, src);
+ ASSERT_GCRY ("gcry_mpi_print", rc);
+
+ /* Shift the output to the right, if shorter than available space */
+ if (rsize && rsize < sizeof (struct ec_mpi))
+ {
+ memmove (&cp[sizeof (struct ec_mpi) - rsize], dst, rsize);
+ memset (dst, 0, sizeof (struct ec_mpi) - rsize);
+ }
+ }
}
@@ -313,17 +316,17 @@ mpi_serialize (struct ec_mpi *dst, gcry_mpi_t src)
void
mpi_parse (gcry_mpi_t dst, const struct ec_mpi *src)
{
- gcry_mpi_t ret;
- gcry_error_t rc;
+ gcry_mpi_t ret;
+ gcry_error_t rc;
- rc = gcry_mpi_scan (&ret,
- GCRYMPI_FMT_USG,
- src,
- sizeof (struct ec_mpi),
- NULL);
- ASSERT_GCRY ("gcry_mpi_scan", rc);
+ rc = gcry_mpi_scan (&ret,
+ GCRYMPI_FMT_USG,
+ src,
+ sizeof (struct ec_mpi),
+ NULL);
+ ASSERT_GCRY ("gcry_mpi_scan", rc);
- gcry_mpi_snatch (dst, ret);
+ gcry_mpi_snatch (dst, ret);
}
@@ -336,30 +339,30 @@ mpi_parse (gcry_mpi_t dst, const struct ec_mpi *src)
void
ec_point_serialize (struct ec_mpi *dst, const gcry_mpi_point_t src)
{
- gcry_sexp_t s;
- gcry_ctx_t ctx;
- gcry_error_t rc;
- gcry_mpi_t q;
+ gcry_sexp_t s;
+ gcry_ctx_t ctx;
+ gcry_error_t rc;
+ gcry_mpi_t q;
- brandt_assert (dst);
+ brandt_assert (dst);
- rc = gcry_sexp_build (&s, NULL, "(public-key(ecc(curve " CURVE ")))");
- ASSERT_GCRY ("gcry_sexp_build", rc);
- brandt_assert (NULL != s);
+ rc = gcry_sexp_build (&s, NULL, "(public-key(ecc(curve " CURVE ")))");
+ ASSERT_GCRY ("gcry_sexp_build", rc);
+ brandt_assert (NULL != s);
- rc = gcry_mpi_ec_new (&ctx, s, NULL);
- ASSERT_GCRY ("gcry_mpi_ec_new", rc);
- gcry_sexp_release (s);
+ rc = gcry_mpi_ec_new (&ctx, s, NULL);
+ ASSERT_GCRY ("gcry_mpi_ec_new", rc);
+ gcry_sexp_release (s);
- rc = gcry_mpi_ec_set_point ("q", src, ctx);
- ASSERT_GCRY ("gcry_mpi_ec_set_point", rc);
+ rc = gcry_mpi_ec_set_point ("q", src, ctx);
+ ASSERT_GCRY ("gcry_mpi_ec_set_point", rc);
- q = gcry_mpi_ec_get_mpi ("q@eddsa", ctx, 0);
- brandt_assert (NULL != q);
- gcry_ctx_release (ctx);
+ q = gcry_mpi_ec_get_mpi ("q@eddsa", ctx, 0);
+ brandt_assert (NULL != q);
+ gcry_ctx_release (ctx);
- mpi_serialize (dst, q);
- gcry_mpi_release (q);
+ mpi_serialize (dst, q);
+ gcry_mpi_release (q);
}
@@ -372,24 +375,24 @@ ec_point_serialize (struct ec_mpi *dst, const gcry_mpi_point_t src)
void
ec_point_parse (gcry_mpi_point_t dst, const struct ec_mpi *src)
{
- gcry_sexp_t s;
- gcry_ctx_t ctx;
- gcry_mpi_point_t ret;
- gcry_error_t rc;
-
- rc = gcry_sexp_build (&s, NULL, "(public-key(ecc(curve " CURVE ")(q %b)))",
- sizeof (struct ec_mpi), src);
- ASSERT_GCRY ("gcry_sexp_build", rc);
-
- rc = gcry_mpi_ec_new (&ctx, s, NULL);
- ASSERT_GCRY ("gcry_mpi_ec_new", rc);
- gcry_sexp_release (s);
-
- ret = gcry_mpi_ec_get_point ("q", ctx, 0);
- brandt_assert (ret);
- gcry_ctx_release (ctx);
- gcry_mpi_ec_mul (dst, GCRYMPI_CONST_ONE, ret, ec_ctx);
- gcry_mpi_point_release (ret);
+ gcry_sexp_t s;
+ gcry_ctx_t ctx;
+ gcry_mpi_point_t ret;
+ gcry_error_t rc;
+
+ rc = gcry_sexp_build (&s, NULL, "(public-key(ecc(curve " CURVE ")(q %b)))",
+ sizeof (struct ec_mpi), src);
+ ASSERT_GCRY ("gcry_sexp_build", rc);
+
+ rc = gcry_mpi_ec_new (&ctx, s, NULL);
+ ASSERT_GCRY ("gcry_mpi_ec_new", rc);
+ gcry_sexp_release (s);
+
+ ret = gcry_mpi_ec_get_point ("q", ctx, 0);
+ brandt_assert (ret);
+ gcry_ctx_release (ctx);
+ gcry_mpi_ec_mul (dst, GCRYMPI_CONST_ONE, ret, ec_ctx);
+ gcry_mpi_point_release (ret);
}
@@ -402,13 +405,13 @@ ec_point_parse (gcry_mpi_point_t dst, const struct ec_mpi *src)
void
smc_free1 (gcry_mpi_point_t *dst, uint16_t size1)
{
- if (NULL == dst)
- return;
+ if (NULL == dst)
+ return;
- for (uint16_t i = 0; i < size1; i++)
- if (NULL != dst[i])
- gcry_mpi_point_release (dst[i]);
- free (dst);
+ for (uint16_t i = 0; i < size1; i++)
+ if (NULL != dst[i])
+ gcry_mpi_point_release (dst[i]);
+ free (dst);
}
@@ -424,23 +427,23 @@ smc_free1 (gcry_mpi_point_t *dst, uint16_t size1)
gcry_mpi_point_t *
smc_init1 (uint16_t size1)
{
- gcry_mpi_point_t *ret;
-
- ret = GNUNET_new_array (size1, gcry_mpi_point_t);
-
- for (uint16_t i = 0; i < size1; i++)
- {
- if (NULL == (ret[i] = gcry_mpi_point_new (0)))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
- "libbrandt",
- "could not init point in 1 dimensional array. "
- "out of memory?\n");
- smc_free1 (ret, size1);
- return NULL;
- }
- }
- return ret;
+ gcry_mpi_point_t *ret;
+
+ ret = GNUNET_new_array (size1, gcry_mpi_point_t);
+
+ for (uint16_t i = 0; i < size1; i++)
+ {
+ if (NULL == (ret[i] = gcry_mpi_point_new (0)))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR,
+ "libbrandt",
+ "could not init point in 1 dimensional array. "
+ "out of memory?\n");
+ smc_free1 (ret, size1);
+ return NULL;
+ }
+ }
+ return ret;
}
@@ -454,14 +457,14 @@ smc_init1 (uint16_t size1)
void
smc_free2 (gcry_mpi_point_t **dst, uint16_t size1, uint16_t size2)
{
- if (NULL == dst)
- return;
-
- for (uint16_t i = 0; i < size1; i++)
- for (uint16_t j = 0; j < size2; j++)
- if (NULL != dst[i][j])
- gcry_mpi_point_release (dst[i][j]);
- free (dst);
+ if (NULL == dst)
+ return;
+
+ for (uint16_t i = 0; i < size1; i++)
+ for (uint16_t j = 0; j < size2; j++)
+ if (NULL != dst[i][j])
+ gcry_mpi_point_release (dst[i][j]);
+ free (dst);
}
@@ -478,27 +481,27 @@ smc_free2 (gcry_mpi_point_t **dst, uint16_t size1, uint16_t size2)
gcry_mpi_point_t **
smc_init2 (uint16_t size1, uint16_t size2)
{
- gcry_mpi_point_t **ret;
-
- ret = GNUNET_new_array_2d (size1, size2, gcry_mpi_point_t);
-
- for (uint16_t i = 0; i < size1; i++)
- {
- for (uint16_t j = 0; j < size2; j++)
- {
- if (NULL == (ret[i][j] = gcry_mpi_point_new (0)))
- {
- GNUNET_log_from (
- GNUNET_ERROR_TYPE_ERROR,
- "libbrandt",
- "could not init point in 2 dimensional array. "
- "out of memory?\n");
- smc_free2 (ret, size1, size2);
- GNUNET_assert (0);
- }
- }
- }
- return ret;
+ gcry_mpi_point_t **ret;
+
+ ret = GNUNET_new_array_2d (size1, size2, gcry_mpi_point_t);
+
+ for (uint16_t i = 0; i < size1; i++)
+ {
+ for (uint16_t j = 0; j < size2; j++)
+ {
+ if (NULL == (ret[i][j] = gcry_mpi_point_new (0)))
+ {
+ GNUNET_log_from (
+ GNUNET_ERROR_TYPE_ERROR,
+ "libbrandt",
+ "could not init point in 2 dimensional array. "
+ "out of memory?\n");
+ smc_free2 (ret, size1, size2);
+ GNUNET_assert (0);
+ }
+ }
+ }
+ return ret;
}
@@ -512,19 +515,19 @@ smc_init2 (uint16_t size1, uint16_t size2)
*/
void
smc_free3 (gcry_mpi_point_t ***dst,
- uint16_t size1,
- uint16_t size2,
- uint16_t size3)
+ uint16_t size1,
+ uint16_t size2,
+ uint16_t size3)
{
- if (NULL == dst)
- return;
-
- for (uint16_t i = 0; i < size1; i++)
- for (uint16_t j = 0; j < size2; j++)
- for (uint16_t k = 0; k < size3; k++)
- if (NULL != dst[i][j][k])
- gcry_mpi_point_release (dst[i][j][k]);
- free (dst);
+ if (NULL == dst)
+ return;
+
+ for (uint16_t i = 0; i < size1; i++)
+ for (uint16_t j = 0; j < size2; j++)
+ for (uint16_t k = 0; k < size3; k++)
+ if (NULL != dst[i][j][k])
+ gcry_mpi_point_release (dst[i][j][k]);
+ free (dst);
}
@@ -542,30 +545,30 @@ smc_free3 (gcry_mpi_point_t ***dst,
gcry_mpi_point_t ***
smc_init3 (uint16_t size1, uint16_t size2, uint16_t size3)
{
- gcry_mpi_point_t ***ret;
-
- ret = GNUNET_new_array_3d (size1, size2, size3, gcry_mpi_point_t);
-
- for (uint16_t i = 0; i < size1; i++)
- {
- for (uint16_t j = 0; j < size2; j++)
- {
- for (uint16_t k = 0; k < size3; k++)
- {
- if (NULL == (ret[i][j][k] = gcry_mpi_point_new (0)))
- {
- GNUNET_log_from (
- GNUNET_ERROR_TYPE_ERROR,
- "libbrandt",
- "could not init point in 2 dimensional array. "
- "out of memory?\n");
- smc_free3 (ret, size1, size2, size3);
- GNUNET_assert (0);
- }
- }
- }
- }
- return ret;
+ gcry_mpi_point_t ***ret;
+
+ ret = GNUNET_new_array_3d (size1, size2, size3, gcry_mpi_point_t);
+
+ for (uint16_t i = 0; i < size1; i++)
+ {
+ for (uint16_t j = 0; j < size2; j++)
+ {
+ for (uint16_t k = 0; k < size3; k++)
+ {
+ if (NULL == (ret[i][j][k] = gcry_mpi_point_new (0)))
+ {
+ GNUNET_log_from (
+ GNUNET_ERROR_TYPE_ERROR,
+ "libbrandt",
+ "could not init point in 2 dimensional array. "
+ "out of memory?\n");
+ smc_free3 (ret, size1, size2, size3);
+ GNUNET_assert (0);
+ }
+ }
+ }
+ }
+ return ret;
}
@@ -586,13 +589,13 @@ smc_init3 (uint16_t size1, uint16_t size2, uint16_t size3)
void
smc_sums_partial (gcry_mpi_point_t out[],
gcry_mpi_point_t in[],
- uint16_t len,
- uint16_t stepi,
- uint16_t stepo)
+ uint16_t len,
+ uint16_t stepi,
+ uint16_t stepo)
{
- brandt_assert (NULL != out);
- for (uint16_t i = 0, o = 0; o < len * stepo; i += stepi, o += stepo)
- gcry_mpi_ec_add (out[o], (o ? out[o - stepo] : ec_zero), in[i], ec_ctx);
+ brandt_assert (NULL != out);
+ for (uint16_t i = 0, o = 0; o < len * stepo; i += stepi, o += stepo)
+ gcry_mpi_ec_add (out[o], (o ? out[o - stepo] : ec_zero), in[i], ec_ctx);
}
@@ -610,21 +613,21 @@ smc_sums_partial (gcry_mpi_point_t out[],
void
smc_sum (gcry_mpi_point_t out,
gcry_mpi_point_t in[],
- uint16_t len,
- uint16_t step)
+ uint16_t len,
+ uint16_t step)
{
- brandt_assert (NULL != out);
- ec_point_copy (out, ec_zero);
- for (uint16_t i = 0; i < len * step; i += step)
- gcry_mpi_ec_add (out, out, in[i], ec_ctx);
+ brandt_assert (NULL != out);
+ ec_point_copy (out, ec_zero);
+ for (uint16_t i = 0; i < len * step; i += step)
+ gcry_mpi_ec_add (out, out, in[i], ec_ctx);
}
void
smc_prep_keyshare (struct BRANDT_Auction *ad)
{
- ad->y = smc_init1 (ad->n);
- brandt_assert (ad->y);
+ ad->y = smc_init1 (ad->n);
+ brandt_assert (ad->y);
}
@@ -640,85 +643,85 @@ smc_prep_keyshare (struct BRANDT_Auction *ad)
unsigned char *
smc_gen_keyshare (struct BRANDT_Auction *ad, size_t *buflen)
{
- unsigned char *ret;
- struct msg_head *head;
- struct ec_mpi *pubkey_share;
- struct proof_dl *proof1;
-
- brandt_assert (ad && buflen);
- *buflen = (sizeof (*head) +
- sizeof (*pubkey_share) +
- sizeof (*proof1));
- ret = GNUNET_new_array (*buflen, unsigned char);
-
- head = (struct msg_head *)ret;
- head->prot_version = htonl (0);
- head->msg_type = htonl (msg_init);
-
- proof1 = (struct proof_dl *)(ret + sizeof (*head) + sizeof (*pubkey_share));
- ad->x = gcry_mpi_new (256);
- ec_skey_create (ad->x);
- smc_zkp_dl (ad->y[ad->i], ad->x, proof1);
-
- pubkey_share = (struct ec_mpi *)(ret + sizeof (*head));
- ec_point_serialize (pubkey_share, ad->y[ad->i]);
-
- return ret;
+ unsigned char *ret;
+ struct msg_head *head;
+ struct ec_mpi *pubkey_share;
+ struct proof_dl *proof1;
+
+ brandt_assert (ad && buflen);
+ *buflen = (sizeof (*head)
+ + sizeof (*pubkey_share)
+ + sizeof (*proof1));
+ ret = GNUNET_new_array (*buflen, unsigned char);
+
+ head = (struct msg_head *) ret;
+ head->prot_version = htonl (0);
+ head->msg_type = htonl (msg_init);
+
+ proof1 = (struct proof_dl *) (ret + sizeof (*head) + sizeof (*pubkey_share));
+ ad->x = gcry_mpi_new (256);
+ ec_skey_create (ad->x);
+ smc_zkp_dl (ad->y[ad->i], ad->x, proof1);
+
+ pubkey_share = (struct ec_mpi *) (ret + sizeof (*head));
+ ec_point_serialize (pubkey_share, ad->y[ad->i]);
+
+ return ret;
}
int
smc_recv_keyshare (struct BRANDT_Auction *ad,
const unsigned char *buf,
- size_t buflen,
- uint16_t sender)
+ size_t buflen,
+ uint16_t sender)
{
- int ret = 0;
- struct proof_dl *proof1;
- gcry_mpi_point_t y = gcry_mpi_point_new (0);
-
- brandt_assert (ad && buf);
-
- if (buflen != (sizeof (struct ec_mpi) + sizeof (*proof1)))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong size of received key share\n");
- goto quit;
- }
-
- proof1 = (struct proof_dl *)(buf + sizeof (struct ec_mpi));
- ec_point_parse (y, (struct ec_mpi *)buf);
- if (smc_zkp_dl_check (y, proof1))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong zkp1 for public key share received\n");
- goto quit;
- }
-
- ec_point_copy (ad->y[sender], y);
-
- ret = 1;
+ int ret = 0;
+ struct proof_dl *proof1;
+ gcry_mpi_point_t y = gcry_mpi_point_new (0);
+
+ brandt_assert (ad && buf);
+
+ if (buflen != (sizeof (struct ec_mpi) + sizeof (*proof1)))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong size of received key share\n");
+ goto quit;
+ }
+
+ proof1 = (struct proof_dl *) (buf + sizeof (struct ec_mpi));
+ ec_point_parse (y, (struct ec_mpi *) buf);
+ if (smc_zkp_dl_check (y, proof1))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong zkp1 for public key share received\n");
+ goto quit;
+ }
+
+ ec_point_copy (ad->y[sender], y);
+
+ ret = 1;
quit:
- gcry_mpi_point_release (y);
- return ret;
+ gcry_mpi_point_release (y);
+ return ret;
}
void
smc_prep_bid (struct BRANDT_Auction *ad)
{
- ad->alpha = smc_init2 (ad->n, ad->k);
- brandt_assert (ad->alpha);
+ ad->alpha = smc_init2 (ad->n, ad->k);
+ brandt_assert (ad->alpha);
- ad->beta = smc_init2 (ad->n, ad->k);
- brandt_assert (ad->beta);
+ ad->beta = smc_init2 (ad->n, ad->k);
+ brandt_assert (ad->beta);
- ad->Y = gcry_mpi_point_new (0);
- brandt_assert (ad->Y);
- smc_sum (ad->Y, ad->y, ad->n, 1);
- brandt_assert (ad->Y);
+ ad->Y = gcry_mpi_point_new (0);
+ brandt_assert (ad->Y);
+ smc_sum (ad->Y, ad->y, ad->n, 1);
+ brandt_assert (ad->Y);
}
@@ -734,176 +737,176 @@ smc_prep_bid (struct BRANDT_Auction *ad)
unsigned char *
smc_encrypt_bid (struct BRANDT_Auction *ad, size_t *buflen)
{
- unsigned char *ret;
- unsigned char *cur;
- struct msg_head *head;
- struct proof_0og *proof3;
- gcry_mpi_t r_sum;
- gcry_mpi_t r_sum2;
- gcry_mpi_t r_part;
-
- brandt_assert (ad && buflen);
- *buflen = (sizeof (*head) + /* msg header */
- ad->k * /* k * (alpha, beta, proof3) */
- (sizeof (struct ec_mpi) * 2 +
- sizeof (*proof3)) +
- sizeof (struct proof_2dle)); /* proof2 */
- if (0 < ad->m)
- *buflen += sizeof (struct proof_2dle);
- ret = GNUNET_new_array (*buflen, unsigned char);
-
- head = (struct msg_head *)ret;
- head->prot_version = htonl (0);
- head->msg_type = htonl (msg_bid);
- cur = ret + sizeof (*head);
-
- r_sum = gcry_mpi_new (256);
- r_sum2 = gcry_mpi_new (256);
- r_part = gcry_mpi_new (256);
-
- for (uint16_t j = 0; j < ad->k; j++)
- {
- proof3 = (struct proof_0og *)(cur + 2 * sizeof (struct ec_mpi));
- smc_zkp_0og (j == ad->b,
- ad->Y,
- r_part,
- ad->alpha[ad->i][j],
- ad->beta[ad->i][j],
- proof3);
- ec_point_serialize ((struct ec_mpi *)cur, ad->alpha[ad->i][j]);
- ec_point_serialize (&((struct ec_mpi *)cur)[1], ad->beta[ad->i][j]);
- gcry_mpi_addm (r_sum, r_sum, r_part, ec_n);
-
- /* prepare sum for additional M+1st price auction proof (see below) */
- if (0 < ad->m && 1 == (ad->k - j - ad->i) % ad->n)
- gcry_mpi_addm (r_sum2, r_sum2, r_part, ec_n);
-
- cur += 2 * sizeof (struct ec_mpi) + sizeof (struct proof_0og);
- }
- smc_zkp_2dle (NULL, NULL, ad->Y, ec_gen, r_sum, (struct proof_2dle *)cur);
-
- /* in M+1st price auctions we need to prove that our bid is from the valid
- * subset of bids as well */
- if (0 < ad->m)
- {
- struct proof_2dle *proof2 = (struct proof_2dle *)(ret + *buflen) - 1;
- smc_zkp_2dle (NULL, NULL, ad->Y, ec_gen, r_sum2, proof2);
- }
-
- gcry_mpi_release (r_sum);
- gcry_mpi_release (r_sum2);
- gcry_mpi_release (r_part);
-
- return ret;
+ unsigned char *ret;
+ unsigned char *cur;
+ struct msg_head *head;
+ struct proof_0og *proof3;
+ gcry_mpi_t r_sum;
+ gcry_mpi_t r_sum2;
+ gcry_mpi_t r_part;
+
+ brandt_assert (ad && buflen);
+ *buflen = (sizeof (*head) /* msg header */
+ + ad->k /* k * (alpha, beta, proof3) */
+ * (sizeof (struct ec_mpi) * 2
+ + sizeof (*proof3))
+ + sizeof (struct proof_2dle)); /* proof2 */
+ if (0 < ad->m)
+ *buflen += sizeof (struct proof_2dle);
+ ret = GNUNET_new_array (*buflen, unsigned char);
+
+ head = (struct msg_head *) ret;
+ head->prot_version = htonl (0);
+ head->msg_type = htonl (msg_bid);
+ cur = ret + sizeof (*head);
+
+ r_sum = gcry_mpi_new (256);
+ r_sum2 = gcry_mpi_new (256);
+ r_part = gcry_mpi_new (256);
+
+ for (uint16_t j = 0; j < ad->k; j++)
+ {
+ proof3 = (struct proof_0og *) (cur + 2 * sizeof (struct ec_mpi));
+ smc_zkp_0og (j == ad->b,
+ ad->Y,
+ r_part,
+ ad->alpha[ad->i][j],
+ ad->beta[ad->i][j],
+ proof3);
+ ec_point_serialize ((struct ec_mpi *) cur, ad->alpha[ad->i][j]);
+ ec_point_serialize (&((struct ec_mpi *) cur)[1], ad->beta[ad->i][j]);
+ gcry_mpi_addm (r_sum, r_sum, r_part, ec_n);
+
+ /* prepare sum for additional M+1st price auction proof (see below) */
+ if (0 < ad->m && 1 == (ad->k - j - ad->i) % ad->n)
+ gcry_mpi_addm (r_sum2, r_sum2, r_part, ec_n);
+
+ cur += 2 * sizeof (struct ec_mpi) + sizeof (struct proof_0og);
+ }
+ smc_zkp_2dle (NULL, NULL, ad->Y, ec_gen, r_sum, (struct proof_2dle *) cur);
+
+ /* in M+1st price auctions we need to prove that our bid is from the valid
+ * subset of bids as well */
+ if (0 < ad->m)
+ {
+ struct proof_2dle *proof2 = (struct proof_2dle *) (ret + *buflen) - 1;
+ smc_zkp_2dle (NULL, NULL, ad->Y, ec_gen, r_sum2, proof2);
+ }
+
+ gcry_mpi_release (r_sum);
+ gcry_mpi_release (r_sum2);
+ gcry_mpi_release (r_part);
+
+ return ret;
}
int
smc_recv_encrypted_bid (struct BRANDT_Auction *ad,
const unsigned char *buf,
- size_t buflen,
- uint16_t sender)
+ size_t buflen,
+ uint16_t sender)
{
- int ret = 0;
- const unsigned char *cur = buf;
- struct proof_0og *proof3;
- gcry_mpi_point_t **ct; /* ciphertexts */
- gcry_mpi_point_t alpha_sum = gcry_mpi_point_new (0);
- gcry_mpi_point_t beta_sum = gcry_mpi_point_new (0);
- gcry_mpi_point_t alpha_sum2 = gcry_mpi_point_new (0);
- gcry_mpi_point_t beta_sum2 = gcry_mpi_point_new (0);
-
- brandt_assert (ad && buf);
-
- if (buflen != (ad->k * (sizeof (struct ec_mpi) * 2 + sizeof (*proof3)) +
- (0 < ad->m ? 2 : 1) * sizeof (struct proof_2dle)) ||
- NULL == (ct = smc_init2 (2, ad->k)))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong size of received encrypted bid\n");
- goto quit;
- }
-
- ec_point_copy (alpha_sum, ec_zero);
- ec_point_copy (beta_sum, ec_zero);
- ec_point_copy (alpha_sum2, ec_zero);
- ec_point_copy (beta_sum2, ec_zero);
-
- for (uint16_t j = 0; j < ad->k; j++)
- {
- ec_point_parse (ct[0][j], (struct ec_mpi *)cur);
- ec_point_parse (ct[1][j], &((struct ec_mpi *)cur)[1]);
- proof3 = (struct proof_0og *)(cur + 2 * sizeof (struct ec_mpi));
- if (smc_zkp_0og_check (ad->Y, ct[0][j], ct[1][j], proof3))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong zkp3 for alpha, beta received\n");
- goto quit;
- }
- gcry_mpi_ec_add (alpha_sum, alpha_sum, ct[0][j], ec_ctx);
- gcry_mpi_ec_add (beta_sum, beta_sum, ct[1][j], ec_ctx);
-
- /* precalculate ciphertext sums for second 2dle proof needed in M+1st
- * price auctions */
- if (0 < ad->m && 1 == (ad->k - j - sender) % ad->n)
- {
- gcry_mpi_ec_add (alpha_sum2, alpha_sum2, ct[0][j], ec_ctx);
- gcry_mpi_ec_add (beta_sum2, beta_sum2, ct[1][j], ec_ctx);
- }
-
- cur += 2 * sizeof (struct ec_mpi) + sizeof (struct proof_0og);
- }
-
- gcry_mpi_ec_sub (alpha_sum, alpha_sum, ec_gen, ec_ctx);
- if (smc_zkp_2dle_check (alpha_sum,
- beta_sum,
- ad->Y,
- ec_gen,
- (struct proof_2dle *)cur))
- {
- GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong zkp2 for alpha, beta received\n");
- goto quit;
- }
-
- /* On M+1st price auctions check with the second 2dle proof if the bidder
- * only bid on one of his allowed indizes */
- if (0 < ad->m)
- {
- cur += sizeof (struct proof_2dle);
- gcry_mpi_ec_sub (alpha_sum2, alpha_sum2, ec_gen, ec_ctx);
- if (smc_zkp_2dle_check (alpha_sum2,
- beta_sum2,
- ad->Y,
- ec_gen,
- (struct proof_2dle *)cur))
- {
- GNUNET_log_from (
- GNUNET_ERROR_TYPE_WARNING,
- "libbrandt",
- "wrong second zkp2 for alpha, beta received. "
- "bid not allowed for this user in M+1st price auctions.\n");
- goto quit;
- }
- }
-
- for (uint16_t j = 0; j < ad->k; j++)
- {
- ec_point_copy (ad->alpha[sender][j], ct[0][j]);
- ec_point_copy (ad->beta[sender][j], ct[1][j]);
- }
- smc_free2 (ct, 2, ad->k);
-
- ret = 1; /* finally success */
+ int ret = 0;
+ const unsigned char *cur = buf;
+ struct proof_0og *proof3;
+ gcry_mpi_point_t **ct; /* ciphertexts */
+ gcry_mpi_point_t alpha_sum = gcry_mpi_point_new (0);
+ gcry_mpi_point_t beta_sum = gcry_mpi_point_new (0);
+ gcry_mpi_point_t alpha_sum2 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t beta_sum2 = gcry_mpi_point_new (0);
+
+ brandt_assert (ad && buf);
+
+ if (buflen != (ad->k * (sizeof (struct ec_mpi) * 2 + sizeof (*proof3))
+ + (0 < ad->m ? 2 : 1) * sizeof (struct proof_2dle)) ||
+ NULL == (ct = smc_init2 (2, ad->k)))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong size of received encrypted bid\n");
+ goto quit;
+ }
+
+ ec_point_copy (alpha_sum, ec_zero);
+ ec_point_copy (beta_sum, ec_zero);
+ ec_point_copy (alpha_sum2, ec_zero);
+ ec_point_copy (beta_sum2, ec_zero);
+
+ for (uint16_t j = 0; j < ad->k; j++)
+ {
+ ec_point_parse (ct[0][j], (struct ec_mpi *) cur);
+ ec_point_parse (ct[1][j], &((struct ec_mpi *) cur)[1]);
+ proof3 = (struct proof_0og *) (cur + 2 * sizeof (struct ec_mpi));
+ if (smc_zkp_0og_check (ad->Y, ct[0][j], ct[1][j], proof3))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong zkp3 for alpha, beta received\n");
+ goto quit;
+ }
+ gcry_mpi_ec_add (alpha_sum, alpha_sum, ct[0][j], ec_ctx);
+ gcry_mpi_ec_add (beta_sum, beta_sum, ct[1][j], ec_ctx);
+
+ /* precalculate ciphertext sums for second 2dle proof needed in M+1st
+ * price auctions */
+ if (0 < ad->m && 1 == (ad->k - j - sender) % ad->n)
+ {
+ gcry_mpi_ec_add (alpha_sum2, alpha_sum2, ct[0][j], ec_ctx);
+ gcry_mpi_ec_add (beta_sum2, beta_sum2, ct[1][j], ec_ctx);
+ }
+
+ cur += 2 * sizeof (struct ec_mpi) + sizeof (struct proof_0og);
+ }
+
+ gcry_mpi_ec_sub (alpha_sum, alpha_sum, ec_gen, ec_ctx);
+ if (smc_zkp_2dle_check (alpha_sum,
+ beta_sum,
+ ad->Y,
+ ec_gen,
+ (struct proof_2dle *) cur))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong zkp2 for alpha, beta received\n");
+ goto quit;
+ }
+
+ /* On M+1st price auctions check with the second 2dle proof if the bidder
+ * only bid on one of his allowed indizes */
+ if (0 < ad->m)
+ {
+ cur += sizeof (struct proof_2dle);
+ gcry_mpi_ec_sub (alpha_sum2, alpha_sum2, ec_gen, ec_ctx);
+ if (smc_zkp_2dle_check (alpha_sum2,
+ beta_sum2,
+ ad->Y,
+ ec_gen,
+ (struct proof_2dle *) cur))
+ {
+ GNUNET_log_from (
+ GNUNET_ERROR_TYPE_WARNING,
+ "libbrandt",
+ "wrong second zkp2 for alpha, beta received. "
+ "bid not allowed for this user in M+1st price auctions.\n");
+ goto quit;
+ }
+ }
+
+ for (uint16_t j = 0; j < ad->k; j++)
+ {
+ ec_point_copy (ad->alpha[sender][j], ct[0][j]);
+ ec_point_copy (ad->beta[sender][j], ct[1][j]);
+ }
+ smc_free2 (ct, 2, ad->k);
+
+ ret = 1; /* finally success */
quit:
- gcry_mpi_point_release (alpha_sum);
- gcry_mpi_point_release (beta_sum);
- gcry_mpi_point_release (alpha_sum2);
- gcry_mpi_point_release (beta_sum2);
- return ret;
+ gcry_mpi_point_release (alpha_sum);
+ gcry_mpi_point_release (beta_sum);
+ gcry_mpi_point_release (alpha_sum2);
+ gcry_mpi_point_release (beta_sum2);
+ return ret;
}
@@ -921,41 +924,41 @@ smc_zkp_dl (gcry_mpi_point_t v,
const gcry_mpi_t x,
struct proof_dl *proof)
{
- struct zkp_challenge_dl challenge;
- gcry_mpi_point_t a = gcry_mpi_point_new (0);
- gcry_mpi_t r = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_t z = gcry_mpi_new (256);
-
- /* v = xg */
- gcry_mpi_ec_mul (v, x, ec_gen, ec_ctx);
-
- /* a = zg */
- ec_keypair_create (a, z);
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g, ec_gen);
- ec_point_serialize (&challenge.v, v);
- ec_point_serialize (&challenge.a, a);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp dl");
-
- /* r = z + cx */
- gcry_mpi_mulm (r, c, x, ec_n);
- gcry_mpi_addm (r, r, z, ec_n);
-
- ec_point_serialize (&proof->a, a);
- mpi_serialize (&proof->r, r);
-
- gcry_mpi_point_release (a);
- gcry_mpi_release (r);
- gcry_mpi_release (c);
- gcry_mpi_release (z);
+ struct zkp_challenge_dl challenge;
+ gcry_mpi_point_t a = gcry_mpi_point_new (0);
+ gcry_mpi_t r = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_t z = gcry_mpi_new (256);
+
+ /* v = xg */
+ gcry_mpi_ec_mul (v, x, ec_gen, ec_ctx);
+
+ /* a = zg */
+ ec_keypair_create (a, z);
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g, ec_gen);
+ ec_point_serialize (&challenge.v, v);
+ ec_point_serialize (&challenge.a, a);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp dl");
+
+ /* r = z + cx */
+ gcry_mpi_mulm (r, c, x, ec_n);
+ gcry_mpi_addm (r, r, z, ec_n);
+
+ ec_point_serialize (&proof->a, a);
+ mpi_serialize (&proof->r, r);
+
+ gcry_mpi_point_release (a);
+ gcry_mpi_release (r);
+ gcry_mpi_release (c);
+ gcry_mpi_release (z);
}
@@ -971,42 +974,42 @@ int
smc_zkp_dl_check (const gcry_mpi_point_t v,
const struct proof_dl *proof)
{
- int ret;
- struct zkp_challenge_dl challenge;
- gcry_mpi_point_t a = gcry_mpi_point_new (0);
- gcry_mpi_t r = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_point_t left = gcry_mpi_point_new (0);
- gcry_mpi_point_t right = gcry_mpi_point_new (0);
-
- ec_point_parse (a, &proof->a);
- mpi_parse (r, &proof->r);
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g, ec_gen);
- ec_point_serialize (&challenge.v, v);
- ec_point_serialize (&challenge.a, a);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp dl");
-
- /* rg =? a + cv */
- gcry_mpi_ec_mul (left, r, ec_gen, ec_ctx);
- gcry_mpi_ec_mul (right, c, v, ec_ctx);
- gcry_mpi_ec_add (right, a, right, ec_ctx);
- ret = ec_point_cmp (left, right);
-
- gcry_mpi_point_release (a);
- gcry_mpi_release (r);
- gcry_mpi_release (c);
- gcry_mpi_point_release (left);
- gcry_mpi_point_release (right);
-
- return ret;
+ int ret;
+ struct zkp_challenge_dl challenge;
+ gcry_mpi_point_t a = gcry_mpi_point_new (0);
+ gcry_mpi_t r = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_point_t left = gcry_mpi_point_new (0);
+ gcry_mpi_point_t right = gcry_mpi_point_new (0);
+
+ ec_point_parse (a, &proof->a);
+ mpi_parse (r, &proof->r);
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g, ec_gen);
+ ec_point_serialize (&challenge.v, v);
+ ec_point_serialize (&challenge.a, a);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp dl");
+
+ /* rg =? a + cv */
+ gcry_mpi_ec_mul (left, r, ec_gen, ec_ctx);
+ gcry_mpi_ec_mul (right, c, v, ec_ctx);
+ gcry_mpi_ec_add (right, a, right, ec_ctx);
+ ret = ec_point_cmp (left, right);
+
+ gcry_mpi_point_release (a);
+ gcry_mpi_release (r);
+ gcry_mpi_release (c);
+ gcry_mpi_point_release (left);
+ gcry_mpi_point_release (right);
+
+ return ret;
}
@@ -1027,76 +1030,76 @@ smc_zkp_dl_check (const gcry_mpi_point_t v,
* shared with the verifier.
*/
void
-smc_zkp_2dle (gcry_mpi_point_t v,
- gcry_mpi_point_t w,
+smc_zkp_2dle (gcry_mpi_point_t v,
+ gcry_mpi_point_t w,
const gcry_mpi_point_t g1,
const gcry_mpi_point_t g2,
- const gcry_mpi_t x,
+ const gcry_mpi_t x,
struct proof_2dle *proof)
{
- struct zkp_challenge_2dle challenge;
- gcry_mpi_point_t rv;
- gcry_mpi_point_t rw;
- gcry_mpi_t rx;
- gcry_mpi_point_t a = gcry_mpi_point_new (0);
- gcry_mpi_point_t b = gcry_mpi_point_new (0);
- gcry_mpi_t r = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_t z = gcry_mpi_new (256);
-
- rv = (NULL == v) ? gcry_mpi_point_new (0) : v;
- rw = (NULL == w) ? gcry_mpi_point_new (0) : w;
- rx = (NULL == x) ? gcry_mpi_new (256) : x;
-
- if (NULL == x)
- ec_skey_create (rx);
-
- /* v = x*g1 */
- gcry_mpi_ec_mul (rv, rx, g1, ec_ctx);
-
- /* w = x*g2 */
- gcry_mpi_ec_mul (rw, rx, g2, ec_ctx);
-
- /* a = z*g1 */
- ec_keypair_create_base (a, z, g1);
-
- /* b = z*g2 */
- gcry_mpi_ec_mul (b, z, g2, ec_ctx);
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g1, g1);
- ec_point_serialize (&challenge.g2, g2);
- ec_point_serialize (&challenge.v, rv);
- ec_point_serialize (&challenge.w, rw);
- ec_point_serialize (&challenge.a, a);
- ec_point_serialize (&challenge.b, b);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp 2dle");
-
- /* r = z + cx */
- gcry_mpi_mulm (r, c, rx, ec_n);
- gcry_mpi_addm (r, r, z, ec_n);
-
- mpi_serialize (&proof->r, r);
- ec_point_serialize (&proof->a, a);
- ec_point_serialize (&proof->b, b);
-
- if (NULL == v)
- gcry_mpi_point_release (rv);
- if (NULL == w)
- gcry_mpi_point_release (rw);
- if (NULL == x)
- gcry_mpi_release (rx);
- gcry_mpi_point_release (a);
- gcry_mpi_point_release (b);
- gcry_mpi_release (r);
- gcry_mpi_release (c);
- gcry_mpi_release (z);
+ struct zkp_challenge_2dle challenge;
+ gcry_mpi_point_t rv;
+ gcry_mpi_point_t rw;
+ gcry_mpi_t rx;
+ gcry_mpi_point_t a = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b = gcry_mpi_point_new (0);
+ gcry_mpi_t r = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_t z = gcry_mpi_new (256);
+
+ rv = (NULL == v) ? gcry_mpi_point_new (0) : v;
+ rw = (NULL == w) ? gcry_mpi_point_new (0) : w;
+ rx = (NULL == x) ? gcry_mpi_new (256) : x;
+
+ if (NULL == x)
+ ec_skey_create (rx);
+
+ /* v = x*g1 */
+ gcry_mpi_ec_mul (rv, rx, g1, ec_ctx);
+
+ /* w = x*g2 */
+ gcry_mpi_ec_mul (rw, rx, g2, ec_ctx);
+
+ /* a = z*g1 */
+ ec_keypair_create_base (a, z, g1);
+
+ /* b = z*g2 */
+ gcry_mpi_ec_mul (b, z, g2, ec_ctx);
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g1, g1);
+ ec_point_serialize (&challenge.g2, g2);
+ ec_point_serialize (&challenge.v, rv);
+ ec_point_serialize (&challenge.w, rw);
+ ec_point_serialize (&challenge.a, a);
+ ec_point_serialize (&challenge.b, b);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp 2dle");
+
+ /* r = z + cx */
+ gcry_mpi_mulm (r, c, rx, ec_n);
+ gcry_mpi_addm (r, r, z, ec_n);
+
+ mpi_serialize (&proof->r, r);
+ ec_point_serialize (&proof->a, a);
+ ec_point_serialize (&proof->b, b);
+
+ if (NULL == v)
+ gcry_mpi_point_release (rv);
+ if (NULL == w)
+ gcry_mpi_point_release (rw);
+ if (NULL == x)
+ gcry_mpi_release (rx);
+ gcry_mpi_point_release (a);
+ gcry_mpi_point_release (b);
+ gcry_mpi_release (r);
+ gcry_mpi_release (c);
+ gcry_mpi_release (z);
}
@@ -1112,60 +1115,60 @@ smc_zkp_2dle (gcry_mpi_point_t v,
* @return 0 if the proof is correct, something else otherwise
*/
int
-smc_zkp_2dle_check (const gcry_mpi_point_t v,
- const gcry_mpi_point_t w,
- const gcry_mpi_point_t g1,
- const gcry_mpi_point_t g2,
+smc_zkp_2dle_check (const gcry_mpi_point_t v,
+ const gcry_mpi_point_t w,
+ const gcry_mpi_point_t g1,
+ const gcry_mpi_point_t g2,
const struct proof_2dle *proof)
{
- int ret;
- struct zkp_challenge_2dle challenge;
- gcry_mpi_point_t a = gcry_mpi_point_new (0);
- gcry_mpi_point_t b = gcry_mpi_point_new (0);
- gcry_mpi_t r = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_point_t left = gcry_mpi_point_new (0);
- gcry_mpi_point_t right = gcry_mpi_point_new (0);
-
- mpi_parse (r, &proof->r);
- ec_point_parse (a, &proof->a);
- ec_point_parse (b, &proof->b);
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g1, g1);
- ec_point_serialize (&challenge.g2, g2);
- ec_point_serialize (&challenge.v, v);
- ec_point_serialize (&challenge.w, w);
- ec_point_serialize (&challenge.a, a);
- ec_point_serialize (&challenge.b, b);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp 2dle");
-
- /* r*g1 =? a + cv */
- gcry_mpi_ec_mul (left, r, g1, ec_ctx);
- gcry_mpi_ec_mul (right, c, v, ec_ctx);
- gcry_mpi_ec_add (right, a, right, ec_ctx);
- ret = ec_point_cmp (left, right);
-
- /* r*g2 =? b + cw */
- gcry_mpi_ec_mul (left, r, g2, ec_ctx);
- gcry_mpi_ec_mul (right, c, w, ec_ctx);
- gcry_mpi_ec_add (right, b, right, ec_ctx);
- ret |= ec_point_cmp (left, right);
-
- gcry_mpi_point_release (a);
- gcry_mpi_point_release (b);
- gcry_mpi_release (r);
- gcry_mpi_release (c);
- gcry_mpi_point_release (left);
- gcry_mpi_point_release (right);
-
- return ret;
+ int ret;
+ struct zkp_challenge_2dle challenge;
+ gcry_mpi_point_t a = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b = gcry_mpi_point_new (0);
+ gcry_mpi_t r = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_point_t left = gcry_mpi_point_new (0);
+ gcry_mpi_point_t right = gcry_mpi_point_new (0);
+
+ mpi_parse (r, &proof->r);
+ ec_point_parse (a, &proof->a);
+ ec_point_parse (b, &proof->b);
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g1, g1);
+ ec_point_serialize (&challenge.g2, g2);
+ ec_point_serialize (&challenge.v, v);
+ ec_point_serialize (&challenge.w, w);
+ ec_point_serialize (&challenge.a, a);
+ ec_point_serialize (&challenge.b, b);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp 2dle");
+
+ /* r*g1 =? a + cv */
+ gcry_mpi_ec_mul (left, r, g1, ec_ctx);
+ gcry_mpi_ec_mul (right, c, v, ec_ctx);
+ gcry_mpi_ec_add (right, a, right, ec_ctx);
+ ret = ec_point_cmp (left, right);
+
+ /* r*g2 =? b + cw */
+ gcry_mpi_ec_mul (left, r, g2, ec_ctx);
+ gcry_mpi_ec_mul (right, c, w, ec_ctx);
+ gcry_mpi_ec_add (right, b, right, ec_ctx);
+ ret |= ec_point_cmp (left, right);
+
+ gcry_mpi_point_release (a);
+ gcry_mpi_point_release (b);
+ gcry_mpi_release (r);
+ gcry_mpi_release (c);
+ gcry_mpi_point_release (left);
+ gcry_mpi_point_release (right);
+
+ return ret;
}
@@ -1189,140 +1192,140 @@ smc_zkp_2dle_check (const gcry_mpi_point_t v,
* shared with the verifier.
*/
void
-smc_zkp_0og (int m_is_gen,
+smc_zkp_0og (int m_is_gen,
const gcry_mpi_point_t y,
- gcry_mpi_t r,
- gcry_mpi_point_t alpha,
- gcry_mpi_point_t beta,
+ gcry_mpi_t r,
+ gcry_mpi_point_t alpha,
+ gcry_mpi_point_t beta,
struct proof_0og *proof)
{
- struct zkp_challenge_0og challenge;
- gcry_mpi_point_t a1 = gcry_mpi_point_new (0);
- gcry_mpi_point_t a2 = gcry_mpi_point_new (0);
- gcry_mpi_point_t b1 = gcry_mpi_point_new (0);
- gcry_mpi_point_t b2 = gcry_mpi_point_new (0);
- gcry_mpi_t d1 = gcry_mpi_new (256);
- gcry_mpi_t d2 = gcry_mpi_new (256);
- gcry_mpi_t r1 = gcry_mpi_new (256);
- gcry_mpi_t r2 = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_t rr;
- gcry_mpi_t w = gcry_mpi_new (256);
-
- rr = (NULL == r) ? gcry_mpi_new (256) : r;
-
- /* beta = r*g */
- ec_keypair_create (beta, rr);
- gcry_mpi_mod (rr, rr, ec_n);
-
- /* alpha = m + r*y */
- gcry_mpi_ec_mul (alpha, rr, y, ec_ctx);
- gcry_mpi_ec_add (alpha, m_is_gen ? ec_gen : ec_zero, alpha, ec_ctx);
-
- if (!m_is_gen)
- { /* m == 0 */
- ec_keypair_create_base (a1, d1, beta);
- gcry_mpi_mod (d1, d1, ec_n);
- ec_keypair_create_base (b1, r1, y);
- gcry_mpi_mod (r1, r1, ec_n);
-
- /* a1 = r1*g + d1*beta */
- gcry_mpi_ec_mul (a2, r1, ec_gen, ec_ctx);
- gcry_mpi_ec_add (a1, a2, a1, ec_ctx);
-
- /* b1 = r1*y + d1*(alpha-g) */
- gcry_mpi_ec_sub (b2, alpha, ec_gen, ec_ctx);
- gcry_mpi_ec_mul (a2, d1, b2, ec_ctx);
- gcry_mpi_ec_add (b1, b1, a2, ec_ctx);
-
- /* a2 = w * g */
- ec_keypair_create_base (a2, w, ec_gen);
- gcry_mpi_mod (w, w, ec_n);
-
- /* b2 = w * y */
- gcry_mpi_ec_mul (b2, w, y, ec_ctx);
- }
- else
- { /* m == g */
- ec_keypair_create_base (a2, d2, beta);
- gcry_mpi_mod (d2, d2, ec_n);
- ec_keypair_create_base (b2, r2, y);
- gcry_mpi_mod (r2, r2, ec_n);
-
- /* a2 = r2*g + d2*beta */
- gcry_mpi_ec_mul (a1, r2, ec_gen, ec_ctx);
- gcry_mpi_ec_add (a2, a1, a2, ec_ctx);
-
- /* b2 = r2*y + d2*(alpha-0) */
- /* useless subtraction to have same amount of operations as in m == 0 */
- gcry_mpi_ec_sub (b1, alpha, ec_zero, ec_ctx);
- gcry_mpi_ec_mul (a1, d2, b1, ec_ctx);
- gcry_mpi_ec_add (b2, b2, a1, ec_ctx);
-
- /* a1 = w * g */
- ec_keypair_create_base (a1, w, ec_gen);
- gcry_mpi_mod (w, w, ec_n);
-
- /* b1 = w * y */
- gcry_mpi_ec_mul (b1, w, y, ec_ctx);
- }
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g, ec_gen);
- ec_point_serialize (&challenge.alpha, alpha);
- ec_point_serialize (&challenge.beta, beta);
- ec_point_serialize (&challenge.a1, a1);
- ec_point_serialize (&challenge.a2, a2);
- ec_point_serialize (&challenge.b1, b1);
- ec_point_serialize (&challenge.b2, b2);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp 0og");
-
- if (!m_is_gen)
- { /* m == 0 */
- /* d2 = c - d1 */
- gcry_mpi_subm (d2, c, d1, ec_n);
-
- /* r2 = w - r*d2 */
- gcry_mpi_mulm (r2, rr, d2, ec_n);
- gcry_mpi_subm (r2, w, r2, ec_n);
- }
- else
- { /* m == g */
- /* d1 = c - d2 */
- gcry_mpi_subm (d1, c, d2, ec_n);
-
- /* r1 = w - r*d1 */
- gcry_mpi_mulm (r1, rr, d1, ec_n);
- gcry_mpi_subm (r1, w, r1, ec_n);
- }
-
- ec_point_serialize (&proof->a1, a1);
- ec_point_serialize (&proof->a2, a2);
- ec_point_serialize (&proof->b1, b1);
- ec_point_serialize (&proof->b2, b2);
- mpi_serialize (&proof->d1, d1);
- mpi_serialize (&proof->d2, d2);
- mpi_serialize (&proof->r1, r1);
- mpi_serialize (&proof->r2, r2);
-
- gcry_mpi_point_release (a1);
- gcry_mpi_point_release (a2);
- gcry_mpi_point_release (b1);
- gcry_mpi_point_release (b2);
- gcry_mpi_release (d1);
- gcry_mpi_release (d2);
- gcry_mpi_release (r1);
- gcry_mpi_release (r2);
- gcry_mpi_release (c);
- if (NULL == r)
- gcry_mpi_release (rr);
- gcry_mpi_release (w);
+ struct zkp_challenge_0og challenge;
+ gcry_mpi_point_t a1 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t a2 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b1 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b2 = gcry_mpi_point_new (0);
+ gcry_mpi_t d1 = gcry_mpi_new (256);
+ gcry_mpi_t d2 = gcry_mpi_new (256);
+ gcry_mpi_t r1 = gcry_mpi_new (256);
+ gcry_mpi_t r2 = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_t rr;
+ gcry_mpi_t w = gcry_mpi_new (256);
+
+ rr = (NULL == r) ? gcry_mpi_new (256) : r;
+
+ /* beta = r*g */
+ ec_keypair_create (beta, rr);
+ gcry_mpi_mod (rr, rr, ec_n);
+
+ /* alpha = m + r*y */
+ gcry_mpi_ec_mul (alpha, rr, y, ec_ctx);
+ gcry_mpi_ec_add (alpha, m_is_gen ? ec_gen : ec_zero, alpha, ec_ctx);
+
+ if (! m_is_gen)
+ { /* m == 0 */
+ ec_keypair_create_base (a1, d1, beta);
+ gcry_mpi_mod (d1, d1, ec_n);
+ ec_keypair_create_base (b1, r1, y);
+ gcry_mpi_mod (r1, r1, ec_n);
+
+ /* a1 = r1*g + d1*beta */
+ gcry_mpi_ec_mul (a2, r1, ec_gen, ec_ctx);
+ gcry_mpi_ec_add (a1, a2, a1, ec_ctx);
+
+ /* b1 = r1*y + d1*(alpha-g) */
+ gcry_mpi_ec_sub (b2, alpha, ec_gen, ec_ctx);
+ gcry_mpi_ec_mul (a2, d1, b2, ec_ctx);
+ gcry_mpi_ec_add (b1, b1, a2, ec_ctx);
+
+ /* a2 = w * g */
+ ec_keypair_create_base (a2, w, ec_gen);
+ gcry_mpi_mod (w, w, ec_n);
+
+ /* b2 = w * y */
+ gcry_mpi_ec_mul (b2, w, y, ec_ctx);
+ }
+ else
+ { /* m == g */
+ ec_keypair_create_base (a2, d2, beta);
+ gcry_mpi_mod (d2, d2, ec_n);
+ ec_keypair_create_base (b2, r2, y);
+ gcry_mpi_mod (r2, r2, ec_n);
+
+ /* a2 = r2*g + d2*beta */
+ gcry_mpi_ec_mul (a1, r2, ec_gen, ec_ctx);
+ gcry_mpi_ec_add (a2, a1, a2, ec_ctx);
+
+ /* b2 = r2*y + d2*(alpha-0) */
+ /* useless subtraction to have same amount of operations as in m == 0 */
+ gcry_mpi_ec_sub (b1, alpha, ec_zero, ec_ctx);
+ gcry_mpi_ec_mul (a1, d2, b1, ec_ctx);
+ gcry_mpi_ec_add (b2, b2, a1, ec_ctx);
+
+ /* a1 = w * g */
+ ec_keypair_create_base (a1, w, ec_gen);
+ gcry_mpi_mod (w, w, ec_n);
+
+ /* b1 = w * y */
+ gcry_mpi_ec_mul (b1, w, y, ec_ctx);
+ }
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g, ec_gen);
+ ec_point_serialize (&challenge.alpha, alpha);
+ ec_point_serialize (&challenge.beta, beta);
+ ec_point_serialize (&challenge.a1, a1);
+ ec_point_serialize (&challenge.a2, a2);
+ ec_point_serialize (&challenge.b1, b1);
+ ec_point_serialize (&challenge.b2, b2);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp 0og");
+
+ if (! m_is_gen)
+ { /* m == 0 */
+ /* d2 = c - d1 */
+ gcry_mpi_subm (d2, c, d1, ec_n);
+
+ /* r2 = w - r*d2 */
+ gcry_mpi_mulm (r2, rr, d2, ec_n);
+ gcry_mpi_subm (r2, w, r2, ec_n);
+ }
+ else
+ { /* m == g */
+ /* d1 = c - d2 */
+ gcry_mpi_subm (d1, c, d2, ec_n);
+
+ /* r1 = w - r*d1 */
+ gcry_mpi_mulm (r1, rr, d1, ec_n);
+ gcry_mpi_subm (r1, w, r1, ec_n);
+ }
+
+ ec_point_serialize (&proof->a1, a1);
+ ec_point_serialize (&proof->a2, a2);
+ ec_point_serialize (&proof->b1, b1);
+ ec_point_serialize (&proof->b2, b2);
+ mpi_serialize (&proof->d1, d1);
+ mpi_serialize (&proof->d2, d2);
+ mpi_serialize (&proof->r1, r1);
+ mpi_serialize (&proof->r2, r2);
+
+ gcry_mpi_point_release (a1);
+ gcry_mpi_point_release (a2);
+ gcry_mpi_point_release (b1);
+ gcry_mpi_point_release (b2);
+ gcry_mpi_release (d1);
+ gcry_mpi_release (d2);
+ gcry_mpi_release (r1);
+ gcry_mpi_release (r2);
+ gcry_mpi_release (c);
+ if (NULL == r)
+ gcry_mpi_release (rr);
+ gcry_mpi_release (w);
}
@@ -1342,87 +1345,87 @@ smc_zkp_0og_check (const gcry_mpi_point_t y,
const gcry_mpi_point_t beta,
const struct proof_0og *proof)
{
- int ret;
- struct zkp_challenge_0og challenge;
- gcry_mpi_point_t a1 = gcry_mpi_point_new (0);
- gcry_mpi_point_t a2 = gcry_mpi_point_new (0);
- gcry_mpi_point_t b1 = gcry_mpi_point_new (0);
- gcry_mpi_point_t b2 = gcry_mpi_point_new (0);
- gcry_mpi_t d1 = gcry_mpi_new (256);
- gcry_mpi_t d2 = gcry_mpi_new (256);
- gcry_mpi_t r1 = gcry_mpi_new (256);
- gcry_mpi_t r2 = gcry_mpi_new (256);
- gcry_mpi_t c;
- gcry_mpi_t sum = gcry_mpi_new (256);
- gcry_mpi_point_t right = gcry_mpi_point_new (0);
- gcry_mpi_point_t tmp = gcry_mpi_point_new (0);
-
- ec_point_parse (a1, &proof->a1);
- ec_point_parse (a2, &proof->a2);
- ec_point_parse (b1, &proof->b1);
- ec_point_parse (b2, &proof->b2);
- mpi_parse (d1, &proof->d1);
- mpi_parse (d2, &proof->d2);
- mpi_parse (r1, &proof->r1);
- mpi_parse (r2, &proof->r2);
-
- /* compute challenge c */
- ec_point_serialize (&challenge.g, ec_gen);
- ec_point_serialize (&challenge.alpha, alpha);
- ec_point_serialize (&challenge.beta, beta);
- ec_point_serialize (&challenge.a1, a1);
- ec_point_serialize (&challenge.a2, a2);
- ec_point_serialize (&challenge.b1, b1);
- ec_point_serialize (&challenge.b2, b2);
- GNUNET_CRYPTO_kdf_mod_mpi (&c,
- ec_n,
- NULL,
- 0,
- &challenge,
- sizeof (challenge),
- "libbrandt zkp 0og");
-
- /* c == d1 + d2 */
- gcry_mpi_addm (sum, d1, d2, ec_n);
- ret = gcry_mpi_cmp (c, sum);
-
- /* a1 == r1*g + d1*beta */
- gcry_mpi_ec_mul (tmp, r1, ec_gen, ec_ctx);
- gcry_mpi_ec_mul (right, d1, beta, ec_ctx);
- gcry_mpi_ec_add (right, tmp, right, ec_ctx);
- ret |= ec_point_cmp (a1, right) << 1;
-
- /* b1 == r1*y + d1*(alpha-g) */
- gcry_mpi_ec_sub (right, alpha, ec_gen, ec_ctx);
- gcry_mpi_ec_mul (tmp, d1, right, ec_ctx);
- gcry_mpi_ec_mul (right, r1, y, ec_ctx);
- gcry_mpi_ec_add (right, right, tmp, ec_ctx);
- ret |= ec_point_cmp (b1, right) << 2;
-
- /* a2 == r2*g + d2*beta */
- gcry_mpi_ec_mul (tmp, d2, beta, ec_ctx);
- gcry_mpi_ec_mul (right, r2, ec_gen, ec_ctx);
- gcry_mpi_ec_add (right, right, tmp, ec_ctx);
- ret |= ec_point_cmp (a2, right) << 3;
-
- /* b2 == r2*y + d2*alpha */
- gcry_mpi_ec_mul (tmp, d2, alpha, ec_ctx);
- gcry_mpi_ec_mul (right, r2, y, ec_ctx);
- gcry_mpi_ec_add (right, right, tmp, ec_ctx);
- ret |= ec_point_cmp (b2, right) << 4;
-
- gcry_mpi_point_release (a1);
- gcry_mpi_point_release (a2);
- gcry_mpi_point_release (b1);
- gcry_mpi_point_release (b2);
- gcry_mpi_release (d1);
- gcry_mpi_release (d2);
- gcry_mpi_release (r1);
- gcry_mpi_release (r2);
- gcry_mpi_release (c);
- gcry_mpi_release (sum);
- gcry_mpi_point_release (right);
- gcry_mpi_point_release (tmp);
-
- return ret;
+ int ret;
+ struct zkp_challenge_0og challenge;
+ gcry_mpi_point_t a1 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t a2 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b1 = gcry_mpi_point_new (0);
+ gcry_mpi_point_t b2 = gcry_mpi_point_new (0);
+ gcry_mpi_t d1 = gcry_mpi_new (256);
+ gcry_mpi_t d2 = gcry_mpi_new (256);
+ gcry_mpi_t r1 = gcry_mpi_new (256);
+ gcry_mpi_t r2 = gcry_mpi_new (256);
+ gcry_mpi_t c;
+ gcry_mpi_t sum = gcry_mpi_new (256);
+ gcry_mpi_point_t right = gcry_mpi_point_new (0);
+ gcry_mpi_point_t tmp = gcry_mpi_point_new (0);
+
+ ec_point_parse (a1, &proof->a1);
+ ec_point_parse (a2, &proof->a2);
+ ec_point_parse (b1, &proof->b1);
+ ec_point_parse (b2, &proof->b2);
+ mpi_parse (d1, &proof->d1);
+ mpi_parse (d2, &proof->d2);
+ mpi_parse (r1, &proof->r1);
+ mpi_parse (r2, &proof->r2);
+
+ /* compute challenge c */
+ ec_point_serialize (&challenge.g, ec_gen);
+ ec_point_serialize (&challenge.alpha, alpha);
+ ec_point_serialize (&challenge.beta, beta);
+ ec_point_serialize (&challenge.a1, a1);
+ ec_point_serialize (&challenge.a2, a2);
+ ec_point_serialize (&challenge.b1, b1);
+ ec_point_serialize (&challenge.b2, b2);
+ GNUNET_CRYPTO_kdf_mod_mpi (&c,
+ ec_n,
+ NULL,
+ 0,
+ &challenge,
+ sizeof (challenge),
+ "libbrandt zkp 0og");
+
+ /* c == d1 + d2 */
+ gcry_mpi_addm (sum, d1, d2, ec_n);
+ ret = gcry_mpi_cmp (c, sum);
+
+ /* a1 == r1*g + d1*beta */
+ gcry_mpi_ec_mul (tmp, r1, ec_gen, ec_ctx);
+ gcry_mpi_ec_mul (right, d1, beta, ec_ctx);
+ gcry_mpi_ec_add (right, tmp, right, ec_ctx);
+ ret |= ec_point_cmp (a1, right) << 1;
+
+ /* b1 == r1*y + d1*(alpha-g) */
+ gcry_mpi_ec_sub (right, alpha, ec_gen, ec_ctx);
+ gcry_mpi_ec_mul (tmp, d1, right, ec_ctx);
+ gcry_mpi_ec_mul (right, r1, y, ec_ctx);
+ gcry_mpi_ec_add (right, right, tmp, ec_ctx);
+ ret |= ec_point_cmp (b1, right) << 2;
+
+ /* a2 == r2*g + d2*beta */
+ gcry_mpi_ec_mul (tmp, d2, beta, ec_ctx);
+ gcry_mpi_ec_mul (right, r2, ec_gen, ec_ctx);
+ gcry_mpi_ec_add (right, right, tmp, ec_ctx);
+ ret |= ec_point_cmp (a2, right) << 3;
+
+ /* b2 == r2*y + d2*alpha */
+ gcry_mpi_ec_mul (tmp, d2, alpha, ec_ctx);
+ gcry_mpi_ec_mul (right, r2, y, ec_ctx);
+ gcry_mpi_ec_add (right, right, tmp, ec_ctx);
+ ret |= ec_point_cmp (b2, right) << 4;
+
+ gcry_mpi_point_release (a1);
+ gcry_mpi_point_release (a2);
+ gcry_mpi_point_release (b1);
+ gcry_mpi_point_release (b2);
+ gcry_mpi_release (d1);
+ gcry_mpi_release (d2);
+ gcry_mpi_release (r1);
+ gcry_mpi_release (r2);
+ gcry_mpi_release (c);
+ gcry_mpi_release (sum);
+ gcry_mpi_point_release (right);
+ gcry_mpi_point_release (tmp);
+
+ return ret;
}