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,105 @@
1
+ '''
2
+ **Boneh-Boyen Hierarchical Identity-Based Encryption (BB04-HIBE)**
3
+
4
+ *Authors:* Dan Boneh, Xavier Boyen
5
+
6
+ | **Title:** "Efficient Selective Identity-Based Encryption Without Random Oracles"
7
+ | **Published in:** Eurocrypt 2004
8
+ | **Available from:** http://crypto.stanford.edu/~dabo/pubs/papers/bbibe.pdf
9
+ | **Notes:** Section 4.1 - Core HIBE implementation
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (hierarchical identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** Decisional Bilinear Diffie-Hellman (DBDH)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 3/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+ from charm.toolbox.iterate import dotprod2
24
+ from charm.toolbox.hash_module import Waters
25
+
26
+ debug = False
27
+ class HIBE_BB04:
28
+ """
29
+ >>> from charm.toolbox.pairinggroup import PairingGroup, GT
30
+ >>> group = PairingGroup('SS512')
31
+ >>> hibe = HIBE_BB04(group)
32
+ >>> (master_public_key, master_key) = hibe.setup()
33
+ >>> ID = "bob@mail.com"
34
+ >>> (public_key, secret_key) = hibe.extract(3, master_public_key, master_key, ID)
35
+ >>> msg = group.random(GT)
36
+ >>> cipher_text = hibe.encrypt(master_public_key, public_key, msg)
37
+ >>> decrypted_msg = hibe.decrypt(public_key, secret_key, cipher_text)
38
+ >>> decrypted_msg == msg
39
+ True
40
+
41
+ """
42
+ def __init__(self, groupObj):
43
+ global group, hash_func
44
+ group = groupObj
45
+ hash_func = lambda k,w,x,y,z: ((w ** x[k]) * y[k]) ** z[k]
46
+
47
+ def setup(self, l=5, z=32):
48
+ """ j represents maximum depth of HIBE system,
49
+ z represents the bit size of each integer_j of identity.
50
+ """
51
+ assert l > 0, "invalid number of levels (need more than 0)"
52
+ alpha, beta = group.random(ZR, 2)
53
+ g = group.random(G1)
54
+ gb = group.random(G2)
55
+ g1 = g ** alpha
56
+ g1b = gb ** alpha
57
+ delta = [group.random(ZR) for i in range(l)]
58
+ h = [g ** delta[i] for i in range(l)]
59
+ hb = [gb ** delta[i] for i in range(l)]
60
+ g0b = gb ** (alpha * beta)
61
+ v = pair(g, g0b)
62
+
63
+ mpk = { 'g': g, 'g1':g1, 'h':h, 'gb':gb, 'g1b':g1b, 'hb':hb, 'v':v, 'l':l, 'z':z }
64
+ mk = { 'g0b':g0b }
65
+ return (mpk, mk)
66
+
67
+ def extract(self, level, mpk, mk, ID):
68
+ j = level
69
+ assert j >= 1 and j <= mpk['l'], "invalid level: 1 - %d" % mpk['l']
70
+ I = Waters(group, j, mpk['z']).hash(ID)
71
+ r = [group.random(ZR) for i in range(j)]
72
+ g_b = [mpk['gb'] ** r[i] for i in range(j)]
73
+ hashID = mk['g0b'] * dotprod2(range(j), hash_func, mpk['g1b'], I, mpk['hb'], r)
74
+ return { 'ID':ID, 'j':j }, { 'd0':hashID, 'dn':g_b }
75
+
76
+ # TODO: come back to this
77
+ def derive(self, mpk, pk):
78
+ j = pk['j'] # pk[j-1]
79
+ assert pk['j'] + 1 <= mpk['l'], "invalid level: 1 - %d" % mpk['l']
80
+ I = Waters(group, j, mpk['z']).hash(pk['ID'])
81
+
82
+ r = [group.random(ZR) for i in range(j)]
83
+ g_b = [pk['dn'][i] * (mpk['gb'] ** r[i]) for i in range(j)] # j-1
84
+ g_b.append( pk['gb'] ** r[j] ) # represents j
85
+ hashID = dID['d0'] * dotprod2(range(j+1), hash_func, mpk['g1b'], I, mpk['hb'], r)
86
+ return { 'ID':ID, 'j':j }, { 'd0':hashID, 'dn':g_b}
87
+
88
+ def encrypt(self, mpk, pk, M):
89
+ I = Waters(group, pk['j'], mpk['z']).hash(pk['ID'])
90
+ s = group.random(ZR)
91
+ A = M * (mpk['v'] ** s)
92
+ B = mpk['g'] ** s
93
+ C = {}
94
+ for i in range(pk['j']):
95
+ C[i] = ((mpk['g1'] ** I[i]) * mpk['h'][i]) ** s
96
+
97
+ return {'A':A, 'B':B, 'C':C, 'j':pk['j'] }
98
+
99
+ def decrypt(self, pk, sk, ct):
100
+ prod_result = 1
101
+ for i in range(ct['j']):
102
+ prod_result *= pair(ct['C'][i], sk['dn'][i])
103
+ M = ct['A'] * (prod_result / pair(ct['B'], sk['d0']))
104
+ return M
105
+
@@ -0,0 +1,193 @@
1
+ '''
2
+ **Lewko-Waters Unbounded Hierarchical Identity-Based Encryption (LW11-HIBE)**
3
+
4
+ *Authors:* Allison Lewko, Brent Waters
5
+
6
+ | **Title:** "Unbounded HIBE and Attribute-Based Encryption"
7
+ | **Published in:** Advances in Cryptology - EUROCRYPT 2011, Springer Berlin/Heidelberg
8
+ | **Available from:** http://eprint.iacr.org/2011/049
9
+ | **Notes:** Modified for prime order groups using techniques from "Tools for Simulating
10
+ | Features of Composite Order Bilinear Groups in the Prime Order Setting"
11
+ | (EUROCRYPT 2012, http://eprint.iacr.org/2011/490, Section B.3)
12
+
13
+ .. rubric:: Scheme Properties
14
+
15
+ * **Type:** encryption (hierarchical identity-based)
16
+ * **Setting:** bilinear groups (symmetric)
17
+ * **Assumption:** Decisional Linear (DLIN)
18
+
19
+ .. rubric:: Implementation
20
+
21
+ :Authors: N. Fotiou
22
+ :Date: 6/2014
23
+ '''
24
+ from charm.toolbox.pairinggroup import ZR,G1,G2,GT,pair
25
+ from charm.core.math.integer import integer,bitsize
26
+ from charm.toolbox.matrixops import *
27
+
28
+ debug = False
29
+ class HIBE_LW11:
30
+ """
31
+ >>> from charm.toolbox.pairinggroup import GT,PairingGroup
32
+ >>> group = PairingGroup('SS512', secparam=512)
33
+ >>> msg = group.random(GT)
34
+ >>> #print("Message to encrypt:")
35
+ >>> #print (msg)
36
+ >>> I = [".gr.edu.mmlab"]
37
+ >>> I2 = [".gr.edu.mmlab","mail"]
38
+ >>> I3 = [".gr.edu.mmlab","mail", "fotiou"]
39
+ >>> hibe = HIBE_LW11(group)
40
+ >>> (MSK,PP) = hibe.setup()
41
+ >>> CT = hibe.encrypt(msg,I3,PP)
42
+ >>> SK = hibe.keyGen(I,MSK,PP)
43
+ >>> SK2 = hibe.delegate(PP,SK, I2)
44
+ >>> SK3 = hibe.delegate(PP,SK2, I3)
45
+ >>> M = hibe.decrypt(CT, SK3)
46
+ >>> M == msg
47
+ True
48
+ >>> M = hibe.decrypt(CT, SK2)
49
+ >>> M == msg
50
+ True
51
+ >>> M = hibe.decrypt(CT, SK)
52
+ >>> M == msg
53
+ True
54
+ """
55
+ def __init__(self, groupObj):
56
+ global group
57
+ group = groupObj
58
+ group._verbose = True
59
+ return
60
+
61
+ def setup(self):
62
+ d = [0 for x in range(10)]
63
+ D = [0 for x in range(10)]
64
+ gauss = [0 for x in range(10)]
65
+ g = [0 for x in range(6)]
66
+ G = [0 for x in range(8)]
67
+ one = group.random(ZR)
68
+ g_r = group.random(G1)
69
+ for x in range(10):
70
+ d[x] = [group.random(ZR) for y in range(10)]
71
+ for x in range(10):
72
+ for y in range(10):
73
+ gauss[y] = d[y]+[group.init(ZR, 0)]
74
+ gauss[x] = d[x] +[one]
75
+ D[x] = GaussEliminationinGroups(gauss)
76
+ a1, a2, theta, sigma, gamma, ksi = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR), group.random(ZR)
77
+ for x in range(6):
78
+ g[x] = [g_r**d[x][y] for y in range(10)]
79
+ G[0] = [g_r**D[0][y] for y in range(10)]
80
+ G[1] = [g_r**D[1][y] for y in range(10)]
81
+ G[2] = [g_r**(D[0][y]*gamma) for y in range(10)]
82
+ G[3] = [g_r**(D[1][y]*ksi) for y in range(10)]
83
+ G[4] = [g_r**(D[2][y]*theta) for y in range(10)]
84
+ G[5] = [g_r**(D[3][y]*theta) for y in range(10)]
85
+ G[6] = [g_r**(D[4][y]*sigma) for y in range(10)]
86
+ G[7] = [g_r**(D[5][y]*sigma) for y in range(10)]
87
+ PP = { 'e1':pair(g_r,g_r)**(a1*one), 'e2':pair(g_r,g_r)**(a2*one), 'g':g}
88
+ MSK = {'a1':a1, 'a2':a2, 'g':G}
89
+ if(debug):
90
+ print("Public parameters:")
91
+ group.debug(PP)
92
+ print("Master Secret Key:")
93
+ group.debug(MSK)
94
+ return (MSK,PP)
95
+
96
+ def keyGen(self, I, MSK, PP):
97
+ r1,r2,y,w = [],[],[],[]
98
+ for i in range(len(I)):
99
+ r1.append(group.random(ZR))
100
+ r2.append(group.random(ZR))
101
+ for i in range(len(I)-1):
102
+ y.append(group.random(ZR))
103
+ w.append(group.random(ZR))
104
+ y.append(MSK['a1'] - sum(y))
105
+ w.append(MSK['a2'] - sum(w))
106
+ K = [0 for x in range(len(I))]
107
+ g = [0 for x in range(6)]
108
+ for i in range(len(I)):
109
+ g[0] = [MSK['g'][0][x]**y[i] for x in range(10)]
110
+ g[1] = [MSK['g'][1][x]**w[i] for x in range(10)]
111
+ g[2] = [MSK['g'][4][x]**(r1[i]* group.hash(I[i], ZR)) for x in range(10)]
112
+ g[3] = [MSK['g'][5][x]**(-r1[i]) for x in range(10)]
113
+ g[4] = [MSK['g'][6][x]**(r2[i]* group.hash(I[i], ZR)) for x in range(10)]
114
+ g[5] = [MSK['g'][7][x]**(-r2[i]) for x in range(10)]
115
+ K[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
116
+ g = []
117
+ g.append(MSK['g'][2])
118
+ g.append(MSK['g'][3])
119
+ g.append(MSK['g'][4])
120
+ g.append(MSK['g'][5])
121
+ g.append(MSK['g'][6])
122
+ g.append(MSK['g'][7])
123
+ SK = {'g':g,'K':K}
124
+ if(debug):
125
+ print("Secret key:")
126
+ group.debug(SK)
127
+ return SK
128
+
129
+ def delegate (self, PP, SK, I):
130
+ y,w,w1, w2 = [],[],[],[]
131
+ for i in range(len(I) -1):
132
+ w1.append(group.random(ZR))
133
+ w2.append(group.random(ZR))
134
+ y.append(group.random(ZR))
135
+ w.append(group.random(ZR))
136
+ w1.append(group.random(ZR))
137
+ w2.append(group.random(ZR))
138
+ y.append (0 - sum(y))
139
+ w.append (0 - sum(w))
140
+ K = [0 for x in range(len(I))]
141
+ g = [0 for x in range(6)]
142
+ for i in range(len(I)-1):
143
+ g[0] = [SK['g'][0][x]**y[i] for x in range(10)]
144
+ g[1] = [SK['g'][1][x]**w[i] for x in range(10)]
145
+ g[2] = [SK['g'][2][x]**(w1[i]* group.hash(I[i], ZR)) for x in range(10)]
146
+ g[3] = [SK['g'][3][x]**(-w1[i]) for x in range(10)]
147
+ g[4] = [SK['g'][4][x]**(w2[i]* group.hash(I[i], ZR)) for x in range(10)]
148
+ g[5] = [SK['g'][5][x]**(-w2[i]) for x in range(10)]
149
+ K[i] = [SK['K'][i][x]*g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
150
+ i = len(I)-1
151
+ g[0] = [SK['g'][0][x]**y[i] for x in range(10)]
152
+ g[1] = [SK['g'][1][x]**w[i] for x in range(10)]
153
+ g[2] = [SK['g'][2][x]**(w1[i]* group.hash(I[i], ZR)) for x in range(10)]
154
+ g[3] = [SK['g'][3][x]**(-w1[i]) for x in range(10)]
155
+ g[4] = [SK['g'][4][x]**(w2[i]* group.hash(I[i], ZR)) for x in range(10)]
156
+ g[5] = [SK['g'][5][x]**(-w2[i]) for x in range(10)]
157
+ K[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
158
+ SK = {'g':SK['g'],'K':K}
159
+ if(debug):
160
+ print("Secret key:")
161
+ group.debug(SK)
162
+ return SK
163
+
164
+ def encrypt(self, M, I, PP):
165
+ s1, s2 = group.random(ZR), group.random(ZR)
166
+ t1, t2 = [],[]
167
+ for i in range(len(I)):
168
+ t1.append(group.random(ZR))
169
+ t2.append(group.random(ZR))
170
+ C0 = M*(PP['e1']**s1)*(PP['e2']**s2)
171
+ C = [0 for x in range(len(I))]
172
+ g = [0 for x in range(6)]
173
+ g[0] = [PP['g'][0][x]**s1 for x in range(10)]
174
+ g[1] = [PP['g'][1][x]**s2 for x in range(10)]
175
+ for i in range(len(I)):
176
+ g[2] = [PP['g'][2][x]**t1[i] for x in range(10)]
177
+ g[3] = [PP['g'][3][x]**(t1[i]*group.hash(I[i], ZR)) for x in range(10)]
178
+ g[4] = [PP['g'][4][x]**t2[i] for x in range(10)]
179
+ g[5] = [PP['g'][5][x]**(t2[i]*group.hash(I[i], ZR)) for x in range(10)]
180
+ C[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
181
+ CT = {'C0':C0, 'C':C}
182
+ if(debug):
183
+ print("CipherText:")
184
+ group.debug(CT)
185
+ return CT
186
+
187
+ def decrypt(self, CT, SK):
188
+ B = 1
189
+ for i in range(len(SK['K'])):
190
+ for x in range(10):
191
+ B*= pair(CT['C'][i][x], SK['K'][i][x])
192
+ M = CT['C0']/ B
193
+ return M
File without changes
@@ -0,0 +1,119 @@
1
+ '''
2
+ **Al-Riyami-Paterson Certificateless Public Key Cryptography (RP03)**
3
+
4
+ *Authors:* Sattam S. Al-Riyami, Kenneth G. Paterson
5
+
6
+ | **Title:** "Certificateless Public Key Cryptography"
7
+ | **Published in:** Asiacrypt 2003
8
+ | **Available from:** https://eprint.iacr.org/2003/126.pdf
9
+ | **Notes:** Section 4.2 - CL-PKE scheme combining identity-based and public key encryption
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** encryption (certificateless, identity-based)
14
+ * **Setting:** bilinear groups (symmetric)
15
+ * **Assumption:** BDH (Bilinear Diffie-Hellman)
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Nikos Fotiou (https://www.fotiou.gr)
20
+ :Date: 7/2022
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import PairingGroup, ZR,G1,G2,pair
24
+ from charm.core.math.integer import randomBits,integer,bitsize
25
+ from charm.toolbox.hash_module import Hash,int2Bytes,integer
26
+
27
+ debug = False
28
+ class CLPKC_RP03():
29
+
30
+ def __init__(self, groupObj):
31
+
32
+ global group, h
33
+ group = groupObj
34
+ h = Hash(group)
35
+
36
+ def setup(self, secparam=None):
37
+ P = group.random(G1)
38
+ s = group.random(ZR)
39
+ P0 = s*P
40
+ params={'P':P, 'P0':P0}
41
+ master_key = s
42
+ return (params, master_key)
43
+
44
+ def partial_private_key_extract(self, master_key, ID):
45
+ QA = group.hash(ID, G1)
46
+ DA = master_key * QA
47
+ return DA
48
+
49
+ '''
50
+ DA = partial_private_key
51
+ xA = secret_value
52
+ '''
53
+ def set_private_key(self, DA, xA):
54
+ SA = xA*DA
55
+ return SA
56
+ '''
57
+ xA = secret_value
58
+ '''
59
+ def set_public_key(self, params, xA):
60
+ XA = xA*params['P']
61
+ YA = xA*params['P0']
62
+ PA = {'XA':XA, 'YA': YA}
63
+ return PA
64
+
65
+ def encrypt(self, params, M, ID, P): # check length to make sure it is within n bits
66
+ QA = group.hash(ID, G1)
67
+ g_id = pair(QA, P['YA'])
68
+ #choose σ = {0,1}^n where n is # bits
69
+ sig = integer(randomBits(group.secparam))
70
+ r = h.hashToZr(sig, M)
71
+ enc_M = self.encodeToZn(M)
72
+ if bitsize(enc_M) / 8 <= group.messageSize():
73
+ C = { 'U':r * params['P'], 'V':sig ^ h.hashToZn(g_id ** r) , 'W':enc_M ^ h.hashToZn(sig) }
74
+ else:
75
+ print("Message cannot be encoded.")
76
+ return None
77
+ return C
78
+
79
+ def decrypt(self, params, SA, C):
80
+ U, V, W = C['U'], C['V'], C['W']
81
+ sig = V ^ h.hashToZn(pair(SA, U))
82
+ dec_M = W ^ h.hashToZn(sig)
83
+ M = self.decodeFromZn(dec_M)
84
+
85
+ r = h.hashToZr(sig, M)
86
+ if U == r * params['P']:
87
+ if debug: print("Successful Decryption!!!")
88
+ return M
89
+ if debug: print("Decryption Failed!!!")
90
+ return None
91
+
92
+
93
+ def encodeToZn(self, message):
94
+ assert type(message) == bytes, "Input must be of type bytes"
95
+ return integer(message)
96
+
97
+ def decodeFromZn(self, element):
98
+ if type(element) == integer:
99
+ msg = int2Bytes(element)
100
+ return msg
101
+ return None
102
+
103
+
104
+ def main():
105
+ group = PairingGroup('SS512', secparam=1024)
106
+ clpkc = CLPKC_RP03(group)
107
+ (params, master_key) = clpkc.setup()
108
+ ID = 'user@email.com'
109
+ partial_private_key = clpkc.partial_private_key_extract(master_key, ID)
110
+ secret_value = group.random(ZR)
111
+ private_key = clpkc.set_private_key(partial_private_key, secret_value)
112
+ public_key = clpkc.set_public_key(params, secret_value)
113
+ msg = b"hello world!!!!!"
114
+ cipher_text = clpkc.encrypt(params, msg, ID, public_key)
115
+ plain_text = clpkc.decrypt(params, private_key, cipher_text)
116
+ print (plain_text)
117
+
118
+ if __name__=='__main__':
119
+ main()
@@ -0,0 +1,168 @@
1
+ '''
2
+ **Chen-Wee Dual System Groups IBE (CW13)**
3
+
4
+ *Authors:* Jie Chen, Hoeteck Wee
5
+
6
+ | **Title:** "Dual System Groups and its Applications - Compact HIBE and More"
7
+ | **Published in:** CRYPTO 2013
8
+ | **Available from:** http://eprint.iacr.org/2013/394.pdf
9
+ | **Notes:** Compact IBE using dual system groups methodology
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: 5/2013
21
+ :Notes: Implementation optimized to reduce exponentiation and multiplication operations.
22
+ '''
23
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
24
+ from charm.core.crypto.cryptobase import *
25
+ from charm.toolbox.IBEnc import IBEnc
26
+ from charm.toolbox.matrixops import *
27
+
28
+ debug = False
29
+ class IBE_CW13(IBEnc):
30
+ """
31
+ >>> group = PairingGroup('MNT224', secparam=1024)
32
+ >>> ibe = IBE_CW13(group)
33
+ >>> (master_public_key, master_secret_key) = ibe.setup()
34
+ >>> ID = 'user@email.com'
35
+ >>> private_key = ibe.extract(master_public_key, master_secret_key, ID)
36
+ >>> msg = group.random(GT)
37
+ >>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
38
+ >>> decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
39
+ >>> print (decryptedMSG==msg)
40
+ True
41
+ """
42
+ def __init__(self, groupObj):
43
+ IBEnc.__init__(self)
44
+ #IBEnc.setProperty(self, message_space=[GT, 'KEM'], secdef='IND_sID_CPA', assumption='DBDH', secmodel='ROM', other={'id':ZR})
45
+ global group
46
+ group = groupObj
47
+
48
+ def setup(self):
49
+ g1 = group.random(G1) #generator in G1
50
+ g2 = group.random(G2) #generator in G2
51
+
52
+ #generate B and B*
53
+ B = [[group.random(ZR), group.random(ZR)],[group.random(ZR), group.random(ZR)]]
54
+
55
+ Bt = MatrixTransGroups(B)
56
+ Bstar= [GaussEliminationinGroups([[Bt[0][0], Bt[0][1], group.init(ZR, 1)],
57
+ [Bt[1][0], Bt[1][1], group.init(ZR, 0)]]),
58
+ GaussEliminationinGroups([[Bt[0][0], Bt[0][1], group.init(ZR, 0)],
59
+ [Bt[1][0], Bt[1][1], group.init(ZR, 1)]])]
60
+ Bstar = MatrixTransGroups(Bstar)
61
+
62
+
63
+ ## checks Bt * Bstar = identity matrix
64
+ # for i in self.MatrixMulGroups(Bt, Bstar):
65
+ # print("[%s,%s]"%(i[0],i[1]))
66
+
67
+ #generate R
68
+ R = [[group.random(ZR), group.init(ZR, 0)],
69
+ [group.init(ZR, 0), group.init(ZR, 1)]]
70
+
71
+ #generate A1 and A2
72
+ A1 =[[group.random(ZR), group.random(ZR)],
73
+ [group.random(ZR), group.random(ZR)]]
74
+ A2 =[[group.random(ZR), group.random(ZR)],
75
+ [group.random(ZR), group.random(ZR)]]
76
+ k = [group.random(ZR),group.random(ZR)] #k is a 2 dimentional vector
77
+
78
+ #The following code differs from the paper.
79
+ BA1 = MatrixMulGroups(B,A1)
80
+ BA2 = MatrixMulGroups(B,A2)
81
+ BsR = MatrixMulGroups(Bstar,R)
82
+ BsA1R = MatrixMulGroups(MatrixMulGroups(Bstar, MatrixTransGroups(A1)),R)
83
+ BsA2R = MatrixMulGroups(MatrixMulGroups(Bstar, MatrixTransGroups(A2)),R)
84
+ b0 = [B[0][0],B[1][0]]
85
+ b1 = [BA1[0][0],BA1[1][0]]
86
+ b2 = [BA2[0][0],BA2[1][0]]
87
+ b0s = [BsR[0][0],BsR[1][0]]
88
+ b1s = [BsA1R[0][0],BsA1R[1][0]]
89
+ b2s = [BsA2R[0][0],BsA2R[1][0]]
90
+
91
+ #generate the mpk
92
+ g1b0 = [g1**b0[0], g1**b0[1]]
93
+ g1b1 = [g1**b1[0], g1**b1[1]]
94
+ g1b2 = [g1**b2[0], g1**b2[1]]
95
+ egg = (pair(g1, g2)) ** (k[0]*b0[0] + k[1]*b0[1])
96
+
97
+ mpk = {'g1':g1, 'g2':g2, 'g1b0':g1b0, 'g1b1':g1b1, 'g1b2': g1b2, 'egg':egg}
98
+
99
+ #generate private parameters
100
+ msk = { 'k':k, 'b0s':b0s, 'b1s':b1s,'b2s':b2s}
101
+
102
+ if(debug):
103
+ print("Public parameters...")
104
+ group.debug(mpk)
105
+ print("Secret parameters...")
106
+ group.debug(msk)
107
+ return (mpk, msk)
108
+
109
+ def extract(self, mpk, msk, ID):
110
+ #_ID is an element in ZR, r is an random number in ZR
111
+ _ID = group.hash(ID, ZR)
112
+ r = group.random(ZR)
113
+
114
+ sk_id = {'K0': [mpk['g2']**(msk['b0s'][0]*r),
115
+ mpk['g2']**(msk['b0s'][1]*r)],
116
+ 'K1': [mpk['g2']**(msk['k'][0] + (msk['b2s'][0]+_ID*msk['b1s'][0])*r),
117
+ mpk['g2']**(msk['k'][1] + (msk['b2s'][1]+_ID*msk['b1s'][1])*r)]}
118
+
119
+ if(debug):
120
+ print("Generate User SK...")
121
+ group.debug(sk_id)
122
+ return sk_id
123
+
124
+
125
+ def encrypt(self, mpk, ID, M):
126
+ #_ID is an element in ZR, s is an random number in ZR
127
+ s = group.random(ZR)
128
+ _ID = group.hash(ID,ZR)
129
+ #M is an element in GT
130
+ C0 = [mpk['g1b0'][0]**s, mpk['g1b0'][1]**s]
131
+ C1 = [(mpk['g1b2'][0]*(mpk['g1b1'][0]**_ID))**s,
132
+ (mpk['g1b2'][1]*(mpk['g1b1'][1]**_ID))**s]
133
+ C2 = (mpk['egg']**s) * M
134
+
135
+ ct_id = { 'C0':C0, 'C1':C1, 'C2':C2}
136
+
137
+ if(debug):
138
+ print('\nEncrypt...')
139
+ group.debug(ct_id)
140
+ return ct_id
141
+
142
+ def decrypt(self, mpk, sk_id, ct_id):
143
+
144
+ mask = self.vpair(ct_id['C0'], sk_id['K1']) / self.vpair(ct_id['C1'], sk_id['K0'])
145
+ Mprime = ct_id['C2']/mask
146
+ if(debug):
147
+ print('\nDecrypt....')
148
+ return Mprime
149
+
150
+ def vpair(self, g1v, g2v):
151
+ return pair(g1v[0],g2v[0]) * pair(g1v[1],g2v[1])
152
+
153
+ def main():
154
+
155
+ group = PairingGroup('MNT224', secparam=1024)
156
+ ibe = IBE_CW13(group)
157
+ (master_public_key, master_secret_key) = ibe.setup()
158
+ ID = 'user@email.com'
159
+ private_key = ibe.extract(master_public_key, master_secret_key, ID)
160
+ msg = group.random(GT)
161
+ cipher_text = ibe.encrypt(master_public_key, ID, msg)
162
+ decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
163
+ print (decryptedMSG==msg)
164
+
165
+ if __name__ == '__main__':
166
+ debug = True
167
+ main()
168
+
@@ -0,0 +1,94 @@
1
+ '''
2
+ **Boneh-Boyen Identity-Based Encryption (BB-IBE)**
3
+
4
+ *Authors:* Dan Boneh, Xavier Boyen
5
+
6
+ | **Title:** "Efficient Selective-ID Secure Identity-Based Encryption Without Random Oracles"
7
+ | **Published in:** Eurocrypt 2004
8
+ | **Available from:** http://crypto.stanford.edu/~dabo/pubs/papers/bbibe.pdf
9
+ | **Notes:** Section 5.1 - IBE (1-level HIBE) implementation of the BB_2 scheme
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: J. Ayo Akinyele
20
+ :Date: 11/2010
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
24
+ from charm.toolbox.IBEnc import *
25
+ from charm.core.math.pairing import hashPair as sha2
26
+
27
+ debug = False
28
+ class IBE_BB04(IBEnc):
29
+ """
30
+ >>> group = PairingGroup('MNT224')
31
+ >>> ibe = IBE_BB04(group)
32
+ >>> (master_public_key, master_key) = ibe.setup()
33
+ >>> master_public_key_ID = group.random(ZR)
34
+ >>> key = ibe.extract(master_key, master_public_key_ID)
35
+ >>> msg = group.random(GT)
36
+ >>> cipher_text = ibe.encrypt(master_public_key, master_public_key_ID, msg)
37
+ >>> decrypted_msg = ibe.decrypt(master_public_key, key, cipher_text)
38
+ >>> decrypted_msg == msg
39
+ True
40
+ """
41
+ def __init__(self, groupObj):
42
+ IBEnc.__init__(self)
43
+ IBEnc.setProperty(self, secDef=IND_sID_CPA, assumption=DBDH,
44
+ messageSpace=[GT, 'KEM'], secModel=ROM, id=ZR)
45
+ global group
46
+ group = groupObj
47
+
48
+ def setup(self, secparam=None):
49
+ #StartBenchmark(bID1, [CpuTime, NativeTime])
50
+ g, h = group.random(G1), group.random(G2)
51
+ v = pair(g, h)
52
+ x, y = group.random(), group.random()
53
+
54
+ X = g ** x
55
+ Y = g ** y
56
+ pk = { 'g':g, 'X':X, 'Y':Y, 'v':v } # public params
57
+ mk = { 'x':x, 'y':y, 'h':h } # master secret
58
+ return (pk, mk)
59
+
60
+ # Note: ID is in Zp* and is the public key ID for the user
61
+ def extract(self, mk, ID):
62
+ r = group.random()
63
+ # compute K
64
+ K = mk['h'] ** ~(ID + mk['x'] + r*mk['y'])
65
+ return { 'id':ID, 'r':r, 'K':K }
66
+
67
+ # assume that M is in GT
68
+ def encrypt(self, params, ID, M):
69
+ s = group.random()
70
+
71
+ A = (params['v'] ** s) * M
72
+ B = params['Y'] ** s
73
+ C = (params['X'] ** s) * (params['g'] ** (s * ID))
74
+ return { 'A':A, 'B':B, 'C':C }
75
+
76
+ def keyenc(self, params, ID, msg):
77
+ s = group.random()
78
+ A = sha2(params['v'] ** s) # session key
79
+ B = params['Y'] ** s
80
+ C = (params['X'] ** s) * (params['g'] ** (s * ID))
81
+ # use prf here?
82
+ ciph = { 'B': B, 'C': C }
83
+ return (A, ciph) # user must destroy A since it protects the msg
84
+
85
+ def decrypt(self, pk, dID, CT):
86
+ A, B, C = CT['A'], CT['B'], CT['C']
87
+ v_s = pair(((B ** dID['r']) * C), dID['K'])
88
+ return A / v_s
89
+
90
+ def keydec(self, pk, dID, CT):
91
+ A, B, C = CT['A'], CT['B'], CT['C']
92
+ v_s = pair(((B ** dID['r']) * C), dID['K'])
93
+ return sha2(v_s)
94
+