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.
Files changed (323) hide show
  1. charm/__init__.py +5 -0
  2. charm/adapters/__init__.py +0 -0
  3. charm/adapters/abenc_adapt_hybrid.py +90 -0
  4. charm/adapters/dabenc_adapt_hybrid.py +145 -0
  5. charm/adapters/ibenc_adapt_hybrid.py +72 -0
  6. charm/adapters/ibenc_adapt_identityhash.py +80 -0
  7. charm/adapters/kpabenc_adapt_hybrid.py +91 -0
  8. charm/adapters/pkenc_adapt_bchk05.py +121 -0
  9. charm/adapters/pkenc_adapt_chk04.py +91 -0
  10. charm/adapters/pkenc_adapt_hybrid.py +98 -0
  11. charm/adapters/pksig_adapt_naor01.py +89 -0
  12. charm/config.py +7 -0
  13. charm/core/__init__.py +0 -0
  14. charm/core/benchmark/benchmark_util.c +353 -0
  15. charm/core/benchmark/benchmark_util.h +61 -0
  16. charm/core/benchmark/benchmarkmodule.c +476 -0
  17. charm/core/benchmark/benchmarkmodule.h +162 -0
  18. charm/core/benchmark.cpython-313-darwin.so +0 -0
  19. charm/core/crypto/AES/AES.c +1464 -0
  20. charm/core/crypto/AES.cpython-313-darwin.so +0 -0
  21. charm/core/crypto/DES/DES.c +113 -0
  22. charm/core/crypto/DES.cpython-313-darwin.so +0 -0
  23. charm/core/crypto/DES3/DES3.c +26 -0
  24. charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
  25. charm/core/crypto/__init__.py +0 -0
  26. charm/core/crypto/cryptobase/XOR.c +80 -0
  27. charm/core/crypto/cryptobase/_counter.c +496 -0
  28. charm/core/crypto/cryptobase/_counter.h +54 -0
  29. charm/core/crypto/cryptobase/block_template.c +900 -0
  30. charm/core/crypto/cryptobase/block_template.h +69 -0
  31. charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
  32. charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
  33. charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
  34. charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
  35. charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
  36. charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
  37. charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
  38. charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
  39. charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
  40. charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
  41. charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
  42. charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
  43. charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
  44. charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
  45. charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
  46. charm/core/crypto/cryptobase/stream_template.c +271 -0
  47. charm/core/crypto/cryptobase/strxor.c +229 -0
  48. charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
  49. charm/core/engine/__init__.py +5 -0
  50. charm/core/engine/protocol.py +293 -0
  51. charm/core/engine/util.py +174 -0
  52. charm/core/math/__init__.py +0 -0
  53. charm/core/math/elliptic_curve/ecmodule.c +1986 -0
  54. charm/core/math/elliptic_curve/ecmodule.h +230 -0
  55. charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
  56. charm/core/math/elliptic_curve.pyi +63 -0
  57. charm/core/math/integer/integermodule.c +2539 -0
  58. charm/core/math/integer/integermodule.h +145 -0
  59. charm/core/math/integer.cpython-313-darwin.so +0 -0
  60. charm/core/math/integer.pyi +76 -0
  61. charm/core/math/pairing/miracl/miracl_config.h +37 -0
  62. charm/core/math/pairing/miracl/miracl_interface.h +118 -0
  63. charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
  64. charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
  65. charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
  66. charm/core/math/pairing/pairingmodule.c +2230 -0
  67. charm/core/math/pairing/pairingmodule.h +241 -0
  68. charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
  69. charm/core/math/pairing/relic/pairingmodule3.h +233 -0
  70. charm/core/math/pairing/relic/relic_interface.c +1337 -0
  71. charm/core/math/pairing/relic/relic_interface.h +217 -0
  72. charm/core/math/pairing/relic/test_relic.c +171 -0
  73. charm/core/math/pairing.cpython-313-darwin.so +0 -0
  74. charm/core/math/pairing.pyi +69 -0
  75. charm/core/utilities/base64.c +248 -0
  76. charm/core/utilities/base64.h +15 -0
  77. charm/schemes/__init__.py +0 -0
  78. charm/schemes/abenc/__init__.py +0 -0
  79. charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
  80. charm/schemes/abenc/abenc_bsw07.py +146 -0
  81. charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
  82. charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
  83. charm/schemes/abenc/abenc_lsw08.py +159 -0
  84. charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
  85. charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
  86. charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
  87. charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
  88. charm/schemes/abenc/abenc_waters09.py +144 -0
  89. charm/schemes/abenc/abenc_yct14.py +208 -0
  90. charm/schemes/abenc/abenc_yllc15.py +178 -0
  91. charm/schemes/abenc/ac17.py +248 -0
  92. charm/schemes/abenc/bsw07.py +141 -0
  93. charm/schemes/abenc/cgw15.py +277 -0
  94. charm/schemes/abenc/dabe_aw11.py +204 -0
  95. charm/schemes/abenc/dfa_fe12.py +144 -0
  96. charm/schemes/abenc/pk_hve08.py +179 -0
  97. charm/schemes/abenc/waters11.py +143 -0
  98. charm/schemes/aggrsign_MuSig.py +150 -0
  99. charm/schemes/aggrsign_bls.py +267 -0
  100. charm/schemes/blindsig_ps16.py +654 -0
  101. charm/schemes/chamhash_adm05.py +113 -0
  102. charm/schemes/chamhash_rsa_hw09.py +100 -0
  103. charm/schemes/commit/__init__.py +0 -0
  104. charm/schemes/commit/commit_gs08.py +77 -0
  105. charm/schemes/commit/commit_pedersen92.py +53 -0
  106. charm/schemes/encap_bchk05.py +62 -0
  107. charm/schemes/grpsig/__init__.py +0 -0
  108. charm/schemes/grpsig/groupsig_bgls04.py +114 -0
  109. charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
  110. charm/schemes/hibenc/__init__.py +0 -0
  111. charm/schemes/hibenc/hibenc_bb04.py +105 -0
  112. charm/schemes/hibenc/hibenc_lew11.py +193 -0
  113. charm/schemes/ibenc/__init__.py +0 -0
  114. charm/schemes/ibenc/clpkc_rp03.py +119 -0
  115. charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
  116. charm/schemes/ibenc/ibenc_bb03.py +94 -0
  117. charm/schemes/ibenc/ibenc_bf01.py +121 -0
  118. charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
  119. charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
  120. charm/schemes/ibenc/ibenc_lsw08.py +120 -0
  121. charm/schemes/ibenc/ibenc_sw05.py +238 -0
  122. charm/schemes/ibenc/ibenc_waters05.py +144 -0
  123. charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
  124. charm/schemes/ibenc/ibenc_waters09.py +107 -0
  125. charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
  126. charm/schemes/joye_scheme.py +106 -0
  127. charm/schemes/lem_scheme.py +207 -0
  128. charm/schemes/pk_fre_ccv11.py +107 -0
  129. charm/schemes/pk_vrf.py +127 -0
  130. charm/schemes/pkenc/__init__.py +0 -0
  131. charm/schemes/pkenc/pkenc_cs98.py +108 -0
  132. charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
  133. charm/schemes/pkenc/pkenc_gm82.py +98 -0
  134. charm/schemes/pkenc/pkenc_paillier99.py +118 -0
  135. charm/schemes/pkenc/pkenc_rabin.py +254 -0
  136. charm/schemes/pkenc/pkenc_rsa.py +186 -0
  137. charm/schemes/pksig/__init__.py +0 -0
  138. charm/schemes/pksig/pksig_CW13_z.py +135 -0
  139. charm/schemes/pksig/pksig_bls04.py +87 -0
  140. charm/schemes/pksig/pksig_boyen.py +156 -0
  141. charm/schemes/pksig/pksig_chch.py +97 -0
  142. charm/schemes/pksig/pksig_chp.py +70 -0
  143. charm/schemes/pksig/pksig_cl03.py +150 -0
  144. charm/schemes/pksig/pksig_cl04.py +87 -0
  145. charm/schemes/pksig/pksig_cllww12_z.py +142 -0
  146. charm/schemes/pksig/pksig_cyh.py +132 -0
  147. charm/schemes/pksig/pksig_dsa.py +76 -0
  148. charm/schemes/pksig/pksig_ecdsa.py +71 -0
  149. charm/schemes/pksig/pksig_hess.py +104 -0
  150. charm/schemes/pksig/pksig_hw.py +110 -0
  151. charm/schemes/pksig/pksig_lamport.py +63 -0
  152. charm/schemes/pksig/pksig_ps01.py +135 -0
  153. charm/schemes/pksig/pksig_ps02.py +124 -0
  154. charm/schemes/pksig/pksig_ps03.py +119 -0
  155. charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
  156. charm/schemes/pksig/pksig_schnorr91.py +77 -0
  157. charm/schemes/pksig/pksig_waters.py +115 -0
  158. charm/schemes/pksig/pksig_waters05.py +121 -0
  159. charm/schemes/pksig/pksig_waters09.py +121 -0
  160. charm/schemes/pre_mg07.py +150 -0
  161. charm/schemes/prenc/pre_afgh06.py +126 -0
  162. charm/schemes/prenc/pre_bbs98.py +123 -0
  163. charm/schemes/prenc/pre_nal16.py +216 -0
  164. charm/schemes/protocol_a01.py +272 -0
  165. charm/schemes/protocol_ao00.py +215 -0
  166. charm/schemes/protocol_cns07.py +274 -0
  167. charm/schemes/protocol_schnorr91.py +125 -0
  168. charm/schemes/sigma1.py +64 -0
  169. charm/schemes/sigma2.py +129 -0
  170. charm/schemes/sigma3.py +126 -0
  171. charm/schemes/threshold/__init__.py +59 -0
  172. charm/schemes/threshold/dkls23_dkg.py +556 -0
  173. charm/schemes/threshold/dkls23_presign.py +1089 -0
  174. charm/schemes/threshold/dkls23_sign.py +761 -0
  175. charm/schemes/threshold/xrpl_wallet.py +967 -0
  176. charm/test/__init__.py +0 -0
  177. charm/test/adapters/__init__.py +0 -0
  178. charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
  179. charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
  180. charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
  181. charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
  182. charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
  183. charm/test/benchmark/abenc_yllc15_bench.py +92 -0
  184. charm/test/benchmark/benchmark_test.py +148 -0
  185. charm/test/benchmark_threshold.py +260 -0
  186. charm/test/conftest.py +38 -0
  187. charm/test/fuzz/__init__.py +1 -0
  188. charm/test/fuzz/conftest.py +5 -0
  189. charm/test/fuzz/fuzz_policy_parser.py +76 -0
  190. charm/test/fuzz/fuzz_serialization.py +83 -0
  191. charm/test/schemes/__init__.py +0 -0
  192. charm/test/schemes/abenc/__init__.py +0 -0
  193. charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
  194. charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
  195. charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
  196. charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
  197. charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
  198. charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
  199. charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
  200. charm/test/schemes/chamhash_adm05_test.py +31 -0
  201. charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
  202. charm/test/schemes/commit/__init__.py +0 -0
  203. charm/test/schemes/commit/commit_gs08_test.py +24 -0
  204. charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
  205. charm/test/schemes/dabe_aw11_test.py +45 -0
  206. charm/test/schemes/encap_bchk05_test.py +21 -0
  207. charm/test/schemes/grpsig/__init__.py +0 -0
  208. charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
  209. charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
  210. charm/test/schemes/hibenc/__init__.py +0 -0
  211. charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
  212. charm/test/schemes/ibenc/__init__.py +0 -0
  213. charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
  214. charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
  215. charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
  216. charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
  217. charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
  218. charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
  219. charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
  220. charm/test/schemes/pk_vrf_test.py +29 -0
  221. charm/test/schemes/pkenc/__init__.py +0 -0
  222. charm/test/schemes/pkenc_test.py +255 -0
  223. charm/test/schemes/pksig/__init__.py +0 -0
  224. charm/test/schemes/pksig_test.py +376 -0
  225. charm/test/schemes/rsa_alg_test.py +340 -0
  226. charm/test/schemes/threshold_test.py +1792 -0
  227. charm/test/serialize/__init__.py +0 -0
  228. charm/test/serialize/serialize_test.py +40 -0
  229. charm/test/toolbox/__init__.py +0 -0
  230. charm/test/toolbox/conversion_test.py +30 -0
  231. charm/test/toolbox/ecgroup_test.py +53 -0
  232. charm/test/toolbox/integer_arithmetic_test.py +441 -0
  233. charm/test/toolbox/paddingschemes_test.py +238 -0
  234. charm/test/toolbox/policy_parser_stress_test.py +969 -0
  235. charm/test/toolbox/secretshare_test.py +28 -0
  236. charm/test/toolbox/symcrypto_test.py +108 -0
  237. charm/test/toolbox/test_policy_expression.py +16 -0
  238. charm/test/vectors/__init__.py +1 -0
  239. charm/test/vectors/test_bls_vectors.py +289 -0
  240. charm/test/vectors/test_pedersen_vectors.py +315 -0
  241. charm/test/vectors/test_schnorr_vectors.py +368 -0
  242. charm/test/zkp_compiler/__init__.py +9 -0
  243. charm/test/zkp_compiler/benchmark_zkp.py +258 -0
  244. charm/test/zkp_compiler/test_and_proof.py +240 -0
  245. charm/test/zkp_compiler/test_batch_verify.py +248 -0
  246. charm/test/zkp_compiler/test_dleq_proof.py +264 -0
  247. charm/test/zkp_compiler/test_or_proof.py +231 -0
  248. charm/test/zkp_compiler/test_proof_serialization.py +121 -0
  249. charm/test/zkp_compiler/test_range_proof.py +241 -0
  250. charm/test/zkp_compiler/test_representation_proof.py +325 -0
  251. charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
  252. charm/test/zkp_compiler/test_thread_safety.py +169 -0
  253. charm/test/zkp_compiler/test_zkp_parser.py +139 -0
  254. charm/toolbox/ABEnc.py +26 -0
  255. charm/toolbox/ABEncMultiAuth.py +66 -0
  256. charm/toolbox/ABEnumeric.py +800 -0
  257. charm/toolbox/Commit.py +24 -0
  258. charm/toolbox/DFA.py +89 -0
  259. charm/toolbox/FSA.py +1254 -0
  260. charm/toolbox/Hash.py +39 -0
  261. charm/toolbox/IBEnc.py +62 -0
  262. charm/toolbox/IBSig.py +64 -0
  263. charm/toolbox/PKEnc.py +66 -0
  264. charm/toolbox/PKSig.py +56 -0
  265. charm/toolbox/PREnc.py +32 -0
  266. charm/toolbox/ZKProof.py +289 -0
  267. charm/toolbox/__init__.py +0 -0
  268. charm/toolbox/bitstring.py +49 -0
  269. charm/toolbox/broadcast.py +220 -0
  270. charm/toolbox/conversion.py +100 -0
  271. charm/toolbox/eccurve.py +149 -0
  272. charm/toolbox/ecgroup.py +143 -0
  273. charm/toolbox/enum.py +60 -0
  274. charm/toolbox/hash_module.py +91 -0
  275. charm/toolbox/integergroup.py +323 -0
  276. charm/toolbox/iterate.py +22 -0
  277. charm/toolbox/matrixops.py +76 -0
  278. charm/toolbox/mpc_utils.py +296 -0
  279. charm/toolbox/msp.py +175 -0
  280. charm/toolbox/mta.py +985 -0
  281. charm/toolbox/node.py +120 -0
  282. charm/toolbox/ot/__init__.py +22 -0
  283. charm/toolbox/ot/base_ot.py +374 -0
  284. charm/toolbox/ot/dpf.py +642 -0
  285. charm/toolbox/ot/mpfss.py +228 -0
  286. charm/toolbox/ot/ot_extension.py +589 -0
  287. charm/toolbox/ot/silent_ot.py +378 -0
  288. charm/toolbox/paddingschemes.py +423 -0
  289. charm/toolbox/paddingschemes_test.py +238 -0
  290. charm/toolbox/pairingcurves.py +85 -0
  291. charm/toolbox/pairinggroup.py +186 -0
  292. charm/toolbox/policy_expression_spec.py +70 -0
  293. charm/toolbox/policytree.py +189 -0
  294. charm/toolbox/reCompiler.py +346 -0
  295. charm/toolbox/redundancyschemes.py +65 -0
  296. charm/toolbox/schemebase.py +188 -0
  297. charm/toolbox/secretshare.py +104 -0
  298. charm/toolbox/secretutil.py +174 -0
  299. charm/toolbox/securerandom.py +73 -0
  300. charm/toolbox/sigmaprotocol.py +46 -0
  301. charm/toolbox/specialprimes.py +45 -0
  302. charm/toolbox/symcrypto.py +279 -0
  303. charm/toolbox/threshold_sharing.py +553 -0
  304. charm/toolbox/xmlserialize.py +94 -0
  305. charm/toolbox/zknode.py +105 -0
  306. charm/zkp_compiler/__init__.py +89 -0
  307. charm/zkp_compiler/and_proof.py +460 -0
  308. charm/zkp_compiler/batch_verify.py +324 -0
  309. charm/zkp_compiler/dleq_proof.py +423 -0
  310. charm/zkp_compiler/or_proof.py +305 -0
  311. charm/zkp_compiler/range_proof.py +417 -0
  312. charm/zkp_compiler/representation_proof.py +466 -0
  313. charm/zkp_compiler/schnorr_proof.py +273 -0
  314. charm/zkp_compiler/thread_safe.py +150 -0
  315. charm/zkp_compiler/zk_demo.py +489 -0
  316. charm/zkp_compiler/zkp_factory.py +330 -0
  317. charm/zkp_compiler/zkp_generator.py +370 -0
  318. charm/zkp_compiler/zkparser.py +269 -0
  319. charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
  320. charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
  321. charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
  322. charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
  323. 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)