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,179 @@
1
+ '''
2
+ **Hidden-Vector Encryption (HVE08)**
3
+
4
+ *Authors:* Vincenzo Iovino, Giuseppe Persiano
5
+
6
+ | **Title:** "Hidden-Vector Encryption with Groups of Prime Order"
7
+ | **Published in:** Pairing-Based Cryptography (Pairing), 2008
8
+ | **Available from:** http://dl.acm.org/citation.cfm?id=1431889
9
+ | **Notes:** Predicate encryption supporting hidden-vector queries
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** predicate encryption (public key)
14
+ * **Setting:** Pairing groups (prime order)
15
+ * **Assumption:** Decisional Linear
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Matthew W. Pagano
20
+ :Date: 12/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
23
+
24
+ debug = True
25
+ class HVE08:
26
+ def __init__(self, groupObj):
27
+ global group
28
+ group = groupObj
29
+
30
+ def setup(self, n):
31
+ g1 = group.random(G1)
32
+ g2 = group.random(G2)
33
+ y = group.random(ZR)
34
+ Y = pair(g1, g2) ** y
35
+
36
+ T = {}; t = {}; V = {}; v = {}; R = {}
37
+ r = {}; M = {}; m = {}
38
+
39
+ for i in range(0, n):
40
+ t[i] = group.random(ZR)
41
+ v[i] = group.random(ZR)
42
+ r[i] = group.random(ZR)
43
+ m[i] = group.random(ZR)
44
+
45
+ T[i] = g1 ** t[i]
46
+ V[i] = g1 ** v[i]
47
+ R[i] = g1 ** r[i]
48
+ M[i] = g1 ** m[i]
49
+
50
+ pk = {'g1':g1, 'g2':g2, 'n':n, 'Y':Y, 'T':T, 'V':V, 'R':R, 'M':M}
51
+ msk = {'y':y, 't':t, 'v':v, 'r':r, 'm':m}
52
+ return (pk, msk)
53
+
54
+ def keygen(self, pk, msk, yVector):
55
+ """yVector: expects binary attributes of 0 or 1 and "dont care" attribute is represented by the value 2.
56
+ """
57
+ g1 = pk['g1']
58
+ g2 = pk['g2']
59
+ n = pk['n']
60
+ y = msk['y']
61
+
62
+ yVectorLen = len(yVector)
63
+ assert (n == yVectorLen),"pk_hve08.py: length of yVector passed in to keygen is unequal to n passed in to setup."
64
+
65
+ numNonDontCares = 0
66
+ for i in range(0, yVectorLen):
67
+ if (yVector[i] != 2):
68
+ numNonDontCares += 1
69
+
70
+ if (numNonDontCares == 0):
71
+ sk = g2 ** y
72
+ return sk
73
+
74
+ a = {}
75
+ sum_ais_soFar = 0
76
+
77
+ for i in range(0, (numNonDontCares - 1)):
78
+ a[i] = group.random(ZR)
79
+ sum_ais_soFar += a[i]
80
+
81
+ a[(numNonDontCares - 1)] = y - sum_ais_soFar
82
+
83
+ YVector = {}
84
+ LVector = {}
85
+ current_a_index = 0
86
+
87
+ for i in range(0, yVectorLen):
88
+ if (yVector[i] == 0):
89
+ YVector[i] = g2 ** (a[current_a_index] / msk['r'][i])
90
+ LVector[i] = g2 ** (a[current_a_index] / msk['m'][i])
91
+ current_a_index += 1
92
+ elif (yVector[i] == 1):
93
+ YVector[i] = g2 ** (a[current_a_index] / msk['t'][i])
94
+ LVector[i] = g2 ** (a[current_a_index] / msk['v'][i])
95
+ current_a_index += 1
96
+ elif (yVector[i] == 2): # dont care attribute
97
+ YVector[i] = group.init(G2)
98
+ LVector[i] = group.init(G2)
99
+ else:
100
+ assert False,"pk_hve08.py: one of the yVector elements is not 0, 1, or 2 (only allowable values)."
101
+
102
+ sk = (YVector, LVector)
103
+ return sk
104
+
105
+ def encrypt(self, M, xVector, pk):
106
+ g1 = pk['g1']
107
+ n = pk['n']
108
+ Y = pk['Y']
109
+
110
+ s = group.random(ZR)
111
+
112
+ xVectorLen = len(xVector)
113
+ assert (n == xVectorLen),"pk_hve08.py: the length of the xVector passed in to encrypt is unequal to the n value passed in to setup."
114
+
115
+ s_i = {}
116
+
117
+ for i in range(0, n):
118
+ s_i[i] = group.random(ZR)
119
+
120
+ omega = M * (Y ** (-s))
121
+ C0 = g1 ** s
122
+
123
+ XVector = {}
124
+ WVector = {}
125
+
126
+ for i in range(0, n):
127
+ if (xVector[i] == 0):
128
+ XVector[i] = pk['R'][i] ** (s - s_i[i])
129
+ WVector[i] = pk['M'][i] ** (s_i[i])
130
+ elif (xVector[i] == 1):
131
+ XVector[i] = pk['T'][i] ** (s - s_i[i])
132
+ WVector[i] = pk['V'][i] ** (s_i[i])
133
+ else:
134
+ assert False,"pk_hve08.py: one of the xVector elements passed into encrypt is not either 0 or 1 (only allowable values)."
135
+
136
+ CT = (omega, C0, XVector, WVector)
137
+ return CT
138
+
139
+ def decrypt(self, CT, sk):
140
+ (omega, C0, XVector, WVector) = CT
141
+
142
+ try:
143
+ (YVector, LVector) = sk
144
+ except:
145
+ M = omega * pair(C0, sk)
146
+ return M
147
+
148
+ dotProd = 1
149
+
150
+ n = len(YVector)
151
+ if ( (n != len(LVector)) or (n != len(XVector)) or (n != len(WVector)) ):
152
+ assert False, "pk_hve08.py: lengths of the vectors passed to decrypt are unequal in at least one case."
153
+ for i in range(0, n):
154
+ if ( (YVector[i] != group.init(G2)) and (LVector[i] != group.init(G2)) ):
155
+ dotProd *= ( pair(XVector[i], YVector[i]) * pair(WVector[i], LVector[i]) )
156
+
157
+ M = omega * dotProd
158
+ return M
159
+
160
+ def main():
161
+ grp = PairingGroup("MNT224")
162
+
163
+ hve08 = HVE08(grp)
164
+ (pk, msk) = hve08.setup(4)
165
+ sk = hve08.keygen(pk, msk, [0, 1, 0, 0])
166
+ M = group.random(GT)
167
+ print(M)
168
+ print("\n\n")
169
+ CT = hve08.encrypt(M, [0, 1, 0, 0], pk)
170
+ M2 = hve08.decrypt(CT, sk)
171
+ print(M2)
172
+ if (M == M2):
173
+ print("success")
174
+ else:
175
+ print("failed")
176
+
177
+ if __name__ == "__main__":
178
+ debug = True
179
+ main()
@@ -0,0 +1,143 @@
1
+ '''
2
+ **Ciphertext-Policy ABE: Expressive and Efficient (Waters11)**
3
+
4
+ *Authors:* Brent Waters
5
+
6
+ | **Title:** "Ciphertext-Policy Attribute-Based Encryption: An Expressive, Efficient, and Provably Secure Realization"
7
+ | **Published in:** Public Key Cryptography (PKC), 2011
8
+ | **Available from:** https://doi.org/10.1007/978-3-642-19379-8_4
9
+ | **Notes:** Asymmetric version of the scheme in Section 3
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** ciphertext-policy attribute-based encryption
14
+ * **Setting:** Pairing groups
15
+ * **Assumption:** Decisional Parallel Bilinear Diffie-Hellman Exponent
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Shashank Agrawal
20
+ :Date: 05/2016
21
+ '''
22
+
23
+ from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
24
+ from charm.toolbox.ABEnc import ABEnc
25
+ from charm.toolbox.msp import MSP
26
+
27
+ debug = False
28
+
29
+
30
+ class Waters11(ABEnc):
31
+
32
+ def __init__(self, group_obj, uni_size, verbose=False):
33
+ ABEnc.__init__(self)
34
+ self.group = group_obj
35
+ self.uni_size = uni_size # bound on the size of the universe of attributes
36
+ self.util = MSP(self.group, verbose)
37
+
38
+ def setup(self):
39
+ """
40
+ Generates public key and master secret key.
41
+ """
42
+
43
+ if debug:
44
+ print('Setup algorithm:\n')
45
+
46
+ # pick a random element each from two source groups and pair them
47
+ g1 = self.group.random(G1)
48
+ g2 = self.group.random(G2)
49
+ alpha = self.group.random(ZR)
50
+ g1_alpha = g1 ** alpha
51
+ e_gg_alpha = pair(g1_alpha, g2)
52
+
53
+ a = self.group.random(ZR)
54
+ g1_a = g1 ** a
55
+
56
+ h = [0]
57
+ for i in range(self.uni_size):
58
+ h.append(self.group.random(G1))
59
+
60
+ pk = {'g1': g1, 'g2': g2, 'g1_a': g1_a, 'h': h, 'e_gg_alpha': e_gg_alpha}
61
+ msk = {'g1_alpha': g1_alpha}
62
+ return pk, msk
63
+
64
+ def keygen(self, pk, msk, attr_list):
65
+ """
66
+ Generate a key for a set of attributes.
67
+ """
68
+
69
+ if debug:
70
+ print('Key generation algorithm:\n')
71
+
72
+ t = self.group.random(ZR)
73
+ k0 = msk['g1_alpha'] * (pk['g1_a'] ** t)
74
+ L = pk['g2'] ** t
75
+
76
+ K = {}
77
+ for attr in attr_list:
78
+ K[attr] = pk['h'][int(attr)] ** t
79
+
80
+ return {'attr_list': attr_list, 'k0': k0, 'L': L, 'K': K}
81
+
82
+ def encrypt(self, pk, msg, policy_str):
83
+ """
84
+ Encrypt a message M under a monotone span program.
85
+ """
86
+
87
+ if debug:
88
+ print('Encryption algorithm:\n')
89
+
90
+ policy = self.util.createPolicy(policy_str)
91
+ mono_span_prog = self.util.convert_policy_to_msp(policy)
92
+ num_cols = self.util.len_longest_row
93
+
94
+ # pick randomness
95
+ u = []
96
+ for i in range(num_cols):
97
+ rand = self.group.random(ZR)
98
+ u.append(rand)
99
+ s = u[0] # shared secret
100
+
101
+ c0 = pk['g2'] ** s
102
+
103
+ C = {}
104
+ D = {}
105
+ for attr, row in mono_span_prog.items():
106
+ cols = len(row)
107
+ sum = 0
108
+ for i in range(cols):
109
+ sum += row[i] * u[i]
110
+ attr_stripped = self.util.strip_index(attr)
111
+ r_attr = self.group.random(ZR)
112
+ c_attr = (pk['g1_a'] ** sum) / (pk['h'][int(attr_stripped)] ** r_attr)
113
+ d_attr = pk['g2'] ** r_attr
114
+ C[attr] = c_attr
115
+ D[attr] = d_attr
116
+
117
+ c_m = (pk['e_gg_alpha'] ** s) * msg
118
+
119
+ return {'policy': policy, 'c0': c0, 'C': C, 'D': D, 'c_m': c_m}
120
+
121
+ def decrypt(self, pk, ctxt, key):
122
+ """
123
+ Decrypt ciphertext ctxt with key key.
124
+ """
125
+
126
+ if debug:
127
+ print('Decryption algorithm:\n')
128
+
129
+ nodes = self.util.prune(ctxt['policy'], key['attr_list'])
130
+ if not nodes:
131
+ print ("Policy not satisfied.")
132
+ return None
133
+
134
+ prodG = 1
135
+ prodGT = 1
136
+
137
+ for node in nodes:
138
+ attr = node.getAttributeAndIndex()
139
+ attr_stripped = self.util.strip_index(attr)
140
+ prodG *= ctxt['C'][attr]
141
+ prodGT *= pair(key['K'][attr_stripped], ctxt['D'][attr])
142
+
143
+ return (ctxt['c_m'] * pair(prodG, key['L']) * prodGT) / (pair(key['k0'], ctxt['c0']))
@@ -0,0 +1,150 @@
1
+ '''
2
+ **MuSig: Key Aggregation for Schnorr Signatures (MuSig)**
3
+
4
+ *Authors:* Gregory Maxwell, Andrew Poelstra, Yannick Seurin, Pieter Wuille
5
+
6
+ | **Title:** "Simple Schnorr Multi-Signatures with Applications to Bitcoin"
7
+ | **Published in:** ePrint Archive, 2018
8
+ | **Available from:** https://eprint.iacr.org/2018/068
9
+ | **Notes:** Designed for Bitcoin multi-signature applications
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** aggregate signature (Schnorr-based)
14
+ * **Setting:** elliptic curve groups
15
+ * **Assumption:** DL
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Lovesh Harchandani
20
+ :Date: 6/2018
21
+ '''
22
+
23
+ from functools import reduce
24
+
25
+ from charm.toolbox.eccurve import secp256k1
26
+ from charm.toolbox.ecgroup import ZR, G, ECGroup
27
+ from charm.core.engine.util import objectToBytes
28
+
29
+
30
+ debug = False
31
+
32
+
33
+ class MuSig:
34
+ def __init__(self, groupObj):
35
+ global group
36
+ group = groupObj
37
+
38
+ def keygen(self, g, secparam=None):
39
+ x = group.random()
40
+ g_x = g ** x
41
+ pk = {'g^x': g_x, 'g': g, 'identity': str(g_x), 'secparam': secparam}
42
+ sk = {'x': x}
43
+ return pk, sk
44
+
45
+ def sign(self, nonce, sk, pk, challenge, all_pub_keys):
46
+ hash_of_pub_keys = MuSig.hash_pub_keys(all_pub_keys)
47
+ h = group.hash(MuSig.dump(pk['g^x']) + MuSig.dump(hash_of_pub_keys), ZR)
48
+ return nonce + challenge * sk['x'] * h
49
+
50
+ def verify(self, pub_keys, sig, message):
51
+ apk = self.aggregated_pub_key(pub_keys)
52
+ R, s = sig
53
+ challenge = self.compute_challenge(apk, R, message)
54
+ g = pub_keys[0]['g']
55
+ return g ** s == R * (apk ** challenge)
56
+
57
+ @staticmethod
58
+ def aggregate_sigs(signatures):
59
+ return sum(signatures)
60
+
61
+ @staticmethod
62
+ def new_nonce():
63
+ return group.random()
64
+
65
+ @staticmethod
66
+ def aggregate_nonce(g, nonces):
67
+ return MuSig.product([g ** n for n in nonces])
68
+
69
+ @staticmethod
70
+ def hash_pub_keys(pub_keys):
71
+ acc = b''
72
+ for p in pub_keys:
73
+ acc += MuSig.dump(p['g^x'])
74
+ return group.hash(acc, ZR)
75
+
76
+ @staticmethod
77
+ def aggregated_pub_key(pub_keys):
78
+ hash_of_pub_keys = MuSig.hash_pub_keys(pub_keys)
79
+ hash_dump = MuSig.dump(hash_of_pub_keys)
80
+ xs = []
81
+ for pk in pub_keys:
82
+ d = MuSig.dump(pk['g^x']) + hash_dump
83
+ xs.append(pk['g^x'] ** group.hash(d, ZR))
84
+ return MuSig.product(xs)
85
+
86
+ @staticmethod
87
+ def compute_challenge(aggregated_pub_key, aggregate_nonce, message):
88
+ m = MuSig.dump(message)
89
+ message_hash = group.hash(m, ZR)
90
+ return group.hash(MuSig.dump(aggregated_pub_key) + MuSig.dump(aggregate_nonce) + MuSig.dump(message_hash))
91
+
92
+ @staticmethod
93
+ def product(seq):
94
+ return reduce(lambda x, y: x * y, seq)
95
+
96
+ @staticmethod
97
+ def dump(obj):
98
+ return objectToBytes(obj, group)
99
+
100
+
101
+ def main():
102
+ grp = ECGroup(secp256k1)
103
+ ms = MuSig(grp)
104
+ g = grp.random(G)
105
+ if debug:
106
+ print('Generator...', g)
107
+
108
+ msg = 'hello there'
109
+ num_signers = 5
110
+
111
+ if debug:
112
+ print('{} signers will sign {}'.format(num_signers, msg))
113
+
114
+ signers = [ms.keygen(g) for _ in range(num_signers)]
115
+
116
+ nonces = [ms.new_nonce() for _ in range(num_signers)]
117
+ an = ms.aggregate_nonce(g, nonces)
118
+ all_pub_keys = [signer[0] for signer in signers]
119
+
120
+ if debug:
121
+ print('Public keys...')
122
+ for pk in all_pub_keys:
123
+ print(pk)
124
+
125
+ apk = ms.aggregated_pub_key(all_pub_keys)
126
+ if debug:
127
+ print('Aggregated Public key: ', apk)
128
+
129
+ challenge = ms.compute_challenge(apk, an, msg)
130
+ sigs = [ms.sign(nonces[i], signers[i][1], signers[i][0], challenge, all_pub_keys) for i in range(num_signers)]
131
+
132
+ if debug:
133
+ print('Signatures...')
134
+ for sig in sigs:
135
+ print(sig)
136
+
137
+ asig = ms.aggregate_sigs(sigs)
138
+
139
+ if debug:
140
+ print('Aggregated signature: ', asig)
141
+
142
+ assert ms.verify(all_pub_keys, (an, asig), msg), 'Aggregated sig verification failed'
143
+
144
+ if debug:
145
+ print('Verification succeeded')
146
+
147
+
148
+ if __name__ == "__main__":
149
+ debug = True
150
+ main()