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
charm/toolbox/Hash.py ADDED
@@ -0,0 +1,39 @@
1
+ from charm.toolbox.schemebase import *
2
+
3
+ class Hash(SchemeBase):
4
+ ''' Base class for Hash functions
5
+
6
+ Notes: This class implements an interface for a standard hash function scheme.
7
+ A hash function consists of two algorithms: (paramgen or keygen and hash).
8
+ '''
9
+
10
+ def __init__(self):
11
+ SchemeBase.__init__(self)
12
+ SchemeBase._setProperty(self, scheme='Hash')
13
+ self.baseSecDefs = None # Enum('EU_CMA')
14
+ # base methods?
15
+ def paramgen(self, *args):
16
+ raise NotImplementedError
17
+
18
+ def hash(self, *args):
19
+ raise NotImplementedError
20
+
21
+
22
+ class ChamHash(Hash):
23
+ '''
24
+ Notes: This class implements an interface for a chameleon hash function.
25
+ A standard charmeleon hash scheme has two algorithms paramgen and hash.
26
+ paramgen accepts a security parameter and the length of p and q. Hash accepts
27
+ public key, label, a message and a random element.
28
+ '''
29
+
30
+ def __init__(self):
31
+ Hash.__init__(self)
32
+ Hash._setProperty(self, scheme='ChamHash')
33
+ self.baseSecDefs = None # Enum('EU_CMA')
34
+
35
+ def paramgen(self, secparam, p=None, q=None):
36
+ raise NotImplementedError
37
+
38
+ def hash(self, pk, prefix, message, r):
39
+ raise NotImplementedError
charm/toolbox/IBEnc.py ADDED
@@ -0,0 +1,62 @@
1
+ '''
2
+ Base class for identity-based encryption
3
+
4
+ Notes: This class implements an interface for a standard identity-based encryption scheme.
5
+ Identity-based encryption consists of three algorithms: (setup, extract, encrypt, and decrypt).
6
+ '''
7
+ from charm.toolbox.schemebase import *
8
+
9
+ ibeBaseSecDefs = Enum('IND_ID_CPA','IND_sID_CPA','IND_ID_CCA','IND_sID_CCA', 'IND_ID_CCA2')
10
+ IND_ID_CPA,IND_sID_CPA,IND_ID_CCA,IND_sID_CCA,IND_ID_CCA2='IND_ID_CPA','IND_sID_CPA','IND_ID_CCA','IND_sID_CCA', 'IND_ID_CCA2'
11
+
12
+ ibeSchemeType='ibeScheme'
13
+
14
+ class IBEnc(SchemeBase):
15
+ def __init__(self):
16
+ SchemeBase.__init__(self)
17
+ SchemeBase._setProperty(self, scheme='IBEnc')
18
+
19
+ def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
20
+ assert secDef is not None and secDef in ibeBaseSecDefs.getList(), "not a valid security definition for this scheme type."
21
+ SchemeBase._setProperty(self, None, ibeBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
22
+ return True
23
+
24
+ def getProperty(self):
25
+ baseProp = SchemeBase._getProperty(self)
26
+ return baseProp
27
+
28
+ def checkProperty(self, schemeObj, _reqProps):
29
+ reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
30
+ result = SchemeBase._checkProperty(self, schemeObj, reqProps)
31
+ return result
32
+
33
+ def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
34
+ # 1. inherit the scheme's properties
35
+ assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
36
+ self.properties.update(scheme.getProperty())
37
+ # 2. make sure things are consistent, then update to new properties
38
+ assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
39
+ assert secDef is not None and secDef in ibeBaseSecDefs.getList(), "not a valid security definition for this scheme type."
40
+ SchemeBase._setProperty(self, None, ibeBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
41
+ return
42
+
43
+ def printProperties(self):
44
+ name = str(self.__class__).split("'")[-2].split(".")[-1]
45
+ print("<=== %s Properties ===>" % name)
46
+ for k,v in self.properties.items():
47
+ print(k, ":", v)
48
+ print("<=== %s Properties ===>" % name)
49
+ return
50
+
51
+ def setup(self):
52
+ raise NotImplementedError
53
+
54
+ def extract(self, mk, ID):
55
+ raise NotImplementedError
56
+
57
+ def encrypt(self, pk, ID, message):
58
+ raise NotImplementedError
59
+
60
+ def decrypt(self, pk, sk, ct):
61
+ raise NotImplementedError
62
+
charm/toolbox/IBSig.py ADDED
@@ -0,0 +1,64 @@
1
+ '''
2
+ Base class for identity-based signatures
3
+
4
+ Notes: This class implements an interface for a standard identity-based signatures scheme.
5
+ Identity-based signatures consists of four algorithms: (setup, keygen, sign and verify).
6
+ '''
7
+ from charm.toolbox.schemebase import *
8
+
9
+ ibsigBaseSecDefs = Enum('EU_CMA', 'wEU_CMA', 'sEU_CMA')
10
+ EU_CMA,wEU_CMA,sEU_CMA="EU_CMA","wEU_CMA","sEU_CMA"
11
+
12
+ ibsigSchemeType='ibsigScheme'
13
+
14
+ class IBSig(SchemeBase):
15
+ def __init__(self):
16
+ SchemeBase.__init__(self)
17
+ SchemeBase._setProperty(self, scheme='IBSig')
18
+
19
+ def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
20
+ assert secDef is not None and secDef in ibsigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
21
+ SchemeBase._setProperty(self, None, ibsigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
22
+ return True
23
+
24
+ def getProperty(self):
25
+ baseProp = SchemeBase._getProperty(self)
26
+ return baseProp
27
+
28
+ def checkProperty(self, schemeObj, _reqProps):
29
+ reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
30
+ result = SchemeBase._checkProperty(self, schemeObj, reqProps)
31
+ if result == True:
32
+ self.setScheme(schemeObj)
33
+ return result
34
+
35
+ def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
36
+ # 1. inherit the scheme's properties
37
+ assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
38
+ self.properties.update(scheme.getProperty())
39
+ # 2. make sure things are consistent, then update to new properties
40
+ assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
41
+ assert secDef is not None and secDef in ibsigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
42
+ SchemeBase._setProperty(self, None, ibsigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
43
+ return
44
+
45
+ def printProperties(self):
46
+ name = str(self.__class__).split("'")[-2].split(".")[-1]
47
+ print("<=== %s Properties ===>" % name)
48
+ for k,v in self.properties.items():
49
+ print(k, ":", v)
50
+ print("<=== %s Properties ===>" % name)
51
+ return
52
+
53
+ def setup(self):
54
+ raise NotImplementedError
55
+
56
+ def keygen(self, msk, ID):
57
+ raise NotImplementedError
58
+
59
+ def sign(self, pk, sk, M):
60
+ raise NotImplementedError
61
+
62
+ def verify(self, pk, M, sig):
63
+ raise NotImplementedError
64
+
charm/toolbox/PKEnc.py ADDED
@@ -0,0 +1,66 @@
1
+ '''
2
+ Base class for public-key encryption
3
+
4
+ Notes: This class implements an interface for a standard public-key encryption scheme.
5
+ A public key encryption consists of four algorithms: (paramgen, keygen, encrypt, decrypt).
6
+ '''
7
+ from charm.toolbox.schemebase import *
8
+
9
+ encBaseSecDefs = Enum('OW_CPA','OW_CCA1','OW_CCA','IND_CPA','IND_CCA1','IND_CCA',
10
+ 'NM_CPA','NM_CCA1','NM_CCA','KA_CPA','KA_CCA1','KA_CCA')
11
+
12
+ OW_CPA,OW_CCA1,OW_CCA="OW_CPA","OW_CCA1","OW_CCA"
13
+ IND_CPA,IND_CCA1,IND_CCA="IND_CPA","IND_CCA1","IND_CCA"
14
+ NM_CPA,NM_CCA1,NM_CCA="NM_CPA","NM_CCA1","NM_CCA"
15
+ KA_CPA,KA_CCA1,KA_CCA='KA_CPA','KA_CCA1','KA_CCA'
16
+
17
+ pkencSchemeType="pkeScheme"
18
+
19
+ class PKEnc(SchemeBase):
20
+ def __init__(self):
21
+ SchemeBase.__init__(self)
22
+ SchemeBase._setProperty(self, scheme='PKEnc')
23
+
24
+ def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
25
+ assert secDef is not None and secDef in encBaseSecDefs.getList(), "not a valid security definition for this scheme type."
26
+ SchemeBase._setProperty(self, None, encBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
27
+ return True
28
+
29
+ def getProperty(self):
30
+ baseProp = SchemeBase._getProperty(self)
31
+ return baseProp
32
+
33
+ def checkProperty(self, schemeObj, _reqProps):
34
+ reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
35
+ result = SchemeBase._checkProperty(self, schemeObj, reqProps)
36
+ return result
37
+
38
+ def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
39
+ # 1. inherit the scheme's properties
40
+ assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
41
+ self.properties.update(scheme.getProperty())
42
+ # 2. make sure things are consistent, then update to new properties
43
+ assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
44
+ assert secDef is not None and secDef in encBaseSecDefs.getList(), "not a valid security definition for this scheme type."
45
+ SchemeBase._setProperty(self, None, encBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
46
+ return
47
+
48
+ def printProperties(self):
49
+ name = str(self.__class__).split("'")[-2].split(".")[-1]
50
+ print("<=== %s Properties ===>" % name)
51
+ for k,v in self.properties.items():
52
+ print(k, ":", v)
53
+ print("<=== %s Properties ===>" % name)
54
+ return
55
+
56
+ def paramgen(self, param1=None, param2=None):
57
+ return NotImplemented
58
+
59
+ def keygen(self, securityparam):
60
+ return NotImplemented
61
+
62
+ def encrypt(self, pk, M):
63
+ return NotImplemented
64
+
65
+ def decrypt(self, pk, sk, c):
66
+ return NotImplemented
charm/toolbox/PKSig.py ADDED
@@ -0,0 +1,56 @@
1
+ '''
2
+ Base class for public-key signatures
3
+
4
+ Notes: This class implements an interface for a standard public-key signature scheme.
5
+ A public key signature consists of three algorithms: (keygen, sign, verify).
6
+ '''
7
+ from charm.toolbox.schemebase import *
8
+
9
+ pksigBaseSecDefs = Enum('EU_CMA', 'wEU_CMA', 'sEU_CMA')
10
+ EU_CMA,wEU_CMA,sEU_CMA="EU_CMA","wEU_CMA","sEU_CMA"
11
+
12
+ class PKSig(SchemeBase):
13
+ def __init__(self):
14
+ SchemeBase.__init__(self)
15
+ SchemeBase._setProperty(self, scheme='PKSig')
16
+
17
+ def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
18
+ assert secDef is not None and secDef in pksigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
19
+ SchemeBase._setProperty(self, None, pksigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
20
+ return True
21
+
22
+ def getProperty(self):
23
+ baseProp = SchemeBase._getProperty(self)
24
+ return baseProp
25
+
26
+ def checkProperty(self, schemeObj, _reqProps):
27
+ reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
28
+ result = SchemeBase._checkProperty(self, schemeObj, reqProps)
29
+ return result
30
+
31
+ def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
32
+ # 1. inherit the scheme's properties
33
+ assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
34
+ self.properties.update(scheme.getProperty())
35
+ # 2. make sure things are consistent, then update to new properties
36
+ assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
37
+ assert secDef is not None and secDef in pksigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
38
+ SchemeBase._setProperty(self, None, pksigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
39
+ return
40
+
41
+ def printProperties(self):
42
+ name = str(self.__class__).split("'")[-2].split(".")[-1]
43
+ print("<=== %s Properties ===>" % name)
44
+ for k,v in self.properties.items():
45
+ print(k, ":", v)
46
+ print("<=== %s Properties ===>" % name)
47
+ return
48
+
49
+ def keygen(self, securityparam):
50
+ raise NotImplementedError
51
+
52
+ def sign(self, pk, sk, message):
53
+ raise NotImplementedError
54
+
55
+ def verify(self, pk, message, sig):
56
+ raise NotImplementedError
charm/toolbox/PREnc.py ADDED
@@ -0,0 +1,32 @@
1
+ ''' Base class for Proxy Re-Encryption
2
+
3
+ Notes: This class implements an interface for a standard proxy re-encryption scheme.
4
+
5
+ A proxy re-encryption scheme consists of six algorithms:
6
+ (setup, keygen, encrypt, decrypt, rekeygen, re_encrypt).
7
+ '''
8
+ from charm.toolbox.schemebase import *
9
+
10
+ class PREnc(SchemeBase):
11
+ def __init__(self):
12
+ SchemeBase.__init__(self)
13
+ SchemeBase._setProperty(self, scheme='PREnc')
14
+ #self.baseSecDefs = Enum('IND_AB_CPA', 'IND_AB_CCA', 'sIND_AB_CPA', 'sIND_AB_CCA')
15
+
16
+ def setup(self):
17
+ raise NotImplementedError
18
+
19
+ def keygen(self, params):
20
+ raise NotImplementedError
21
+
22
+ def encrypt(self, params, pk, M):
23
+ raise NotImplementedError
24
+
25
+ def decrypt(self, params, sk, ct):
26
+ raise NotImplementedError
27
+
28
+ def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
29
+ raise NotImplementedError
30
+
31
+ def re_encrypt(self, params, rk, c_a):
32
+ raise NotImplementedError
@@ -0,0 +1,289 @@
1
+ """
2
+ Base class for Zero-Knowledge Proof systems.
3
+
4
+ This module provides a base class for implementing zero-knowledge proof schemes
5
+ in the Charm cryptographic library. Zero-knowledge proofs allow a prover to
6
+ convince a verifier that a statement is true without revealing any additional
7
+ information beyond the validity of the statement.
8
+
9
+ The module defines:
10
+ - Security definitions for ZK proofs (HVZK, ZK, NIZK, SIM)
11
+ - Exception classes for error handling
12
+ - ZKProofBase class for implementing concrete ZK proof schemes
13
+ - Proof dataclass for storing proof components
14
+
15
+ Security Properties:
16
+ - HVZK: Honest-Verifier Zero-Knowledge - secure against honest verifiers
17
+ - ZK: Zero-Knowledge - secure against malicious verifiers
18
+ - NIZK: Non-Interactive Zero-Knowledge - no interaction required
19
+ - SIM: Simulation Sound - proofs cannot be simulated without witness
20
+
21
+ Example:
22
+ class SchnorrProof(ZKProofBase):
23
+ def setup(self, group):
24
+ # Initialize with the group
25
+ ...
26
+ def prove(self, statement, witness):
27
+ # Generate Schnorr proof
28
+ ...
29
+ def verify(self, statement, proof):
30
+ # Verify Schnorr proof
31
+ ...
32
+ """
33
+ from charm.toolbox.schemebase import *
34
+ from charm.toolbox.enum import *
35
+ from dataclasses import dataclass
36
+ from typing import Any, Optional
37
+
38
+ # Security definitions for zero-knowledge proofs
39
+ zkpSecDefs = Enum('HVZK', 'ZK', 'NIZK', 'SIM')
40
+ HVZK, ZK, NIZK, SIM = "HVZK", "ZK", "NIZK", "SIM"
41
+
42
+
43
+ class ZKProofError(Exception):
44
+ """Base exception for the ZKP module.
45
+
46
+ All ZKP-related exceptions inherit from this class, allowing
47
+ for broad exception catching when needed.
48
+ """
49
+ pass
50
+
51
+
52
+ class ZKParseError(ZKProofError):
53
+ """Error parsing ZK statements.
54
+
55
+ Raised when a zero-knowledge statement cannot be parsed,
56
+ typically due to malformed input or invalid syntax.
57
+ """
58
+ pass
59
+
60
+
61
+ class ZKValidationError(ZKProofError):
62
+ """Error validating inputs.
63
+
64
+ Raised when inputs to ZKP operations fail validation,
65
+ such as invalid group elements or malformed witnesses.
66
+ """
67
+ pass
68
+
69
+
70
+ class ZKProofVerificationError(ZKProofError):
71
+ """Proof verification failed.
72
+
73
+ Raised when a zero-knowledge proof fails verification,
74
+ indicating either an invalid proof or mismatched statement.
75
+ """
76
+ pass
77
+
78
+
79
+ @dataclass
80
+ class Proof:
81
+ """Dataclass to hold zero-knowledge proof components.
82
+
83
+ This class encapsulates all components of a zero-knowledge proof,
84
+ following the standard Sigma protocol structure (commitment, challenge, response).
85
+
86
+ Attributes:
87
+ commitment: The prover's initial commitment value(s). This is the first
88
+ message in a Sigma protocol, committing the prover to random values.
89
+ challenge: The challenge value from the verifier (or derived via Fiat-Shamir
90
+ for non-interactive proofs). Must be unpredictable to the prover.
91
+ response: The prover's response computed using the witness and challenge.
92
+ This allows the verifier to check the proof without learning the witness.
93
+ proof_type: String identifier for the type of proof (e.g., 'schnorr', 'dleq',
94
+ 'or', 'and'). Used for deserialization and validation.
95
+ version: Integer version number for the proof format. Allows for backward
96
+ compatibility when proof formats evolve.
97
+
98
+ Example:
99
+ proof = Proof(
100
+ commitment=g ** r,
101
+ challenge=hash(commitment, statement),
102
+ response=r + challenge * secret,
103
+ proof_type='schnorr',
104
+ version=1
105
+ )
106
+ """
107
+ commitment: Any
108
+ challenge: Any
109
+ response: Any
110
+ proof_type: str
111
+ version: int = 1
112
+
113
+
114
+ class ZKProofBase(SchemeBase):
115
+ """Base class for zero-knowledge proof schemes.
116
+
117
+ This class provides the foundation for implementing zero-knowledge proof
118
+ systems in Charm. Concrete implementations should extend this class and
119
+ implement all abstract methods.
120
+
121
+ A zero-knowledge proof scheme consists of three core algorithms:
122
+ - setup: Initialize the proof system with group parameters
123
+ - prove: Generate a proof that a statement is true given a witness
124
+ - verify: Verify that a proof is valid for a given statement
125
+
126
+ Additionally, serialization methods are provided for proof persistence
127
+ and network transmission.
128
+
129
+ Security Properties:
130
+ Implementations should specify their security level using setProperty():
131
+ - HVZK: Secure against honest verifiers only
132
+ - ZK: Secure against malicious verifiers (requires simulation)
133
+ - NIZK: Non-interactive (typically via Fiat-Shamir transform)
134
+ - SIM: Simulation soundness (proofs unforgeable even with simulated proofs)
135
+
136
+ Example:
137
+ class MyZKProof(ZKProofBase):
138
+ def __init__(self):
139
+ ZKProofBase.__init__(self)
140
+ self.setProperty(secDef='NIZK', assumption='DL', secModel='ROM')
141
+ """
142
+
143
+ def __init__(self):
144
+ """Initialize the ZKProof base class.
145
+
146
+ Calls the parent SchemeBase constructor and sets the scheme type
147
+ to 'ZKProof' for property tracking and type checking.
148
+ """
149
+ SchemeBase.__init__(self)
150
+ SchemeBase._setProperty(self, scheme='ZKProof')
151
+
152
+ def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
153
+ """Set security properties for this ZK proof scheme.
154
+
155
+ Configures the security properties of the proof scheme, including
156
+ the security definition, hardness assumption, and security model.
157
+
158
+ Args:
159
+ secDef: Security definition, must be one of: 'HVZK', 'ZK', 'NIZK', 'SIM'.
160
+ Defines the zero-knowledge security level of the scheme.
161
+ assumption: The computational hardness assumption (e.g., 'DL', 'DDH').
162
+ Should be a string representing the underlying assumption.
163
+ messageSpace: Description of the valid message/statement space.
164
+ Can be a type or list of types.
165
+ secModel: Security model, typically 'SM' (standard), 'ROM' (random oracle),
166
+ or 'CRS' (common reference string).
167
+ **kwargs: Additional scheme-specific properties.
168
+
169
+ Returns:
170
+ bool: True if properties were set successfully.
171
+
172
+ Raises:
173
+ AssertionError: If secDef is not a valid security definition.
174
+ """
175
+ assert secDef is not None and secDef in zkpSecDefs.getList(), \
176
+ "not a valid security definition for this scheme type."
177
+ SchemeBase._setProperty(self, None, zkpSecDefs[secDef], str(assumption),
178
+ messageSpace, str(secModel), **kwargs)
179
+ return True
180
+
181
+ def getProperty(self):
182
+ """Get the security properties of this ZK proof scheme.
183
+
184
+ Returns:
185
+ dict: A dictionary containing all configured security properties,
186
+ including scheme type, security definition, assumption,
187
+ message space, and security model.
188
+ """
189
+ baseProp = SchemeBase._getProperty(self)
190
+ return baseProp
191
+
192
+ def setup(self, group):
193
+ """Initialize the proof system with group parameters.
194
+
195
+ This method should initialize any scheme-specific parameters
196
+ needed for proof generation and verification.
197
+
198
+ Args:
199
+ group: The algebraic group to use for the proof system.
200
+ Typically a pairing group or integer group from Charm.
201
+
202
+ Returns:
203
+ Implementation-specific setup parameters (e.g., public parameters).
204
+
205
+ Raises:
206
+ NotImplementedError: Must be implemented by subclasses.
207
+ """
208
+ raise NotImplementedError
209
+
210
+ def prove(self, statement, witness):
211
+ """Generate a zero-knowledge proof.
212
+
213
+ Creates a proof that the prover knows a witness satisfying the
214
+ given statement, without revealing the witness itself.
215
+
216
+ Args:
217
+ statement: The public statement to prove. The format depends
218
+ on the specific proof type (e.g., public key for Schnorr).
219
+ witness: The secret witness known only to the prover
220
+ (e.g., private key for Schnorr).
221
+
222
+ Returns:
223
+ Proof: A Proof object containing commitment, challenge, and response.
224
+
225
+ Raises:
226
+ NotImplementedError: Must be implemented by subclasses.
227
+ ZKValidationError: If statement or witness validation fails.
228
+ """
229
+ raise NotImplementedError
230
+
231
+ def verify(self, statement, proof):
232
+ """Verify a zero-knowledge proof.
233
+
234
+ Checks whether the given proof is valid for the statement,
235
+ confirming that the prover knows a valid witness.
236
+
237
+ Args:
238
+ statement: The public statement that was proven.
239
+ proof: The Proof object to verify.
240
+
241
+ Returns:
242
+ bool: True if the proof is valid, False otherwise.
243
+
244
+ Raises:
245
+ NotImplementedError: Must be implemented by subclasses.
246
+ ZKValidationError: If statement or proof format is invalid.
247
+ ZKProofVerificationError: If verification fails due to invalid proof.
248
+ """
249
+ raise NotImplementedError
250
+
251
+ def serialize(self, proof, group):
252
+ """Serialize a proof to bytes.
253
+
254
+ Converts a Proof object to a byte representation suitable for
255
+ storage or network transmission.
256
+
257
+ Args:
258
+ proof: The Proof object to serialize.
259
+ group: The algebraic group used in the proof, needed for
260
+ serializing group elements.
261
+
262
+ Returns:
263
+ bytes: The serialized proof data.
264
+
265
+ Raises:
266
+ NotImplementedError: Must be implemented by subclasses.
267
+ ZKValidationError: If proof format is invalid for serialization.
268
+ """
269
+ raise NotImplementedError
270
+
271
+ def deserialize(self, data, group):
272
+ """Deserialize bytes to a proof.
273
+
274
+ Reconstructs a Proof object from its byte representation.
275
+
276
+ Args:
277
+ data: The serialized proof bytes.
278
+ group: The algebraic group used in the proof, needed for
279
+ deserializing group elements.
280
+
281
+ Returns:
282
+ Proof: The reconstructed Proof object.
283
+
284
+ Raises:
285
+ NotImplementedError: Must be implemented by subclasses.
286
+ ZKParseError: If the data cannot be parsed as a valid proof.
287
+ """
288
+ raise NotImplementedError
289
+
File without changes
@@ -0,0 +1,49 @@
1
+ '''
2
+ ``bistring.Bytes`` is a replacement for Python's ``byte``.
3
+ '''
4
+
5
+ import string
6
+ import sys
7
+
8
+ py3 = False
9
+ if float(sys.version[:3]) >= 3.0:
10
+ py3 = True
11
+
12
+
13
+ class Bytes(bytes):
14
+ def __init__(self, value, enc=None):
15
+ if enc != None:
16
+ if py3: bytes.__init__(value, enc)
17
+ else: bytes.__init__(value)
18
+ else:
19
+ bytes.__init__(value)
20
+
21
+ def __xor__(self, other):
22
+ '''Overload the ``^`` operator to provide xor '''
23
+ assert len(self) == len(other), "xor: operands differ in length."
24
+ res = bytearray()
25
+ for i in range(0,len(self)):
26
+ if py3: res.append(self[i] ^ other[i])
27
+ else: res.append(chr(ord(self[i]) ^ ord(other[i])))
28
+ #print("res[%s] = %s" % (i, res[i]))
29
+ return Bytes(res)
30
+
31
+ def __add__(self, other):
32
+ return Bytes(bytes.__add__(self, other))
33
+
34
+ @classmethod
35
+ def fill(self, prefix, length):
36
+ '''Provides an easy way to create a byte array of a specified length and content'''
37
+ bits = b''
38
+ for i in range(0, int(length)):
39
+ bits += prefix
40
+ return Bytes(bits)
41
+
42
+
43
+ if py3:
44
+ def getBytes(arg1, arg2='utf-8'):
45
+ return Bytes(arg1, arg2)
46
+ else:
47
+ def getBytes(arg1, arg2=None):
48
+ return bytes(arg1)
49
+ # TODO: add left and right bit shifting