From 5ef8d3c6cbe7970bc9c9e54b4ab23c8727200b15 Mon Sep 17 00:00:00 2001 From: "Schanzenbach, Martin" Date: Thu, 16 Aug 2018 17:04:43 +0200 Subject: simplify --- po/POTFILES.in | 1 - src/include/gnunet_zklaim_lib.h | 131 ----------------- src/zklaim/Makefile.am | 22 +-- src/zklaim/zklaim.c | 309 +++++++++++++++++++++++++++++++--------- 4 files changed, 249 insertions(+), 214 deletions(-) delete mode 100644 src/include/gnunet_zklaim_lib.h diff --git a/po/POTFILES.in b/po/POTFILES.in index c4f23ebda..a0fbfc6a1 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -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 index a1fd1f017..000000000 --- a/src/include/gnunet_zklaim_lib.h +++ /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 */ diff --git a/src/zklaim/Makefile.am b/src/zklaim/Makefile.am index c7ca595b8..a3432794a 100644 --- a/src/zklaim/Makefile.am +++ b/src/zklaim/Makefile.am @@ -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 diff --git a/src/zklaim/zklaim.c b/src/zklaim/zklaim.c index a53c193d1..82eb38d2d 100644 --- a/src/zklaim/zklaim.c +++ b/src/zklaim/zklaim.c @@ -1,79 +1,256 @@ /* - 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 . + * 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 -#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 +#include +#include +#include +#include +#include + +// 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(); } -- cgit v1.2.3