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,238 @@
1
+ '''
2
+ **Sahai-Waters Fuzzy Identity-Based Encryption (SW05)**
3
+
4
+ *Authors:* Amit Sahai, Brent Waters
5
+
6
+ | **Title:** "Fuzzy Identity-Based Encryption"
7
+ | **Published in:** Eurocrypt 2005
8
+ | **Available from:** http://eprint.iacr.org/2004/086.pdf
9
+ | **Notes:** Original construction (Section 4) and large universe construction (Section 6)
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based, fuzzy/attribute-based)
14
+ * **Setting:** bilinear groups (symmetric)
15
+ * **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Christina Garman
20
+ :Date: 10/2011
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
24
+ from charm.toolbox.IBEnc import IBEnc
25
+ from charm.toolbox.secretshare import SecretShare
26
+
27
+ debug = False
28
+ class IBE_SW05(IBEnc):
29
+ """
30
+ >>> from charm.toolbox.pairinggroup import PairingGroup,GT
31
+ >>> group = PairingGroup('SS512')
32
+ >>> max_attributes = 6
33
+ >>> required_overlap = 4
34
+ >>> ibe = IBE_SW05_LUC(group)
35
+ >>> (master_public_key, master_key) = ibe.setup(max_attributes, required_overlap)
36
+ >>> private_identity = ['insurance', 'id=2345', 'oncology', 'doctor', 'nurse', 'JHU'] #private identity
37
+ >>> public_identity = ['insurance', 'id=2345', 'doctor', 'oncology', 'JHU', 'billing', 'misc'] #public identity for encrypt
38
+ >>> (pub_ID_hashed, secret_key) = ibe.extract(master_key, private_identity, master_public_key, required_overlap, max_attributes)
39
+ >>> msg = group.random(GT)
40
+ >>> cipher_text = ibe.encrypt(master_public_key, public_identity, msg, max_attributes)
41
+ >>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text, pub_ID_hashed, required_overlap)
42
+ >>> msg == decrypted_msg
43
+ True
44
+ """
45
+ def __init__(self, groupObj):
46
+ IBEnc.__init__(self)
47
+ global group, H, util
48
+ group = groupObj
49
+ H = lambda x: group.hash(('0', x), ZR)
50
+ util = SecretShare(group, False)
51
+
52
+ def setup(self, n, d):
53
+ '''
54
+ :Parameters:
55
+ - ``n``: the maximum number of attributes in the system.
56
+ OR the maximum length of an identity
57
+ - ``d``: the set overlap required to decrypt
58
+ '''
59
+ g = group.random(G1)
60
+ y = group.random(ZR)
61
+ Y = pair(g, g) ** y
62
+
63
+ t = [ group.random(ZR) for x in range( n )]
64
+ T = [ g ** i for i in t]
65
+
66
+ pk = { 'g':g, 'Y':Y, 'T': T }
67
+ mk = { 'y':y, 't':t } # master secret
68
+ return (pk, mk)
69
+
70
+ def intersection_subset(self, w, wPrime, d):
71
+ S = []
72
+ for i in range(len(w)):
73
+ for j in range(len(wPrime)):
74
+ if(w[i] == wPrime[j]):
75
+ S.append(w[i])
76
+
77
+ if(len(S) < d):
78
+ assert False, "Cannot decrypt. w and w' do not have enough attributes in common."
79
+
80
+ S_sub = [S[k] for k in range(d)]
81
+ return S_sub
82
+
83
+ def extract(self, mk, ID, pk, dOver, n):
84
+ w_hash = [H(x) for x in ID] # assumes ID is a list
85
+
86
+ #a d-1 degree polynomial q is generated such that q(0) = y
87
+ q = [group.random(ZR) for x in range(dOver)]
88
+ q[0] = mk['y']
89
+ # use secret sharing as building block
90
+ shares = util.genShares(mk['y'], dOver, n, q, w_hash)
91
+ D = {}; t_index = {};
92
+ for i in w_hash:
93
+ j = w_hash.index(i)
94
+ D[i] = (pk['g'] ** (shares[j][1] / mk['t'][j]))
95
+ # dictionary for finding corresponding T public value when encrypting
96
+ # this eliminates ordering of attribute issues
97
+ t_index[i] = j;
98
+
99
+ pk['T_index'] = t_index
100
+ return (w_hash, { 'D':D })
101
+
102
+ def encrypt(self, pk, w_prime, M, n):
103
+ '''
104
+ Encryption with the public key, Wprime and the message M in G2
105
+ '''
106
+ w_prime_hash = [H(x) for x in w_prime]
107
+ s = group.random(ZR)
108
+
109
+ Eprime = M * (pk['Y'] ** s)
110
+ E = {}
111
+ for i in w_prime_hash:
112
+ k = pk['T_index'][i]
113
+ E[i] = pk['T'][k] ** s
114
+
115
+ return { 'wPrime':w_prime_hash, 'Eprime':Eprime, 'E':E}
116
+
117
+ def decrypt(self, pk, sk, CT, w, d):
118
+ '''dID must have an intersection overlap of at least d with Wprime to decrypt
119
+ '''
120
+ S = self.intersection_subset(w, CT['wPrime'], d)
121
+ coeffs = util.recoverCoefficients(S)
122
+ prod = 1
123
+ for i in S:
124
+ prod *= pair(sk['D'][i], CT['E'][i]) ** coeffs[i]
125
+
126
+ return CT['Eprime'] / prod
127
+
128
+
129
+ '''
130
+ Sahai-Waters Fuzzy Identity-Based Encryption, Large Universe Construction
131
+
132
+ | From: "A. Sahai, B. Waters Fuzzy Identity-Based Encryption.
133
+ | Published in: Eurocrypt 2005
134
+ | Available from: eprint.iacr.org/2004/086.pdf
135
+ | Notes: Original construction (Section 4) and large universe construction (Section 6).
136
+
137
+ * type: encryption (identity-based)
138
+ * setting: bilinear groups
139
+
140
+ :Authors: Christina Garman
141
+ :Date: 10/2011
142
+ '''
143
+ class IBE_SW05_LUC(IBEnc):
144
+ def __init__(self, groupObj):
145
+ IBEnc.__init__(self)
146
+ global group, H, util
147
+ group = groupObj
148
+ H = lambda x: group.hash(('0', x), ZR)
149
+ util = SecretShare(group, False)
150
+
151
+ def setup(self, n, d):
152
+ '''
153
+ :Parameters:
154
+ - ``n``: the maximum number of attributes in the system.
155
+ OR the maximum length of an identity
156
+ - ``d``: the set overlap required to decrypt
157
+ '''
158
+ g = group.random(G1)
159
+ y = group.random(ZR)
160
+ g1 = g ** y
161
+ g2 = group.random(G1)
162
+
163
+ t = [ group.random(G1) for x in range( n+1 )]
164
+
165
+ pk = { 'g':g, 'g1':g1, 'g2':g2, 't':t }
166
+ mk = { 'y':y } # master secret
167
+ return (pk, mk)
168
+
169
+ def eval_T(self, pk, n, x):
170
+ N = [group.init(ZR,(x + 1)) for x in range(n + 1)]
171
+ N_int = [(x + 1) for x in range(n + 1)]
172
+
173
+ coeffs = util.recoverCoefficients(N)
174
+ prod_result = 1
175
+ for i in N_int:
176
+ j = group.init(ZR, i)
177
+ prod_result *= (pk['t'][i-1] ** coeffs[j])
178
+
179
+ T = (pk['g2'] ** (x * n)) * prod_result
180
+ return T
181
+
182
+ def intersection_subset(self, w, wPrime, d):
183
+ S = []
184
+ for i in range(len(w)):
185
+ for j in range(len(wPrime)):
186
+ if(w[i] == wPrime[j]):
187
+ S.append(w[i])
188
+
189
+ if(len(S) < d):
190
+ assert False, "Cannot decrypt. w and w' do not have enough attributes in common."
191
+
192
+ S_sub = [S[k] for k in range(d)]
193
+ return S_sub
194
+
195
+ def extract(self, mk, ID, pk, dOver, n):
196
+ w_hash = [H(x) for x in ID] # assumes ID is a list
197
+
198
+ r = group.random(ZR)
199
+ #a d-1 degree polynomial q is generated such that q(0) = y
200
+ q = [group.random(ZR) for x in range(dOver)]
201
+ q[0] = mk['y']
202
+ shares = util.genShares(mk['y'], dOver, n, q, w_hash)
203
+ D = {}
204
+ d = {}
205
+ for i in w_hash:
206
+ j = w_hash.index(i)
207
+ D[i] = (pk['g2'] ** shares[j][1]) * (self.eval_T(pk, n, i) ** r)
208
+ d[i] = pk['g'] ** r
209
+
210
+ return (w_hash, { 'D':D, 'd':d })
211
+
212
+ def encrypt(self, pk, w_prime, M, n):
213
+ '''
214
+ Encryption with the public key, Wprime and the message M in G2
215
+ '''
216
+ w_prime_hash = [H(x) for x in w_prime]
217
+ s = group.random(ZR)
218
+
219
+ Eprime = M * (pair(pk['g1'], pk['g2']) ** s)
220
+ Eprimeprime = pk['g'] ** s
221
+
222
+ E = {}
223
+ for i in w_prime_hash:
224
+ E[i] = self.eval_T(pk, n, i) ** s
225
+
226
+ return { 'wPrime':w_prime_hash, 'Eprime':Eprime, 'Eprimeprime':Eprimeprime,'E':E}
227
+
228
+ def decrypt(self, pk, sk, CT, w, d):
229
+ '''dID must have an intersection overlap of at least d with Wprime to decrypt
230
+ '''
231
+ S = self.intersection_subset(w, CT['wPrime'], d)
232
+ #print("S :=", S)
233
+ coeffs = util.recoverCoefficients(S)
234
+ prod = 1
235
+ for i in S:
236
+ prod *= (pair(sk['d'][i], CT['E'][i]) / pair(sk['D'][i], CT['Eprimeprime'])) ** coeffs[i]
237
+
238
+ return CT['Eprime'] * prod
@@ -0,0 +1,144 @@
1
+ '''
2
+ **Waters Identity-Based Encryption (Waters05)**
3
+
4
+ *Authors:* Brent Waters
5
+
6
+ | **Title:** "Efficient Identity-Based Encryption Without Random Oracles"
7
+ | **Published in:** Eurocrypt 2005
8
+ | **Available from:** http://eprint.iacr.org/2005/369.pdf
9
+ | **Notes:** Section 4 - Secure and practical IBE without random oracles
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Gary Belvin
20
+ :Date: 06/2011
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
24
+ from charm.toolbox.IBEnc import *
25
+ from charm.toolbox.bitstring import Bytes
26
+ from charm.toolbox.hash_module import Waters
27
+ import hashlib, math
28
+
29
+ debug = False
30
+ class IBE_N04(IBEnc):
31
+ """
32
+ >>> from charm.toolbox.pairinggroup import PairingGroup,GT
33
+ >>> from charm.toolbox.hash_module import Waters
34
+ >>> group = PairingGroup('SS512')
35
+ >>> waters_hash = Waters(group)
36
+ >>> ibe = IBE_N04(group)
37
+ >>> (master_public_key, master_key) = ibe.setup()
38
+ >>> ID = "bob@mail.com"
39
+ >>> kID = waters_hash.hash(ID)
40
+ >>> secret_key = ibe.extract(master_key, kID)
41
+ >>> msg = group.random(GT)
42
+ >>> cipher_text = ibe.encrypt(master_public_key, kID, msg)
43
+ >>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
44
+ >>> decrypted_msg == msg
45
+ True
46
+ """
47
+
48
+ """Implementation of David Naccahe Identity Based Encryption"""
49
+ def __init__(self, groupObj):
50
+ IBEnc.__init__(self)
51
+ IBEnc.setProperty(self, secDef=IND_ID_CPA, assumption=DBDH, secModel=SM, id=ZR, messageSpace=[GT, 'KEM'])
52
+ global group
53
+ group = groupObj
54
+
55
+ def setup(self, l=32):
56
+ """l is the security parameter
57
+ with l = 32, and the hash function at 256 bits = n * l with n = 8"""
58
+ global waters
59
+ g = group.random(G1) # generator for group G of prime order p
60
+
61
+ sha2_byte_len = 32
62
+ hLen = sha2_byte_len * 8
63
+ n = int(math.floor(hLen / l))
64
+ waters = Waters(group, n, l, 'sha256')
65
+
66
+ alpha = group.random() #from Zp
67
+ g1 = g ** alpha # G1
68
+ g2 = group.random(G2) #G2
69
+ uprime = group.random(G2)
70
+ U = [group.random() for x in range(n)]
71
+
72
+ pk = {'g':g, 'g1':g1, 'g2': g2, 'uPrime':uprime, 'U': U,
73
+ 'n':n, 'l':l}
74
+
75
+ mk = pk.copy()
76
+ mk['g2^alpha'] = g2 ** alpha #master secret
77
+ if debug:
78
+ print(mk)
79
+
80
+ return (pk, mk)
81
+
82
+ def extract(self, mk, v):
83
+ '''v = (v1, .., vn) is an identity'''
84
+ r = group.random()
85
+
86
+ d1 = mk['uPrime']
87
+ for i in range(mk['n']):
88
+ d1 *= mk['U'][i] ** v[i]
89
+
90
+ d1 = mk['g2^alpha'] * (d1 ** r)
91
+ d2 = mk['g'] ** r
92
+
93
+ if debug:
94
+ print("D1 =>", d1)
95
+ print("D2 =>", d2)
96
+ return {'d1': d1, 'd2':d2}
97
+
98
+ def encrypt(self, pk, ID, M): # M:GT
99
+ t = group.random()
100
+ c1 = (pair(pk['g1'], pk['g2']) ** t) * M
101
+ c2 = pk['g'] ** t
102
+ c3 = pk['uPrime']
103
+ for i in range(pk['n']):
104
+ c3 *= pk['U'][i] ** ID[i]
105
+ c3 = c3 ** t
106
+
107
+ if debug:
108
+ print("Encrypting")
109
+ print("C1 =>", c1)
110
+ print("C2 =>", c2)
111
+ print("C3 =>", c3)
112
+ return {'c1':c1, 'c2': c2, 'c3':c3}
113
+
114
+ def decrypt(self, pk, sID, ct):
115
+ num = pair(sID['d2'], ct['c3'])
116
+ dem = pair(ct['c2'], sID['d1'])
117
+ if debug:
118
+ print("Decrypting")
119
+ print("arg1 =>", sID['d2'].type)
120
+ print("arg2 =>", ct['c3'].type)
121
+ print("Num: =>", num)
122
+ print("Dem: =>", dem)
123
+
124
+ return ct['c1'] * num / dem
125
+
126
+ def main():
127
+ group = PairingGroup('SS512')
128
+ waters_hash = Waters(group)
129
+ ibe = IBE_N04(group)
130
+ (master_public_key, master_key) = ibe.setup()
131
+
132
+ ID = "bob@mail.com"
133
+ kID = waters_hash.hash(ID)
134
+ secret_key = ibe.extract(master_key, kID)
135
+ msg = group.random(GT)
136
+ cipher_text = ibe.encrypt(master_public_key, kID, msg)
137
+ decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
138
+ assert msg == decrypted_msg, "invalid decryption"
139
+ if debug: print("Successful Decryption!")
140
+
141
+ if __name__ == "__main__":
142
+ debug = True
143
+ main()
144
+
@@ -0,0 +1,164 @@
1
+ r'''
2
+ **Waters Identity-Based Encryption - Optimized (Waters05-Z)**
3
+
4
+ *Authors:* Brent Waters
5
+
6
+ | **Title:** "Efficient Identity-Based Encryption Without Random Oracles"
7
+ | **Published in:** Eurocrypt 2005
8
+ | **Available from:** http://eprint.iacr.org/2005/369.pdf
9
+ | **Notes:** Section 4 - Optimized implementation for asymmetric groups
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Gary Belvin
20
+ :Date: 06/2011
21
+
22
+ :Improved by: Fan Zhang (zfwise@gwu.edu), supported by GWU computer science department
23
+ :Date: 3/2013
24
+ :Notes:
25
+ 1. e(g_1, g_2) is pre-calculated as part of public parameters.
26
+ 2. Fixed exponentiation by using omega vector in Z_q with u = g^omega.
27
+ 3. Stored omega in msk to speed up extract() by computing exponent first.
28
+ 4. Works with asymmetric groups (MNT curves).
29
+ 5. All sk_id elements in G2 and ct_id elements in G1.
30
+ '''
31
+ from __future__ import print_function
32
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
33
+ from charm.toolbox.IBEnc import IBEnc
34
+ from charm.toolbox.hash_module import Waters
35
+ import math, string, random
36
+
37
+ def randomStringGen(size=30, chars=string.ascii_uppercase + string.digits):
38
+ return ''.join(random.choice(chars) for x in range(size))
39
+
40
+ debug = False
41
+ class IBE_N04_z(IBEnc):
42
+ """
43
+ >>> from charm.toolbox.pairinggroup import PairingGroup,GT
44
+ >>> from charm.toolbox.hash_module import Waters
45
+ >>> group = PairingGroup('SS512')
46
+ >>> waters_hash = Waters(group)
47
+ >>> ibe = IBE_N04_z(group)
48
+ >>> (master_public_key, master_key) = ibe.setup()
49
+ >>> ID = "bob@mail.com"
50
+ >>> kID = waters_hash.hash(ID)
51
+ >>> secret_key = ibe.extract(master_key, ID)
52
+ >>> msg = group.random(GT)
53
+ >>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
54
+ >>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
55
+ >>> decrypted_msg == msg
56
+ True
57
+ """
58
+
59
+ """Implementation of David Naccahe Identity Based Encryption"""
60
+ def __init__(self, groupObj):
61
+ IBEnc.__init__(self)
62
+ #IBEnc.setProperty(self, secdef='IND_ID_CPA', assumption='DBDH', secmodel='Standard')
63
+ #, other={'id':ZR}
64
+ #message_space=[GT, 'KEM']
65
+ global group
66
+ group = groupObj
67
+ global waters_hash
68
+ waters_hash = Waters(group)
69
+
70
+ def setup(self, l=32):
71
+ '''l is the security parameter
72
+ with l = 32, and the hash function at 160 bits = n * l with n = 5'''
73
+ global waters
74
+ g = group.random(G1) # generator for group G of prime order p
75
+
76
+ sha2_byte_len = 32
77
+ hLen = sha2_byte_len * 8
78
+ n = int(math.floor(hLen / l))
79
+ waters = Waters(group, n, l, 'sha256')
80
+
81
+ alpha = group.random(ZR) #from Zp
82
+ g1 = g ** alpha # G1
83
+ g2 = group.random(G2) #G2
84
+ u = group.random(ZR)
85
+ uprime = g ** u
86
+ U_z = [group.random(ZR) for x in range(n)]
87
+ U = [g ** x for x in U_z]
88
+
89
+ pk = {'g':g, 'g1':g1, 'g2': g2, 'uPrime':uprime, 'U': U,
90
+ 'n':n, 'l':l, 'eg1g2':pair(g1, g2)}
91
+
92
+ mk = {'g1':g1, 'g2': g2, 'n':n, 'g2^alpha': g2 ** alpha, 'U_z':U_z, 'u':u} #master secret
93
+ if debug:
94
+ print(mk)
95
+
96
+ return (pk, mk)
97
+
98
+ def extract(self, mk, ID):
99
+ '''v = (v1, .., vn) is an identity'''
100
+
101
+ v = waters_hash.hash(ID)
102
+ r = group.random(ZR)
103
+
104
+ u = mk['u']
105
+
106
+ for i in range(mk['n']):
107
+ u += mk['U_z'][i] * v[i]
108
+ d1 = mk['g2^alpha'] * (mk['g2'] ** (u * r) )
109
+ d2 = mk['g2'] ** r
110
+
111
+ if debug:
112
+ print("D1 =>", d1)
113
+ print("D2 =>", d2)
114
+ return {'d1': d1, 'd2':d2}
115
+
116
+ def encrypt(self, pk, ID, M): # M:GT
117
+
118
+ v = waters_hash.hash(ID)
119
+ t = group.random(ZR)
120
+ c1 = (pk['eg1g2'] ** t) * M
121
+ c2 = pk['g'] ** t
122
+ c3 = pk['uPrime']
123
+
124
+ for i in range(pk['n']):
125
+ c3 *= pk['U'][i] ** v[i]
126
+ c3 = c3 ** t
127
+
128
+ if debug:
129
+ print("Encrypting")
130
+ print("C1 =>", c1)
131
+ print("C2 =>", c2)
132
+ print("C3 =>", c3)
133
+ return {'c1':c1, 'c2': c2, 'c3':c3}
134
+
135
+ def decrypt(self, pk, sID, ct):
136
+ num = pair(ct['c3'], sID['d2'])
137
+ dem = pair(ct['c2'], sID['d1'])
138
+ if debug:
139
+ print("Decrypting")
140
+ print("arg1 =>", sID['d2'].type)
141
+ print("arg2 =>", ct['c3'].type)
142
+ print("Num: =>", num)
143
+ print("Dem: =>", dem)
144
+
145
+ return ct['c1'] * num / dem
146
+
147
+ def main():
148
+ group = PairingGroup('MNT224')
149
+ waters_hash = Waters(group)
150
+ ibe = IBE_N04_z(group)
151
+ (master_public_key, master_key) = ibe.setup()
152
+
153
+ ID = "bob@mail.com"
154
+ secret_key = ibe.extract(master_key, ID)
155
+ msg = group.random(GT)
156
+ cipher_text = ibe.encrypt(master_public_key, ID, msg)
157
+ decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
158
+ assert msg == decrypted_msg, "invalid decryption"
159
+ if debug: print("Successful Decryption!")
160
+
161
+ if __name__ == "__main__":
162
+ debug = True
163
+ main()
164
+
@@ -0,0 +1,107 @@
1
+ '''
2
+ **Waters Dual System Encryption (Waters09)**
3
+
4
+ *Authors:* Brent Waters
5
+
6
+ | **Title:** "Dual System Encryption: Realizing Fully Secure IBE and HIBE under Simple Assumptions"
7
+ | **Published in:** CRYPTO 2009
8
+ | **Available from:** http://eprint.iacr.org/2009/385.pdf
9
+ | **Notes:** Fully secure IBE construction using dual system encryption
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (identity-based)
14
+ * **Setting:** bilinear groups (symmetric pairings)
15
+ * **Assumption:** DLIN (Decisional Linear) and related assumptions
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 03/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import ZR,G1,pair
23
+ from charm.toolbox.IBEnc import *
24
+
25
+ debug = False
26
+ class DSE09(IBEnc):
27
+ """
28
+ >>> from charm.toolbox.pairinggroup import PairingGroup, GT
29
+ >>> group = PairingGroup('SS512')
30
+ >>> ibe = DSE09(group)
31
+ >>> ID = "user2@email.com"
32
+ >>> (master_public_key, master_secret_key) = ibe.setup()
33
+ >>> secret_key = ibe.keygen(master_public_key, master_secret_key, ID)
34
+ >>> msg = group.random(GT)
35
+ >>> cipher_text = ibe.encrypt(master_public_key, msg, ID)
36
+ >>> decrypted_msg = ibe.decrypt(cipher_text, secret_key)
37
+ >>> decrypted_msg == msg
38
+ True
39
+ """
40
+ def __init__(self, groupObj):
41
+ IBEnc.__init__(self)
42
+ global group, util
43
+ group = groupObj
44
+
45
+ def setup(self):
46
+ g, w, u, h, v, v1, v2 = group.random(G1, 7)
47
+ a1, a2, b, alpha = group.random(ZR, 4)
48
+
49
+ tau1 = v * (v1 ** a1)
50
+ tau2 = v * (v2 ** a2)
51
+ mpk = { 'g':g, 'g^b':g ** b, 'g^a1':g ** a1, 'g^a2':g ** a2,
52
+ 'g^ba1':g ** (b * a1), 'g^ba2':g ** (b * a2), 'tau1':tau1, 'tau2':tau2,
53
+ 'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'w':w, 'u':u,'h':h,
54
+ 'egg_alpha': pair(g, g) ** (alpha * a1 * b) }
55
+ msk = { 'g^alph':g ** alpha, 'g^alph_a1':g ** (alpha * a1),
56
+ 'v':v, 'v1':v1, 'v2':v2, 'alpha':alpha }
57
+ return (mpk, msk)
58
+
59
+ def keygen(self, mpk, msk, ID):
60
+ r1, r2, z1, z2, tag_k = group.random(ZR, 5)
61
+ r = r1 + r2
62
+ _ID = group.hash(ID)
63
+ D = {}
64
+ D[1] = msk['g^alph_a1'] * (msk['v'] ** r)
65
+ D[2] = (mpk['g'] ** -msk['alpha']) * (msk['v1'] ** r) * (mpk['g'] ** z1)
66
+ D[3] = mpk['g^b'] ** -z1
67
+ D[4] = (msk['v2'] ** r) * (mpk['g'] ** z2)
68
+ D[5] = mpk['g^b'] ** -z2
69
+ D[6] = mpk['g^b'] ** r2
70
+ D[7] = mpk['g'] ** r1
71
+ K = ((mpk['u'] ** _ID) * (mpk['w'] ** tag_k) * mpk['h']) ** r1
72
+
73
+ sk = { 'ID':_ID, 'D':D, 'K':K, 'tag_k':tag_k }
74
+ return sk
75
+
76
+ def encrypt(self, mpk, M, ID):
77
+ s1, s2, t, tag_c = group.random(ZR, 4)
78
+ s = s1 + s2
79
+ _ID = group.hash(ID)
80
+
81
+ C = {}
82
+ C[0] = M * (mpk['egg_alpha'] ** s2)
83
+ C[1] = mpk['g^b'] ** s
84
+ C[2] = mpk['g^ba1'] ** s1
85
+ C[3] = mpk['g^a1'] ** s1
86
+ C[4] = mpk['g^ba2'] ** s2
87
+ C[5] = mpk['g^a2'] ** s2
88
+ C[6] = (mpk['tau1'] ** s1) * (mpk['tau2'] ** s2)
89
+ C[7] = (mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w'] ** -t)
90
+
91
+ C['E1'] = ((mpk['u'] ** _ID) * (mpk['w'] ** tag_c) * mpk['h']) ** t
92
+ C['E2'] = mpk['g'] ** t
93
+ C['tag_c'] = tag_c
94
+ return C
95
+
96
+ def decrypt(self, ct, sk):
97
+ tag = (1 / (ct['tag_c'] - sk['tag_k']))
98
+ E1, E2 = ct['E1'], ct['E2']
99
+ C, D, K = ct, sk['D'], sk['K']
100
+ _ID = sk['ID']
101
+ # hash IDs
102
+ 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])
103
+ A2 = pair(C[6], D[6]) * pair(C[7], D[7])
104
+ A3 = A1 / A2
105
+ A4 = (pair(E1, D[7]) / pair(E2, K)) ** tag
106
+ return C[0] / (A3 / A4)
107
+