2 This file is part of GNUnet.
3 Copyright (C) 2015 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file util/test_ecc_scalarproduct.c
23 * @brief testcase for math behind ECC SP calculation
24 * @author Christian Grothoff
27 #include "gnunet_util_lib.h"
33 static struct GNUNET_CRYPTO_EccDlogContext *edc;
37 * Perform SP calculation.
39 * @param avec 0-terminated vector of Alice's values
40 * @param bvec 0-terminated vector of Bob's values
44 test_sp(const unsigned int *avec,
45 const unsigned int *bvec)
63 /* determine length */
64 for (len = 0; 0 != avec[len]; len++)
70 GNUNET_CRYPTO_ecc_rnd_mpi(edc,
72 g = GNUNET_new_array(len,
74 h = GNUNET_new_array(len,
76 ria = gcry_mpi_new(0);
77 tmp = gcry_mpi_new(0);
78 for (i = 0; i < len; i++)
80 ri = GNUNET_CRYPTO_ecc_random_mod_n(edc);
81 g[i] = GNUNET_CRYPTO_ecc_dexp_mpi(edc,
87 /* tmp = ria + avec[i] */
91 h[i] = GNUNET_CRYPTO_ecc_dexp_mpi(edc,
94 gcry_mpi_release(ria);
95 gcry_mpi_release(tmp);
98 val = gcry_mpi_new(0);
99 gcry_mpi_set_ui(val, bvec[0]);
100 pg = GNUNET_CRYPTO_ecc_pmul_mpi(edc,
103 ph = GNUNET_CRYPTO_ecc_pmul_mpi(edc,
106 for (i = 1; i < len; i++)
109 gcry_mpi_point_t tmp;
111 gcry_mpi_set_ui(val, bvec[i]);
112 m = GNUNET_CRYPTO_ecc_pmul_mpi(edc,
115 tmp = GNUNET_CRYPTO_ecc_add(edc,
118 gcry_mpi_point_release(m);
119 gcry_mpi_point_release(pg);
120 gcry_mpi_point_release(g[i]);
123 m = GNUNET_CRYPTO_ecc_pmul_mpi(edc,
126 tmp = GNUNET_CRYPTO_ecc_add(edc,
129 gcry_mpi_point_release(m);
130 gcry_mpi_point_release(ph);
131 gcry_mpi_point_release(h[i]);
134 gcry_mpi_release(val);
139 pgi = GNUNET_CRYPTO_ecc_pmul_mpi(edc,
142 gsp = GNUNET_CRYPTO_ecc_add(edc,
145 gcry_mpi_point_release(pgi);
146 gcry_mpi_point_release(ph);
147 sp = GNUNET_CRYPTO_ecc_dlog(edc,
149 gcry_mpi_point_release(gsp);
155 main(int argc, char *argv[])
157 static unsigned int v11[] = { 1, 1, 0 };
158 static unsigned int v22[] = { 2, 2, 0 };
159 static unsigned int v35[] = { 3, 5, 0 };
160 static unsigned int v24[] = { 2, 4, 0 };
162 GNUNET_log_setup("test-ecc-scalarproduct",
165 edc = GNUNET_CRYPTO_ecc_dlog_prepare(128, 128);
166 GNUNET_assert(2 == test_sp(v11, v11));
167 GNUNET_assert(4 == test_sp(v22, v11));
168 GNUNET_assert(8 == test_sp(v35, v11));
169 GNUNET_assert(26 == test_sp(v35, v24));
170 GNUNET_assert(26 == test_sp(v24, v35));
171 GNUNET_assert(16 == test_sp(v22, v35));
172 GNUNET_CRYPTO_ecc_dlog_release(edc);
176 /* end of test_ecc_scalarproduct.c */