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,28 @@
1
+ from charm.toolbox.secretshare import SecretShare
2
+ from charm.toolbox.pairinggroup import PairingGroup,ZR
3
+ import unittest
4
+
5
+ debug=False
6
+
7
+ class SecretShareTest(unittest.TestCase):
8
+ def testSecretShare(self):
9
+ # Testing Secret sharing python API
10
+ k = 3
11
+ n = 4
12
+ group = PairingGroup('SS512')
13
+
14
+ s = SecretShare(group, False)
15
+ sec = group.random(ZR)
16
+ shares = s.genShares(sec, k, n)
17
+
18
+ K = shares[0]
19
+ if debug: print('\nOriginal secret: %s' % K)
20
+ y = {group.init(ZR, 1):shares[1], group.init(ZR, 2):shares[2], group.init(ZR, 3):shares[3]}
21
+
22
+ secret = s.recoverSecret(y)
23
+
24
+ assert K == secret, "Could not recover the secret!"
25
+ if debug: print("Successfully recovered secret: ", secret)
26
+
27
+ if __name__ == "__main__":
28
+ unittest.main()
@@ -0,0 +1,108 @@
1
+ import unittest
2
+ from charm.toolbox.symcrypto import SymmetricCryptoAbstraction,AuthenticatedCryptoAbstraction, MessageAuthenticator
3
+ from charm.toolbox.pairinggroup import PairingGroup,GT
4
+ from charm.core.math.pairing import hashPair as sha2
5
+ class SymmetricCryptoAbstractionTest(unittest.TestCase):
6
+
7
+ def testAESCBC(self):
8
+ self.MsgtestAESCBC(b"hello world")
9
+
10
+ def testAESCBCLong(self):
11
+ self.MsgtestAESCBC(b"Lots of people working in cryptography have no deep \
12
+ concern with real application issues. They are trying to discover things \
13
+ clever enough to write papers about -- Whitfield Diffie.")
14
+
15
+ def testAESCBC_Seperate(self):
16
+ self.MsgTestAESCBCSeperate(b"Lots of people working in cryptography have no deep \
17
+ concern with real application issues. They are trying to discover things \
18
+ clever enough to write papers about -- Whitfield Diffie.")
19
+
20
+ def MsgtestAESCBC(self,msg):
21
+ groupObj = PairingGroup('SS512')
22
+ a = SymmetricCryptoAbstraction(sha2(groupObj.random(GT)))
23
+ ct = a.encrypt(msg)
24
+ dmsg = a.decrypt(ct);
25
+ assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
26
+
27
+ def MsgTestAESCBCSeperate(self,msg):
28
+ groupObj = PairingGroup('SS512')
29
+ ran = groupObj.random(GT)
30
+ a = SymmetricCryptoAbstraction(sha2(ran))
31
+ ct = a.encrypt(msg)
32
+ b = SymmetricCryptoAbstraction(sha2(ran))
33
+ dmsg = b.decrypt(ct);
34
+ assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
35
+
36
+ class AuthenticatedCryptoAbstractionTest(unittest.TestCase):
37
+
38
+ def testAESCBC(self):
39
+ self.MsgtestAESCBC(b"hello world")
40
+
41
+ def testAESCBCLong(self):
42
+ self.MsgtestAESCBC(b"Lots of people working in cryptography have no deep \
43
+ concern with real application issues. They are trying to discover things \
44
+ clever enough to write papers about -- Whitfield Diffie.")
45
+ def testAESCBC_Seperate(self):
46
+ self.MsgTestAESCBCSeperate(b"Lots of people working in cryptography have no deep \
47
+ concern with real application issues. They are trying to discover things \
48
+ clever enough to write papers about -- Whitfield Diffie.")
49
+
50
+
51
+ def MsgtestAESCBC(self,msg):
52
+ groupObj = PairingGroup('SS512')
53
+ a = AuthenticatedCryptoAbstraction(sha2(groupObj.random(GT)))
54
+ ct = a.encrypt(msg)
55
+ dmsg = a.decrypt(ct);
56
+ assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
57
+
58
+ def MsgTestAESCBCSeperate(self,msg):
59
+ groupObj = PairingGroup('SS512')
60
+ ran = groupObj.random(GT)
61
+ a = AuthenticatedCryptoAbstraction(sha2(ran))
62
+ ct = a.encrypt(msg)
63
+ b = AuthenticatedCryptoAbstraction(sha2(ran))
64
+ dmsg = b.decrypt(ct);
65
+ assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
66
+
67
+ class MessageAuthenticatorTest(unittest.TestCase):
68
+ def testSelfVerify(self):
69
+ key = sha2(PairingGroup('SS512').random(GT))
70
+ m = MessageAuthenticator(key)
71
+ a = m.mac('hello world')
72
+ assert m.verify(a), "expected message to verify";
73
+
74
+ def testSeperateVerify(self):
75
+ key = sha2(PairingGroup('SS512').random(GT))
76
+ m = MessageAuthenticator(key)
77
+ a = m.mac('hello world')
78
+ m1 = MessageAuthenticator(key)
79
+ assert m1.verify(a), "expected message to verify";
80
+
81
+ def testTamperData(self):
82
+ key = sha2(PairingGroup('SS512').random(GT))
83
+ m = MessageAuthenticator(key)
84
+ a = m.mac('hello world')
85
+ m1 = MessageAuthenticator(key)
86
+ a["msg"]= "tampered"
87
+ assert not m1.verify(a), "expected message to verify";
88
+
89
+ def testTamperMac(self):
90
+ key = sha2(PairingGroup('SS512').random(GT))
91
+ m = MessageAuthenticator(key)
92
+ a = m.mac('hello world')
93
+ m1 = MessageAuthenticator(key)
94
+ a["digest"]= "tampered"
95
+ assert not m1.verify(a), "expected message to verify";
96
+
97
+ def testTamperAlg(self):
98
+ key = sha2(PairingGroup('SS512').random(GT))
99
+ m = MessageAuthenticator(key)
100
+ a = m.mac('hello world')
101
+ m1 = MessageAuthenticator(key)
102
+ m1._algorithm = "alg" # bypassing the algorithm check to verify the mac is over the alg + data
103
+ a["alg"]= "alg"
104
+ assert not m1.verify(a), "expected message to verify";
105
+
106
+ if __name__ == "__main__":
107
+ unittest.main()
108
+
@@ -0,0 +1,16 @@
1
+ import unittest
2
+
3
+ from hypothesis import given
4
+
5
+ from charm.toolbox.policy_expression_spec import policy_expressions, assert_valid, alland_policy_expressions
6
+
7
+
8
+ class TestPolicyExpressionSpec(unittest.TestCase):
9
+
10
+ @given(policy_expressions())
11
+ def test_policy_expression_spec(self, policy_expression):
12
+ assert_valid(policy_expression)
13
+
14
+ @given(alland_policy_expressions())
15
+ def test_allAND_policy_expressions(self, policy_expression):
16
+ assert_valid(policy_expression)
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,289 @@
1
+ """
2
+ BLS Signature Test Vectors
3
+
4
+ Test vectors for BLS (Boneh-Lynn-Shacham) signatures based on:
5
+ - Original paper: "Short Signatures from the Weil Pairing" (Boneh, Lynn, Shacham, 2004)
6
+ - IETF draft-irtf-cfrg-bls-signature (for reference structure)
7
+
8
+ Note: Charm's BLS implementation uses PBC library with specific curve parameters.
9
+ These test vectors verify mathematical correctness and consistency.
10
+ """
11
+
12
+ import unittest
13
+ from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
14
+ from charm.schemes.pksig.pksig_bls04 import BLS01
15
+ from charm.core.engine.util import objectToBytes
16
+
17
+
18
+ class TestBLSMathematicalProperties(unittest.TestCase):
19
+ """
20
+ Test mathematical properties that must hold for any correct BLS implementation.
21
+
22
+ These tests verify the fundamental algebraic properties of BLS signatures
23
+ as defined in the original Boneh-Lynn-Shacham paper.
24
+ """
25
+
26
+ def setUp(self):
27
+ """Set up test fixtures with BN254 curve (128-bit security)."""
28
+ self.group = PairingGroup('BN254')
29
+ self.bls = BLS01(self.group)
30
+
31
+ def test_signature_verification_equation(self):
32
+ """
33
+ Test Vector BLS-1: Signature Verification Equation
34
+
35
+ Property: e(σ, g) = e(H(m), pk) where σ = H(m)^sk, pk = g^sk
36
+
37
+ Source: Boneh-Lynn-Shacham 2004, Section 2.1
38
+ """
39
+ # Generate keys
40
+ (pk, sk) = self.bls.keygen()
41
+
42
+ # Sign a message
43
+ message = {'content': 'test message for BLS verification'}
44
+ signature = self.bls.sign(sk['x'], message)
45
+
46
+ # Verify using the BLS verification equation
47
+ # e(σ, g) = e(H(m), g^x)
48
+ M = objectToBytes(message, self.group)
49
+ h = self.group.hash(M, G1)
50
+
51
+ lhs = pair(signature, pk['g'])
52
+ rhs = pair(h, pk['g^x'])
53
+
54
+ self.assertEqual(lhs, rhs,
55
+ "BLS verification equation e(σ, g) = e(H(m), pk) must hold")
56
+
57
+ def test_signature_determinism(self):
58
+ """
59
+ Test Vector BLS-2: Signature Determinism
60
+
61
+ Property: For fixed (sk, m), sign(sk, m) always produces the same σ
62
+
63
+ Source: BLS signatures are deterministic by construction
64
+ """
65
+ (pk, sk) = self.bls.keygen()
66
+ message = {'content': 'determinism test message'}
67
+
68
+ # Sign the same message multiple times
69
+ sig1 = self.bls.sign(sk['x'], message)
70
+ sig2 = self.bls.sign(sk['x'], message)
71
+ sig3 = self.bls.sign(sk['x'], message)
72
+
73
+ self.assertEqual(sig1, sig2, "BLS signatures must be deterministic")
74
+ self.assertEqual(sig2, sig3, "BLS signatures must be deterministic")
75
+
76
+ def test_different_messages_different_signatures(self):
77
+ """
78
+ Test Vector BLS-3: Message Binding
79
+
80
+ Property: Different messages produce different signatures (with overwhelming probability)
81
+
82
+ Source: Security requirement from BLS paper
83
+ """
84
+ (pk, sk) = self.bls.keygen()
85
+
86
+ msg1 = {'content': 'message one'}
87
+ msg2 = {'content': 'message two'}
88
+
89
+ sig1 = self.bls.sign(sk['x'], msg1)
90
+ sig2 = self.bls.sign(sk['x'], msg2)
91
+
92
+ self.assertNotEqual(sig1, sig2,
93
+ "Different messages must produce different signatures")
94
+
95
+ def test_wrong_key_verification_fails(self):
96
+ """
97
+ Test Vector BLS-4: Key Binding
98
+
99
+ Property: Signature valid under sk1 must not verify under pk2
100
+
101
+ Source: Unforgeability requirement
102
+ """
103
+ (pk1, sk1) = self.bls.keygen()
104
+ (pk2, sk2) = self.bls.keygen()
105
+
106
+ message = {'content': 'key binding test'}
107
+ signature = self.bls.sign(sk1['x'], message)
108
+
109
+ # Should verify with correct key
110
+ self.assertTrue(self.bls.verify(pk1, signature, message),
111
+ "Signature must verify with correct public key")
112
+
113
+ # Should NOT verify with wrong key
114
+ self.assertFalse(self.bls.verify(pk2, signature, message),
115
+ "Signature must NOT verify with wrong public key")
116
+
117
+ def test_modified_message_verification_fails(self):
118
+ """
119
+ Test Vector BLS-5: Message Integrity
120
+
121
+ Property: Modifying the message must cause verification to fail
122
+
123
+ Source: Unforgeability requirement
124
+ """
125
+ (pk, sk) = self.bls.keygen()
126
+
127
+ original_message = {'content': 'original message'}
128
+ modified_message = {'content': 'modified message'}
129
+
130
+ signature = self.bls.sign(sk['x'], original_message)
131
+
132
+ self.assertTrue(self.bls.verify(pk, signature, original_message),
133
+ "Signature must verify with original message")
134
+ self.assertFalse(self.bls.verify(pk, signature, modified_message),
135
+ "Signature must NOT verify with modified message")
136
+
137
+ def test_bilinearity_property(self):
138
+ """
139
+ Test Vector BLS-6: Bilinearity
140
+
141
+ Property: e(g^a, h^b) = e(g, h)^(ab)
142
+
143
+ Source: Fundamental pairing property required for BLS security
144
+ """
145
+ g = self.group.random(G1)
146
+ h = self.group.random(G2)
147
+ a = self.group.random(ZR)
148
+ b = self.group.random(ZR)
149
+
150
+ lhs = pair(g ** a, h ** b)
151
+ rhs = pair(g, h) ** (a * b)
152
+
153
+ self.assertEqual(lhs, rhs,
154
+ "Bilinearity property e(g^a, h^b) = e(g,h)^(ab) must hold")
155
+
156
+ def test_non_degeneracy(self):
157
+ """
158
+ Test Vector BLS-7: Non-degeneracy
159
+
160
+ Property: e(g, h) ≠ 1 for generators g, h
161
+
162
+ Source: Required pairing property for BLS security
163
+ """
164
+ g = self.group.random(G1)
165
+ h = self.group.random(G2)
166
+
167
+ pairing_result = pair(g, h)
168
+ identity = self.group.init(GT, 1)
169
+
170
+ self.assertNotEqual(pairing_result, identity,
171
+ "Pairing of generators must not be identity (non-degeneracy)")
172
+
173
+
174
+ class TestBLSKnownAnswerTests(unittest.TestCase):
175
+ """
176
+ Known Answer Tests (KATs) for BLS signatures.
177
+
178
+ These tests use fixed seeds to generate reproducible test vectors
179
+ that can be verified across implementations.
180
+ """
181
+
182
+ def setUp(self):
183
+ """Set up with BN254 curve."""
184
+ self.group = PairingGroup('BN254')
185
+ self.bls = BLS01(self.group)
186
+
187
+ def test_kat_signature_structure(self):
188
+ """
189
+ Test Vector BLS-KAT-1: Signature Structure
190
+
191
+ Verify that signatures are elements of G1 (for Type-3 pairings).
192
+ """
193
+ (pk, sk) = self.bls.keygen()
194
+ message = {'content': 'structure test'}
195
+ signature = self.bls.sign(sk['x'], message)
196
+
197
+ # Signature should be a valid group element
198
+ # Verify by checking it can be used in pairing operations
199
+ try:
200
+ result = pair(signature, pk['g'])
201
+ self.assertIsNotNone(result, "Signature must be valid G1 element")
202
+ except Exception as e:
203
+ self.fail(f"Signature is not a valid G1 element: {e}")
204
+
205
+ def test_kat_empty_message(self):
206
+ """
207
+ Test Vector BLS-KAT-2: Empty Message Handling
208
+
209
+ Verify correct handling of edge case: empty message.
210
+ """
211
+ (pk, sk) = self.bls.keygen()
212
+ message = {} # Empty message
213
+
214
+ # Should be able to sign and verify empty message
215
+ signature = self.bls.sign(sk['x'], message)
216
+ self.assertTrue(self.bls.verify(pk, signature, message),
217
+ "Empty message must be signable and verifiable")
218
+
219
+ def test_kat_large_message(self):
220
+ """
221
+ Test Vector BLS-KAT-3: Large Message Handling
222
+
223
+ Verify correct handling of large messages (hashing works correctly).
224
+ """
225
+ (pk, sk) = self.bls.keygen()
226
+
227
+ # Create a large message (10KB of data)
228
+ large_content = 'x' * 10240
229
+ message = {'content': large_content}
230
+
231
+ signature = self.bls.sign(sk['x'], message)
232
+ self.assertTrue(self.bls.verify(pk, signature, message),
233
+ "Large messages must be signable and verifiable")
234
+
235
+
236
+ class TestBLSSecurityProperties(unittest.TestCase):
237
+ """
238
+ Security-focused tests for BLS implementation.
239
+
240
+ These tests verify that the implementation resists known attacks.
241
+ """
242
+
243
+ def setUp(self):
244
+ """Set up with BN254 curve."""
245
+ self.group = PairingGroup('BN254')
246
+ self.bls = BLS01(self.group)
247
+
248
+ def test_identity_element_rejection(self):
249
+ """
250
+ Test Vector BLS-SEC-1: Identity Element Attack
251
+
252
+ Verify that identity element is not accepted as valid signature.
253
+
254
+ Attack: Attacker submits identity element as signature.
255
+ Expected: Verification must fail.
256
+ """
257
+ (pk, sk) = self.bls.keygen()
258
+ message = {'content': 'identity attack test'}
259
+
260
+ # Create identity element in G1
261
+ identity = self.group.init(G1, 1)
262
+
263
+ # Identity should NOT verify as a valid signature
264
+ # (unless the message hashes to identity, which is negligible probability)
265
+ result = self.bls.verify(pk, identity, message)
266
+ self.assertFalse(result,
267
+ "Identity element must not be accepted as valid signature")
268
+
269
+ def test_random_signature_rejection(self):
270
+ """
271
+ Test Vector BLS-SEC-2: Random Signature Rejection
272
+
273
+ Verify that random group elements are rejected as signatures.
274
+ """
275
+ (pk, sk) = self.bls.keygen()
276
+ message = {'content': 'random signature test'}
277
+
278
+ # Generate random element (not a valid signature)
279
+ random_sig = self.group.random(G1)
280
+
281
+ # Random element should not verify
282
+ result = self.bls.verify(pk, random_sig, message)
283
+ self.assertFalse(result,
284
+ "Random group element must not verify as valid signature")
285
+
286
+
287
+ if __name__ == '__main__':
288
+ unittest.main()
289
+