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,91 @@
1
+ import charm.core.crypto.cryptobase
2
+ from charm.core.math.pairing import pairing,pc_element,ZR
3
+ from charm.core.math.integer import integer,int2Bytes
4
+ from charm.toolbox.conversion import Conversion
5
+ from charm.toolbox.bitstring import Bytes
6
+ import hashlib, base64
7
+
8
+ class Hash():
9
+ def __init__(self, pairingElement=None, htype='sha256', integerElement=None):
10
+ self.hash_type = htype
11
+ # instance of PairingGroup
12
+ self.group = pairingElement
13
+
14
+ def hashToZn(self, value):
15
+ if type(value) == pc_element:
16
+ h = hashlib.new(self.hash_type)
17
+ h.update(self.group.serialize(value))
18
+ #print "digest => %s" % h.hexdigest()
19
+ # get raw bytes of digest and hash to Zr
20
+ val = h.digest()
21
+ return integer(int(self.group.hash(val, ZR)))
22
+ # do something related to that
23
+ if type(value) == integer:
24
+ str_value = int2Bytes(value)
25
+ #print("str_value =>", str_value)
26
+ #val = self.group.hash(str_value, ZR)
27
+ #print("hash =>", val)
28
+ return integer(int(self.group.hash(str_value, ZR)))
29
+ return None
30
+
31
+ # takes two arbitrary strings and hashes to an element of Zr
32
+ def hashToZr(self, *args):
33
+ if isinstance(args, tuple):
34
+ #print("Hashing =>", args)
35
+ strs = ""
36
+ for i in args:
37
+ if type(i) == str:
38
+ strs += str(base64.encodebytes(bytes(i, 'utf8')))
39
+ elif type(i) == bytes:
40
+ strs += str(base64.encodebytes(i))
41
+ elif type(i) == integer:
42
+ strs += str(base64.encodebytes(int2Bytes(i)))
43
+ elif type(i) == pc_element:
44
+ strs += str(base64.encodebytes(self.group.serialize(i)))
45
+
46
+ if len(strs) > 0:
47
+ return self.group.hash(strs, ZR)
48
+ return None
49
+
50
+
51
+ """
52
+ Waters Hash technique: how to hash in standard model.
53
+ Default - len=8, bits=32 ==> 256-bits total (for SHA-256)
54
+ For SHA1, len=5 bits=32 ==> 160-bits total
55
+ """
56
+ class Waters:
57
+ """
58
+ >>> from charm.toolbox.pairinggroup import *
59
+ >>> from charm.toolbox.hash_module import Waters
60
+ >>> group = PairingGroup("SS512")
61
+ >>> waters = Waters(group, length=8, bits=32)
62
+ >>> a = waters.hash("user@email.com")
63
+ """
64
+ def __init__(self, group, length=8, bits=32, hash_func='sha256'):
65
+ self._group = group
66
+ self._length = length
67
+ self._bitsize = bits
68
+ self.hash_function = hash_func
69
+ self._hashObj = hashlib.new(self.hash_function)
70
+ self.hashLen = len(self._hashObj.digest())
71
+
72
+ def sha2(self, message):
73
+ h = self._hashObj.copy()
74
+ h.update(bytes(message, 'utf-8'))
75
+ return Bytes(h.digest())
76
+
77
+ def hash(self, strID):
78
+ '''Hash the identity string and break it up in to l bit pieces'''
79
+ assert type(strID) == str, "invalid input type"
80
+ hash = self.sha2(strID)
81
+
82
+ val = Conversion.OS2IP(hash) #Convert to integer format
83
+ bstr = bin(val)[2:] #cut out the 0b header
84
+
85
+ v=[]
86
+ for i in range(self._length): #z must be greater than or equal to 1
87
+ binsubstr = bstr[self._bitsize*i : self._bitsize*(i+1)]
88
+ intval = int(binsubstr, 2)
89
+ intelement = self._group.init(ZR, intval)
90
+ v.append(intelement)
91
+ return v
@@ -0,0 +1,323 @@
1
+ try:
2
+ #from charm.core.math.integer import integer,randomBits,random,randomPrime,isPrime,encode,decode,hashInt,bitsize,legendre,gcd,lcm,serialize,deserialize,int2Bytes,toInt
3
+ from charm.core.math.integer import * #InitBenchmark,StartBenchmark,EndBenchmark,GetBenchmark,GetGeneralBenchmarks,ClearBenchmark
4
+ # Verify we got actual implementations, not mocks (for Sphinx autodoc)
5
+ _test = integer
6
+ except Exception as err:
7
+ # Provide stub implementations for documentation purposes (Sphinx autodoc)
8
+ # These allow modules to be imported for documentation generation
9
+ # but will raise errors if actually used at runtime
10
+ class integer:
11
+ """Stub class for documentation. Requires C extension for actual use."""
12
+ pass
13
+ def randomBits(bits): raise NotImplementedError("Requires C extension")
14
+ def random(max): raise NotImplementedError("Requires C extension")
15
+ def randomPrime(bits, safe=False): raise NotImplementedError("Requires C extension")
16
+ def isPrime(n): raise NotImplementedError("Requires C extension")
17
+ def encode(M, p, q): raise NotImplementedError("Requires C extension")
18
+ def decode(element, p, q): raise NotImplementedError("Requires C extension")
19
+ def hashInt(args, p, q, flag): raise NotImplementedError("Requires C extension")
20
+ def bitsize(n): raise NotImplementedError("Requires C extension")
21
+ def legendre(a, p): raise NotImplementedError("Requires C extension")
22
+ def gcd(a, b): raise NotImplementedError("Requires C extension")
23
+ def lcm(a, b): raise NotImplementedError("Requires C extension")
24
+ def serialize(obj): raise NotImplementedError("Requires C extension")
25
+ def deserialize(data): raise NotImplementedError("Requires C extension")
26
+ def int2Bytes(n): raise NotImplementedError("Requires C extension")
27
+ def toInt(obj): raise NotImplementedError("Requires C extension")
28
+ def InitBenchmark(): raise NotImplementedError("Requires C extension")
29
+ def StartBenchmark(options): raise NotImplementedError("Requires C extension")
30
+ def EndBenchmark(): raise NotImplementedError("Requires C extension")
31
+ def GetBenchmark(option): raise NotImplementedError("Requires C extension")
32
+ def GetGeneralBenchmarks(): raise NotImplementedError("Requires C extension")
33
+ def ClearBenchmark(): raise NotImplementedError("Requires C extension")
34
+
35
+ class IntegerGroup:
36
+ def __init__(self, start=0):
37
+ pass
38
+
39
+ def setparam(self, p, q):
40
+ if p == (2 * q) + 1 and isPrime(p) and isPrime(q):
41
+ self.p = integer(p)
42
+ self.q = integer(q)
43
+ return True
44
+ else:
45
+ print("p and q are not safe primes!")
46
+ return False
47
+
48
+ def __str__(self):
49
+ outStr = ""
50
+ outStr += "p = " + str(self.p) + "\n"
51
+ outStr += "q = " + str(self.q) + "\n"
52
+ return outStr
53
+
54
+ def paramgen(self, bits, r=2):
55
+ # determine which group
56
+ while True:
57
+ self.p = randomPrime(bits, 1)
58
+ self.q = (self.p - 1) / 2
59
+ if (isPrime(self.p) and isPrime(self.q)):
60
+ break
61
+ self.r = r
62
+ return None
63
+
64
+ def randomGen(self):
65
+ while True:
66
+ h = random(self.p)
67
+ g = (h ** self.r) % self.p
68
+ if not g == 1:
69
+ break
70
+ return g
71
+
72
+ def groupSetting(self):
73
+ return 'integer'
74
+
75
+ def groupType(self):
76
+ return 'SchnorrGroup mod p'
77
+
78
+ def groupOrder(self):
79
+ return bitsize(self.q)
80
+
81
+ def bitsize(self):
82
+ return bitsize(self.q) / 8
83
+
84
+ def isMember(self, x):
85
+ return x.isCongruent()
86
+
87
+ def random(self, max=0):
88
+ if max == 0:
89
+ return random(self.p)
90
+ else:
91
+ return random(max)
92
+
93
+ def encode(self, M):
94
+ return encode(M, self.p, self.q)
95
+
96
+ def decode(self, element):
97
+ return decode(element, self.p, self.q)
98
+
99
+ def serialize(self, object):
100
+ assert type(object) == integer, "cannot serialize non-integer types"
101
+ return serialize(object)
102
+
103
+ def deserialize(self, bytes_object):
104
+ assert type(bytes_object) == bytes, "cannot deserialize object"
105
+ return deserialize(bytes_object)
106
+
107
+ def hash(self, *args):
108
+ if isinstance(args, tuple):
109
+ #print "Hashing => '%s'" % args
110
+ return hashInt(args, self.p, self.q, False)
111
+ return None
112
+
113
+ def InitBenchmark(self):
114
+ """initiates the benchmark state"""
115
+ return InitBenchmark()
116
+
117
+ def StartBenchmark(self, options):
118
+ """starts the benchmark with any of these options:
119
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
120
+ return StartBenchmark(options)
121
+
122
+ def EndBenchmark(self):
123
+ """ends an ongoing benchmark"""
124
+ return EndBenchmark()
125
+
126
+ def GetGeneralBenchmarks(self):
127
+ """retrieves benchmark count for all group operations"""
128
+ return GetGeneralBenchmarks()
129
+
130
+ def GetBenchmark(self, option):
131
+ """retrieves benchmark results for any of these options:
132
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
133
+ return GetBenchmark(option)
134
+
135
+ class IntegerGroupQ:
136
+ def __init__(self, start=0):
137
+ pass
138
+
139
+ def __str__(self):
140
+ outStr = ""
141
+ outStr += "p = " + str(self.p) + "\n"
142
+ outStr += "q = " + str(self.q) + "\n"
143
+ return outStr
144
+
145
+ def setparam(self, p, q):
146
+ if p == (2 * q) + 1 and isPrime(p) and isPrime(q):
147
+ self.p = integer(p)
148
+ self.q = integer(q)
149
+ return True
150
+ else:
151
+ print("p and q are not safe primes!")
152
+ return False
153
+
154
+ def paramgen(self, bits, r=2):
155
+ # determine which group
156
+ while True:
157
+ self.p = randomPrime(bits, 1)
158
+ self.q = (self.p - 1) / 2
159
+ if (isPrime(self.p) and isPrime(self.q)):
160
+ break
161
+ self.r = r
162
+ return None
163
+
164
+ def randomG(self):
165
+ return self.randomGen()
166
+
167
+ def randomGen(self):
168
+ while True:
169
+ h = random(self.p)
170
+ g = (h ** self.r) % self.p
171
+ if not g == 1:
172
+ #print "g => %s" % g
173
+ break
174
+ return g
175
+
176
+ def groupSetting(self):
177
+ return 'integer'
178
+
179
+ def groupType(self):
180
+ return 'SchnorrGroup mod q'
181
+
182
+ def groupOrder(self):
183
+ return bitsize(self.q)
184
+
185
+ def messageSize(self):
186
+ return bitsize(self.q) / 8
187
+
188
+ def isMember(self, x):
189
+ return x.isCongruent()
190
+
191
+ def random(self, max=0):
192
+ if max == 0:
193
+ return random(self.q)
194
+ else:
195
+ return random(max)
196
+
197
+ def encode(self, M):
198
+ return encode(M, self.p, self.q)
199
+
200
+ def decode(self, element):
201
+ return decode(element, self.p, self.q)
202
+
203
+ def hash(self, *args):
204
+ if isinstance(args, tuple):
205
+ return hashInt(args, self.p, self.q, True)
206
+ List = []
207
+ for i in args:
208
+ List.append(i)
209
+ return hashInt(tuple(List), self.p, self.q, True)
210
+
211
+ def serialize(self, object):
212
+ assert type(object) == integer, "cannot serialize non-integer types"
213
+ return serialize(object)
214
+
215
+ def deserialize(self, bytes_object):
216
+ assert type(bytes_object) == bytes, "cannot deserialize object"
217
+ return deserialize(bytes_object)
218
+
219
+ def InitBenchmark(self):
220
+ """initiates the benchmark state"""
221
+ return InitBenchmark()
222
+
223
+ def StartBenchmark(self, options):
224
+ """starts the benchmark with any of these options:
225
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
226
+ return StartBenchmark(options)
227
+
228
+ def EndBenchmark(self):
229
+ """ends an ongoing benchmark"""
230
+ return EndBenchmark()
231
+
232
+ def GetGeneralBenchmarks(self):
233
+ """retrieves benchmark count for all group operations"""
234
+ return GetGeneralBenchmarks()
235
+
236
+ def GetBenchmark(self, option):
237
+ """retrieves benchmark results for any of these options:
238
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
239
+ return GetBenchmark(option)
240
+
241
+
242
+ class RSAGroup:
243
+ def __init__(self):
244
+ self.p = self.q = self.n = 0
245
+
246
+ def __str__(self):
247
+ outStr = ""
248
+ outStr += "p = " + str(self.p) + "\n"
249
+ outStr += "q = " + str(self.q) + "\n"
250
+ outStr += "N = " + str(self.n) + "\n"
251
+ return outStr
252
+
253
+ def paramgen(self, secparam):
254
+ # Generate two random primes for RSA/Paillier
255
+ # Note: gcd(p*q, (p-1)*(q-1)) is always 1 for distinct primes p, q
256
+ # so we don't need to check that condition
257
+ p, q = randomPrime(secparam), randomPrime(secparam)
258
+ n = p * q
259
+ self.p = p
260
+ self.q = q
261
+ self.n = n
262
+ return (p, q, n)
263
+
264
+ def setparam(self, p, q):
265
+ if isPrime(p) and isPrime(q) and p != q:
266
+ self.p = integer(p)
267
+ self.q = integer(q)
268
+ self.n = self.p * self.q
269
+ return True
270
+ else:
271
+ print("p and q are not primes!")
272
+ return False
273
+
274
+ def serialize(self, object):
275
+ assert type(object) == integer, "cannot serialize non-integer types"
276
+ return serialize(object)
277
+
278
+ def deserialize(self, bytes_object):
279
+ assert type(bytes_object) == bytes, "cannot deserialize object"
280
+ return deserialize(bytes_object)
281
+
282
+ def random(self, max=0):
283
+ if max == 0:
284
+ return random(self.n)
285
+ else:
286
+ return random(max)
287
+
288
+ def groupSetting(self):
289
+ return 'integer'
290
+
291
+ def groupType(self):
292
+ return 'RSAGroup mod p'
293
+
294
+ def groupOrder(self):
295
+ return bitsize(self.n)
296
+
297
+ def encode(self, value):
298
+ pass
299
+
300
+ def decode(self, value):
301
+ pass
302
+
303
+ def InitBenchmark(self):
304
+ """initiates the benchmark state"""
305
+ return InitBenchmark()
306
+
307
+ def StartBenchmark(self, options):
308
+ """starts the benchmark with any of these options:
309
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
310
+ return StartBenchmark(options)
311
+
312
+ def EndBenchmark(self):
313
+ """ends an ongoing benchmark"""
314
+ return EndBenchmark()
315
+
316
+ def GetGeneralBenchmarks(self):
317
+ """retrieves benchmark count for all group operations"""
318
+ return GetGeneralBenchmarks()
319
+
320
+ def GetBenchmark(self, option):
321
+ """retrieves benchmark results for any of these options:
322
+ RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
323
+ return GetBenchmark(option)
@@ -0,0 +1,22 @@
1
+
2
+ # simple example
3
+ #>>> a = [1,2,3,4,5]
4
+ #>>> dotprod(1, 1, len(a), lambda i,b: (b[i] ** 2), a)
5
+ # TODO: support caching of values at each stage of product?
6
+
7
+ def dotprod(init, skip, n, func, *args):
8
+ prod = init
9
+ i = 0
10
+ for j in range(i, n):
11
+ if j != skip:
12
+ result = func(j, *args)
13
+ # cache if necessary
14
+ prod *= result
15
+ #print("product =>", prod)
16
+ return prod
17
+
18
+ def dotprod2(iterator, func, *args):
19
+ prod = 1
20
+ for j in iterator:
21
+ prod *= func(j, *args)
22
+ return prod
@@ -0,0 +1,76 @@
1
+
2
+ '''
3
+ :Authors: Fan Zhang(zfwise@gwu.edu), supported by GWU computer science department
4
+ :Date: 3/2013
5
+ :Note: Matrix operations over finite fields
6
+ '''
7
+ def GaussEliminationinGroups(m):
8
+ #The code was original found at: http://ine.scripts.mit.edu/blog/2011/05/gaussian-elimination-in-python/
9
+ #Here is an example: suppose you have A= [[1,2],
10
+ # [3,4]]
11
+ #and you want AX = I.
12
+ #if X = [[x1,x2],[x3,x4]] and I = [[1,0],[0,1]]
13
+ #GaussEliminationinGroups([1,2,1],[3,4,0])-->[x1,x3]
14
+ #GaussEliminationinGroups([1,2,0],[3,4,1])-->[x2,x4]
15
+ #then X = MatrixTransGroups[[x1,x3],[x2,x4]]
16
+
17
+ #eliminate columns
18
+ for col in range(len(m[0])):
19
+ for row in range(col+1, len(m)):
20
+ r = [(rowValue * (-(m[row][col] / m[col][col]))) for rowValue in m[col]]
21
+ m[row] = [ (pair[0]+pair[1]) for pair in zip(m[row], r)]
22
+ #now backsolve by substitution
23
+ ans = []
24
+ m.reverse() #makes it easier to backsolve
25
+ for sol in range(len(m)):
26
+ if sol == 0:
27
+ ans.append(m[sol][-1] / m[sol][-2])
28
+ else:
29
+ inner = 0
30
+ #substitute in all known coefficients
31
+ for x in range(sol):
32
+ inner += (ans[x]*m[sol][-2-x])
33
+ #the equation is now reduced to ax + b = c form
34
+ #solve with (c - b) / a
35
+ ans.append((m[sol][-1]-inner)/m[sol][-sol-2])
36
+ ans.reverse()
37
+ return ans
38
+
39
+ def MatrixMulGroups(matrix1,matrix2):
40
+ # Matrix multiplication
41
+ if len(matrix1[0]) != len(matrix2):
42
+ # Check matrix dimensions
43
+ print('Matrices must be m*n and n*p to multiply!')
44
+ else:
45
+ # Multiply if correct dimensions
46
+ new_matrix = [[0 for row in range(len(matrix2[0]))] for col in range(len(matrix1))]
47
+ for i in range(len(matrix1)):
48
+ for j in range(len(matrix2[0])):
49
+ for k in range(len(matrix2)):
50
+ new_matrix[i][j] += matrix1[i][k]*matrix2[k][j]
51
+ return new_matrix
52
+
53
+ def MatrixAddGroups(matrix1,matrix2):
54
+ # Matrix Addition
55
+ if (len(matrix1[0]) != len(matrix2[0]) or len(matrix1) != len(matrix2)):
56
+ # Check matrix dimensions
57
+ print('Matrices must be m*m and m*m to Add!')
58
+ else:
59
+ # Add if correct dimensions
60
+ rows = len(matrix1)
61
+ columns =len(matrix1[0])
62
+ result = [[matrix1[row][col] + matrix2[row][col] for col in range(columns)] for row in range(rows)]
63
+ return result
64
+
65
+ def MatrixScalarMulGroups(lamda , matrix):
66
+ # Matrix Scalar Mul
67
+ rows = len(matrix)
68
+ columns =len(matrix[0])
69
+ result = [[matrix[row][col] * lamda for col in range(columns)] for row in range(rows)]
70
+ return result
71
+
72
+ def MatrixTransGroups(matrix):
73
+ # Matrix transpose,
74
+ result = [[r[col] for r in matrix] for col in range(len(matrix[0]))]
75
+ return result
76
+