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
charm/test/conftest.py ADDED
@@ -0,0 +1,38 @@
1
+ """
2
+ Pytest configuration for Charm test suite.
3
+
4
+ This module provides custom pytest hooks and fixtures for version-specific
5
+ test skipping and other test configuration.
6
+ """
7
+
8
+ import sys
9
+ import pytest
10
+
11
+
12
+ def pytest_configure(config):
13
+ """Register custom markers."""
14
+ config.addinivalue_line(
15
+ "markers",
16
+ "skip_py312plus: Skip test on Python 3.12+ due to known issues"
17
+ )
18
+ config.addinivalue_line(
19
+ "markers",
20
+ "slow: Mark test as slow-running"
21
+ )
22
+
23
+
24
+ def pytest_collection_modifyitems(config, items):
25
+ """
26
+ Automatically skip tests marked with skip_py312plus on Python 3.12+.
27
+
28
+ This hook runs after test collection and modifies the test items
29
+ to add skip markers based on the Python version.
30
+ """
31
+ if sys.version_info >= (3, 12):
32
+ skip_py312plus = pytest.mark.skip(
33
+ reason="Test skipped on Python 3.12+ due to known hanging/compatibility issues"
34
+ )
35
+ for item in items:
36
+ if "skip_py312plus" in item.keywords:
37
+ item.add_marker(skip_py312plus)
38
+
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,5 @@
1
+ # Skip fuzzing files from pytest collection
2
+ # These require atheris to be installed and are meant to be run directly
3
+
4
+ collect_ignore = ["fuzz_policy_parser.py", "fuzz_serialization.py"]
5
+
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Fuzzing harness for PolicyParser in charm.toolbox.policytree
4
+
5
+ This fuzzer tests the policy parser with random inputs to find crashes,
6
+ hangs, or other unexpected behavior.
7
+
8
+ Usage:
9
+ pip install atheris
10
+ python charm/test/fuzz/fuzz_policy_parser.py
11
+
12
+ The fuzzer will run continuously until stopped (Ctrl+C) or a crash is found.
13
+
14
+ Note: This file is not a pytest test module. It requires atheris to be installed
15
+ and should be run directly.
16
+ """
17
+
18
+ import sys
19
+
20
+ # Defer atheris import to runtime to avoid pytest collection errors
21
+ atheris = None
22
+
23
+
24
+ def setup_module():
25
+ """Import modules after Atheris initialization for proper instrumentation."""
26
+ global PolicyParser
27
+ from charm.toolbox.policytree import PolicyParser
28
+
29
+
30
+ def fuzz_policy_parser(data: bytes) -> None:
31
+ """Fuzz target for PolicyParser.
32
+
33
+ Tests the parser with random byte strings converted to policy strings.
34
+ """
35
+ try:
36
+ # Convert bytes to string, handling encoding errors gracefully
37
+ policy_str = data.decode('utf-8', errors='replace')
38
+
39
+ # Skip empty strings
40
+ if not policy_str.strip():
41
+ return
42
+
43
+ # Parse the policy string
44
+ parser = PolicyParser()
45
+ parser.parse(policy_str)
46
+
47
+ except Exception:
48
+ # Expected exceptions from invalid input are fine
49
+ # We're looking for crashes, hangs, or memory issues
50
+ pass
51
+
52
+
53
+ def main():
54
+ """Main entry point for the fuzzer."""
55
+ global atheris
56
+
57
+ try:
58
+ import atheris as _atheris
59
+ atheris = _atheris
60
+ except ImportError:
61
+ print("ERROR: atheris is required for fuzzing.")
62
+ print("Install with: pip install atheris")
63
+ sys.exit(1)
64
+
65
+ # Initialize Atheris with instrumentation
66
+ atheris.instrument_all()
67
+ setup_module()
68
+
69
+ # Start fuzzing
70
+ atheris.Setup(sys.argv, fuzz_policy_parser)
71
+ atheris.Fuzz()
72
+
73
+
74
+ if __name__ == "__main__":
75
+ main()
76
+
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Fuzzing harness for serialization/deserialization in Charm
4
+
5
+ This fuzzer tests the deserialization functions with random byte inputs
6
+ to find crashes, memory corruption, or other issues.
7
+
8
+ Usage:
9
+ pip install atheris
10
+ python charm/test/fuzz/fuzz_serialization.py
11
+
12
+ Note: This file is not a pytest test module. It requires atheris to be installed
13
+ and should be run directly.
14
+ """
15
+
16
+ import sys
17
+
18
+ # Defer atheris import to runtime to avoid pytest collection errors
19
+ atheris = None
20
+
21
+
22
+ def setup_module():
23
+ """Import modules after Atheris initialization."""
24
+ global PairingGroup, objectToBytes, bytesToObject
25
+ from charm.toolbox.pairinggroup import PairingGroup
26
+ from charm.core.engine.util import objectToBytes, bytesToObject
27
+
28
+
29
+ def fuzz_pairing_deserialization(data: bytes) -> None:
30
+ """Fuzz target for pairing group deserialization.
31
+
32
+ Tests bytesToObject with random bytes to find crashes.
33
+ """
34
+ try:
35
+ group = PairingGroup('BN254')
36
+
37
+ # Try to deserialize random bytes
38
+ bytesToObject(data, group)
39
+
40
+ except Exception:
41
+ # Expected exceptions are fine
42
+ pass
43
+
44
+
45
+ def fuzz_combined(data: bytes) -> None:
46
+ """Combined fuzz target testing multiple deserialization paths."""
47
+ fdp = atheris.FuzzedDataProvider(data)
48
+
49
+ try:
50
+ group = PairingGroup('BN254')
51
+
52
+ # Get random bytes of varying lengths
53
+ payload = fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, 1024))
54
+
55
+ # Try deserialization
56
+ bytesToObject(payload, group)
57
+
58
+ except Exception:
59
+ pass
60
+
61
+
62
+ def main():
63
+ """Main entry point."""
64
+ global atheris
65
+
66
+ try:
67
+ import atheris as _atheris
68
+ atheris = _atheris
69
+ except ImportError:
70
+ print("ERROR: atheris is required for fuzzing.")
71
+ print("Install with: pip install atheris")
72
+ sys.exit(1)
73
+
74
+ atheris.instrument_all()
75
+ setup_module()
76
+
77
+ atheris.Setup(sys.argv, fuzz_combined)
78
+ atheris.Fuzz()
79
+
80
+
81
+ if __name__ == "__main__":
82
+ main()
83
+
File without changes
File without changes
@@ -0,0 +1,39 @@
1
+ import unittest
2
+
3
+ from charm.schemes.abenc.abenc_bsw07 import CPabe_BSW07
4
+ from charm.toolbox.pairinggroup import PairingGroup, GT
5
+
6
+ debug = False
7
+
8
+
9
+ class CPabe_BSW07Test(unittest.TestCase):
10
+ def testCPabe_BSW07(self):
11
+ groupObj = PairingGroup('SS512')
12
+
13
+ cpabe = CPabe_BSW07(groupObj)
14
+ attrs = ['ONE', 'TWO', 'THREE']
15
+ access_policy = '((four or three) and (three or one))'
16
+ if debug:
17
+ print("Attributes =>", attrs);
18
+ print("Policy =>", access_policy)
19
+
20
+ (pk, mk) = cpabe.setup()
21
+
22
+ sk = cpabe.keygen(pk, mk, attrs)
23
+
24
+ rand_msg = groupObj.random(GT)
25
+ if debug: print("msg =>", rand_msg)
26
+ ct = cpabe.encrypt(pk, rand_msg, access_policy)
27
+ if debug: print("\n\nCiphertext...\n")
28
+ groupObj.debug(ct)
29
+
30
+ rec_msg = cpabe.decrypt(pk, sk, ct)
31
+ if debug: print("\n\nDecrypt...\n")
32
+ if debug: print("Rec msg =>", rec_msg)
33
+
34
+ assert rand_msg == rec_msg, "FAILED Decryption: message is incorrect"
35
+ if debug: print("Successful Decryption!!!")
36
+
37
+
38
+ if __name__ == "__main__":
39
+ unittest.main()
@@ -0,0 +1,16 @@
1
+ import unittest
2
+
3
+ import charm.schemes.abenc.abenc_dacmacs_yj14 as abenc_dacmacs_yj14
4
+
5
+ debug = False
6
+
7
+
8
+ # unit test for scheme contributed by artjomb
9
+ class DacMacs_YJ14Test(unittest.TestCase):
10
+ def testDacmacs_YJ14(self):
11
+ abenc_dacmacs_yj14.basicTest()
12
+ abenc_dacmacs_yj14.revokedTest()
13
+
14
+
15
+ if __name__ == "__main__":
16
+ unittest.main()
@@ -0,0 +1,33 @@
1
+ import unittest
2
+
3
+ from charm.schemes.abenc.abenc_lsw08 import KPabe
4
+ from charm.toolbox.pairinggroup import PairingGroup, GT
5
+
6
+ debug = False
7
+
8
+
9
+ class KPabeTest(unittest.TestCase):
10
+ def testKPabe(self):
11
+ groupObj = PairingGroup('MNT224')
12
+ kpabe = KPabe(groupObj)
13
+
14
+ (pk, mk) = kpabe.setup()
15
+
16
+ policy = '(ONE or THREE) and (THREE or TWO)'
17
+ attributes = ['ONE', 'TWO', 'THREE', 'FOUR']
18
+ msg = groupObj.random(GT)
19
+
20
+ mykey = kpabe.keygen(pk, mk, policy)
21
+
22
+ if debug: print("Encrypt under these attributes: ", attributes)
23
+ ciphertext = kpabe.encrypt(pk, msg, attributes)
24
+ if debug: print(ciphertext)
25
+
26
+ rec_msg = kpabe.decrypt(ciphertext, mykey)
27
+
28
+ assert msg == rec_msg
29
+ if debug: print("Successful Decryption!")
30
+
31
+
32
+ if __name__ == "__main__":
33
+ unittest.main()
@@ -0,0 +1,16 @@
1
+ import unittest
2
+
3
+ import charm.schemes.abenc.abenc_maabe_yj14 as abenc_maabe_yj14
4
+
5
+ debug = False
6
+
7
+
8
+ # unit test for scheme contributed by artjomb
9
+ class MAabe_YJ14Test(unittest.TestCase):
10
+ def testMAabe_YJ14(self):
11
+ abenc_maabe_yj14.basicTest()
12
+ abenc_maabe_yj14.revokedTest()
13
+
14
+
15
+ if __name__ == "__main__":
16
+ unittest.main()
@@ -0,0 +1,16 @@
1
+ import unittest
2
+
3
+ import charm.schemes.abenc.abenc_tbpre_lww14 as abenc_tbpre_lww14
4
+
5
+ debug = False
6
+
7
+
8
+ # unit test for scheme contributed by artjomb
9
+ class TBPre_LWW14Test(unittest.TestCase):
10
+ def testTBPre_LWW14(self):
11
+ abenc_tbpre_lww14.basicTest()
12
+ # abenc_tbpre_lww14.basicTest2() # seems to fail
13
+
14
+
15
+ if __name__ == "__main__":
16
+ unittest.main()
@@ -0,0 +1,38 @@
1
+ import unittest
2
+
3
+ from charm.schemes.abenc.abenc_waters09 import CPabe09
4
+ from charm.toolbox.pairinggroup import PairingGroup, GT
5
+
6
+ debug = False
7
+
8
+
9
+ class CPabe09Test(unittest.TestCase):
10
+ def testCPabe(self):
11
+ # Get the eliptic curve with the bilinear mapping feature needed.
12
+ groupObj = PairingGroup('SS512')
13
+
14
+ cpabe = CPabe09(groupObj)
15
+ (msk, pk) = cpabe.setup()
16
+ pol = '((ONE or THREE) and (TWO or FOUR))'
17
+ attr_list = ['THREE', 'ONE', 'TWO']
18
+
19
+ if debug: print('Acces Policy: %s' % pol)
20
+ if debug: print('User credential list: %s' % attr_list)
21
+ m = groupObj.random(GT)
22
+
23
+ cpkey = cpabe.keygen(pk, msk, attr_list)
24
+ if debug: print("\nSecret key: %s" % attr_list)
25
+ if debug: groupObj.debug(cpkey)
26
+ cipher = cpabe.encrypt(pk, m, pol)
27
+
28
+ if debug: print("\nCiphertext...")
29
+ if debug: groupObj.debug(cipher)
30
+ orig_m = cpabe.decrypt(pk, cpkey, cipher)
31
+
32
+ assert m == orig_m, 'FAILED Decryption!!!'
33
+ if debug: print('Successful Decryption!')
34
+ del groupObj
35
+
36
+
37
+ if __name__ == "__main__":
38
+ unittest.main()
@@ -0,0 +1,74 @@
1
+ import sys
2
+ import unittest
3
+
4
+ import pytest
5
+
6
+ from charm.toolbox.secretutil import SecretUtil
7
+
8
+ settings = pytest.importorskip("hypothesis").settings
9
+ given = pytest.importorskip("hypothesis").given
10
+ from hypothesis.strategies import lists
11
+
12
+ from charm.schemes.abenc.abenc_yllc15 import YLLC15
13
+ from charm.toolbox.pairinggroup import PairingGroup, GT
14
+ from charm.toolbox.policy_expression_spec import attributes, policy_expressions
15
+
16
+
17
+ class YLLC15Test(unittest.TestCase):
18
+
19
+ def setUp(self):
20
+ group = PairingGroup('SS512')
21
+ self.abe = YLLC15(group)
22
+ (self.params, self.msk) = self.abe.setup()
23
+
24
+ def test_ukgen(self, user_id='bob@example.com'):
25
+ (public_key, secret_key) = self.abe.ukgen(self.params)
26
+
27
+ @pytest.mark.skipif(sys.version_info < (3, 4),
28
+ reason="requires python3.4 or higher")
29
+ @given(attrs=lists(attributes(), min_size=1))
30
+ @settings(deadline=300, max_examples=50)
31
+ def test_proxy_key_gen_deduplicates_and_uppercases_attributes(self, attrs):
32
+ pkcs, skcs = self.abe.ukgen(self.params)
33
+ pku, sku = self.abe.ukgen(self.params)
34
+ proxy_key_user = self.abe.proxy_keygen(self.params, self.msk, pkcs, pku, attrs)
35
+ self.assertEqual({ attr.upper() for attr in set(attrs) }, proxy_key_user['k_attrs'].keys())
36
+
37
+ @settings(deadline=1000, max_examples=50) # Increased deadline for CI variability
38
+ @given(policy_str=policy_expressions())
39
+ def test_encrypt_proxy_decrypt_decrypt_round_trip(self, policy_str):
40
+ pkcs, skcs = self.abe.ukgen(self.params)
41
+ pku, sku = self.abe.ukgen(self.params)
42
+ attrs = self.extract_attributes(policy_str)
43
+ random_key_elem = self.abe.group.random(GT)
44
+
45
+ proxy_key_user = self.abe.proxy_keygen(self.params, self.msk, pkcs, pku, attrs)
46
+ ciphertext = self.abe.encrypt(self.params, random_key_elem, policy_str)
47
+ intermediate_value = self.abe.proxy_decrypt(skcs, proxy_key_user, ciphertext)
48
+ recovered_key_elem = self.abe.decrypt(None, sku, intermediate_value)
49
+ self.assertEqual(random_key_elem, recovered_key_elem)
50
+
51
+ def extract_attributes(self, policy_str):
52
+ util = SecretUtil(self.abe.group)
53
+ policy = util.createPolicy(policy_str)
54
+ return [util.strip_index(policy_attr) for policy_attr in util.getAttributeList(policy)]
55
+
56
+ @pytest.mark.skipif(sys.version_info < (3, 4),
57
+ reason="requires python3.4 or higher")
58
+ @settings(deadline=400, max_examples=50)
59
+ @given(policy=policy_expressions())
60
+ def test_policy_not_satisfied(self, policy):
61
+ pkcs, skcs = self.abe.ukgen(self.params)
62
+ pku, sku = self.abe.ukgen(self.params)
63
+ attribute_list = ["UNLIKELY_ATTRIBUTE_NAME"]
64
+ proxy_key_user = self.abe.proxy_keygen(self.params, self.msk, pkcs, pku, attribute_list)
65
+
66
+ random_key_elem = self.abe.group.random(GT)
67
+ ciphertext = self.abe.encrypt(self.params, random_key_elem, policy)
68
+
69
+ result = self.abe.proxy_decrypt(skcs, proxy_key_user, ciphertext)
70
+ self.assertIsNone(result)
71
+
72
+
73
+ if __name__ == "__main__":
74
+ unittest.main()
@@ -0,0 +1,31 @@
1
+ import unittest
2
+
3
+ import pytest
4
+
5
+ from charm.schemes.chamhash_adm05 import ChamHash_Adm05
6
+ from charm.toolbox.integergroup import integer
7
+
8
+ debug = False
9
+
10
+
11
+ class ChamHash_Adm05Test(unittest.TestCase):
12
+ @pytest.mark.skip(reason="Fails on Linux CI - investigating platform-specific issue with IntegerGroupQ.hash")
13
+ def testChamHash_Adm05(self):
14
+ # fixed params for unit tests
15
+ p = integer(141660875619984104245410764464185421040193281776686085728248762539241852738181649330509191671665849071206347515263344232662465937366909502530516774705282764748558934610432918614104329009095808618770549804432868118610669336907161081169097403439689930233383598055540343198389409225338204714777812724565461351567)
16
+ q = integer(70830437809992052122705382232092710520096640888343042864124381269620926369090824665254595835832924535603173757631672116331232968683454751265258387352641382374279467305216459307052164504547904309385274902216434059305334668453580540584548701719844965116691799027770171599194704612669102357388906362282730675783)
17
+ chamHash = ChamHash_Adm05(p, q)
18
+ (pk, sk) = chamHash.paramgen()
19
+ if debug: print("pk => ", pk)
20
+ if debug: print("sk => ", sk)
21
+
22
+ msg = "Hello world this is the message!"
23
+ (h, r, s) = chamHash.hash(pk, msg)
24
+ if debug: print("Hash...")
25
+ if debug: print("sig =>", h)
26
+
27
+ (h1, r1, s1) = chamHash.hash(pk, msg, r, s)
28
+ if debug: print("sig 2 =>", h1)
29
+
30
+ assert h == h1, "Signature failed!!!"
31
+ if debug: print("Signature generated correctly!!!")
@@ -0,0 +1,29 @@
1
+ import unittest
2
+
3
+ from charm.schemes.chamhash_rsa_hw09 import ChamHash_HW09
4
+ from charm.toolbox.integergroup import integer
5
+
6
+ debug = False
7
+
8
+
9
+ class ChamHash_HW09Test(unittest.TestCase):
10
+ def testChamHash_HW09(self):
11
+ # Test p and q primes for unit tests only
12
+ # These primes are mathematically suitable - phi_N = (p-1)*(q-1) is coprime with 65537
13
+ # This ensures the deterministic coprime algorithm finds a solution quickly
14
+ p = integer(95969491500266197744623842643163713790605329484264579952704690252128663957034885038057265490969414900858594119440280815406458877960454430736966405387849574204717896425412057524927419980472986383200765875162149934175300724788379539851438576829444747397186724447127392785957485487971933719848100802790176324337)
15
+ q = integer(165685596906806363133681673469906489437474476163789251744214878002662496954723502283532073376723817149461444040314419947626958411649072129703545884779008062578922350877123596086401947242893563534827734633284461244941306661332124200807263458137608535445118169374047964965396160553232687802551488935469282118877)
16
+
17
+ chamHash = ChamHash_HW09()
18
+ (pk, sk) = chamHash.paramgen(1024, p, q)
19
+
20
+ msg = "Hello world this is the message!"
21
+ (h, r) = chamHash.hash(pk, msg)
22
+ if debug: print("Hash...")
23
+ if debug: print("sig =>", h)
24
+
25
+ (h1, r1) = chamHash.hash(pk, msg, r)
26
+ if debug: print("sig 2 =>", h1)
27
+
28
+ assert h == h1, "Signature failed!!!"
29
+ if debug: print("Signature generated correctly!!!")
File without changes
@@ -0,0 +1,24 @@
1
+ import unittest
2
+
3
+ from charm.schemes.commit.commit_gs08 import Commitment_GS08
4
+ from charm.toolbox.pairinggroup import PairingGroup, G1
5
+
6
+ debug = False
7
+
8
+
9
+ class Commitment_GS08Test(unittest.TestCase):
10
+ def testCommitment_GS08(self):
11
+ groupObj = PairingGroup('SS512')
12
+ cm = Commitment_GS08(groupObj)
13
+
14
+ pk = cm.setup()
15
+ if debug:
16
+ print("Public parameters...")
17
+ print("pk =>", pk)
18
+
19
+ m = groupObj.random(G1)
20
+ if debug: print("Committing to =>", m)
21
+ (c, d) = cm.commit(pk, m)
22
+
23
+ assert cm.decommit(pk, c, d, m), "FAILED to decommit"
24
+ if debug: print("Successful and Verified decommitment!!!")
@@ -0,0 +1,26 @@
1
+ import unittest
2
+
3
+ from charm.schemes.commit.commit_pedersen92 import CM_Ped92
4
+ from charm.toolbox.ecgroup import ECGroup
5
+ from charm.toolbox.pairinggroup import ZR
6
+
7
+ debug = False
8
+
9
+
10
+ class CM_Ped92Test(unittest.TestCase):
11
+ def testCM_Ped92(self):
12
+ groupObj = ECGroup(410)
13
+ cm = CM_Ped92(groupObj)
14
+
15
+ pk = cm.setup()
16
+ if debug:
17
+ print("Public parameters...")
18
+ print("pk =>", pk)
19
+
20
+ m = groupObj.random(ZR)
21
+ if debug: print("Commiting to =>", m)
22
+ (c, d) = cm.commit(pk, m)
23
+
24
+ assert cm.decommit(pk, c, d, m), "FAILED to decommit"
25
+ if debug: print("Successful and Verified decommitment!!!")
26
+ del groupObj
@@ -0,0 +1,45 @@
1
+ import unittest
2
+
3
+ from charm.schemes.abenc.dabe_aw11 import Dabe
4
+ from charm.toolbox.pairinggroup import PairingGroup, GT
5
+
6
+ debug = False
7
+
8
+
9
+ class DabeTest(unittest.TestCase):
10
+ def testDabe(self):
11
+ groupObj = PairingGroup('SS512')
12
+
13
+ dabe = Dabe(groupObj)
14
+ GP = dabe.setup()
15
+
16
+ # Setup an authority
17
+ auth_attrs = ['ONE', 'TWO', 'THREE', 'FOUR']
18
+ (SK, PK) = dabe.authsetup(GP, auth_attrs)
19
+ if debug: print("Authority SK")
20
+ if debug: print(SK)
21
+
22
+ # Setup a user and give him some keys
23
+ gid, K = "bob", {}
24
+ usr_attrs = ['THREE', 'ONE', 'TWO']
25
+ for i in usr_attrs: dabe.keygen(GP, SK, i, gid, K)
26
+ if debug: print('User credential list: %s' % usr_attrs)
27
+ if debug: print("\nSecret key:")
28
+ if debug: groupObj.debug(K)
29
+
30
+ # Encrypt a random element in GT
31
+ m = groupObj.random(GT)
32
+ policy = '((one or three) and (TWO or FOUR))'
33
+ if debug: print('Acces Policy: %s' % policy)
34
+ CT = dabe.encrypt(GP, PK, m, policy)
35
+ if debug: print("\nCiphertext...")
36
+ if debug: groupObj.debug(CT)
37
+
38
+ orig_m = dabe.decrypt(GP, K, CT)
39
+
40
+ assert m == orig_m, 'FAILED Decryption!!!'
41
+ if debug: print('Successful Decryption!')
42
+
43
+
44
+ if __name__ == "__main__":
45
+ unittest.main()
@@ -0,0 +1,21 @@
1
+ from charm.schemes.encap_bchk05 import EncapBCHK
2
+ import unittest
3
+
4
+ debug = False
5
+ class EncapBCHKTest(unittest.TestCase):
6
+ def testEncapBCHK(self):
7
+ encap = EncapBCHK()
8
+
9
+ hout = encap.setup()
10
+
11
+ (r, com, dec) = encap.S(hout)
12
+
13
+ rout = encap.R(hout, com, dec)
14
+
15
+ if debug: print("recovered m =>", rout)
16
+
17
+ assert r == rout, "Failed Decryption"
18
+ if debug: print("Successful Decryption!!!")
19
+
20
+ if __name__ == "__main__":
21
+ unittest.main()
File without changes
@@ -0,0 +1,35 @@
1
+ import unittest
2
+
3
+ from charm.schemes.grpsig.groupsig_bgls04 import ShortSig as BGLS04
4
+ from charm.toolbox.pairinggroup import PairingGroup
5
+
6
+ debug = False
7
+
8
+
9
+ class BGLS04Test(unittest.TestCase):
10
+ def testBGLS04(self):
11
+ groupObj = PairingGroup('MNT224')
12
+ n = 3 # how manu users in the group
13
+ user = 1 # which user's key to sign a message with
14
+
15
+ sigTest = BGLS04(groupObj)
16
+
17
+ (gpk, gmsk, gsk) = sigTest.keygen(n)
18
+
19
+ message = 'Hello World this is a message!'
20
+ if debug: print("\n\nSign the following M: '%s'" % (message))
21
+
22
+ signature = sigTest.sign(gpk, gsk[user], message)
23
+
24
+ result = sigTest.verify(gpk, message, signature)
25
+ #if result:
26
+ # print("Verify signers identity...")
27
+ # index = sigTest.open(gpk, gmsk, message, signature)
28
+ # i = 0
29
+ # while i < n:
30
+ # if gsk[i][0] == index:
31
+ # print('Found index of signer: %d' % i)
32
+ # print('A = %s' % index)
33
+ # i += 1
34
+ assert result, "Signature Failed"
35
+ if debug: print('Complete!')