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,307 @@
1
+ /*
2
+ * Charm-Crypto is a framework for rapidly prototyping cryptosystems.
3
+ *
4
+ * Charm-Crypto is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU Lesser General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 2.1 of the License, or (at your option) any later version.
8
+ *
9
+ * Charm-Crypto is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ * Lesser General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Lesser General Public License
15
+ * along with Charm-Crypto. If not, see <http://www.gnu.org/licenses/>.
16
+ *
17
+ * Please contact the charm-crypto dev team at support@charm-crypto.com
18
+ * for any questions.
19
+ */
20
+
21
+ /*
22
+ * @file pairingmodule2.h
23
+ *
24
+ * @brief charm interface over MIRACL's pairing-based operations
25
+ *
26
+ * @author jakinye3@jhu.edu
27
+ * @remark this version of the pairing module uses the MIRACL library (www.shamus.ie).
28
+ * At the moment, only useful for academic purposes and should be treated as such.
29
+ * To build into Charm, you'll need to acquire the MIRACL source and compile with the
30
+ * build script located in the miracl dir. See the online documentation at charm-crypto.com
31
+ * for how to install.
32
+ *
33
+ ************************************************************************/
34
+
35
+ #ifndef PAIRINGMODULE2_H
36
+ #define PAIRINGMODULE2_H
37
+
38
+ #ifndef PY_SSIZE_T_CLEAN
39
+ #define PY_SSIZE_T_CLEAN
40
+ #endif
41
+
42
+ /* Define MS_WIN64 to get correct PYLONG_BITS_IN_DIGIT on Windows. */
43
+ #if PY_MINOR_VERSION <= 10 && defined(_WIN64) && !defined(MS_WIN64)
44
+ #define MS_WIN64
45
+ #endif
46
+
47
+ #include <Python.h>
48
+ #include <structmember.h>
49
+
50
+ #if PY_MINOR_VERSION <= 10
51
+ #include <longintrepr.h>
52
+ #else
53
+ #include <cpython/longintrepr.h> /* for conversions */
54
+ #endif
55
+ #include <stdlib.h>
56
+ #include "miracl_interface2.h"
57
+ #include <gmp.h>
58
+ #include <limits.h>
59
+ #include <sys/types.h>
60
+ #include <sys/stat.h>
61
+ #include <fcntl.h>
62
+ #include "benchmarkmodule.h"
63
+ #include <openssl/objects.h>
64
+ #include <openssl/rand.h>
65
+ #include <openssl/sha.h>
66
+ #include <openssl/evp.h>
67
+ #ifdef BENCHMARK_ENABLED
68
+ #include "benchmark_util.h"
69
+ #endif
70
+
71
+ /* supported pairing curves */
72
+ #define MNT160 80
73
+ #define BN256 128
74
+ #define SS512 80
75
+ #define SS1536 128
76
+
77
+ /* buf sizes */
78
+ #define BenchmarkIdentifier 1
79
+ #define BUF_MAX_LEN 512
80
+ #define HASH_LEN 20
81
+ #define ID_LEN 8
82
+
83
+ /* Index numbers for different hash functions. These are all implemented as SHA1(index || message). */
84
+ #define HASH_FUNCTION_STR_TO_Zr_CRH 0
85
+ #define HASH_FUNCTION_Zr_TO_G1_ROM 1
86
+ #define HASH_FUNCTION_ELEMENTS 2
87
+ #define HASH_FUNCTION_STRINGS 3
88
+
89
+ #ifdef DEBUG
90
+ #define debug_e(...) element_printf("DEBUG: "__VA_ARGS__)
91
+ #else
92
+ #define debug_e(...)
93
+ #endif
94
+
95
+ int pairing_init_finished;
96
+ PyTypeObject ElementType;
97
+ PyTypeObject PairingType;
98
+ static PyObject *ElementError;
99
+
100
+ #define PyElement_Check(obj) PyObject_TypeCheck(obj, &ElementType)
101
+ #define PyPairing_Check(obj) PyObject_TypeCheck(obj, &PairingType)
102
+
103
+ PyMethodDef Element_methods[];
104
+ PyMethodDef pairing_methods[];
105
+ PyMemberDef Element_members[];
106
+ PyNumberMethods element_number;
107
+
108
+ #ifdef BENCHMARK_ENABLED
109
+ typedef struct {
110
+ PyObject_HEAD
111
+ int op_init;
112
+ int exp_pyZR_t, exp_pyG1_t, exp_pyG2_t, exp_pyGT_t;
113
+ int mul_pyZR_t, mul_pyG1_t, mul_pyG2_t, mul_pyGT_t;
114
+ int div_pyZR_t, div_pyG1_t, div_pyG2_t, div_pyGT_t;
115
+ // optional
116
+ int add_pyZR_t, add_pyG1_t, add_pyG2_t, add_pyGT_t;
117
+ int sub_pyZR_t, sub_pyG1_t, sub_pyG2_t, sub_pyGT_t;
118
+ } Operations;
119
+ #endif
120
+
121
+ typedef struct {
122
+ PyObject_HEAD
123
+ pairing_t *pair_obj;
124
+ element_t *order;
125
+ int curve;
126
+ int group_init;
127
+ #ifdef BENCHMARK_ENABLED
128
+ Operations *gBench;
129
+ Benchmark *dBench;
130
+ uint8_t bench_id[ID_LEN+1];
131
+ #endif
132
+ } Pairing;
133
+
134
+ typedef struct {
135
+ PyObject_HEAD
136
+ Pairing *pairing;
137
+ element_t *e;
138
+ Group_t element_type;
139
+ int elem_initialized;
140
+ int elem_initPP;
141
+ } Element;
142
+
143
+ #define IS_PAIRING_OBJ_NULL(obj) \
144
+ if(obj->pairing == NULL) { \
145
+ PyErr_SetString(ElementError, "pairing structure not initialized."); \
146
+ return NULL; \
147
+ }
148
+
149
+ /* miracl macros to simplify interface */
150
+ #define print(msg, type, e) \
151
+ printf("%s", msg); \
152
+ element_printf(type, e); \
153
+ printf("\n");
154
+
155
+ #define element_init_hash(a) _init_hash(a->pair_obj)
156
+ #define element_add_str_hash(a, b, c) _element_add_str_hash(a->pair_obj, b, c)
157
+ #define element_add_to_hash(a) _element_add_to_hash(a->element_type, a->pairing->pair_obj, a->e)
158
+ #define element_finish_hash(a, t) a->e = finish_hash(t, a->pairing->pair_obj)
159
+ #define element_hash_to_key(a, b, c) _element_hash_key(a->pairing->pair_obj, a->element_type, a->e, b, c)
160
+
161
+ #define element_is(a, b) element_is_value(a->element_type, a->e, b)
162
+ #define element_add(c, a, b) _element_add(a->element_type, c->e, a->e, b->e, a->pairing->order)
163
+ #define element_sub(c, a, b) _element_sub(a->element_type, c->e, a->e, b->e, a->pairing->order)
164
+ #define element_mul(c, a, b) _element_mul(a->element_type, c->e, a->e, b->e, a->pairing->order)
165
+ #define element_mul_si(c, a, b) _element_mul_si(a->element_type, a->pairing->pair_obj, c->e, a->e, b, a->pairing->order)
166
+ #define element_mul_zn(c, a, b) _element_mul_zn(a->element_type, a->pairing->pair_obj, c->e, a->e, b->e, a->pairing->order)
167
+ // TODO: fix for -1 / ZR and similar operations
168
+ #define element_div(c, a, b) _element_div(a->element_type, c->e, a->e, b->e, a->pairing->order)
169
+ #define element_set(a, b) _element_set(a->pairing->curve, a->element_type, a->e, b->e);
170
+ #define element_set_raw(g, t, a, b) _element_set(g->curve, t, a, b);
171
+ #define element_setG1(c, a, b) _element_setG1(c->element_type, c->e, a->e, b->e);
172
+
173
+ #define element_set_si(a, b) \
174
+ if(a->element_type == pyZR_t) { _element_set_si(a->element_type, a->e, b); }
175
+
176
+ #define element_set_mpz(a, b) _element_set_mpz(a->element_type, a->e, b);
177
+ #define element_to_mpz(a, b) _element_to_mpz(pyZR_t, a->e, b);
178
+ #define object_to_mpz(a, b) _element_to_mpz(pyZR_t, a, b);
179
+
180
+ #define element_neg(a, b) \
181
+ a->e = _element_neg(a->element_type, b->e, b->pairing->order);
182
+
183
+ #define element_invert(a, b) \
184
+ _element_inv(b->element_type, b->pairing->pair_obj, b->e, a->e, b->pairing->order)
185
+
186
+ #define element_pow_zr(c, a, b) \
187
+ if (a->element_type != NONE_G) { \
188
+ c->e = _element_pow_zr(a->element_type, a->pairing->pair_obj, a->e, b->e, a->pairing->order); \
189
+ c->element_type = a->element_type; }
190
+
191
+ #define element_pow_int(c, a, b) \
192
+ c->e = _element_pow_zr_zr(pyZR_t, a->pairing->pair_obj, a->e, b, a->pairing->order); \
193
+ c->element_type = pyZR_t;
194
+
195
+ #define element_pp_init(b, a) \
196
+ b = _element_pp_init(a->pairing->pair_obj, a->element_type, a->e)
197
+
198
+ #define pairing_apply(c, a, b) \
199
+ if(a->pairing->curve == MNT || a->pairing->curve == BN || a->pairing->curve == SS) { \
200
+ c->e = _element_pairing(a->pairing->pair_obj, a->e, b->e); \
201
+ c->element_type = pyGT_t; \
202
+ }
203
+
204
+ #define element_prod_pairing(c, a, b, l) \
205
+ if(c->pairing->curve == MNT || c->pairing->curve == BN || c->pairing->curve == SS) { \
206
+ c->e = _element_prod_pairing(c->pairing->pair_obj, a, b, l); \
207
+ c->element_type = pyGT_t; }
208
+
209
+ #define element_from_hash(a, d, l) \
210
+ a->e = _element_from_hash(a->element_type, a->pairing->pair_obj, d, l);
211
+
212
+ #define element_after_hash(a, d, l) \
213
+ a->e = hash_then_map(a->element_type, a->pairing->pair_obj, d, l);
214
+
215
+ #define element_length_in_bytes(a) \
216
+ _element_length_in_bytes(a->pairing->curve, a->element_type, a->e);
217
+
218
+ #define element_to_bytes(d, a) \
219
+ _element_to_bytes(d, a->pairing->curve, a->element_type, a->e);
220
+
221
+ #define element_from_bytes(o, b) \
222
+ o->e = _element_from_bytes(o->pairing->curve, o->element_type, b);
223
+
224
+ #define element_cmp(a, b) _element_cmp(a->element_type, a->e, b->e);
225
+ #define element_length_to_str(a) _element_length_to_str(a->element_type, a->e);
226
+ #define element_to_str(d, a) _element_to_str(d, a->element_type, a->e);
227
+ #define element_init_G1 _element_init_G1
228
+ #define element_init_G2 _element_init_G2
229
+ #define element_init_GT(a) _element_init_GT(a->pair_obj);
230
+ #define check_membership(a) element_is_member(a->pairing->curve, a->element_type, a->pairing->pair_obj, a->e)
231
+
232
+ #define Check_Elements(o1, o2) PyElement_Check(o1) && PyElement_Check(o2)
233
+
234
+ #define Check_Types2(o1, o2, lhs_o1, rhs_o2, longLHS_o1, longRHS_o2) \
235
+ if(PyElement_Check(o1)) { \
236
+ lhs_o1 = (Element *) o1; \
237
+ debug("found a lhs element.\n"); \
238
+ } \
239
+ else if(_PyLong_Check(o1)) { \
240
+ longLHS_o1 = TRUE; } \
241
+ \
242
+ if(PyElement_Check(o2)) { \
243
+ rhs_o2 = (Element *) o2; \
244
+ debug("found a rhs element.\n"); \
245
+ } \
246
+ else if(_PyLong_Check(o2)) { \
247
+ longRHS_o2 = TRUE; } \
248
+
249
+ #define VERIFY_GROUP(g) \
250
+ if(PyPairing_Check(g) && g->group_init == FALSE) { \
251
+ PyErr_SetString(ElementError, "invalid group object specified."); \
252
+ return NULL; } \
253
+ if(g->pair_obj == NULL) { \
254
+ PyErr_SetString(ElementError, "pairing object is NULL."); \
255
+ return NULL; } \
256
+
257
+ PyObject *Element_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
258
+ int Element_init(Element *self, PyObject *args, PyObject *kwds);
259
+ PyObject *Element_print(Element* self);
260
+ PyObject *Element_call(Element *elem, PyObject *args, PyObject *kwds);
261
+ void Element_dealloc(Element* self);
262
+ Element *convertToZR(PyObject *LongObj, PyObject *elemObj);
263
+
264
+ PyObject *Apply_pairing(Element *self, PyObject *args);
265
+ PyObject *sha2_hash(Element *self, PyObject *args);
266
+
267
+ int exp_rule(Group_t lhs, Group_t rhs);
268
+ int mul_rule(Group_t lhs, Group_t rhs);
269
+ int add_rule(Group_t lhs, Group_t rhs);
270
+ int sub_rule(Group_t lhs, Group_t rhs);
271
+ int div_rule(Group_t lhs, Group_t rhs);
272
+ int pair_rule(Group_t lhs, Group_t rhs);
273
+
274
+ #ifdef BENCHMARK_ENABLED
275
+
276
+ #define Update_Op(name, op_type, elem_type, bench_obj) \
277
+ Op_ ##name(op_type, elem_type, pyZR_t, bench_obj) \
278
+ Op_ ##name(op_type, elem_type, pyG1_t, bench_obj) \
279
+ Op_ ##name(op_type, elem_type, pyG2_t, bench_obj) \
280
+ Op_ ##name(op_type, elem_type, pyGT_t, bench_obj) \
281
+
282
+ #define CLEAR_ALLDBENCH(bench_obj) \
283
+ CLEAR_DBENCH(bench_obj, pyZR_t); \
284
+ CLEAR_DBENCH(bench_obj, pyG1_t); \
285
+ CLEAR_DBENCH(bench_obj, pyG2_t); \
286
+ CLEAR_DBENCH(bench_obj, pyGT_t); \
287
+
288
+ #else
289
+
290
+ #define UPDATE_BENCH(op_type, elem_type, bench_obj) /* ... */
291
+ // #define UPDATE_BENCHMARK(op_type, bench_obj) /* ... */
292
+ #define CLEAR_ALLDBENCH(bench_obj) /* ... */
293
+ #define GetField(count, type, group, bench_obj) /* ... */
294
+ #endif
295
+
296
+
297
+ #define EXIT_IF(check, msg) \
298
+ if(check) { \
299
+ PyErr_SetString(ElementError, msg); \
300
+ return NULL; }
301
+
302
+ #define EXITCODE_IF(check, msg, code) \
303
+ if(check) { \
304
+ PyErr_SetString(ElementError, msg); \
305
+ return Py_BuildValue("i", code); }
306
+
307
+ #endif