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,223 @@
1
+ '''
2
+ **Non-monotonic CP-ABE (YAHK14)**
3
+
4
+ *Authors:* Shota Yamada, Nuttapong Attrapadung, Goichiro Hanaoka, Noboru Kunihiro
5
+
6
+ | **Title:** "A Framework and Compact Constructions for Non-monotonic Attribute-Based Encryption"
7
+ | **Published in:** Public-Key Cryptography (PKC) 2014, Pages 275-292
8
+ | **Available from:** http://eprint.iacr.org/2014/181 (Section 7)
9
+ | **Notes:** Supports non-monotonic access structures (with negation)
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** ciphertext-policy attribute-based encryption (public key)
14
+ * **Setting:** Bilinear pairing group of prime order
15
+ * **Assumption:** Complex q-type assumption
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: al, artjomb
20
+ :Date: 07/2015
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import *
24
+ from charm.toolbox.secretutil import SecretUtil
25
+ from charm.toolbox.ABEnc import *
26
+
27
+
28
+ debug = False
29
+ class CPABE_YAHK14(ABEnc):
30
+ """
31
+ >>> from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
32
+ >>> group = PairingGroup('SS512')
33
+ >>> cpabe = CPABE_YAHK14(group)
34
+ >>> msg = group.random(GT)
35
+ >>> attributes = ['2', '3'] # must be integer strings
36
+ >>> access_policy = '2 and !1' # must be integer strings
37
+ >>> (master_public_key, master_key) = cpabe.setup()
38
+ >>> secret_key = cpabe.keygen(master_public_key, master_key, attributes)
39
+ >>> cipher_text = cpabe.encrypt(master_public_key, msg, access_policy)
40
+ >>> decrypted_msg = cpabe.decrypt(master_public_key, secret_key, cipher_text)
41
+ >>> msg == decrypted_msg
42
+ True
43
+ """
44
+
45
+ def __init__(self, groupObj, verbose = False):
46
+ ABEnc.__init__(self)
47
+ global util, group
48
+ group = groupObj
49
+ util = SecretUtil(group, verbose)
50
+
51
+ # Defining a function to pick explicit exponents in the group
52
+ def exp(self,value):
53
+ return group.init(ZR, value)
54
+
55
+ def setup(self):
56
+ g = group.random(G1) # this element can also be in G2 and then PairingGroup('MNT224') can be used
57
+ g2, u, h, w, v = group.random(G1), group.random(G1), group.random(G1), group.random(G1), group.random(G1)
58
+ alpha, beta = group.random( ), group.random( )#from ZR
59
+ vDot = u ** beta
60
+ egg = pair(g2,g)**alpha
61
+ pp = {'g':g, 'g2':g2, 'u':u, 'h':h, 'w':w, 'v':v, 'vDot':vDot,'egg':egg}
62
+ mk = {'g2_alpha':g2 ** alpha, 'beta': beta }
63
+ return (pp, mk)
64
+
65
+ def keygen(self, pp, mk, S):
66
+ # S is a set of attributes written as STRINGS i.e. {'1', '2', '3',...}
67
+ r = group.random( )
68
+
69
+ D1 = mk['g2_alpha'] * (pp['w']**r)
70
+ D2 = pp['g']**r
71
+
72
+ vR = pp['v']**(-r)
73
+
74
+ K1, K1Dot, K2, K2Dot = {}, {}, {}, {}
75
+ rDotCumulative = r
76
+ for i, idx in zip(S, range(len(S))):
77
+ ri = group.random( )
78
+ if idx + 1 is len(S):
79
+ riDot = rDotCumulative
80
+ else:
81
+ riDot = group.random( )
82
+ rDotCumulative -= riDot
83
+
84
+ omega_i = self.exp(int(i))
85
+ K1[i] = vR * (pp['u']**omega_i * pp['h'])**ri
86
+ K1Dot[i] = (pp['u']**(omega_i * mk['beta']) * pp['h']**mk['beta'])**riDot
87
+
88
+ K2[i] = pp['g']**ri
89
+ K2Dot[i] = pp['g']**(mk['beta']*riDot)
90
+ S = [s for s in S] #Have to be an array for util.prune
91
+
92
+ return { 'S':S, 'D1': D1, 'D2' : D2, 'K1':K1, 'K1Dot':K1Dot, 'K2':K2, 'K2Dot':K2Dot }
93
+
94
+ def encrypt(self, pp, message, policy_str):
95
+ s = group.random()
96
+
97
+ policy = util.createPolicy(policy_str)
98
+ a_list = util.getAttributeList(policy)
99
+
100
+ shares = util.calculateSharesDict(s, policy) #These are correctly set to be exponents in Z_p
101
+
102
+ C0 = message * (pp['egg']**s)
103
+ C1 = pp['g']**s
104
+
105
+ C_1, C_2, C_3 = {}, {}, {}
106
+ for i in a_list:
107
+ ti = group.random()
108
+ if i[0] == '!':
109
+ inti = util.strip_index(i[1:])
110
+ C_1[i] = pp['w']**shares[i] * pp['vDot']**ti
111
+ else:
112
+ inti = util.strip_index(i)
113
+ C_1[i] = pp['w']**shares[i] * pp['v']**ti
114
+
115
+ inti = self.exp(int(inti))
116
+ C_2[i] = (pp['u']**inti * pp['h'])**(-ti)
117
+ C_3[i] = pp['g']**ti
118
+
119
+ #print('The exponent is ',inti)
120
+
121
+ return { 'Policy':policy_str, 'C0':C0, 'C1':C1, 'C_1':C_1, 'C_2':C_2, 'C_3':C_3 }
122
+
123
+ def decrypt(self, pp, sk, ct):
124
+ policy = util.createPolicy(ct['Policy'])
125
+ z = util.getCoefficients(policy)
126
+
127
+ # workaround to let the charm policy parser successfully parse the non-monotonic attributes
128
+ a_list = util.getAttributeList(policy)
129
+ nS = sk['S'][:]
130
+ for att in a_list:
131
+ if att[0] == '!' and att[1:] not in sk['S']:
132
+ nS.append(att)
133
+
134
+ pruned_list = util.prune(policy, nS)
135
+
136
+ if (pruned_list == False):
137
+ return group.init(GT,1)
138
+
139
+ B = pair(ct['C1'], sk['D1'])
140
+ for i in range(len(pruned_list)):
141
+ x = pruned_list[i].getAttribute( ) #without the underscore
142
+ y = pruned_list[i].getAttributeAndIndex( ) #with the underscore
143
+
144
+ a = pair( ct['C_1'][x], sk['D2'])
145
+ if x[0] == '!':
146
+ b = group.init(GT, 1)
147
+ inti = self.exp(int(x[1:]))
148
+ for xj in sk['S']:
149
+ if xj[0] == '!':
150
+ intj = self.exp(int(xj[1:]))
151
+ else:
152
+ intj = self.exp(int(xj))
153
+ b *= ( pair( ct['C_2'][x], sk['K2Dot'][str(intj)]) * pair( ct['C_3'][x], sk['K1Dot'][str(intj)]) ) ** (1 / (inti - intj))
154
+ else:
155
+ b = pair( ct['C_2'][x], sk['K2'][x]) * pair( ct['C_3'][x], sk['K1'][x])
156
+ d = - z[y]
157
+ B *= ( a * b )**d
158
+
159
+ return ct['C0'] / B
160
+
161
+ def randomMessage(self):
162
+ return group.random(GT)
163
+
164
+ def main():
165
+ curve = 'SS512'
166
+
167
+ groupObj = PairingGroup(curve)
168
+ scheme = CPABE_YAHK14(groupObj)
169
+
170
+ (pp, mk) = scheme.setup()
171
+
172
+ testCases = [
173
+ ( '2 and !1', [
174
+ ({'1', '2'}, False),
175
+ ({'1'}, False),
176
+ ({'2'}, True),
177
+ ({'3'}, False),
178
+ ({'2', '3'}, True)
179
+ ] ),
180
+ ( '2 and 1', [
181
+ ({'1', '2'}, True),
182
+ ({'1'}, False),
183
+ ({'2'}, False),
184
+ ({'3'}, False)
185
+ ] ),
186
+ ( '2', [
187
+ ({'1', '2'}, True),
188
+ ({'1'}, False),
189
+ ({'2'}, True)
190
+ ] ),
191
+ ( '!2', [
192
+ ({'1', '2'}, False),
193
+ ({'1'}, True),
194
+ ({'2'}, False)
195
+ ] ),
196
+ ]
197
+
198
+ for policy_str, users in testCases:
199
+ for S, success in users:
200
+ m = group.random(GT)
201
+ sk = scheme.keygen(pp, mk, S)
202
+ ct = scheme.encrypt(pp, m, policy_str)
203
+ res = scheme.decrypt(pp, sk, ct)
204
+
205
+ if (m == res) == success:
206
+ print("PASS", S, '' if success else 'not', "in '" + policy_str + "'")
207
+ else:
208
+ print("FAIL", S, '' if success else 'not', "in '" + policy_str + "'")
209
+
210
+ m = group.random(GT)
211
+ sk = scheme.keygen(pp, mk, {'1', '2'})
212
+ ct = scheme.encrypt(pp, m, '!1 and 2')
213
+ sk['S'].remove('1')
214
+ res = scheme.decrypt(pp, sk, ct)
215
+
216
+ if (m == res) == False:
217
+ print("PASS: attack failed")
218
+ else:
219
+ print("FAIL: attack succeeded")
220
+
221
+ if __name__ == '__main__':
222
+ debug = True
223
+ main()
@@ -0,0 +1,144 @@
1
+ '''
2
+ **Ciphertext-Policy Attribute-Based Encryption (Waters09)**
3
+
4
+ *Authors:* Brent Waters
5
+
6
+ | **Title:** "Ciphertext-Policy Attribute-Based Encryption: An Expressive, Efficient, and Provably Secure Realization"
7
+ | **Published in:** Cryptology ePrint Archive, 2008 (Appendix C)
8
+ | **Available from:** http://eprint.iacr.org/2008/290.pdf
9
+ | **Notes:** The sole disadvantage of this scheme is the high number of pairings that must be computed during the decryption process (2 + N) for N attributes matching in the key.
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** ciphertext-policy attribute-based encryption (public key)
14
+ * **Setting:** Pairing groups
15
+ * **Assumption:** parallel q-DBDHE
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 11/2010
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+ from charm.toolbox.secretutil import SecretUtil
24
+ from charm.toolbox.ABEnc import ABEnc
25
+
26
+ debug = False
27
+ class CPabe09(ABEnc):
28
+ """
29
+ >>> from charm.toolbox.pairinggroup import PairingGroup,GT
30
+ >>> group = PairingGroup('SS512')
31
+ >>> cpabe = CPabe09(group)
32
+ >>> msg = group.random(GT)
33
+ >>> (master_secret_key, master_public_key) = cpabe.setup()
34
+ >>> policy = '((ONE or THREE) and (TWO or FOUR))'
35
+ >>> attr_list = ['THREE', 'ONE', 'TWO']
36
+ >>> secret_key = cpabe.keygen(master_public_key, master_secret_key, attr_list)
37
+ >>> cipher_text = cpabe.encrypt(master_public_key, msg, policy)
38
+ >>> decrypted_msg = cpabe.decrypt(master_public_key, secret_key, cipher_text)
39
+ >>> decrypted_msg == msg
40
+ True
41
+ """
42
+
43
+ def __init__(self, groupObj):
44
+ ABEnc.__init__(self)
45
+ global util, group
46
+ util = SecretUtil(groupObj, debug)
47
+ group = groupObj
48
+
49
+ def setup(self):
50
+ g1, g2 = group.random(G1), group.random(G2)
51
+ alpha, a = group.random(), group.random()
52
+ e_gg_alpha = pair(g1,g2) ** alpha
53
+ msk = {'g1^alpha':g1 ** alpha, 'g2^alpha':g2 ** alpha}
54
+ pk = {'g1':g1, 'g2':g2, 'e(gg)^alpha':e_gg_alpha, 'g1^a':g1 ** a, 'g2^a':g2 ** a}
55
+ return (msk, pk)
56
+
57
+ def keygen(self, pk, msk, attributes):
58
+ t = group.random()
59
+ K = msk['g2^alpha'] * (pk['g2^a'] ** t)
60
+ L = pk['g2'] ** t
61
+ k_x = [group.hash(s, G1) ** t for s in attributes]
62
+
63
+ K_x = {}
64
+ for i in range(0, len(k_x)):
65
+ K_x[ attributes[i] ] = k_x[i]
66
+
67
+ key = { 'K':K, 'L':L, 'K_x':K_x, 'attributes':attributes }
68
+ return key
69
+
70
+ def encrypt(self, pk, M, policy_str):
71
+ # Extract the attributes as a list
72
+ policy = util.createPolicy(policy_str)
73
+ p_list = util.getAttributeList(policy)
74
+ s = group.random()
75
+ C_tilde = (pk['e(gg)^alpha'] ** s) * M
76
+ C_0 = pk['g1'] ** s
77
+ C, D = {}, {}
78
+ secret = s
79
+ shares = util.calculateSharesList(secret, policy)
80
+
81
+ # ciphertext
82
+ for i in range(len(p_list)):
83
+ r = group.random()
84
+ if shares[i][0] == p_list[i]:
85
+ attr = shares[i][0].getAttribute()
86
+ C[ p_list[i] ] = ((pk['g1^a'] ** shares[i][1]) * (group.hash(attr, G1) ** -r))
87
+ D[ p_list[i] ] = (pk['g2'] ** r)
88
+
89
+ if debug: print("SessionKey: %s" % C_tilde)
90
+ return { 'C0':C_0, 'C':C, 'D':D , 'C_tilde':C_tilde, 'policy':policy_str, 'attribute':p_list }
91
+
92
+ def decrypt(self, pk, sk, ct):
93
+ policy = util.createPolicy(ct['policy'])
94
+ pruned = util.prune(policy, sk['attributes'])
95
+ if pruned == False:
96
+ return False
97
+ coeffs = util.getCoefficients(policy)
98
+ numerator = pair(ct['C0'], sk['K'])
99
+
100
+ # create list for attributes in order...
101
+ k_x, w_i = {}, {}
102
+ for i in pruned:
103
+ j = i.getAttributeAndIndex()
104
+ k = i.getAttribute()
105
+ k_x[ j ] = sk['K_x'][k]
106
+ w_i[ j ] = coeffs[j]
107
+ #print('Attribute %s: coeff=%s, k_x=%s' % (j, w_i[j], k_x[j]))
108
+
109
+ C, D = ct['C'], ct['D']
110
+ denominator = 1
111
+ for i in pruned:
112
+ j = i.getAttributeAndIndex()
113
+ denominator *= ( pair(C[j] ** w_i[j], sk['L']) * pair(k_x[j] ** w_i[j], D[j]) )
114
+ return ct['C_tilde'] / (numerator / denominator)
115
+
116
+ def main():
117
+ #Get the eliptic curve with the bilinear mapping feature needed.
118
+ groupObj = PairingGroup('SS512')
119
+
120
+ cpabe = CPabe09(groupObj)
121
+ (msk, pk) = cpabe.setup()
122
+ pol = '((ONE or THREE) and (TWO or FOUR))'
123
+ attr_list = ['THREE', 'ONE', 'TWO']
124
+
125
+ if debug: print('Acces Policy: %s' % pol)
126
+ if debug: print('User credential list: %s' % attr_list)
127
+ m = groupObj.random(GT)
128
+
129
+ cpkey = cpabe.keygen(pk, msk, attr_list)
130
+ if debug: print("\nSecret key: %s" % attr_list)
131
+ if debug:groupObj.debug(cpkey)
132
+ cipher = cpabe.encrypt(pk, m, pol)
133
+
134
+ if debug: print("\nCiphertext...")
135
+ if debug:groupObj.debug(cipher)
136
+ orig_m = cpabe.decrypt(pk, cpkey, cipher)
137
+
138
+ assert m == orig_m, 'FAILED Decryption!!!'
139
+ if debug: print('Successful Decryption!')
140
+ del groupObj
141
+
142
+ if __name__ == '__main__':
143
+ debug = True
144
+ main()
@@ -0,0 +1,208 @@
1
+ '''
2
+ **Lightweight Key-Policy ABE for IoT (YCT14)**
3
+
4
+ *Authors:* Xuanxia Yao, Zhi Chen, Ye Tian
5
+
6
+ | **Title:** "A lightweight attribute-based encryption scheme for the Internet of things"
7
+ | **Published in:** Future Generation Computer Systems, 2014
8
+ | **Available from:** http://www.sciencedirect.com/science/article/pii/S0167739X14002039
9
+ | **Notes:** Designed for resource-constrained IoT devices
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** key-policy attribute-based encryption (public key)
14
+ * **Setting:** No Pairing (lightweight)
15
+ * **Assumption:** Computational Diffie-Hellman
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: artjomb
20
+ :Date: 10/2014
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+ from charm.toolbox.secretutil import SecretUtil
24
+ from charm.toolbox.symcrypto import SymmetricCryptoAbstraction
25
+ from charm.toolbox.ABEnc import ABEnc
26
+ from charm.schemes.abenc.abenc_lsw08 import KPabe
27
+ from charm.core.math.pairing import hashPair as extractor
28
+
29
+ from time import time
30
+
31
+ debug = False
32
+ class EKPabe(ABEnc):
33
+ """
34
+ >>> from charm.toolbox.pairinggroup import PairingGroup,GT
35
+ >>> group = PairingGroup('MNT224')
36
+ >>> kpabe = EKPabe(group)
37
+ >>> attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
38
+ >>> (master_public_key, master_key) = kpabe.setup(attributes)
39
+ >>> policy = '(ONE or THREE) and (THREE or TWO)'
40
+ >>> secret_key = kpabe.keygen(master_public_key, master_key, policy)
41
+ >>> msg = b"Some Random Message"
42
+ >>> cipher_text = kpabe.encrypt(master_public_key, msg, attributes)
43
+ >>> decrypted_msg = kpabe.decrypt(cipher_text, secret_key)
44
+ >>> decrypted_msg == msg
45
+ True
46
+ """
47
+
48
+ def __init__(self, groupObj, verbose=False):
49
+ ABEnc.__init__(self)
50
+ global group, util
51
+ group = groupObj
52
+ util = SecretUtil(group, verbose)
53
+
54
+ def setup(self, attributes):
55
+ s = group.random(ZR)
56
+ g = group.random(G1)
57
+
58
+ self.attributeSecrets = {}
59
+ self.attribute = {}
60
+ for attr in attributes:
61
+ si = group.random(ZR)
62
+ self.attributeSecrets[attr] = si
63
+ self.attribute[attr] = g**si
64
+ return (g**s, s) # (pk, mk)
65
+
66
+ def keygen(self, pk, mk, policy_str):
67
+ policy = util.createPolicy(policy_str)
68
+ attr_list = util.getAttributeList(policy)
69
+
70
+ s = mk
71
+ shares = util.calculateSharesDict(s, policy)
72
+
73
+ d = {}
74
+ D = { 'policy': policy_str, 'Du': d }
75
+ for x in attr_list:
76
+ y = util.strip_index(x)
77
+ d[y] = shares[x]/self.attributeSecrets[y]
78
+ if debug: print(str(y) + " d[y] " + str(d[y]))
79
+ if debug: print("Access Policy for key: %s" % policy)
80
+ if debug: print("Attribute list: %s" % attr_list)
81
+ return D
82
+
83
+ def encrypt(self, pk, M, attr_list):
84
+ if debug: print('Encryption Algorithm...')
85
+ k = group.random(ZR);
86
+ Cs = pk ** k
87
+
88
+ Ci = {}
89
+ for attr in attr_list:
90
+ Ci[attr] = self.attribute[attr] ** k
91
+
92
+ symcrypt = SymmetricCryptoAbstraction(extractor(Cs))
93
+ C = symcrypt.encrypt(M)
94
+
95
+ return { 'C': C, 'Ci': Ci, 'attributes': attr_list }
96
+
97
+ def decrypt(self, C, D):
98
+ policy = util.createPolicy(D['policy'])
99
+ attrs = util.prune(policy, C['attributes'])
100
+ if attrs == False:
101
+ return False
102
+ coeff = util.getCoefficients(policy)
103
+
104
+ Z = {}
105
+ prodT = 1
106
+ for i in range(len(attrs)):
107
+ x = attrs[i].getAttribute()
108
+ y = attrs[i].getAttributeAndIndex()
109
+ Z[y] = C['Ci'][x] ** D['Du'][x]
110
+ prodT *= Z[y] ** coeff[y]
111
+
112
+ symcrypt = SymmetricCryptoAbstraction(extractor(prodT))
113
+
114
+ return symcrypt.decrypt(C['C'])
115
+
116
+ def main():
117
+ groupObj = PairingGroup('MNT224')
118
+ kpabe = EKPabe(groupObj)
119
+
120
+ attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
121
+
122
+ (pk, mk) = kpabe.setup(attributes)
123
+
124
+ # policy = '(ONE or THREE) and (THREE or TWO)'
125
+ policy = 'THREE and (ONE or TWO)'
126
+ msg = b"Some Random Message"
127
+
128
+ mykey = kpabe.keygen(pk, mk, policy)
129
+
130
+ if debug: print("Encrypt under these attributes: ", attributes)
131
+ ciphertext = kpabe.encrypt(pk, msg, attributes)
132
+ if debug: print(ciphertext)
133
+
134
+ rec_msg = kpabe.decrypt(ciphertext, mykey)
135
+ assert rec_msg
136
+ if debug: print("rec_msg=%s" % str(rec_msg))
137
+
138
+ assert msg == rec_msg
139
+ if debug: print("Successful Decryption!")
140
+
141
+ def benchmark():
142
+ groupObj1 = PairingGroup('MNT224')
143
+ groupObj2 = PairingGroup('MNT224')
144
+ ekpabe = EKPabe(groupObj1)
145
+ kpabe = KPabe(groupObj2)
146
+
147
+ t1_s = 0
148
+ t1_k = 0
149
+ t1_e = 0
150
+ t1_d = 0
151
+ t2_s = 0
152
+ t2_k = 0
153
+ t2_e = 0
154
+ t2_d = 0
155
+
156
+ attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
157
+ policy = 'THREE and (ONE or TWO)'
158
+ msg1 = b"Some Random Message"
159
+ msg2 = groupObj2.random(GT)
160
+
161
+ for b in range(4):
162
+ start = time()
163
+ (epk, emk) = ekpabe.setup(attributes)
164
+ t1_s += time() - start
165
+
166
+ start = time()
167
+ (pk, mk) = kpabe.setup()
168
+ t2_s += time() - start
169
+
170
+ start = time()
171
+ emykey = ekpabe.keygen(epk, emk, policy)
172
+ t1_k += time() - start
173
+
174
+ start = time()
175
+ mykey = kpabe.keygen(pk, mk, policy)
176
+ t2_k += time() - start
177
+
178
+ for i in range(50):
179
+ start = time()
180
+ eciphertext = ekpabe.encrypt(epk, msg1, attributes)
181
+ t1_e += time() - start
182
+
183
+ start = time()
184
+ ciphertext = kpabe.encrypt(pk, msg2, attributes)
185
+ t2_e += time() - start
186
+
187
+ start = time()
188
+ erec_msg = ekpabe.decrypt(eciphertext, emykey)
189
+ t1_d += time() - start
190
+
191
+ start = time()
192
+ rec_msg = kpabe.decrypt(ciphertext, mykey)
193
+ t2_d += time() - start
194
+
195
+ assert msg1 == erec_msg
196
+ assert msg2 == rec_msg
197
+
198
+ print ("yct14 s=%s k=%s e=%s d=%s" % (t1_s, t1_k, t1_e, t1_d))
199
+ print ("lsw08 s=%s k=%s e=%s d=%s" % (t2_s, t2_k, t2_e, t2_d))
200
+
201
+ # Result in VM:
202
+ # yct14 s=0.1 k=0.02 e=3.44 d=2.91
203
+ # lsw08 s=0.42 k=0.41 e=10.32 d=21.25
204
+
205
+ if __name__ == "__main__":
206
+ # debug = True
207
+ # main()
208
+ benchmark()