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
+ **Waters Dual System Signature (Waters09)**
3
+
4
+ *Authors:* B. 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:** Minor improvements: removed alpha from msk, added g2^-alpha.
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** DLIN
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele (original), Fan Zhang (improvements)
20
+ :Date: 2/2012 (original), 3/2013 (improvements)
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+ from charm.toolbox.IBEnc import IBEnc
24
+
25
+ debug = False
26
+ class IBEWaters09(IBEnc):
27
+ """
28
+ >>> group = PairingGroup('MNT224')
29
+ >>> ibe = IBEWaters09(group)
30
+ >>> (master_public_key, master_secret_key) = ibe.keygen()
31
+ >>> msg = "plese sign this message!!!!"
32
+ >>> signature = ibe.sign(master_public_key, master_secret_key, msg)
33
+ >>> ibe.verify(master_public_key, signature, msg)
34
+ True
35
+ """
36
+ def __init__(self, groupObj):
37
+ IBEnc.__init__(self)
38
+ global group, util
39
+ group = groupObj
40
+
41
+ def keygen(self):
42
+ g1 = group.random(G1)
43
+ g2 = group.random(G2)
44
+ a1, a2, b, alpha = group.random(ZR, 4)
45
+ _w, _h, _v, _v1, _v2, _u = group.random(ZR, 6)
46
+
47
+ v = g1 ** _v
48
+ v1 = g1 ** _v1
49
+ v2 = g1 ** _v2
50
+
51
+ v_2 = g2 ** _v
52
+ v1_2 = g2 ** _v1
53
+ v2_2 = g2 ** _v2
54
+ w1, h1 = g1 ** _w, g1 ** _h
55
+ w2, h2 = g2 ** _w, g2 ** _h
56
+ u2 = g2 ** _u
57
+ u1 = g1 ** _u
58
+
59
+ tau1 = v * (v1 ** a1)
60
+ tau2 = v * (v2 ** a2)
61
+ pk = { 'g1':g1, 'g2':g2, 'g1^b':g1 ** b, 'g^a1':g1 ** a1, 'g^a2':g1 ** a2,
62
+ 'g^ba1':g1 ** (b * a1), 'g^ba2':g1 ** (b * a2), 'tau1':tau1, 'tau2':tau2,
63
+ 'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'u':u1, 'u2':u2,'w1':w1, 'h1':h1, 'w2':w2, 'h2':h2,
64
+ 'egg_alpha': pair(g1, g2) ** (alpha * a1 * b) }
65
+ sk = {'g^alph_a1':g2 ** (alpha * a1),
66
+ 'g2^b':g2 ** b,'v':v_2, 'v1':v1_2, 'v2':v2_2, 'g2^-alpha':g2 ** -alpha }
67
+ return (pk, sk)
68
+
69
+ def sign(self, mpk, msk, m):
70
+ r1, r2, z1, z2, tagk = group.random(ZR, 5)
71
+ r = r1 + r2
72
+ M = group.hash(m)
73
+
74
+ S = {}
75
+ S[1] = msk['g^alph_a1'] * (msk['v'] ** r)
76
+ S[2] = msk['g2^-alpha'] * (msk['v1'] ** r) * (mpk['g2'] ** z1)
77
+ S[3] = msk['g2^b'] ** -z1
78
+ S[4] = (msk['v2'] ** r) * (mpk['g2'] ** z2)
79
+ S[5] = msk['g2^b'] ** -z2
80
+ S[6] = msk['g2^b'] ** r2
81
+ S[7] = mpk['g2'] ** r1
82
+ SK = ((mpk['u2'] ** M) * (mpk['w2'] ** tagk) * mpk['h2']) ** r1
83
+
84
+ sigma = { 'sig':S, 'K':SK, 'tagk':tagk }
85
+ return sigma
86
+
87
+ def verify(self, mpk, sigma, m):
88
+ s1, s2, t, tagc = group.random(ZR, 4)
89
+ s = s1 + s2
90
+ M = group.hash(m)
91
+
92
+ sig1, sig2, sig3, sig4, sig5, sig6, sig7, sigK, tagk = sigma['sig'][1],sigma['sig'][2],sigma['sig'][3],sigma['sig'][4],sigma['sig'][5],sigma['sig'][6],sigma['sig'][7],sigma['K'],sigma['tagk']
93
+ E1 = ((mpk['u'] ** M) * (mpk['w1'] ** tagc) * mpk['h1']) ** t
94
+ E2 = mpk['g1'] ** t
95
+ A = (mpk['egg_alpha'] ** s2)
96
+ theta = ~(tagc - tagk)
97
+
98
+ lhs_pair = pair(mpk['g1^b'] ** s, sig1) * pair(mpk['g^ba1'] ** s1, sig2) * pair(mpk['g^a1'] ** s1, sig3) * pair(mpk['g^ba2'] ** s2, sig4) * pair(mpk['g^a2'] ** s2, sig5)
99
+ rhs_pair = pair((mpk['tau1'] ** s1) * (mpk['tau2'] ** s2), sig6) * pair((mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w1'] ** -t), sig7) * (( pair(E1, sig7) / pair(E2, sigK) ) ** theta) * A
100
+ if lhs_pair == rhs_pair:
101
+ return True
102
+ return False
103
+
104
+ def main():
105
+ # scheme designed for symmetric billinear groups
106
+ grp = PairingGroup('MNT224')
107
+
108
+ ibe = IBEWaters09(grp)
109
+
110
+ (mpk, msk) = ibe.keygen()
111
+
112
+ m = "plese sign this message!!!!"
113
+ sigma = ibe.sign(mpk, msk, m)
114
+ if debug: print("Signature :=", sigma)
115
+
116
+ assert ibe.verify(mpk, sigma, m), "Invalid Verification!!!!"
117
+ if debug: print("Successful Individual Verification!")
118
+
119
+ if __name__ == "__main__":
120
+ debug = True
121
+ main()
@@ -0,0 +1,150 @@
1
+ '''
2
+ **Identity-Based Proxy Re-Encryption (MG07)**
3
+
4
+ *Authors:* Matthew Green, Giuseppe Ateniese
5
+
6
+ | **Title:** "Identity-Based Proxy Re-Encryption"
7
+ | **Published in:** Applied Cryptography and Network Security, 2007
8
+ | **Available from:** http://link.springer.com/chapter/10.1007%2F978-3-540-72738-5_19
9
+ | **Notes:** Section 4.3
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** proxy re-encryption (identity-based)
14
+ * **Setting:** bilinear groups (symmetric)
15
+ * **Assumption:** DBDH
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: N. Fotiou
20
+ :Date: 11/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import pc_element,ZR,G1,G2,GT,pair
23
+ from charm.core.math.integer import integer,bitsize, int2Bytes, randomBits
24
+ from charm.toolbox.hash_module import Hash
25
+ from charm.core.engine.util import objectToBytes
26
+
27
+ debug = False
28
+ class PreGA:
29
+ """
30
+ >>> from charm.toolbox.pairinggroup import PairingGroup,pc_element
31
+ >>> ID = "nikos fotiou"
32
+ >>> ID2 = "test user"
33
+ >>> msg = "hello world!!!!!"
34
+ >>> group = PairingGroup('SS512', secparam=1024)
35
+ >>> pre = PreGA(group)
36
+ >>> (master_secret_key, params) = pre.setup()
37
+ >>> id_secret_key = pre.keyGen(master_secret_key, ID)
38
+ >>> id2_secret_key = pre.keyGen(master_secret_key, ID2)
39
+ >>> ciphertext = pre.encrypt(params, ID, msg);
40
+ >>> pre.decryptFirstLevel(params,id_secret_key, ciphertext, ID)
41
+ b'hello world!!!!!'
42
+ >>> re_encryption_key = pre.rkGen(params,id_secret_key, ID, ID2)
43
+ >>> ciphertext2 = pre.reEncrypt(params, ID, re_encryption_key, ciphertext)
44
+ >>> pre.decryptSecondLevel(params,id2_secret_key,ID, ID2, ciphertext2)
45
+ b'hello world!!!!!'
46
+ """
47
+ def __init__(self, groupObj):
48
+ global group,h
49
+ group = groupObj
50
+ h = Hash(group) # use the default
51
+
52
+ def setup(self):
53
+ s = group.random(ZR)
54
+ g = group.random(G1)
55
+ # choose H1-H6 hash functions
56
+ msk = { 's':s }
57
+ params = { 'g':g, 'g_s':g**s}
58
+ if(debug):
59
+ print("Public parameters...")
60
+ group.debug(params)
61
+ print("Master secret key...")
62
+ group.debug(msk)
63
+ return (msk, params)
64
+
65
+ def keyGen(self, msk, ID):
66
+ k = group.hash(ID,G1) ** msk['s']
67
+ skid = { 'skid':k }
68
+ if(debug):
69
+ print("Key for id => '%s'" % ID)
70
+ group.debug(skid)
71
+ return skid
72
+
73
+ def encrypt(self, params, ID, M):
74
+ enc_M = integer(M)
75
+ if bitsize(enc_M)/8 > group.messageSize():
76
+ print("Message cannot be encoded.")
77
+ return None
78
+ sigma = group.random(GT)
79
+ r = h.hashToZr(sigma,enc_M)
80
+ A = params['g'] ** r
81
+ B = sigma * pair(params['g_s'], group.hash(ID, G1) ** r)
82
+ C = enc_M ^ h.hashToZn(sigma)
83
+ C_ = {'A':A, 'B':B, 'C':C}
84
+ S = group.hash((ID, C_),G1) ** r
85
+ ciphertext = {'S':S,'C':C_}
86
+ if(debug):
87
+ print('\nEncrypt...')
88
+ print('r => %s' % r)
89
+ print('sigma => %s' % sigma)
90
+ print('enc_M => %s' % enc_M)
91
+ group.debug(ciphertext)
92
+ return ciphertext
93
+
94
+ def decryptFirstLevel(self, params, skid, cid, ID):
95
+ H = group.hash((ID, cid['C']), G1)
96
+ t = group.random(ZR)
97
+ sigma = cid['C']['B'] / (pair(cid['C']['A'], skid['skid'] * H ** t)/pair(params['g'] ** t, cid['S']))
98
+ m = cid['C']['C'] ^ h.hashToZn(sigma)
99
+ r = h.hashToZr(sigma,m)
100
+ if (cid['S'] != H**r) or (cid['C']['A'] != params['g'] ** r):
101
+ if debug: print("Decryption Failed")
102
+ return None
103
+ if(debug):
104
+ print('\nDecrypting...')
105
+ print('H => %s' % H)
106
+ print('t => %s' % t)
107
+ print('r => %s' % r)
108
+ print('sigma => %s' % sigma)
109
+ print(int2Bytes(m))
110
+ return int2Bytes(m)
111
+
112
+ def rkGen(self, params, skid, IDsrc, IDdest):
113
+ N = integer(randomBits(group.secparam))
114
+ K = pair(skid['skid'], group.hash(IDdest, G1))
115
+ if(debug):
116
+ print("\nRe-encryption key for id1 => '%s' to id2 => '%s'" % (IDsrc,IDdest))
117
+ group.debug(skid)
118
+ print('N => %s' % N)
119
+ print('K => %s' % K)
120
+ return {'N':N, 'R':group.hash((K, IDsrc, IDdest, N), G1) * skid['skid']}
121
+
122
+ def reEncrypt(self, params, IDsrc, rk, cid):
123
+ H = group.hash((IDsrc, cid['C']), G1)
124
+ if pair(params['g'], cid['S']) != pair(H, cid['C']['A']):
125
+ if debug: print("Re-encryption Failed")
126
+ return None
127
+ t = group.random(ZR)
128
+ B_ = cid['C']['B'] / (pair(cid['C']['A'], rk['R'] * H ** t)/pair(params['g'] ** t, cid['S']))
129
+ if(debug):
130
+ print('\nRe-ncrypt...')
131
+ print('H => %s' % H)
132
+ print('t => %s' % t)
133
+ print('B\' => %s' % B_)
134
+ return {'A':cid['C']['A'], 'B':B_, 'C':cid['C']['C'], 'IDsrc':IDsrc, 'N':rk['N']}
135
+
136
+ def decryptSecondLevel(self, params, skid, IDsrc, ID, cid):
137
+ K = pair(group.hash(IDsrc, G1), skid['skid'])
138
+ sigma = cid['B'] * pair(cid['A'], group.hash((K, IDsrc, ID, cid['N']), G1))
139
+ m = cid['C'] ^ h.hashToZn(sigma)
140
+ r = h.hashToZr(sigma,m)
141
+ if (cid['A'] != params['g'] ** r):
142
+ if debug: print("Decryption second level Failed")
143
+ return None
144
+ if(debug):
145
+ print('\nDecrypting Second Level...')
146
+ print('K => %s' % K)
147
+ print('sigma => %s' % sigma)
148
+ print(int2Bytes(m))
149
+ return int2Bytes(m)
150
+
@@ -0,0 +1,126 @@
1
+ '''
2
+ **AFGH Proxy Re-Encryption (AFGH06)**
3
+
4
+ *Authors:* Ateniese, Fu, Green, Hohenberger
5
+
6
+ | **Title:** "Improved Proxy Re-Encryption Schemes with Applications to Secure Distributed Storage"
7
+ | **Published in:** ACM Transactions on Information and System Security (TISSEC), 2006
8
+ | **Available from:** http://dl.acm.org/citation.cfm?id=1127346
9
+ | **Notes:** First-level encryption & second-level decryption not yet implemented
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** proxy re-encryption
14
+ * **Setting:** Pairing groups (Type 1 "symmetric")
15
+ * **Assumption:** eDBDH (Extended Decisional Bilinear DH)
16
+ * **Properties:** CPA-secure, unidirectional, single-hop, non-interactive, collusion-resistant
17
+
18
+ .. rubric:: Implementation
19
+
20
+ :Authors: D. Nuñez
21
+ :Date: 04/2016
22
+ '''
23
+
24
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
25
+ from charm.toolbox.PREnc import PREnc
26
+
27
+ debug = False
28
+ class AFGH06(PREnc):
29
+ """
30
+ Testing AFGH06 implementation
31
+
32
+ >>> from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
33
+ >>> groupObj = PairingGroup('SS512')
34
+ >>> pre = AFGH06(groupObj)
35
+ >>> params = pre.setup()
36
+ >>> (pk_a, sk_a) = pre.keygen(params)
37
+ >>> (pk_b, sk_b) = pre.keygen(params)
38
+ >>> msg = groupObj.random(GT)
39
+ >>> c_a = pre.encrypt(params, pk_a, msg)
40
+ >>> rk = pre.rekeygen(params, pk_a, sk_a, pk_b, sk_b)
41
+ >>> c_b = pre.re_encrypt(params, rk, c_a)
42
+ >>> assert msg == pre.decrypt(params, sk_b, c_b), 'Decryption of re-encrypted ciphertext was incorrect'
43
+ """
44
+
45
+ def __init__(self, groupObj):
46
+ global group
47
+ group = groupObj
48
+
49
+ def setup(self):
50
+ g = group.random(G1)
51
+ Z = pair(g,g)
52
+
53
+ params = { 'g': g, 'Z' : Z }
54
+ if(debug):
55
+ print("Setup: Public parameters...")
56
+ group.debug(params)
57
+ return params
58
+
59
+ def keygen(self, params):
60
+ x1, x2 = group.random(ZR), group.random(ZR)
61
+ Z_x1 = params['Z'] ** x1
62
+ g_x2 = params['g'] ** x2
63
+
64
+ sk = { 'sk1' : x1, 'sk2' : x2 }
65
+ pk = { 'pk1' : Z_x1, 'pk2' : g_x2 }
66
+
67
+ if(debug):
68
+ print('\nKeygen...')
69
+ print("pk => '%s'" % pk)
70
+ print("sk => '%s'" % sk)
71
+ return (pk, sk)
72
+
73
+ def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
74
+ pk_b2 = pk_b['pk2']
75
+ sk_a1 = sk_a['sk1']
76
+ rk = pk_b2 ** sk_a1
77
+ if(debug):
78
+ print('\nReKeyGen...')
79
+ print("rk => '%s'" % rk)
80
+ return rk
81
+
82
+ def encrypt(self, params, pk, m):
83
+ #m = group.encode(M, GT)
84
+ r = group.random(ZR)
85
+
86
+ Z_a1 = pk['pk1']
87
+
88
+ c1 = params['g'] ** r
89
+ c2 = m * (Z_a1 ** r)
90
+
91
+ c = { 'c1' : c1, 'c2' : c2 }
92
+
93
+ if(debug):
94
+ print('\nEncrypt...')
95
+ print('m => %s' % m)
96
+ print('r => %s' % r)
97
+ group.debug(c)
98
+ return c
99
+
100
+ def decrypt(self, params, sk, c):
101
+ c1 = c['c1']
102
+ c2 = c['c2']
103
+ m = c2 / (c1 ** (~sk['sk2']))
104
+
105
+ if(debug):
106
+ print('\nDecrypt...')
107
+ print('m => %s' % m)
108
+
109
+ #return group.decode(m)
110
+ return m
111
+
112
+ def re_encrypt(self, params, rk, c_a):
113
+ c1 = c_a['c1']
114
+ c2 = c_a['c2']
115
+
116
+ c1_prime = pair(c1, rk)
117
+
118
+ c_b = { 'c1' : c1_prime, 'c2' : c2 }
119
+ if(debug):
120
+ print('\nRe-encrypt...')
121
+ group.debug(c_b)
122
+ return c_b
123
+
124
+
125
+
126
+
@@ -0,0 +1,123 @@
1
+ '''
2
+ **BBS Proxy Re-Encryption (BBS98)**
3
+
4
+ *Authors:* Blaze, Bleumer, Strauss
5
+
6
+ | **Title:** "Divertible Protocols and Atomic Proxy Cryptography"
7
+ | **Published in:** Advances in Cryptology - EUROCRYPT'98, 1998
8
+ | **Available from:** http://link.springer.com/chapter/10.1007/BFb0054122
9
+
10
+ .. rubric:: Scheme Properties
11
+
12
+ * **Type:** proxy re-encryption
13
+ * **Setting:** DDH-hard EC groups of prime order (F_p) or Integer Groups
14
+ * **Assumption:** DDH (Decisional Diffie-Hellman)
15
+ * **Properties:** CPA-secure, bidirectional, multihop, interactive, transitive, not collusion-resistant
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: D. Nuñez (dnunez@lcc.uma.es)
20
+ :Date: 04/2016
21
+ '''
22
+
23
+ from charm.toolbox.ecgroup import G
24
+ from charm.toolbox.PREnc import PREnc
25
+
26
+ debug = False
27
+ class BBS98(PREnc):
28
+ """
29
+ Testing BBS98 implementation
30
+
31
+ >>> from charm.toolbox.eccurve import prime192v1
32
+ >>> from charm.toolbox.ecgroup import ECGroup
33
+ >>> groupObj = ECGroup(prime192v1)
34
+ >>> bbs = BBS98(groupObj)
35
+ >>> params = bbs.setup()
36
+ >>> (pk_a, sk_a) = bbs.keygen(params)
37
+ >>> (pk_b, sk_b) = bbs.keygen(params)
38
+ >>> msg = b"hello world!!!123456"
39
+ >>> c_a = bbs.encrypt(params, pk_a, msg)
40
+ >>> assert msg == bbs.decrypt(params, sk_a, c_a), 'Decryption of original ciphertext was incorrect'
41
+ >>> rk = bbs.rekeygen(params, pk_a, sk_a, pk_b, sk_b)
42
+ >>> c_b = bbs.re_encrypt(params, rk, c_a)
43
+ >>> assert msg == bbs.decrypt(params, sk_b, c_b), 'Decryption of re-encrypted ciphertext was incorrect'
44
+ """
45
+
46
+ def __init__(self, groupObj, p=0, q=0):
47
+ global group
48
+ group = groupObj
49
+ if group.groupSetting() == 'integer':
50
+ group.p, group.q, group.r = p, q, 2
51
+
52
+ def setup(self, secparam=0):
53
+ global g
54
+ if group.groupSetting() == 'integer':
55
+ if group.p == 0 or group.q == 0:
56
+ group.paramgen(secparam)
57
+ g = group.randomGen()
58
+ elif group.groupSetting() == 'elliptic_curve':
59
+ group.paramgen(secparam)
60
+ g = group.random(G)
61
+
62
+ params = {'g': g}
63
+ if(debug):
64
+ print("Setup: Public parameters...")
65
+ group.debug(params)
66
+ return params
67
+
68
+ def keygen(self, params):
69
+ x = group.random()
70
+ g_x = params['g'] ** x
71
+
72
+ sk = x # { 'sk' : x }
73
+ pk = g_x # { 'pk' : g_x }
74
+
75
+ if(debug):
76
+ print('\nKeygen...')
77
+ print("pk => '%s'" % pk)
78
+ print("sk => '%s'" % sk)
79
+ return (pk, sk)
80
+
81
+ def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
82
+ rk = sk_b * (~sk_a)
83
+ if(debug):
84
+ print('\nReKeyGen...')
85
+ print("rk => '%s'" % rk)
86
+ return rk
87
+
88
+ def encrypt(self, params, pk, M):
89
+ m = group.encode(M)
90
+ r = group.random()
91
+ c1 = pk ** r
92
+ c2 = (params['g'] ** r) * m
93
+
94
+ c = {'c1': c1, 'c2': c2}
95
+
96
+ if(debug):
97
+ print('\nEncrypt...')
98
+ print('m => %s' % m)
99
+ print('r => %s' % r)
100
+ group.debug(c)
101
+ return c
102
+
103
+ def decrypt(self, params, sk, c):
104
+ c1 = c['c1']
105
+ c2 = c['c2']
106
+ m = c2 / (c1 ** (~sk))
107
+
108
+ if(debug):
109
+ print('\nDecrypt...')
110
+ print('m => %s' % m)
111
+
112
+ return group.decode(m)
113
+
114
+ def re_encrypt(self, params, rk, c_a):
115
+ c1 = c_a['c1']
116
+ c2 = c_a['c2']
117
+
118
+ c_b = {'c1': (c1 ** rk), 'c2': c2}
119
+
120
+ if(debug):
121
+ print('\nRe-encrypt...')
122
+ group.debug(c_b)
123
+ return c_b