charm-crypto-framework 0.61.1__cp313-cp313-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- charm/__init__.py +5 -0
- charm/adapters/__init__.py +0 -0
- charm/adapters/abenc_adapt_hybrid.py +90 -0
- charm/adapters/dabenc_adapt_hybrid.py +145 -0
- charm/adapters/ibenc_adapt_hybrid.py +72 -0
- charm/adapters/ibenc_adapt_identityhash.py +80 -0
- charm/adapters/kpabenc_adapt_hybrid.py +91 -0
- charm/adapters/pkenc_adapt_bchk05.py +121 -0
- charm/adapters/pkenc_adapt_chk04.py +91 -0
- charm/adapters/pkenc_adapt_hybrid.py +98 -0
- charm/adapters/pksig_adapt_naor01.py +89 -0
- charm/config.py +7 -0
- charm/core/__init__.py +0 -0
- charm/core/benchmark/benchmark_util.c +353 -0
- charm/core/benchmark/benchmark_util.h +61 -0
- charm/core/benchmark/benchmarkmodule.c +476 -0
- charm/core/benchmark/benchmarkmodule.h +162 -0
- charm/core/benchmark.cpython-313-darwin.so +0 -0
- charm/core/crypto/AES/AES.c +1464 -0
- charm/core/crypto/AES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES/DES.c +113 -0
- charm/core/crypto/DES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES3/DES3.c +26 -0
- charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
- charm/core/crypto/__init__.py +0 -0
- charm/core/crypto/cryptobase/XOR.c +80 -0
- charm/core/crypto/cryptobase/_counter.c +496 -0
- charm/core/crypto/cryptobase/_counter.h +54 -0
- charm/core/crypto/cryptobase/block_template.c +900 -0
- charm/core/crypto/cryptobase/block_template.h +69 -0
- charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
- charm/core/crypto/cryptobase/stream_template.c +271 -0
- charm/core/crypto/cryptobase/strxor.c +229 -0
- charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
- charm/core/engine/__init__.py +5 -0
- charm/core/engine/protocol.py +293 -0
- charm/core/engine/util.py +174 -0
- charm/core/math/__init__.py +0 -0
- charm/core/math/elliptic_curve/ecmodule.c +1986 -0
- charm/core/math/elliptic_curve/ecmodule.h +230 -0
- charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
- charm/core/math/elliptic_curve.pyi +63 -0
- charm/core/math/integer/integermodule.c +2539 -0
- charm/core/math/integer/integermodule.h +145 -0
- charm/core/math/integer.cpython-313-darwin.so +0 -0
- charm/core/math/integer.pyi +76 -0
- charm/core/math/pairing/miracl/miracl_config.h +37 -0
- charm/core/math/pairing/miracl/miracl_interface.h +118 -0
- charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
- charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
- charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
- charm/core/math/pairing/pairingmodule.c +2230 -0
- charm/core/math/pairing/pairingmodule.h +241 -0
- charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
- charm/core/math/pairing/relic/pairingmodule3.h +233 -0
- charm/core/math/pairing/relic/relic_interface.c +1337 -0
- charm/core/math/pairing/relic/relic_interface.h +217 -0
- charm/core/math/pairing/relic/test_relic.c +171 -0
- charm/core/math/pairing.cpython-313-darwin.so +0 -0
- charm/core/math/pairing.pyi +69 -0
- charm/core/utilities/base64.c +248 -0
- charm/core/utilities/base64.h +15 -0
- charm/schemes/__init__.py +0 -0
- charm/schemes/abenc/__init__.py +0 -0
- charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
- charm/schemes/abenc/abenc_bsw07.py +146 -0
- charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
- charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
- charm/schemes/abenc/abenc_lsw08.py +159 -0
- charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
- charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
- charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
- charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
- charm/schemes/abenc/abenc_waters09.py +144 -0
- charm/schemes/abenc/abenc_yct14.py +208 -0
- charm/schemes/abenc/abenc_yllc15.py +178 -0
- charm/schemes/abenc/ac17.py +248 -0
- charm/schemes/abenc/bsw07.py +141 -0
- charm/schemes/abenc/cgw15.py +277 -0
- charm/schemes/abenc/dabe_aw11.py +204 -0
- charm/schemes/abenc/dfa_fe12.py +144 -0
- charm/schemes/abenc/pk_hve08.py +179 -0
- charm/schemes/abenc/waters11.py +143 -0
- charm/schemes/aggrsign_MuSig.py +150 -0
- charm/schemes/aggrsign_bls.py +267 -0
- charm/schemes/blindsig_ps16.py +654 -0
- charm/schemes/chamhash_adm05.py +113 -0
- charm/schemes/chamhash_rsa_hw09.py +100 -0
- charm/schemes/commit/__init__.py +0 -0
- charm/schemes/commit/commit_gs08.py +77 -0
- charm/schemes/commit/commit_pedersen92.py +53 -0
- charm/schemes/encap_bchk05.py +62 -0
- charm/schemes/grpsig/__init__.py +0 -0
- charm/schemes/grpsig/groupsig_bgls04.py +114 -0
- charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
- charm/schemes/hibenc/__init__.py +0 -0
- charm/schemes/hibenc/hibenc_bb04.py +105 -0
- charm/schemes/hibenc/hibenc_lew11.py +193 -0
- charm/schemes/ibenc/__init__.py +0 -0
- charm/schemes/ibenc/clpkc_rp03.py +119 -0
- charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
- charm/schemes/ibenc/ibenc_bb03.py +94 -0
- charm/schemes/ibenc/ibenc_bf01.py +121 -0
- charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
- charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
- charm/schemes/ibenc/ibenc_lsw08.py +120 -0
- charm/schemes/ibenc/ibenc_sw05.py +238 -0
- charm/schemes/ibenc/ibenc_waters05.py +144 -0
- charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
- charm/schemes/ibenc/ibenc_waters09.py +107 -0
- charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
- charm/schemes/joye_scheme.py +106 -0
- charm/schemes/lem_scheme.py +207 -0
- charm/schemes/pk_fre_ccv11.py +107 -0
- charm/schemes/pk_vrf.py +127 -0
- charm/schemes/pkenc/__init__.py +0 -0
- charm/schemes/pkenc/pkenc_cs98.py +108 -0
- charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
- charm/schemes/pkenc/pkenc_gm82.py +98 -0
- charm/schemes/pkenc/pkenc_paillier99.py +118 -0
- charm/schemes/pkenc/pkenc_rabin.py +254 -0
- charm/schemes/pkenc/pkenc_rsa.py +186 -0
- charm/schemes/pksig/__init__.py +0 -0
- charm/schemes/pksig/pksig_CW13_z.py +135 -0
- charm/schemes/pksig/pksig_bls04.py +87 -0
- charm/schemes/pksig/pksig_boyen.py +156 -0
- charm/schemes/pksig/pksig_chch.py +97 -0
- charm/schemes/pksig/pksig_chp.py +70 -0
- charm/schemes/pksig/pksig_cl03.py +150 -0
- charm/schemes/pksig/pksig_cl04.py +87 -0
- charm/schemes/pksig/pksig_cllww12_z.py +142 -0
- charm/schemes/pksig/pksig_cyh.py +132 -0
- charm/schemes/pksig/pksig_dsa.py +76 -0
- charm/schemes/pksig/pksig_ecdsa.py +71 -0
- charm/schemes/pksig/pksig_hess.py +104 -0
- charm/schemes/pksig/pksig_hw.py +110 -0
- charm/schemes/pksig/pksig_lamport.py +63 -0
- charm/schemes/pksig/pksig_ps01.py +135 -0
- charm/schemes/pksig/pksig_ps02.py +124 -0
- charm/schemes/pksig/pksig_ps03.py +119 -0
- charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
- charm/schemes/pksig/pksig_schnorr91.py +77 -0
- charm/schemes/pksig/pksig_waters.py +115 -0
- charm/schemes/pksig/pksig_waters05.py +121 -0
- charm/schemes/pksig/pksig_waters09.py +121 -0
- charm/schemes/pre_mg07.py +150 -0
- charm/schemes/prenc/pre_afgh06.py +126 -0
- charm/schemes/prenc/pre_bbs98.py +123 -0
- charm/schemes/prenc/pre_nal16.py +216 -0
- charm/schemes/protocol_a01.py +272 -0
- charm/schemes/protocol_ao00.py +215 -0
- charm/schemes/protocol_cns07.py +274 -0
- charm/schemes/protocol_schnorr91.py +125 -0
- charm/schemes/sigma1.py +64 -0
- charm/schemes/sigma2.py +129 -0
- charm/schemes/sigma3.py +126 -0
- charm/schemes/threshold/__init__.py +59 -0
- charm/schemes/threshold/dkls23_dkg.py +556 -0
- charm/schemes/threshold/dkls23_presign.py +1089 -0
- charm/schemes/threshold/dkls23_sign.py +761 -0
- charm/schemes/threshold/xrpl_wallet.py +967 -0
- charm/test/__init__.py +0 -0
- charm/test/adapters/__init__.py +0 -0
- charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
- charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
- charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
- charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
- charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
- charm/test/benchmark/abenc_yllc15_bench.py +92 -0
- charm/test/benchmark/benchmark_test.py +148 -0
- charm/test/benchmark_threshold.py +260 -0
- charm/test/conftest.py +38 -0
- charm/test/fuzz/__init__.py +1 -0
- charm/test/fuzz/conftest.py +5 -0
- charm/test/fuzz/fuzz_policy_parser.py +76 -0
- charm/test/fuzz/fuzz_serialization.py +83 -0
- charm/test/schemes/__init__.py +0 -0
- charm/test/schemes/abenc/__init__.py +0 -0
- charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
- charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
- charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
- charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
- charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
- charm/test/schemes/chamhash_adm05_test.py +31 -0
- charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
- charm/test/schemes/commit/__init__.py +0 -0
- charm/test/schemes/commit/commit_gs08_test.py +24 -0
- charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
- charm/test/schemes/dabe_aw11_test.py +45 -0
- charm/test/schemes/encap_bchk05_test.py +21 -0
- charm/test/schemes/grpsig/__init__.py +0 -0
- charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
- charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
- charm/test/schemes/hibenc/__init__.py +0 -0
- charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
- charm/test/schemes/ibenc/__init__.py +0 -0
- charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
- charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
- charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
- charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
- charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
- charm/test/schemes/pk_vrf_test.py +29 -0
- charm/test/schemes/pkenc/__init__.py +0 -0
- charm/test/schemes/pkenc_test.py +255 -0
- charm/test/schemes/pksig/__init__.py +0 -0
- charm/test/schemes/pksig_test.py +376 -0
- charm/test/schemes/rsa_alg_test.py +340 -0
- charm/test/schemes/threshold_test.py +1792 -0
- charm/test/serialize/__init__.py +0 -0
- charm/test/serialize/serialize_test.py +40 -0
- charm/test/toolbox/__init__.py +0 -0
- charm/test/toolbox/conversion_test.py +30 -0
- charm/test/toolbox/ecgroup_test.py +53 -0
- charm/test/toolbox/integer_arithmetic_test.py +441 -0
- charm/test/toolbox/paddingschemes_test.py +238 -0
- charm/test/toolbox/policy_parser_stress_test.py +969 -0
- charm/test/toolbox/secretshare_test.py +28 -0
- charm/test/toolbox/symcrypto_test.py +108 -0
- charm/test/toolbox/test_policy_expression.py +16 -0
- charm/test/vectors/__init__.py +1 -0
- charm/test/vectors/test_bls_vectors.py +289 -0
- charm/test/vectors/test_pedersen_vectors.py +315 -0
- charm/test/vectors/test_schnorr_vectors.py +368 -0
- charm/test/zkp_compiler/__init__.py +9 -0
- charm/test/zkp_compiler/benchmark_zkp.py +258 -0
- charm/test/zkp_compiler/test_and_proof.py +240 -0
- charm/test/zkp_compiler/test_batch_verify.py +248 -0
- charm/test/zkp_compiler/test_dleq_proof.py +264 -0
- charm/test/zkp_compiler/test_or_proof.py +231 -0
- charm/test/zkp_compiler/test_proof_serialization.py +121 -0
- charm/test/zkp_compiler/test_range_proof.py +241 -0
- charm/test/zkp_compiler/test_representation_proof.py +325 -0
- charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
- charm/test/zkp_compiler/test_thread_safety.py +169 -0
- charm/test/zkp_compiler/test_zkp_parser.py +139 -0
- charm/toolbox/ABEnc.py +26 -0
- charm/toolbox/ABEncMultiAuth.py +66 -0
- charm/toolbox/ABEnumeric.py +800 -0
- charm/toolbox/Commit.py +24 -0
- charm/toolbox/DFA.py +89 -0
- charm/toolbox/FSA.py +1254 -0
- charm/toolbox/Hash.py +39 -0
- charm/toolbox/IBEnc.py +62 -0
- charm/toolbox/IBSig.py +64 -0
- charm/toolbox/PKEnc.py +66 -0
- charm/toolbox/PKSig.py +56 -0
- charm/toolbox/PREnc.py +32 -0
- charm/toolbox/ZKProof.py +289 -0
- charm/toolbox/__init__.py +0 -0
- charm/toolbox/bitstring.py +49 -0
- charm/toolbox/broadcast.py +220 -0
- charm/toolbox/conversion.py +100 -0
- charm/toolbox/eccurve.py +149 -0
- charm/toolbox/ecgroup.py +143 -0
- charm/toolbox/enum.py +60 -0
- charm/toolbox/hash_module.py +91 -0
- charm/toolbox/integergroup.py +323 -0
- charm/toolbox/iterate.py +22 -0
- charm/toolbox/matrixops.py +76 -0
- charm/toolbox/mpc_utils.py +296 -0
- charm/toolbox/msp.py +175 -0
- charm/toolbox/mta.py +985 -0
- charm/toolbox/node.py +120 -0
- charm/toolbox/ot/__init__.py +22 -0
- charm/toolbox/ot/base_ot.py +374 -0
- charm/toolbox/ot/dpf.py +642 -0
- charm/toolbox/ot/mpfss.py +228 -0
- charm/toolbox/ot/ot_extension.py +589 -0
- charm/toolbox/ot/silent_ot.py +378 -0
- charm/toolbox/paddingschemes.py +423 -0
- charm/toolbox/paddingschemes_test.py +238 -0
- charm/toolbox/pairingcurves.py +85 -0
- charm/toolbox/pairinggroup.py +186 -0
- charm/toolbox/policy_expression_spec.py +70 -0
- charm/toolbox/policytree.py +189 -0
- charm/toolbox/reCompiler.py +346 -0
- charm/toolbox/redundancyschemes.py +65 -0
- charm/toolbox/schemebase.py +188 -0
- charm/toolbox/secretshare.py +104 -0
- charm/toolbox/secretutil.py +174 -0
- charm/toolbox/securerandom.py +73 -0
- charm/toolbox/sigmaprotocol.py +46 -0
- charm/toolbox/specialprimes.py +45 -0
- charm/toolbox/symcrypto.py +279 -0
- charm/toolbox/threshold_sharing.py +553 -0
- charm/toolbox/xmlserialize.py +94 -0
- charm/toolbox/zknode.py +105 -0
- charm/zkp_compiler/__init__.py +89 -0
- charm/zkp_compiler/and_proof.py +460 -0
- charm/zkp_compiler/batch_verify.py +324 -0
- charm/zkp_compiler/dleq_proof.py +423 -0
- charm/zkp_compiler/or_proof.py +305 -0
- charm/zkp_compiler/range_proof.py +417 -0
- charm/zkp_compiler/representation_proof.py +466 -0
- charm/zkp_compiler/schnorr_proof.py +273 -0
- charm/zkp_compiler/thread_safe.py +150 -0
- charm/zkp_compiler/zk_demo.py +489 -0
- charm/zkp_compiler/zkp_factory.py +330 -0
- charm/zkp_compiler/zkp_generator.py +370 -0
- charm/zkp_compiler/zkparser.py +269 -0
- charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
- charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
- charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
- charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
- charm_crypto_framework-0.61.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Zero-Knowledge Proof Demo - Secure API Migration Guide
|
|
4
|
+
|
|
5
|
+
This demo shows both the legacy (deprecated) API and the new secure API for
|
|
6
|
+
zero-knowledge proofs in Charm-Crypto.
|
|
7
|
+
|
|
8
|
+
=== RECOMMENDED CURVE: BN254 ===
|
|
9
|
+
|
|
10
|
+
This demo uses the BN254 (Barreto-Naehrig) curve which provides:
|
|
11
|
+
- ~128-bit security level (vs SS512's ~80-bit security)
|
|
12
|
+
- Efficient pairing operations
|
|
13
|
+
- Widely used in production systems (e.g., Ethereum precompiles)
|
|
14
|
+
|
|
15
|
+
Available curves and their security levels:
|
|
16
|
+
- BN254: ~128-bit security (RECOMMENDED for production)
|
|
17
|
+
- SS512: ~80-bit security (legacy, not recommended)
|
|
18
|
+
- MNT224: ~112-bit security (asymmetric curve)
|
|
19
|
+
- SS1024: ~80-bit security (larger but same security as SS512)
|
|
20
|
+
|
|
21
|
+
=== MIGRATION GUIDE ===
|
|
22
|
+
|
|
23
|
+
The legacy API (executeIntZKProof, executeNonIntZKProof) uses insecure dynamic
|
|
24
|
+
code execution (exec/compile) which can lead to code injection vulnerabilities.
|
|
25
|
+
The new secure API directly implements the ZKP protocols without dynamic code.
|
|
26
|
+
|
|
27
|
+
OLD (deprecated - security risk):
|
|
28
|
+
from charm.zkp_compiler.zkp_generator import executeIntZKProof
|
|
29
|
+
result = executeIntZKProof(pk, sk, '(h = g^x)', party_info)
|
|
30
|
+
|
|
31
|
+
NEW (secure - recommended):
|
|
32
|
+
from charm.zkp_compiler.schnorr_proof import SchnorrProof
|
|
33
|
+
proof = SchnorrProof.prove_non_interactive(group, g, h, x)
|
|
34
|
+
is_valid = SchnorrProof.verify_non_interactive(group, g, h, proof)
|
|
35
|
+
|
|
36
|
+
=== PROOF MODES ===
|
|
37
|
+
|
|
38
|
+
Interactive Mode:
|
|
39
|
+
- Prover and verifier exchange messages in real-time
|
|
40
|
+
- Requires network socket connection
|
|
41
|
+
- Prover: commitment -> Verifier: challenge -> Prover: response -> Verifier: verify
|
|
42
|
+
- Security: Honest-Verifier Zero-Knowledge (HVZK)
|
|
43
|
+
|
|
44
|
+
Non-Interactive Mode (Fiat-Shamir):
|
|
45
|
+
- Prover generates complete proof locally using hash function as "random oracle"
|
|
46
|
+
- Proof can be transmitted and verified offline
|
|
47
|
+
- No real-time interaction required
|
|
48
|
+
- Security: Non-Interactive Zero-Knowledge (NIZK) in the Random Oracle Model
|
|
49
|
+
|
|
50
|
+
Usage:
|
|
51
|
+
# Interactive mode (legacy) - requires two terminals:
|
|
52
|
+
Terminal 1: python zk_demo.py -v # Start verifier first
|
|
53
|
+
Terminal 2: python zk_demo.py -p # Then start prover
|
|
54
|
+
|
|
55
|
+
# Non-interactive mode (new secure API):
|
|
56
|
+
python zk_demo.py --demo-secure # Runs complete demo locally
|
|
57
|
+
python zk_demo.py --demo-interactive # Runs interactive demo locally
|
|
58
|
+
python zk_demo.py --demo-serialization # Runs serialization demo
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
|
|
62
|
+
from charm.core.engine.util import objectToBytes, bytesToObject
|
|
63
|
+
from socket import *
|
|
64
|
+
import sys
|
|
65
|
+
import warnings
|
|
66
|
+
|
|
67
|
+
# =============================================================================
|
|
68
|
+
# NEW SECURE API IMPORTS (Recommended)
|
|
69
|
+
# =============================================================================
|
|
70
|
+
# These modules implement ZKP protocols directly without exec() or eval()
|
|
71
|
+
from charm.zkp_compiler.schnorr_proof import SchnorrProof, Proof
|
|
72
|
+
from charm.zkp_compiler.zkp_factory import ZKProofFactory
|
|
73
|
+
|
|
74
|
+
# =============================================================================
|
|
75
|
+
# LEGACY API IMPORTS (Deprecated - uses insecure exec())
|
|
76
|
+
# =============================================================================
|
|
77
|
+
# WARNING: This import uses dynamic code execution which is a security risk.
|
|
78
|
+
# Only use for backwards compatibility with existing code.
|
|
79
|
+
from charm.zkp_compiler.zkp_generator import executeIntZKProof
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# =============================================================================
|
|
83
|
+
# NEW SECURE API DEMOS
|
|
84
|
+
# =============================================================================
|
|
85
|
+
|
|
86
|
+
def demo_non_interactive_proof():
|
|
87
|
+
"""
|
|
88
|
+
Demonstrate non-interactive Schnorr proof using the new secure API.
|
|
89
|
+
|
|
90
|
+
This is the recommended approach for most use cases:
|
|
91
|
+
- No real-time interaction required
|
|
92
|
+
- Proof can be serialized and transmitted
|
|
93
|
+
- Verifier can verify offline
|
|
94
|
+
- Uses Fiat-Shamir heuristic for security
|
|
95
|
+
"""
|
|
96
|
+
print("\n" + "=" * 70)
|
|
97
|
+
print("NON-INTERACTIVE SCHNORR PROOF DEMO (New Secure API)")
|
|
98
|
+
print("=" * 70)
|
|
99
|
+
|
|
100
|
+
# Setup: Use BN254 curve (~128-bit security, recommended for production)
|
|
101
|
+
group = PairingGroup('BN254')
|
|
102
|
+
print(f"\n[Setup] Using pairing group: BN254 (~128-bit security)")
|
|
103
|
+
|
|
104
|
+
# Prover's secret and public values
|
|
105
|
+
g = group.random(G1) # Generator (public)
|
|
106
|
+
x = group.random(ZR) # Secret exponent (prover's secret)
|
|
107
|
+
h = g ** x # Public value (h = g^x)
|
|
108
|
+
|
|
109
|
+
print(f"[Prover] Generated secret x and computed h = g^x")
|
|
110
|
+
print(f"[Prover] Statement to prove: 'I know x such that h = g^x'")
|
|
111
|
+
|
|
112
|
+
# =========================================================================
|
|
113
|
+
# PROVER: Generate proof
|
|
114
|
+
# =========================================================================
|
|
115
|
+
print("\n--- Prover generates proof ---")
|
|
116
|
+
|
|
117
|
+
# Method 1: Direct API (recommended for simple Schnorr proofs)
|
|
118
|
+
proof = SchnorrProof.prove_non_interactive(group, g, h, x)
|
|
119
|
+
|
|
120
|
+
print(f"[Prover] Created proof with:")
|
|
121
|
+
print(f" - Commitment (u = g^r): {str(proof.commitment)[:50]}...")
|
|
122
|
+
print(f" - Challenge (c = H(g,h,u)): {str(proof.challenge)[:50]}...")
|
|
123
|
+
print(f" - Response (z = r + c*x): {str(proof.response)[:50]}...")
|
|
124
|
+
|
|
125
|
+
# =========================================================================
|
|
126
|
+
# VERIFIER: Verify proof
|
|
127
|
+
# =========================================================================
|
|
128
|
+
print("\n--- Verifier verifies proof ---")
|
|
129
|
+
|
|
130
|
+
# Verifier only needs: g, h (public values) and the proof
|
|
131
|
+
is_valid = SchnorrProof.verify_non_interactive(group, g, h, proof)
|
|
132
|
+
|
|
133
|
+
print(f"[Verifier] Checking: g^z == u * h^c")
|
|
134
|
+
print(f"[Verifier] Proof valid: {is_valid}")
|
|
135
|
+
|
|
136
|
+
# =========================================================================
|
|
137
|
+
# Demonstrate that wrong secret fails
|
|
138
|
+
# =========================================================================
|
|
139
|
+
print("\n--- Demonstrating invalid proof detection ---")
|
|
140
|
+
wrong_x = group.random(ZR)
|
|
141
|
+
wrong_proof = SchnorrProof.prove_non_interactive(group, g, h, wrong_x)
|
|
142
|
+
is_valid_wrong = SchnorrProof.verify_non_interactive(group, g, h, wrong_proof)
|
|
143
|
+
print(f"[Verifier] Proof with wrong secret valid: {is_valid_wrong} (expected: False)")
|
|
144
|
+
|
|
145
|
+
return proof, group, g, h
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def demo_interactive_proof():
|
|
149
|
+
"""
|
|
150
|
+
Demonstrate interactive Schnorr proof using the new secure API.
|
|
151
|
+
|
|
152
|
+
Interactive mode is useful when:
|
|
153
|
+
- Prover and verifier can communicate in real-time
|
|
154
|
+
- You want the verifier to contribute randomness (challenge)
|
|
155
|
+
- Security against malicious verifiers is not required
|
|
156
|
+
|
|
157
|
+
Protocol flow:
|
|
158
|
+
1. Prover -> Verifier: commitment (u = g^r)
|
|
159
|
+
2. Verifier -> Prover: challenge (c, random)
|
|
160
|
+
3. Prover -> Verifier: response (z = r + c*x)
|
|
161
|
+
4. Verifier: verify g^z == u * h^c
|
|
162
|
+
"""
|
|
163
|
+
print("\n" + "=" * 70)
|
|
164
|
+
print("INTERACTIVE SCHNORR PROOF DEMO (New Secure API)")
|
|
165
|
+
print("=" * 70)
|
|
166
|
+
|
|
167
|
+
# Setup: Use BN254 curve (~128-bit security)
|
|
168
|
+
group = PairingGroup('BN254')
|
|
169
|
+
g = group.random(G1)
|
|
170
|
+
x = group.random(ZR)
|
|
171
|
+
h = g ** x
|
|
172
|
+
|
|
173
|
+
print(f"\n[Setup] Generator g and public value h = g^x")
|
|
174
|
+
|
|
175
|
+
# Create prover and verifier instances
|
|
176
|
+
prover = SchnorrProof.Prover(x, group)
|
|
177
|
+
verifier = SchnorrProof.Verifier(group)
|
|
178
|
+
|
|
179
|
+
print("\n--- Interactive Protocol ---")
|
|
180
|
+
|
|
181
|
+
# Step 1: Prover creates commitment
|
|
182
|
+
print("\n[Step 1] Prover -> Verifier: commitment")
|
|
183
|
+
commitment = prover.create_commitment(g)
|
|
184
|
+
print(f" u = g^r: {str(commitment)[:50]}...")
|
|
185
|
+
|
|
186
|
+
# Step 2: Verifier creates challenge
|
|
187
|
+
print("\n[Step 2] Verifier -> Prover: challenge")
|
|
188
|
+
challenge = verifier.create_challenge()
|
|
189
|
+
print(f" c (random): {str(challenge)[:50]}...")
|
|
190
|
+
|
|
191
|
+
# Step 3: Prover creates response
|
|
192
|
+
print("\n[Step 3] Prover -> Verifier: response")
|
|
193
|
+
response = prover.create_response(challenge)
|
|
194
|
+
print(f" z = r + c*x: {str(response)[:50]}...")
|
|
195
|
+
|
|
196
|
+
# Step 4: Verifier verifies
|
|
197
|
+
print("\n[Step 4] Verifier: verify")
|
|
198
|
+
is_valid = verifier.verify(g, h, commitment, response)
|
|
199
|
+
print(f" g^z == u * h^c: {is_valid}")
|
|
200
|
+
|
|
201
|
+
return is_valid
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def demo_serialization():
|
|
205
|
+
"""
|
|
206
|
+
Demonstrate proof serialization for network transmission.
|
|
207
|
+
|
|
208
|
+
In real applications, the prover and verifier are on different machines.
|
|
209
|
+
This demo shows how to:
|
|
210
|
+
1. Serialize a proof to bytes for transmission
|
|
211
|
+
2. Deserialize the proof on the receiver side
|
|
212
|
+
3. Verify the deserialized proof
|
|
213
|
+
"""
|
|
214
|
+
print("\n" + "=" * 70)
|
|
215
|
+
print("PROOF SERIALIZATION DEMO (Network Transmission)")
|
|
216
|
+
print("=" * 70)
|
|
217
|
+
|
|
218
|
+
# Setup: Use BN254 curve (~128-bit security)
|
|
219
|
+
group = PairingGroup('BN254')
|
|
220
|
+
g = group.random(G1)
|
|
221
|
+
x = group.random(ZR)
|
|
222
|
+
h = g ** x
|
|
223
|
+
|
|
224
|
+
# =========================================================================
|
|
225
|
+
# PROVER SIDE: Generate and serialize proof
|
|
226
|
+
# =========================================================================
|
|
227
|
+
print("\n--- Prover Side ---")
|
|
228
|
+
|
|
229
|
+
# Generate proof
|
|
230
|
+
proof = SchnorrProof.prove_non_interactive(group, g, h, x)
|
|
231
|
+
print(f"[Prover] Generated proof")
|
|
232
|
+
|
|
233
|
+
# Serialize proof to bytes
|
|
234
|
+
proof_bytes = SchnorrProof.serialize_proof(proof, group)
|
|
235
|
+
print(f"[Prover] Serialized proof to {len(proof_bytes)} bytes")
|
|
236
|
+
|
|
237
|
+
# Also serialize public values (g, h) for transmission
|
|
238
|
+
public_bytes = objectToBytes({'g': g, 'h': h}, group)
|
|
239
|
+
print(f"[Prover] Serialized public values to {len(public_bytes)} bytes")
|
|
240
|
+
|
|
241
|
+
# Total message size
|
|
242
|
+
print(f"[Prover] Total transmission: {len(proof_bytes) + len(public_bytes)} bytes")
|
|
243
|
+
|
|
244
|
+
# =========================================================================
|
|
245
|
+
# NETWORK TRANSMISSION (simulated)
|
|
246
|
+
# =========================================================================
|
|
247
|
+
print("\n--- Network Transmission (simulated) ---")
|
|
248
|
+
print(f" Sending {len(proof_bytes) + len(public_bytes)} bytes...")
|
|
249
|
+
|
|
250
|
+
# =========================================================================
|
|
251
|
+
# VERIFIER SIDE: Deserialize and verify
|
|
252
|
+
# =========================================================================
|
|
253
|
+
print("\n--- Verifier Side ---")
|
|
254
|
+
|
|
255
|
+
# Deserialize public values
|
|
256
|
+
received_public = bytesToObject(public_bytes, group)
|
|
257
|
+
received_g = received_public['g']
|
|
258
|
+
received_h = received_public['h']
|
|
259
|
+
print(f"[Verifier] Deserialized public values")
|
|
260
|
+
|
|
261
|
+
# Deserialize proof
|
|
262
|
+
received_proof = SchnorrProof.deserialize_proof(proof_bytes, group)
|
|
263
|
+
print(f"[Verifier] Deserialized proof")
|
|
264
|
+
|
|
265
|
+
# Verify
|
|
266
|
+
is_valid = SchnorrProof.verify_non_interactive(group, received_g, received_h, received_proof)
|
|
267
|
+
print(f"[Verifier] Proof verification: {is_valid}")
|
|
268
|
+
|
|
269
|
+
return is_valid
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def demo_factory_api():
|
|
273
|
+
"""
|
|
274
|
+
Demonstrate the ZKProofFactory API for statement-based proof creation.
|
|
275
|
+
|
|
276
|
+
The factory provides a higher-level API that:
|
|
277
|
+
- Validates statements for security
|
|
278
|
+
- Creates appropriate proof instances based on the statement
|
|
279
|
+
- Provides a clean prove()/verify() interface
|
|
280
|
+
"""
|
|
281
|
+
print("\n" + "=" * 70)
|
|
282
|
+
print("FACTORY API DEMO (Statement-Based)")
|
|
283
|
+
print("=" * 70)
|
|
284
|
+
|
|
285
|
+
# Setup: Use BN254 curve (~128-bit security)
|
|
286
|
+
group = PairingGroup('BN254')
|
|
287
|
+
g = group.random(G1)
|
|
288
|
+
x = group.random(ZR)
|
|
289
|
+
h = g ** x
|
|
290
|
+
|
|
291
|
+
print(f"\n[Setup] Statement: 'h = g^x'")
|
|
292
|
+
|
|
293
|
+
# Method 1: Create proof instance directly
|
|
294
|
+
print("\n--- Method 1: Direct Factory Creation ---")
|
|
295
|
+
instance = ZKProofFactory.create_schnorr_proof(group, g, h, x)
|
|
296
|
+
proof = instance.prove()
|
|
297
|
+
is_valid = instance.verify(proof)
|
|
298
|
+
print(f"[Result] Proof valid: {is_valid}")
|
|
299
|
+
|
|
300
|
+
# Method 2: Create from statement string
|
|
301
|
+
print("\n--- Method 2: From Statement String ---")
|
|
302
|
+
instance2 = ZKProofFactory.create_from_statement(
|
|
303
|
+
group,
|
|
304
|
+
"h = g^x",
|
|
305
|
+
public_params={'g': g, 'h': h},
|
|
306
|
+
secret_params={'x': x}
|
|
307
|
+
)
|
|
308
|
+
proof2 = instance2.prove()
|
|
309
|
+
is_valid2 = instance2.verify(proof2)
|
|
310
|
+
print(f"[Result] Proof valid: {is_valid2}")
|
|
311
|
+
|
|
312
|
+
return is_valid and is_valid2
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
# =============================================================================
|
|
316
|
+
# LEGACY API DEMO (Deprecated)
|
|
317
|
+
# =============================================================================
|
|
318
|
+
|
|
319
|
+
def legacy_network_demo(argv):
|
|
320
|
+
"""
|
|
321
|
+
DEPRECATED: Legacy network demo using executeIntZKProof.
|
|
322
|
+
|
|
323
|
+
WARNING: This function uses the deprecated API which relies on insecure
|
|
324
|
+
dynamic code execution (exec/compile). Use the new SchnorrProof API instead.
|
|
325
|
+
|
|
326
|
+
This is kept for backwards compatibility with existing deployments.
|
|
327
|
+
"""
|
|
328
|
+
HOST, PORT = "", 8090
|
|
329
|
+
party_info = {}
|
|
330
|
+
|
|
331
|
+
if argv[1] == '-p':
|
|
332
|
+
print("Operating as prover (LEGACY API)...")
|
|
333
|
+
# WARNING: The legacy API will emit a DeprecationWarning
|
|
334
|
+
prover_sock = socket(AF_INET, SOCK_STREAM)
|
|
335
|
+
prover_sock.connect((HOST, PORT))
|
|
336
|
+
prover_sock.settimeout(15)
|
|
337
|
+
user = 'prover'
|
|
338
|
+
party_info['socket'] = prover_sock
|
|
339
|
+
elif argv[1] == '-v':
|
|
340
|
+
print("Operating as verifier (LEGACY API)...")
|
|
341
|
+
svr = socket(AF_INET, SOCK_STREAM)
|
|
342
|
+
svr.bind((HOST, PORT))
|
|
343
|
+
svr.listen(1)
|
|
344
|
+
verifier_sock, addr = svr.accept()
|
|
345
|
+
print("Connected by ", addr)
|
|
346
|
+
user = 'verifier'
|
|
347
|
+
party_info['socket'] = verifier_sock
|
|
348
|
+
else:
|
|
349
|
+
return False
|
|
350
|
+
|
|
351
|
+
# DEPRECATED: Uses a.param file which may not be available
|
|
352
|
+
# Use PairingGroup('BN254') for ~128-bit security (recommended)
|
|
353
|
+
try:
|
|
354
|
+
group = PairingGroup('a.param')
|
|
355
|
+
except Exception:
|
|
356
|
+
print("Warning: 'a.param' not found, using 'BN254' instead (~128-bit security)")
|
|
357
|
+
group = PairingGroup('BN254')
|
|
358
|
+
|
|
359
|
+
party_info['party'] = user
|
|
360
|
+
party_info['setting'] = group
|
|
361
|
+
|
|
362
|
+
# DEPRECATED STATEMENT FORMAT:
|
|
363
|
+
# The legacy API uses string statements like '(h = g^x) and (j = g^y)'
|
|
364
|
+
# This requires dynamic code generation which is a security risk.
|
|
365
|
+
statement = '(h = g^x) and (j = g^y)'
|
|
366
|
+
|
|
367
|
+
if user == 'prover':
|
|
368
|
+
g = group.random(G1)
|
|
369
|
+
x, y = group.random(ZR), group.random(ZR)
|
|
370
|
+
pk = {'h': g ** x, 'g': g, 'j': g ** y}
|
|
371
|
+
sk = {'x': x, 'y': y}
|
|
372
|
+
|
|
373
|
+
# DEPRECATED: This function uses exec() internally
|
|
374
|
+
# Migrate to: SchnorrProof.prove_non_interactive(group, g, h, x)
|
|
375
|
+
result = executeIntZKProof(pk, sk, statement, party_info)
|
|
376
|
+
print("Results for PROVER =>", result)
|
|
377
|
+
|
|
378
|
+
elif user == 'verifier':
|
|
379
|
+
# Verifier uses placeholder values since it doesn't know secrets
|
|
380
|
+
pk = {'h': 1, 'g': 1, 'j': 1}
|
|
381
|
+
sk = {'x': 1}
|
|
382
|
+
|
|
383
|
+
# DEPRECATED: This function uses exec() internally
|
|
384
|
+
# Migrate to: SchnorrProof.verify_non_interactive(group, g, h, proof)
|
|
385
|
+
result = executeIntZKProof(pk, sk, statement, party_info)
|
|
386
|
+
print("Results for VERIFIER =>", result)
|
|
387
|
+
|
|
388
|
+
return True
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
# =============================================================================
|
|
392
|
+
# MAIN
|
|
393
|
+
# =============================================================================
|
|
394
|
+
|
|
395
|
+
def print_usage():
|
|
396
|
+
"""Print usage information."""
|
|
397
|
+
print("""
|
|
398
|
+
Zero-Knowledge Proof Demo
|
|
399
|
+
|
|
400
|
+
Usage:
|
|
401
|
+
python zk_demo.py [option]
|
|
402
|
+
|
|
403
|
+
Options:
|
|
404
|
+
--demo-secure Run non-interactive Schnorr proof demo (NEW API)
|
|
405
|
+
--demo-interactive Run interactive Schnorr proof demo (NEW API)
|
|
406
|
+
--demo-serialization Run serialization demo (NEW API)
|
|
407
|
+
--demo-factory Run factory API demo (NEW API)
|
|
408
|
+
--demo-all Run all secure API demos
|
|
409
|
+
|
|
410
|
+
-p Run as prover (LEGACY API - deprecated)
|
|
411
|
+
-v Run as verifier (LEGACY API - deprecated)
|
|
412
|
+
|
|
413
|
+
--help, -h Show this help message
|
|
414
|
+
|
|
415
|
+
Examples:
|
|
416
|
+
# Recommended: Use new secure API
|
|
417
|
+
python zk_demo.py --demo-secure
|
|
418
|
+
python zk_demo.py --demo-all
|
|
419
|
+
|
|
420
|
+
# Legacy (deprecated): Network demo requires two terminals
|
|
421
|
+
Terminal 1: python zk_demo.py -v
|
|
422
|
+
Terminal 2: python zk_demo.py -p
|
|
423
|
+
""")
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def main(argv):
|
|
427
|
+
"""Main entry point."""
|
|
428
|
+
if len(argv) < 2:
|
|
429
|
+
print_usage()
|
|
430
|
+
return
|
|
431
|
+
|
|
432
|
+
option = argv[1]
|
|
433
|
+
|
|
434
|
+
if option in ['--help', '-h']:
|
|
435
|
+
print_usage()
|
|
436
|
+
|
|
437
|
+
elif option == '--demo-secure':
|
|
438
|
+
demo_non_interactive_proof()
|
|
439
|
+
print("\n✓ Non-interactive demo completed successfully!")
|
|
440
|
+
|
|
441
|
+
elif option == '--demo-interactive':
|
|
442
|
+
result = demo_interactive_proof()
|
|
443
|
+
print(f"\n✓ Interactive demo completed: {'SUCCESS' if result else 'FAILED'}")
|
|
444
|
+
|
|
445
|
+
elif option == '--demo-serialization':
|
|
446
|
+
result = demo_serialization()
|
|
447
|
+
print(f"\n✓ Serialization demo completed: {'SUCCESS' if result else 'FAILED'}")
|
|
448
|
+
|
|
449
|
+
elif option == '--demo-factory':
|
|
450
|
+
result = demo_factory_api()
|
|
451
|
+
print(f"\n✓ Factory API demo completed: {'SUCCESS' if result else 'FAILED'}")
|
|
452
|
+
|
|
453
|
+
elif option == '--demo-all':
|
|
454
|
+
print("\n" + "#" * 70)
|
|
455
|
+
print("# RUNNING ALL SECURE API DEMOS")
|
|
456
|
+
print("#" * 70)
|
|
457
|
+
|
|
458
|
+
demo_non_interactive_proof()
|
|
459
|
+
demo_interactive_proof()
|
|
460
|
+
demo_serialization()
|
|
461
|
+
demo_factory_api()
|
|
462
|
+
|
|
463
|
+
print("\n" + "#" * 70)
|
|
464
|
+
print("# ALL DEMOS COMPLETED SUCCESSFULLY!")
|
|
465
|
+
print("#" * 70)
|
|
466
|
+
print("\nThe new secure API is ready to use. See the migration guide above")
|
|
467
|
+
print("for instructions on updating existing code.")
|
|
468
|
+
|
|
469
|
+
elif option in ['-p', '-v']:
|
|
470
|
+
# Legacy API - show deprecation notice
|
|
471
|
+
print("\n" + "!" * 70)
|
|
472
|
+
print("! WARNING: Using deprecated legacy API")
|
|
473
|
+
print("! This API uses insecure dynamic code execution (exec/compile)")
|
|
474
|
+
print("! Please migrate to the new secure API:")
|
|
475
|
+
print("! python zk_demo.py --demo-secure")
|
|
476
|
+
print("!" * 70 + "\n")
|
|
477
|
+
|
|
478
|
+
# Enable deprecation warnings to be visible
|
|
479
|
+
warnings.filterwarnings('always', category=DeprecationWarning)
|
|
480
|
+
|
|
481
|
+
legacy_network_demo(argv)
|
|
482
|
+
|
|
483
|
+
else:
|
|
484
|
+
print(f"Unknown option: {option}")
|
|
485
|
+
print_usage()
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
if __name__ == "__main__":
|
|
489
|
+
main(sys.argv)
|