diff --git a/internals.h b/internals.h
new file mode 100644
index 0000000..32080ec
--- /dev/null
+++ b/internals.h
@@ -0,0 +1,46 @@
+/* This file is part of libbrandt.
+ * Copyright (C) 2016 GNUnet e.V.
+ *
+ * libbrandt is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libbrandt is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * libbrandt. If not, see .
+ */
+
+/**
+ * @file internals.h
+ * @brief This header contains library internal structs.
+ */
+
+#ifndef _BRANDT_INTERNALS_H
+#define _BRANDT_INTERNALS_H
+
+#include
+
+struct AuctionData {
+ GEN p; /** The "safe prime" p */
+ GEN q; /** The prime @f$q = (p - 1) / 2@f$. */
+ GEN g; /** The generator of @f$\mathbb{G}_q@f$ */
+ uint16_t n; /** The amount of bidders/agents */
+ uint16_t k; /** The amount of possible prices */
+
+ GEN x; /** Own private additive key share */
+ GEN y; /** Own public multiplicative key share */
+ GEN Y; /** Shared public key */
+
+ GEN m; /** Additive share of random exponents, type: Matrix(n,k) */
+ GEN r; /** Key share exponent, type: Vector(k) */
+ GEN b; /** Own bid, type: Vector(k) */
+
+ GEN alpha; /** Own alpha, type: Vector(k) */
+ GEN beta; /** Own beta, type: Vector(k) */
+};
+
+#endif
diff --git a/smc.c b/smc.c
index e3e90cf..02dfafc 100644
--- a/smc.c
+++ b/smc.c
@@ -19,27 +19,71 @@
* @brief Implementation of the smc primitives.
*/
+#include "util.h"
+
#include
GEN
smc_hextodec (char *s) /* int */
{
- unsigned int i, tmp;
+ size_t i;
+ char c;
+ pari_sp ltop = avma;
GEN ret = gen_0; /* int */
- GEN v = gtovecsmall (strtoGENstr (s)); /* vecsmall */
- for (i = 1; i < lg (v); ++i)
+ for (i = 0; i < strlen (s); i++)
{
- ///TODO: scanf instead of if
- if ((v[i] >= '0') && (v[i] <= '9'))
- tmp = v[i] - '0';
- else if ((v[i] >= 'a') && (v[i] <= 'f'))
- tmp = v[i] + 10 - 'a';
- else if ((v[i] >= 'A') && (v[i] <= 'F'))
- tmp = v[i] + 10 - 'A';
- else
- pari_err (e_MISC, "invalid input format");
- ret = addis (shifti (ret, 4), tmp);
+ errno = 0;
+ if (1 != sscanf (&s[i], "%1hhx", &c))
+ {
+ brandt_eprintf ("failed to parse hex (\"%s\") to decimal:", s);
+ return NULL;
+ }
+ ret = addis (shifti (ret, 4), c);
}
- return ret;
+ return gerepilecopy (ltop, ret);
}
+
+
+void
+smc_genbid (AuctionData *ad, uint16_t bid)
+{
+ uint16_t j;
+ pari_sp ltop = avma;
+ GEN ret = cgetg (itos (ad->k)+1, t_VEC); /* vec */
+
+ for (j = 1; j <= ad->k; j++)
+ {
+ gel (ret, j) = gpowgs (ad->g, bid == j);
+ }
+ ad->b = gerepilecopy (ltop, ret);
+}
+
+void
+smc_genalpha (AuctionData *ad)
+{
+ uint16_t j;
+ pari_sp ltop = avma;
+ GEN ret = cgetg (ad->k+1, t_VEC);
+
+ for (j = 1; j <= ad->k; ++j)
+ {
+ gel (ret, j) = gmul (gel (ad->b, j), gpowgi (ad->y, gel (ad->r, j)));
+ }
+ ab->alpha = gerepilecopy (ltop, ret);
+}
+
+void
+smc_genbeta (AuctionData *ad)
+{
+ uint16_t j;
+ pari_sp ltop = avma;
+ GEN ret = cgetg (ad->k+1, t_VEC);
+
+ for (j = 1; j <= ad->k; ++j)
+ {
+ gel (ret, j) = gpowgi (ad->g, gel (ad->r, j));
+ }
+ ab->beta = gerepilecopy (ltop, ret);
+}
+
diff --git a/smc.gp b/smc.gp
index bc7b514..2b7e188 100644
--- a/smc.gp
+++ b/smc.gp
@@ -17,15 +17,19 @@ smc_hextodec(s:str) =
ret;
}
-smc_genfield(p:int, g)=
+smc_genbid(k:small, bid:small, g)=
{
- local(q:int);
- q = (p - 1) / 2;
- [Mod(g^2, p), q];
+ vector(k,j,g^(bid==j));
}
-smc_genkeypair(field:vec)=
+smc_genalpha(k:small, b:vec, r:vec, y)=
{
- local(x:int=random(field[2]));
- [x, field[1]^x];
+ vector(k, j, b[j]*y^r[j]);
}
+
+smc_genbeta(k:small, r:vec, g)=
+{
+ vector(k, j, g^r[j]);
+}
+
+
diff --git a/util.h b/util.h
new file mode 100644
index 0000000..f40dd36
--- /dev/null
+++ b/util.h
@@ -0,0 +1,25 @@
+/* This file is part of libgotr.
+ * (C) 2014-2015 Markus Teich, Jannik Theiß
+ *
+ * libgotr is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 3, or (at your
+ * option) any later version.
+ *
+ * libgotr is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libgotr; see the file LICENSE. If not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _BRANDT_UTIL_H
+#define _BRANDT_UTIL_H
+
+void brandt_eprintf(const char *format, ...);
+
+#endif