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,121 @@
1
+ '''
2
+ **Boneh-Franklin Identity-Based Encryption (BF-IBE)**
3
+
4
+ *Authors:* Dan Boneh, Matthew Franklin
5
+
6
+ | **Title:** "Identity-Based Encryption from the Weil Pairing"
7
+ | **Published in:** Crypto 2001
8
+ | **Available from:** https://crypto.stanford.edu/~dabo/papers/bfibe.pdf
9
+ | **Notes:** Section 4.2 - BasicIdent scheme with Fujisaki-Okamoto transformation
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** BDH (Bilinear Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 2/2011
21
+ '''
22
+ from charm.toolbox.pairinggroup import ZR,G1,G2,pair
23
+ from charm.core.math.integer import randomBits,integer,bitsize
24
+ from charm.toolbox.hash_module import Hash,int2Bytes,integer
25
+ from charm.toolbox.IBEnc import IBEnc
26
+
27
+ debug = False
28
+ class IBE_BonehFranklin(IBEnc):
29
+ """
30
+ >>> from charm.toolbox.pairinggroup import PairingGroup
31
+ >>> group = PairingGroup('MNT224', secparam=1024)
32
+ >>> ibe = IBE_BonehFranklin(group)
33
+ >>> (master_public_key, master_secret_key) = ibe.setup()
34
+ >>> ID = 'user@email.com'
35
+ >>> private_key = ibe.extract(master_secret_key, ID)
36
+ >>> msg = b"hello world!!!!!"
37
+ >>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
38
+ >>> ibe.decrypt(master_public_key, private_key, cipher_text)
39
+ b'hello world!!!!!'
40
+ """
41
+ def __init__(self, groupObj):
42
+ IBEnc.__init__(self)
43
+ global group,h
44
+ group = groupObj
45
+ h = Hash(group)
46
+
47
+ def setup(self):
48
+ s, P = group.random(ZR), group.random(G2)
49
+ P2 = s * P
50
+ # choose H1, H2 hash functions
51
+ pk = { 'P':P, 'P2':P2 }
52
+ sk = { 's':s }
53
+ if(debug):
54
+ print("Public parameters...")
55
+ group.debug(pk)
56
+ print("Secret parameters...")
57
+ group.debug(sk)
58
+ return (pk, sk)
59
+
60
+ def extract(self, sk, ID):
61
+ d_ID = sk['s'] * group.hash(ID, G1)
62
+ k = { 'id':d_ID, 'IDstr':ID }
63
+ if(debug):
64
+ print("Key for id => '%s'" % ID)
65
+ group.debug(k)
66
+ return k
67
+
68
+
69
+ def encrypt(self, pk, ID, M): # check length to make sure it is within n bits
70
+ Q_id = group.hash(ID, G1) #standard
71
+ g_id = pair(Q_id, pk['P2'])
72
+ #choose sig = {0,1}^n where n is # bits
73
+ sig = integer(randomBits(group.secparam))
74
+ r = h.hashToZr(sig, M)
75
+
76
+ enc_M = self.encodeToZn(M)
77
+ if bitsize(enc_M) / 8 <= group.messageSize():
78
+ C = { 'U':r * pk['P'], 'V':sig ^ h.hashToZn(g_id ** r) , 'W':enc_M ^ h.hashToZn(sig) }
79
+ else:
80
+ print("Message cannot be encoded.")
81
+ return None
82
+
83
+ if(debug):
84
+ print('\nEncrypt...')
85
+ print('r => %s' % r)
86
+ print('sig => %s' % sig)
87
+ print("V' =>", g_id ** r)
88
+ print('enc_M => %s' % enc_M)
89
+ group.debug(C)
90
+ return C
91
+
92
+ def decrypt(self, pk, sk, ct):
93
+ U, V, W = ct['U'], ct['V'], ct['W']
94
+ sig = V ^ h.hashToZn(pair(sk['id'], U))
95
+ dec_M = W ^ h.hashToZn(sig)
96
+ M = self.decodeFromZn(dec_M)
97
+
98
+ r = h.hashToZr(sig, M)
99
+ if(debug):
100
+ print('\nDecrypt....')
101
+ print('V =>', V)
102
+ print("V' =>", pair(sk['id'], U))
103
+ print('sig => %s' % sig)
104
+ print('r => %s' % r)
105
+ if U == r * pk['P']:
106
+ if debug: print("Successful Decryption!!!")
107
+ return M
108
+ if debug: print("Decryption Failed!!!")
109
+ return None
110
+
111
+ def encodeToZn(self, message):
112
+ assert type(message) == bytes, "Input must be of type bytes"
113
+ return integer(message)
114
+
115
+ def decodeFromZn(self, element):
116
+ if type(element) == integer:
117
+ msg = int2Bytes(element)
118
+ return msg
119
+ return None
120
+
121
+
@@ -0,0 +1,120 @@
1
+ '''
2
+ **Camenisch-Kohlweiss-Rial-Sheedy Blind Anonymous IBE (CKRS09)**
3
+
4
+ *Authors:* Jan Camenisch, Markulf Kohlweiss, Alfredo Rial, Caroline Sheedy
5
+
6
+ | **Title:** "Blind and Anonymous Identity-Based Encryption and Authorised Private Searches on Public Key Encrypted Data"
7
+ | **Published in:** PKC 2009
8
+ | **Available from:** http://www.iacr.org/archive/pkc2009/54430202/54430202.pdf
9
+ | **Notes:** Section 4.1 - First blind and anonymous IBE scheme
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based, blind, anonymous)
14
+ * **Setting:** bilinear groups (symmetric pairings)
15
+ * **Assumption:** DBDH and related assumptions
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele, Mike Rushanan
20
+ :Date: 02/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+ from charm.toolbox.IBEnc import IBEnc
24
+ from charm.toolbox.conversion import Conversion
25
+ from charm.toolbox.bitstring import Bytes
26
+ from charm.toolbox.iterate import dotprod2
27
+ from charm.toolbox.hash_module import Waters
28
+ import hashlib
29
+
30
+ debug = False
31
+ class IBE_CKRS(IBEnc):
32
+ """
33
+ >>> from charm.toolbox.pairinggroup import PairingGroup, GT
34
+ >>> group = PairingGroup('SS512')
35
+ >>> ibe = IBE_CKRS(group)
36
+ >>> (master_public_key, master_secret_key) = ibe.setup()
37
+ >>> ID = "bob@mail.com"
38
+ >>> secret_key = ibe.extract(master_public_key, master_secret_key, ID)
39
+ >>> msg = group.random(GT)
40
+ >>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
41
+ >>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
42
+ >>> decrypted_msg == msg
43
+ True
44
+ """
45
+ def __init__(self, groupObj):
46
+ global group,hashObj
47
+ group = groupObj
48
+
49
+ def setup(self, n=5, l=32):
50
+ """n integers with each size l"""
51
+ global lam_func, waters
52
+ lam_func = lambda i,x,y: x[i] ** y[i]
53
+ waters = Waters(group, n, l)
54
+ alpha, t1, t2, t3, t4 = group.random(ZR, 5)
55
+ z = list(group.random(ZR, n))
56
+ g = group.random(G1)
57
+ h = group.random(G2)
58
+ omega = pair(g, h) ** (t1 * t2 * alpha)
59
+ g_l = [g ** i for i in z]
60
+ h_l = [h ** i for i in z]
61
+ v1, v2 = g ** t1, g ** t2
62
+ v3, v4 = g ** t3, g ** t4
63
+ msk = { 'alpha':alpha, 't1':t1, 't2':t2, 't3':t3, 't4':t4 }
64
+ mpk = { 'omega':omega, 'g':g, 'h':h, 'g_l':g_l, 'h_l':h_l,
65
+ 'v1':v1, 'v2':v2, 'v3':v3, 'v4':v4, 'n':n, 'l':l }
66
+ return (mpk, msk)
67
+
68
+ def extract(self, mpk, msk, ID):
69
+ r1, r2 = group.random(ZR, 2) # should be params of extract
70
+ hID = waters.hash(ID)
71
+ hashID2 = mpk['h_l'][0] * dotprod2(range(1,mpk['n']), lam_func, mpk['h_l'], hID)
72
+ d = {}
73
+
74
+ d[0] = mpk['h'] ** ((r1 * msk['t1'] * msk['t2']) + (r2 * msk['t3'] * msk['t4']))
75
+ d[1] = (mpk['h'] ** (-msk['alpha'] * msk['t2'])) * (hashID2 ** (-r1 * msk['t2']))
76
+ d[2] = (mpk['h'] ** (-msk['alpha'] * msk['t1'])) * (hashID2 ** (-r1 * msk['t1']))
77
+ d[3] = hashID2 ** (-r2 * msk['t4'])
78
+ d[4] = hashID2 ** (-r2 * msk['t3'])
79
+ return { 'd':d }
80
+
81
+ def encrypt(self, mpk, ID, msg):
82
+ s, s1, s2 = group.random(ZR, 3)
83
+ hID = waters.hash(ID)
84
+ hashID1 = mpk['g_l'][0] * dotprod2(range(1,mpk['n']), lam_func, mpk['g_l'], hID)
85
+ c = {}
86
+ c_pr = (mpk['omega'] ** s) * msg
87
+ c[0] = hashID1 ** s
88
+ c[1] = mpk['v1'] ** (s - s1)
89
+ c[2] = mpk['v2'] ** s1
90
+ c[3] = mpk['v3'] ** (s - s2)
91
+ c[4] = mpk['v4'] ** s2
92
+ return {'c':c, 'c_prime':c_pr }
93
+
94
+ def decrypt(self, mpk, sk, ct):
95
+ c, d = ct['c'], sk['d']
96
+ msg = ct['c_prime'] * pair(c[0], d[0]) * pair(c[1], d[1]) * pair(c[2], d[2]) * pair(c[3], d[3]) * pair(c[4], d[4])
97
+ return msg
98
+
99
+
100
+ def main():
101
+ groupObj = PairingGroup('SS512')
102
+ ibe = IBE_CKRS(groupObj)
103
+ (mpk, msk) = ibe.setup()
104
+
105
+ # represents public identity
106
+ ID = "bob@mail.com"
107
+ sk = ibe.extract(mpk, msk, ID)
108
+
109
+ M = groupObj.random(GT)
110
+ ct = ibe.encrypt(mpk, ID, M)
111
+ m = ibe.decrypt(mpk, sk, ct)
112
+ if debug: print('m =>', m)
113
+
114
+ assert m == M, "FAILED Decryption!"
115
+ if debug: print("Successful Decryption!!! m => '%s'" % m)
116
+
117
+ if __name__ == "__main__":
118
+ debug = True
119
+ main()
120
+
@@ -0,0 +1,172 @@
1
+ r'''
2
+ **Chen-Lim-Ling-Wang-Wee Shorter IBE (CLLWW12)**
3
+
4
+ *Authors:* Jie Chen, Hoon Wei Lim, San Ling, Huaxiong Wang, Hoeteck Wee
5
+
6
+ | **Title:** "Shorter IBE and Signatures via Asymmetric Pairings"
7
+ | **Published in:** Pairing 2012
8
+ | **Available from:** http://eprint.iacr.org/2012/224
9
+ | **Notes:** Section 4 - Shorter IBE construction based on SXDH assumption
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** SXDH (Symmetric External Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Fan Zhang (zfwise@gwu.edu), supported by GWU computer science department
20
+ :Date: 3/2013
21
+ :Notes: Optimized implementation stores msk = {alpha, d_1*, d_2*} instead of
22
+ pre-computed group elements. Computes (alpha + r*ID)*d_1* - r*d_2* before
23
+ exponentiation, reducing G2 exponentials from 8 to 4.
24
+ '''
25
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
26
+ from charm.toolbox.matrixops import *
27
+ from charm.core.crypto.cryptobase import *
28
+ from charm.toolbox.IBEnc import IBEnc
29
+
30
+ debug = False
31
+ class IBE_Chen12_z(IBEnc):
32
+ """
33
+ >>> group = PairingGroup('MNT224', secparam=1024)
34
+ >>> ibe = IBE_Chen12_z(group)
35
+ >>> (master_public_key, master_secret_key) = ibe.setup()
36
+ >>> ID = 'user@email.com'
37
+ >>> private_key = ibe.extract(master_secret_key, ID)
38
+ >>> msg = group.random(GT)
39
+ >>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
40
+ >>> decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
41
+ >>> print (decryptedMSG==msg)
42
+ True
43
+ """
44
+ def __init__(self, groupObj):
45
+ IBEnc.__init__(self)
46
+ global group
47
+ group = groupObj
48
+
49
+ def setup(self):
50
+ g1 = group.random(G1)
51
+ g2 = group.random(G2)
52
+ alpha = group.random(ZR)
53
+ #generate the 4*4 dual pairing vector spaces.
54
+ d11, d12, d13, d14, d21, d22, d23, d24 = group.random(ZR, 8)
55
+ d31, d32, d33, d34, d41, d42, d43, d44 = group.random(ZR, 8)
56
+ D11, D12, D13, D14 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
57
+ D21, D22, D23, D24 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
58
+ D31, D32, D33, D34 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
59
+ D41, D42, D43, D44 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
60
+
61
+ one = group.random(ZR)
62
+
63
+ [D11, D12, D13, D14] = GaussEliminationinGroups([[d11, d12, d13, d14, one],
64
+ [d21, d22, d23, d24, group.init(ZR, 0)],
65
+ [d31, d32, d33, d34, group.init(ZR, 0)],
66
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
67
+ [D21, D22, D23, D24] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
68
+ [d21, d22, d23, d24, one],
69
+ [d31, d32, d33, d34, group.init(ZR, 0)],
70
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
71
+ [D31, D32, D33, D34] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
72
+ [d21, d22, d23, d24, group.init(ZR, 0)],
73
+ [d31, d32, d33, d34, one],
74
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
75
+ [D41, D42, D43, D44] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
76
+ [d21, d22, d23, d24, group.init(ZR, 0)],
77
+ [d31, d32, d33, d34, group.init(ZR, 0)],
78
+ [d41, d42, d43, d44, one]])
79
+
80
+
81
+ #generate public parameters.
82
+ PP2 = (pair(g1, g2))**(alpha*one)
83
+ gd11 = g1**d11
84
+ gd12 = g1**d12
85
+ gd13 = g1**d13
86
+ gd14 = g1**d14
87
+ gd21 = g1**d21
88
+ gd22 = g1**d22
89
+ gd23 = g1**d23
90
+ gd24 = g1**d24
91
+ pk = { 'PP2':PP2,
92
+ 'gd11':gd11, 'gd12':gd12,'gd13':gd13, 'gd14':gd14,
93
+ 'gd21':gd21, 'gd22':gd22, 'gd23':gd23, 'gd24':gd24 }
94
+ #generate private parameters
95
+ ## gD11 = g2**D11
96
+ ## gD12 = g2**D12
97
+ ## gD13 = g2**D13
98
+ ## gD14 = g2**D14
99
+ ## gD21 = g2**D21
100
+ ## gD22 = g2**D22
101
+ ## gD23 = g2**D23
102
+ ## gD24 = g2**D24
103
+ ## msk = { 'alpha':alpha, 'gD11':gD11, 'gD12':gD12, 'gD13':gD13, 'gD14':gD14,
104
+ ## 'gD21':gD21, 'gD22':gD22, 'gD23':gD23, 'gD24':gD24 }
105
+ msk = {'alpha': alpha, 'g2':g2,
106
+ 'D11':D11, 'D12':D12, 'D13':D13, 'D14':D14,
107
+ 'D21':D21, 'D22':D22, 'D23':D23, 'D24':D24}
108
+ if(debug):
109
+ print("Public parameters...")
110
+ group.debug(pk)
111
+ print("Secret parameters...")
112
+ group.debug(msk)
113
+ return (pk, msk)
114
+
115
+ def extract(self, msk, ID):
116
+ _ID = group.hash(ID)
117
+ r = group.random(ZR)
118
+ sk_id1 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D11'] - r * msk['D21'])
119
+ sk_id2 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D12'] - r * msk['D22'])
120
+ sk_id3 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D13'] - r * msk['D23'])
121
+ sk_id4 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D14'] - r * msk['D24'])
122
+
123
+ k = { 'sk_id1':sk_id1, 'sk_id2':sk_id2, 'sk_id3':sk_id3,
124
+ 'sk_id4':sk_id4 }
125
+
126
+ if(debug):
127
+ print("Generate User SK...")
128
+ group.debug(k)
129
+ return k
130
+
131
+
132
+ def encrypt(self, pk, ID, M):
133
+ s = group.random(ZR)
134
+ _ID = group.hash(ID)
135
+ #M is an element in GT
136
+ C0 = (pk['PP2']**s)*M
137
+ C11 = (pk['gd11']**s)*(pk['gd21']**(s*_ID))
138
+ C12 = (pk['gd12']**s)*(pk['gd22']**(s*_ID))
139
+ C13 = (pk['gd13']**s)*(pk['gd23']**(s*_ID))
140
+ C14 = (pk['gd14']**s)*(pk['gd24']**(s*_ID))
141
+
142
+ CT = { 'C0':C0, 'C11':C11, 'C12':C12, 'C13':C13, 'C14':C14 }
143
+
144
+ if(debug):
145
+ print('\nEncrypt...')
146
+ group.debug(CT)
147
+ return CT
148
+
149
+ def decrypt(self, pk, sk, ct):
150
+ Mprime = ct['C0']/(pair(ct['C11'],sk['sk_id1'])*pair(ct['C12'],sk['sk_id2'])*
151
+ pair(ct['C13'],sk['sk_id3'])*pair(ct['C14'],sk['sk_id4']))
152
+
153
+ if(debug):
154
+ print('\nDecrypt....')
155
+ return Mprime
156
+
157
+ def main():
158
+
159
+ group = PairingGroup('MNT224', secparam=1024)
160
+ ibe = IBE_Chen12_z(group)
161
+ (master_public_key, master_secret_key) = ibe.setup()
162
+ ID = 'user@email.com'
163
+ private_key = ibe.extract(master_secret_key, ID)
164
+ msg = group.random(GT)
165
+ cipher_text = ibe.encrypt(master_public_key, ID, msg)
166
+ decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
167
+ print (decryptedMSG==msg)
168
+
169
+ if __name__ == '__main__':
170
+ debug = True
171
+ main()
172
+
@@ -0,0 +1,120 @@
1
+ '''
2
+ **Lewko-Sahai-Waters Revocable IBE (LSW08)**
3
+
4
+ *Authors:* Allison Lewko, Amit Sahai, Brent Waters
5
+
6
+ | **Title:** "Revocation Systems with Very Small Private Keys"
7
+ | **Published in:** IEEE S&P 2010
8
+ | **Available from:** http://eprint.iacr.org/2008/309.pdf
9
+ | **Notes:** Fully secure IBE construction with revocable keys
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based, revocable)
14
+ * **Setting:** bilinear groups (symmetric pairings)
15
+ * **Assumption:** DLIN and related assumptions
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 1/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import ZR,G1,pair
23
+ from charm.toolbox.IBEnc import *
24
+
25
+ debug = False
26
+ class IBE_Revoke(IBEnc):
27
+ """
28
+ >>> from charm.toolbox.pairinggroup import PairingGroup, GT, G2
29
+ >>> group = PairingGroup('SS512')
30
+ >>> num_users = 5 # total # of users
31
+ >>> ibe = IBE_Revoke(group)
32
+ >>> ID = "user2@email.com"
33
+ >>> S = ["user1@email.com", "user3@email.com", "user4@email.com"]
34
+ >>> (master_public_key, master_secret_key) = ibe.setup(num_users)
35
+ >>> secret_key = ibe.keygen(master_public_key, master_secret_key, ID)
36
+ >>> msg = group.random(GT)
37
+ >>> cipher_text = ibe.encrypt(master_public_key, msg, S)
38
+ >>> decrypted_msg = ibe.decrypt(S, cipher_text, secret_key)
39
+ >>> decrypted_msg == msg
40
+ True
41
+ """
42
+
43
+ def __init__(self, groupObj):
44
+ IBEnc.__init__(self)
45
+ global group, util
46
+ group = groupObj
47
+
48
+ def setup(self, n):
49
+ g, w, h, v, v1, v2 = group.random(G1, 6)
50
+ a1, a2, b, alpha = group.random(ZR, 4)
51
+
52
+ tau1 = v * (v1 ** a1)
53
+ tau2 = v * (v2 ** a2)
54
+ pk = {'n':n, 'g':g, 'g^b':g ** b, 'g^a1':g ** a1, 'g^a2':g ** a2,
55
+ 'g^ba1':g ** (b * a1), 'g^ba2':g ** (b * a2), 'tau1':tau1, 'tau2':tau2,
56
+ 'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'w':w, 'h':h,
57
+ 'egg_alpha': pair(g, g) ** (alpha * a1 * b)}
58
+ sk = {'g^alph':g ** alpha, 'g^alph_a1':g ** (alpha * a1),
59
+ 'g^b':g ** b,'v':v, 'v1':v1, 'v2':v2, 'alpha':alpha }
60
+ return (pk, sk)
61
+
62
+ def keygen(self, mpk, msk, ID):
63
+ d1, d2, z1, z2 = group.random(ZR, 4)
64
+ d = d1 + d2
65
+ _ID = group.hash(ID.upper())
66
+ D = {}
67
+ D[1] = msk['g^alph_a1'] * (msk['v'] ** d)
68
+ D[2] = (mpk['g'] ** -msk['alpha']) * (msk['v1'] ** d) * (mpk['g'] ** z1)
69
+ D[3] = mpk['g^b'] ** -z1
70
+ D[4] = (msk['v2'] ** d) * (mpk['g'] ** z2)
71
+ D[5] = mpk['g^b'] ** -z2
72
+ D[6] = mpk['g^b'] ** d2
73
+ D[7] = mpk['g'] ** d1
74
+ K = ((mpk['w'] ** _ID) * mpk['h']) ** d1
75
+
76
+ sk = { 'ID':_ID, 'D':D, 'K':K }
77
+ return sk
78
+
79
+ def encrypt(self, mpk, M, S):
80
+ s1, s2 = group.random(ZR, 2)
81
+ s = s1 + s2
82
+ # number of revoked users
83
+ r = len(S); t_r = group.random(ZR, r)
84
+ t = 0
85
+ for i in t_r: t += i
86
+
87
+ C = {}
88
+ C[0] = M * (mpk['egg_alpha'] ** s2)
89
+ C[1] = mpk['g^b'] ** s
90
+ C[2] = mpk['g^ba1'] ** s1
91
+ C[3] = mpk['g^a1'] ** s1
92
+ C[4] = mpk['g^ba2'] ** s2
93
+ C[5] = mpk['g^a2'] ** s2
94
+ C[6] = (mpk['tau1'] ** s1) * (mpk['tau2'] ** s2)
95
+ C[7] = (mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w'] ** -t)
96
+
97
+ c1 = [i for i in range(r)]; c2 = [i for i in range(r)]
98
+ for i in range(len(t_r)):
99
+ c1[i] = mpk['g'] ** t_r[i]
100
+ S_hash = group.hash(S[i].upper())
101
+ c2[i] = ((mpk['w'] ** S_hash) * mpk['h']) ** t_r[i]
102
+ C['i1'] = c1
103
+ C['i2'] = c2
104
+ return C
105
+
106
+ def decrypt(self, S, ct, sk):
107
+ C, D, K = ct, sk['D'], sk['K']
108
+ _ID = sk['ID']
109
+ # hash IDs
110
+ S_id = [group.hash(i.upper()) for i in S]
111
+ if debug: print("hashed IDs: ", S_id)
112
+ if _ID in S_id: print("Your ID:", _ID, "is in revoked list!"); return
113
+ A1 = pair(C[1], D[1]) * pair(C[2], D[2]) * pair(C[3], D[3]) * pair(C[4], D[4]) * pair(C[5], D[5])
114
+ A2 = pair(C[6], D[6]) * pair(C[7], D[7])
115
+ A3 = A1 / A2
116
+ A4 = 1
117
+ for i in range(len(S_id)):
118
+ A4 *= (pair(C['i1'][i], K) / pair(C['i2'][i], D[7])) ** (1 / (_ID - S_id[i]))
119
+ return C[0] / (A3 / A4)
120
+