start zklaim
authorSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>
Tue, 15 May 2018 17:15:19 +0000 (19:15 +0200)
committerSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>
Tue, 15 May 2018 17:15:19 +0000 (19:15 +0200)
configure.ac
po/POTFILES.in
src/Makefile.am
src/zklaim/Makefile.am [new file with mode: 0644]
src/zklaim/main.c [new file with mode: 0644]

index 668ac75290da908ac5e114b48edacb7d9b160581..fb9012f33f2d9cd65df1882ee76a771c004f980e 100644 (file)
@@ -445,6 +445,16 @@ AC_CHECK_LIB(ogg, ogg_stream_flush_fill,
         AM_CONDITIONAL(HAVE_OGG, false)
         ogg=0)
 
+# check for zklaims
+zklaim=0
+AC_CHECK_HEADER([zklaim.h],zklaim=1)
+AM_CONDITIONAL(HAVE_ZKLAIM, [test "$zklaim" = 1])
+if test "x$zklaim" = x1
+then
+  AC_DEFINE([HAVE_ZKLAIM],[1],[Have zklaim library])
+else
+  AC_DEFINE([HAVE_ZKLAIM],[0],[Lacking zklaim library])
+fi
 
 PKG_CHECK_MODULES([GLIB], [glib-2.0],
 # check for pbc library
@@ -1678,6 +1688,7 @@ src/zonemaster/Makefile
 src/zonemaster/zonemaster.conf
 src/rest/Makefile
 src/abe/Makefile
+src/zklaim/Makefile
 src/identity-attribute/Makefile
 src/identity-provider/Makefile
 pkgconfig/Makefile
index 50cf9761300fb47853852afa5b7c4f4cd3e85b85..d710eaba89b130acbcaf4fb23b273359c783e897 100644 (file)
@@ -507,6 +507,7 @@ src/vpn/gnunet-helper-vpn.c
 src/vpn/gnunet-service-vpn.c
 src/vpn/gnunet-vpn.c
 src/vpn/vpn_api.c
+src/zklaim/main.c
 src/zonemaster/gnunet-service-zonemaster.c
 src/fs/fs_api.h
 src/include/gnunet_common.h
index d8d5487066c4ab969753104ea86e183e2e1a35dc..61e96c75b946f27a2ed29dc0e6ef07f6cfd670f3 100644 (file)
@@ -23,7 +23,10 @@ if HAVE_ABE
     abe \
     credential \
     identity-attribute \
-    identity-provider 
+    identity-provider
+if HAVE_ZKLAIM
+  EXP_DIR += zklaim
+endif
 endif
 if HAVE_JSON
  EXP_DIR += \
diff --git a/src/zklaim/Makefile.am b/src/zklaim/Makefile.am
new file mode 100644 (file)
index 0000000..44f016f
--- /dev/null
@@ -0,0 +1,31 @@
+# This Makefile.am is in the public domain
+AM_CPPFLAGS = -I$(top_srcdir)/src/include
+
+if MINGW
+  WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols
+endif
+
+if USE_COVERAGE
+  AM_CFLAGS = --coverage -O0
+  XLIB = -lgcov
+endif
+
+bin_PROGRAMS = \
+ gnunet-zklaim
+
+gnunet_zklaim_SOURCES = \
+ main.c
+gnunet_zklaim_LDFLAGS = -rdynamic
+gnunet_zklaim_LDADD = \
+ -lzklaim \
+ -lgcrypt \
+ -lsnark \
+ -lff \
+ -lgmp \
+ -lgmpxx \
+ -lcrypto \
+ -lprocps \
+ -lzm \
+ -lstdc++ \
+ -lm
+
diff --git a/src/zklaim/main.c b/src/zklaim/main.c
new file mode 100644 (file)
index 0000000..3fe823b
--- /dev/null
@@ -0,0 +1,237 @@
+/**
+ * Test File for zklaim c implementation
+ */
+
+#include "zklaim.h"
+#include "zklaim_ecc.h"
+#include "zklaim_hash.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <gcrypt.h>
+
+// to boost up valgrind
+int worker() {
+    gcry_sexp_t priv, pub;
+    zklaim_gen_pk(&priv);
+    zklaim_get_pub(priv, &pub);
+    unsigned char *pubbuf;
+    size_t publen;
+    zklaim_pub2buf(pub, &pubbuf, &publen);
+
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+    printf("============================== ISSUER =====================================\n");
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+    //zklaim_ctx* ctx = zklaim_context_init();
+    //zklaim_proving_key* pk = zklaim_proving_key_get(ctx);
+    /*
+     * - 1 -
+     * initialize data structures
+     */
+    printf("[ISSUER] initializing context\n");
+    zklaim_ctx *ctx = zklaim_context_new();
+
+    if (sizeof(ctx->pub_key) != publen) {
+        printf("size mismatch!");
+        return 1;
+    }
+
+    // TODO: there should be a zklaim method for this
+    memcpy(ctx->pub_key, pubbuf, sizeof(ctx->pub_key));
+    free(pubbuf);
+
+    //print_sexp(pub);
+
+    /*
+     * - 2 -
+     * setup the first payload
+     */
+    printf("[ISSUER] Setting up payloads..\n");
+    zklaim_payload pl, pl2;
+    memset(&pl, 0, sizeof(zklaim_payload));
+    pl.data0_ref = 18;
+    pl.data0_op = (enum zklaim_op) (zklaim_greater | zklaim_eq);
+    pl.data1_ref = 1;
+    pl.data1_op = zklaim_eq;
+    pl.data2_ref = 2;
+    pl.data2_op = zklaim_eq;
+    pl.data3_ref = 3;
+    pl.data3_op = zklaim_eq;
+    pl.data4_ref = 600;
+    pl.data4_op = zklaim_less;
+    pl.priv = 0;
+
+    memset(&pl2, 0, sizeof(zklaim_payload));
+    pl2.data0_ref = 0;
+    pl2.data0_op = zklaim_noop;
+    pl2.data1_ref = 0;
+    pl2.data1_op = zklaim_noop;
+    pl2.data2_ref = 0;
+    pl2.data2_op = zklaim_noop;
+    pl2.data3_ref = 0;
+    pl2.data3_op = zklaim_noop;
+    pl2.data4_ref = 9223372036854775807;
+    pl2.data4_op = zklaim_less_or_eq;
+    pl2.priv = 0;
+
+    // fill in the values
+    zklaim_set_attr(&pl, 23, 0);
+    zklaim_set_attr(&pl, 1, 1);
+    zklaim_set_attr(&pl, 2, 2);
+    zklaim_set_attr(&pl, 3, 3);
+    zklaim_set_attr(&pl, 599, 4);
+
+    zklaim_set_attr(&pl2, 0, 0);
+    zklaim_set_attr(&pl2, 0, 1);
+    zklaim_set_attr(&pl2, 0, 2);
+    zklaim_set_attr(&pl2, 0, 3);
+    zklaim_set_attr(&pl2, 9223372036854775807, 4);
+
+    /*
+     * - 3 -
+     * add payload to context
+     */
+    printf("[ISSUER] adding payloads to context\n");
+    zklaim_add_pl(ctx, pl);
+    //zklaim_add_pl(ctx, pl2);
+    //zklaim_add_pl(ctx, pl2);
+    zklaim_hash_ctx(ctx);
+
+    printf("[ISSUER] performing trusted setup in order to generate keys\n");
+    printf("-> trusted setup result: %s\n", (zklaim_trusted_setup(ctx) ? "failed" : "passed"));
+
+    //unsigned char* buf;
+    //size_t vksize = zklaim_verification_key_serialize(ctx, &buf);
+    //printf("serialized vk size: %zuB\n", vksize);
+
+    // write key to disk
+    //FILE* f = fopen("/tmp/vk1", "w");
+    //fwrite(buf, vksize, 1, f);
+    //fclose(f);
+
+    //zklaim_verification_key_deserialize(ctx2, buf, vksize);
+
+    //free(buf);
+
+    //size_t pksize = zklaim_proving_key_serialize(ctx, &buf);
+    //printf("serialized pk size: %.2fMB\n", ((float) pksize)/1000/1000);
+
+    //zklaim_proving_key_deserialize(ctx, buf, pksize);
+
+    //zklaim_print(ctx);
+
+    //zklaim_ctx_sign(ctx, priv);
+
+
+    printf("-> signing context: %s\n", zklaim_ctx_sign(ctx, priv) ? "failed" : "passed");
+
+    unsigned char* ctx_issuer;
+
+    printf("\n[ISSUER] serializing context\n");
+    size_t len = zklaim_ctx_serialize(ctx, &ctx_issuer);
+
+    /*
+     * - 4 -
+     * generate proof
+     */
+
+    //printf("\n-> signing context: %s\n", zklaim_ctx_sign(ctx, priv) ? "failed" : "passed");
+
+    //unsigned char* proof;
+    //size_t proof_size = zklaim_proof_serialize(ctx, &proof);
+    //printf("serialized proof size: %zuB\n", proof_size);
+
+    //zklaim_proof* zkproof_imported;
+
+    //zklaim_proof_deserialize(ctx, proof, proof_size);
+
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+    printf("============================== PROVER =====================================\n");
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+
+
+    zklaim_ctx* ctx_prover = zklaim_context_new();
+    printf("\n[PROVER] deserializing context\n");
+    printf("-> deserialisation status: %s\n\n", zklaim_ctx_deserialize(ctx_prover, ctx_issuer, len) ? "failed" : "passed");
+
+    zklaim_print(ctx_prover);
+
+    ctx_prover->pk = ctx->pk;
+
+    int res = zklaim_ctx_verify(ctx_prover);
+    printf("[PROVER] verification result: %d %s\n", res, (res ? "failed" : "passed"));
+    printf("                              ^--- failure with code 3 (ZKLAIM_INVALID_PROOF) is ok for the prover, as signature passes, but (non-existing) proof fails\n\n");
+
+    printf("[PROVER] resetting operations and reference values to create taylored proof\n");
+    printf("[PROVER] generating proof\n");
+
+    ctx_prover->pk = (unsigned char*) calloc(1, ctx->pk_size);
+    ctx_prover->pk_size = ctx->pk_size;
+    memcpy(ctx_prover->pk, ctx->pk, ctx_prover->pk_size);
+
+    // set custom prover reference values here:
+    ctx_prover->pl_ctx_head->pl.data0_ref = 20;
+    //ctx_prover->pl_ctx_head->pl.data0_op = zklaim_less;
+    ctx_prover->pl_ctx_head->pl.data4_ref = 0;
+    ctx_prover->pl_ctx_head->pl.data4_op = zklaim_noop;
+
+    ctx_prover->pl_ctx_head->pl.data1_ref = 0;
+    ctx_prover->pl_ctx_head->pl.data1_op = zklaim_noop;
+
+    ctx_prover->pl_ctx_head->pl.data2_ref = 0;
+    ctx_prover->pl_ctx_head->pl.data2_op = zklaim_noop;
+
+    ctx_prover->pl_ctx_head->pl.data3_ref = 0;
+    ctx_prover->pl_ctx_head->pl.data3_op = zklaim_noop;
+
+    zklaim_print(ctx_prover);
+
+    printf("-> proof generation status: %s\n\n", (zklaim_proof_generate(ctx_prover) ? "failed" : "passed"));
+
+
+    printf("[PROVER] blinding attributes\n");
+    zklaim_clear_pres(ctx_prover);
+
+
+    printf("[PROVER] serializing context\n\n");
+
+    unsigned char *ctx_prover_buf;
+    len = zklaim_ctx_serialize(ctx_prover, &ctx_prover_buf);
+
+    /*
+     * - 5 -
+     * verify proof
+     */
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+    printf("============================= VERIFIER ====================================\n");
+    printf("===========================================================================\n");
+    printf("===========================================================================\n");
+
+    zklaim_ctx* ctx_verifier = zklaim_context_new();
+    printf("\n[VERIFIER] deserializing context\n");
+    printf("-> deserialisation status: %s\n\n", zklaim_ctx_deserialize(ctx_verifier, ctx_prover_buf, len) ? "failed" : "passed");
+    printf("[VERIFIER] verifying proof and context\n");
+    res = zklaim_ctx_verify(ctx_verifier);
+    printf("verification result: %d %s\n\n", res, (res ? "failed" : "passed"));
+
+    zklaim_print(ctx_verifier);
+
+    free(ctx_prover_buf);
+    free(ctx_issuer);
+    zklaim_ctx_free(ctx);
+    gcry_sexp_release(priv);
+    gcry_sexp_release(pub);
+    zklaim_ctx_free(ctx_prover);
+    zklaim_ctx_free(ctx_verifier);
+
+    return ZKLAIM_OK;
+}
+
+int main() {
+    return worker();
+}