simplify
authorSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>
Thu, 16 Aug 2018 15:04:43 +0000 (17:04 +0200)
committerSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>
Thu, 16 Aug 2018 15:08:02 +0000 (17:08 +0200)
po/POTFILES.in
src/include/gnunet_zklaim_lib.h [deleted file]
src/zklaim/Makefile.am
src/zklaim/zklaim.c

index c4f23ebdab0a430d54423ad18a31d9ba8ebf0a4f..a0fbfc6a14e2372ee6f0501548d9d4850ed33ae9 100644 (file)
@@ -523,7 +523,6 @@ src/vpn/gnunet-helper-vpn-windows.c
 src/vpn/gnunet-service-vpn.c
 src/vpn/gnunet-vpn.c
 src/vpn/vpn_api.c
-src/zklaim/main.c
 src/zklaim/zklaim.c
 src/zonemaster/gnunet-service-zonemaster.c
 src/zonemaster/gnunet-service-zonemaster-monitor.c
diff --git a/src/include/gnunet_zklaim_lib.h b/src/include/gnunet_zklaim_lib.h
deleted file mode 100644 (file)
index a1fd1f0..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
-     This file is part of GNUnet.
-     Copyright (C) 2001-2018 GNUnet e.V.
-
-     GNUnet 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, or (at your
-     option) any later version.
-
-     GNUnet 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 GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
-*/
-
-/**
- * @file include/gnunet_zklaim_lib.h
- * @brief ZKlaim functions for GNUnet
- *
- * @author Martin Schanzenbach
- *
- * @defgroup zklaim ZKlaim library: Zero-Knowledge Credentials
- *
- */
-#ifndef GNUNET_ZKLAIM_LIB_H
-#define GNUNET_ZKLAIM_LIB_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#if 0                           /* keep Emacsens' auto-indent happy */
-}
-#endif
-#endif
-
-#include "gnunet_common.h"
-
-/**
- * @brief type for ZKlaim context
- */
-struct GNUNET_ZKLAIM_Context;
-
-/**
- * @brief type for ZKlaim payload
- */
-struct GNUNET_ZKLAIM_Payload;
-
-
-/**
- * @ingroup zklaim
- * Create a new ZKlaim context. Caller must free return value.
- * TODO: parameters: keys etc.
- *
- * @return fresh context; free using #GNUNET_free
- */
-struct GNUNET_ZKLAIM_Context *
-GNUNET_ZKLAIM_context_create (void);
-
-/**
- * @ingroup zklaim
- * Create a payload.
- * TODO: parameters, attributes etc.
- *
- * @return fresh payload; free using #GNUNET_free
- */
-void
-GNUNET_ZKLAIM_payload_create (void);
-
-/**
- * @ingroup zklaim
- * Create a payload.
- * TODO: parameters, attributes etc.
- *
- * @return GNUNET_OK is successful
- */
-int
-GNUNET_ZKLAIM_context_add_payload (struct GNUNET_ZKLAIM_Context *ctx,
-                                   struct GNUNET_ZKLAIM_Payload* pl);
-
-
-/**
- * @ingroup zklaim
- * Create a payload.
- * TODO: parameters, attributes etc.
- *
- * @return size needed for serialized context, -1 on error
- */
-ssize_t
-GNUNET_ZKLAIM_context_serialize_get_size (struct GNUNET_ZKLAIM_Context *ctx);
-
-
-/**
- * @ingroup zklaim
- * Create a payload.
- * TODO: parameters, attributes etc.
- *
- */
-void
-GNUNET_ZKLAIM_context_serialize (struct GNUNET_ZKLAIM_Context *ctx,
-                                 char* buf);
-
-
-/**
- * @ingroup zklaim
- * Create a payload.
- * TODO: parameters, attributes etc.
- *
- * @return fresh payload; free using #GNUNET_free
- */
-char *
-GNUNET_ZKLAIM_context_to_string (struct GNUNET_ZKLAIM_Context *ctx);
-
-
-
-
-#if 0                           /* keep Emacsens' auto-indent happy */
-{
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-
-/* ifndef GNUNET_ZKLAIM_LIB_H */
-#endif
-/* end of gnunet_zklaim_lib.h */
index c7ca595b8861bac351d47c40479292f8e23c2dfe..a3432794a363fe29f53dd95d291aaf54c57f1d32 100644 (file)
@@ -13,8 +13,8 @@ if USE_COVERAGE
 endif
 
 
-libgnunetzklaim_la_SOURCES = zklaim.c
-libgnunetzklaim_la_LIBADD = \
+gnunet_zklaim_SOURCES = zklaim.c
+gnunet_zklaim_LDADD = \
   $(GCLIBADD)\
   $(LIBGCRYPT_LIBS) \
        -lzklaim \
@@ -25,23 +25,13 @@ libgnunetzklaim_la_LIBADD = \
   -lprocps \
   -lstdc++ \
   -lm
-libgnunetzklaim_la_LDFLAGS = \
-  $(GN_LIB_LDFLAGS) \
-  -version-info 1:0:0
+gnunet_zklaim_LDFLAGS = \
+  $(GN_LIB_LDFLAGS)
 
-lib_LTLIBRARIES = libgnunetzklaim.la
+#lib_LTLIBRARIES = libgnunetzklaim.la
+bin_PROGRAMS = gnunet-zklaim
 
 if ENABLE_TEST_RUN
 AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset XDG_CONFIG_HOME;
 TESTS = $(check_PROGRAMS)
 endif
-
-#check_PROGRAMS = test_cpabe 
-
-#test_cpabe_SOURCES = \
-# test_cpabe.c
-#test_cpabe_LDADD = \
-# libgnunetabe.la \
-# $(top_builddir)/src/util/libgnunetutil.la
-#check_PROGRAMS += \
-# test_cpabe
index a53c193d117d351bfee82cf73f87b00f45a671ee..82eb38d2d5ef4b7669dcf794b93513c7aa35cc92 100644 (file)
 /*
-     This file is part of GNUnet.  Copyright (C) 2001-2018 Christian Grothoff
-     (and other contributing authors)
-
-     GNUnet is free software: you can redistribute it and/or modify it
-     under the terms of the GNU Affero General Public License as published
-     by the Free Software Foundation, either version 3 of the License,
-     or (at your option) any later version.
-
-     GNUnet 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
-     Affero General Public License for more details.
-
-     You should have received a copy of the GNU Affero General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ * This file is part of zklaim.
+ * zklaim 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.
+ *
+ * zklaim 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 zklaim. If not, see https://www.gnu.org/licenses/.
+ */
 
-*/
 
 /**
- * @file abe/abe.c
- * @brief functions for Attribute-Based Encryption
- * @author Martin Schanzenbach
+ * Test File for zklaim c implementation
  */
 
-
-#include "platform.h"
 #include <zklaim/zklaim.h>
-#include "gnunet_crypto_lib.h"
-
-struct GNUNET_ZKLAIM_Context
-{
-  zklaim_ctx* ctx;
-  gcry_sexp_t priv;
-  gcry_sexp_t pub;
-};
-
-struct GNUNET_ZKLAIM_Payload
-{
-  zklaim_payload pl;
-};
-
-struct GNUNET_ZKLAIM_Context*
-GNUNET_ZKLAIM_new ()
-{
-  struct GNUNET_ZKLAIM_Context *ctx;
-  unsigned char *pubbuf;
-  size_t publen;
-  
-  ctx = GNUNET_new (struct GNUNET_ZKLAIM_Context);
-  ctx->ctx = zklaim_context_new();
-  zklaim_pub2buf(ctx->pub, &pubbuf, &publen);
-  zklaim_gen_pk(&ctx->priv);
-  zklaim_get_pub(ctx->priv, &ctx->pub);
-   if (sizeof(ctx->ctx->pub_key) != publen) {
+#include <zklaim/zklaim_ecc.h>
+#include <zklaim/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 NULL;
-   }
+        return 1;
+    }
 
-   memcpy(ctx->ctx->pub_key, pubbuf, sizeof(ctx->ctx->pub_key));
-   free(pubbuf);
-   return ctx;
-}
+    // 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, pl); */
+    //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->next->pl.data0_ref = 30; */
+    /* ctx_prover->pl_ctx_head->next->pl.data0_op = zklaim_less_or_eq; */
+    //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);
 
-int
-GNUNET_ZKLAIM_add_payload (struct GNUNET_ZKLAIM_Context *ctx,
-                           struct GNUNET_ZKLAIM_Payload *pl)
-{
-  zklaim_add_pl (ctx->ctx, pl->pl);
-  return GNUNET_OK;
+    return ZKLAIM_OK;
 }
 
-int
-GNUNET_ZKLAIM_finalize (struct GNUNET_ZKLAIM_Context *ctx)
-{
-  zklaim_hash_ctx (ctx->ctx);
-  zklaim_ctx_sign (ctx->ctx, ctx->priv);
-  return 1;
+int main() {
+    return worker();
 }