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,70 @@
1
+ '''
2
+ **Camenisch-Hohenberger-Pedersen Signature (CHP07)**
3
+
4
+ *Authors:* J. Camenisch, S. Hohenberger, M. Pedersen
5
+
6
+ | **Title:** "Batch Verification of Short Signatures"
7
+ | **Published in:** EUROCRYPT, 2007
8
+ | **Available from:** http://eprint.iacr.org/2007/172.pdf
9
+ | **Notes:**
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** CDH
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 11/2011
21
+ '''
22
+ from charm.toolbox.pairinggroup import G1,G2,ZR,pair
23
+ from charm.toolbox.PKSig import PKSig
24
+
25
+ debug = False
26
+
27
+ class CHP(PKSig):
28
+ """
29
+ >>> from charm.toolbox.pairinggroup import PairingGroup
30
+ >>> group = PairingGroup('SS512')
31
+ >>> chp = CHP(group)
32
+ >>> master_public_key = chp.setup()
33
+ >>> (public_key, secret_key) = chp.keygen(master_public_key)
34
+ >>> msg = { 't1':'time_1', 't2':'time_2', 't3':'time_3', 'str':'this is the message'}
35
+ >>> signature = chp.sign(public_key, secret_key, msg)
36
+ >>> chp.verify(master_public_key, public_key, msg, signature)
37
+ True
38
+ """
39
+ def __init__(self, groupObj):
40
+ global group, H
41
+ group = groupObj
42
+
43
+ def setup(self):
44
+ global H,H3
45
+ H = lambda prefix,x: group.hash((str(prefix), str(x)), G1)
46
+ H3 = lambda a,b: group.hash(('3', str(a), str(b)), ZR)
47
+ g = group.random(G2)
48
+ return { 'g' : g }
49
+
50
+ def keygen(self, mpk):
51
+ alpha = group.random(ZR)
52
+ sk = alpha
53
+ pk = mpk['g'] ** alpha
54
+ return (pk, sk)
55
+
56
+ def sign(self, pk, sk, M):
57
+ a = H(1, M['t1'])
58
+ h = H(2, M['t2'])
59
+ b = H3(M['str'], M['t3'])
60
+ sig = (a ** sk) * (h ** (sk * b))
61
+ return sig
62
+
63
+ def verify(self, mpk, pk, M, sig):
64
+ a = H(1, M['t1'])
65
+ h = H(2, M['t2'])
66
+ b = H3(M['str'], M['t3'])
67
+ if pair(sig, mpk['g']) == (pair(a, pk) * (pair(h, pk) ** b)):
68
+ return True
69
+ return False
70
+
@@ -0,0 +1,150 @@
1
+ '''
2
+ **Camenisch-Lysyanskaya Signature (CL03)**
3
+
4
+ *Authors:* J. Camenisch, A. Lysyanskaya
5
+
6
+ | **Title:** "A Signature Scheme with Efficient Protocols"
7
+ | **Published in:** SCN, 2003
8
+ | **Available from:** http://cs.brown.edu/~anna/papers/camlys02b.pdf
9
+ | **Notes:** Schemes 2.2 (on page 4) and 4 (on page 8).
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (public key)
14
+ * **Setting:** integer groups
15
+ * **Assumption:** Strong RSA
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Christina Garman, Antonio de la Piedra
20
+ :Date: 11/2013
21
+ '''
22
+ from charm.toolbox.PKSig import PKSig
23
+ from charm.core.math.integer import integer,isPrime,random,randomPrime,randomBits
24
+ import hashlib
25
+
26
+ def SHA1(bytes1):
27
+ s1 = hashlib.new('sha256')
28
+ s1.update(bytes1)
29
+ return s1.digest()
30
+
31
+ def randomQR(n):
32
+ return random(n) ** 2
33
+
34
+ debug=False
35
+ class Sig_CL03(PKSig):
36
+ """
37
+ >>> pksig = Sig_CL03()
38
+ >>> p = integer(21281327767482252741932894893985715222965623124768085901716557791820905647984944443933101657552322341359898014680608292582311911954091137905079983298534519)
39
+ >>> q = integer(25806791860198780216123533220157510131833627659100364815258741328806284055493647951841418122944864389129382151632630375439181728665686745203837140362092027)
40
+ >>> (public_key, secret_key) = pksig.keygen(1024, p, q)
41
+ >>> msg = integer(SHA1(b'This is the message I want to hash.'))
42
+ >>> signature = pksig.sign(public_key, secret_key, msg)
43
+ >>> pksig.verify(public_key, msg, signature)
44
+ True
45
+ >>> from charm.toolbox.conversion import Conversion
46
+ >>> g = {}
47
+ >>> m = {}
48
+ >>> j = 16
49
+ >>> for i in range(1, j + 1): g[str(i)] = randomQR(public_key['N'])
50
+ >>> for i in range(1, j + 1): m[str(i)] = integer(SHA1(Conversion.IP2OS(random(public_key['N']))))
51
+ >>> Cx = 1 % public_key['N']
52
+ >>> for i in range(1, len(m) + 1): Cx = Cx*(g[str(i)] ** m[str(i)])
53
+ >>> pksig = Sig_CL03()
54
+ >>> p = integer(21281327767482252741932894893985715222965623124768085901716557791820905647984944443933101657552322341359898014680608292582311911954091137905079983298534519)
55
+ >>> q = integer(25806791860198780216123533220157510131833627659100364815258741328806284055493647951841418122944864389129382151632630375439181728665686745203837140362092027)
56
+ >>> (public_key, secret_key) = pksig.keygen(1024, p, q)
57
+ >>> signature = pksig.signCommit(public_key, secret_key, Cx)
58
+ >>> pksig.verifyCommit(public_key, signature, Cx)
59
+ True
60
+ """
61
+ def __init__(self, lmin=160, lin=160, secparam=512):
62
+ global ln, lm, le, l
63
+ ln = 2 * secparam
64
+ lm = lmin
65
+ le = lm + 2
66
+ l = lin
67
+
68
+ def keygen(self, secparam=512, p=0, q=0):
69
+ if(p == 0):
70
+ pprime = randomPrime(secparam)
71
+ while(not isPrime(2*pprime + 1)):
72
+ pprime = randomPrime(secparam)
73
+ p = 2 * pprime + 1
74
+ print(p)
75
+
76
+ if(q == 0):
77
+ qprime = randomPrime(secparam)
78
+ while(not isPrime(2*qprime + 1)):
79
+ qprime = randomPrime(secparam)
80
+ q = 2 * qprime + 1
81
+ print(q)
82
+
83
+ N = p * q
84
+
85
+ a = randomQR(N)
86
+ b = randomQR(N)
87
+ c = randomQR(N)
88
+
89
+ pk = { 'N':N, 'a':a, 'b':b, 'c':c }
90
+ sk = { 'p':p, 'q':q }
91
+
92
+ return (pk, sk)
93
+
94
+ def sign(self, pk, sk, m):
95
+ e = randomPrime(le)
96
+
97
+ ls = ln + lm + l
98
+ s = integer(randomBits(ls))
99
+
100
+ phi_N = (sk['p']-1)*(sk['q']-1)
101
+ e2 = e % phi_N
102
+
103
+ v = (((pk['a'] ** m)*(pk['b'] ** s)*pk['c']) ** (e2 ** -1)) % pk['N']
104
+
105
+ sig = { 'e':e, 's':s, 'v':v }
106
+
107
+ return sig
108
+
109
+ def signCommit(self, pk, sk, Cx):
110
+ e = randomPrime(le)
111
+
112
+ ls = ln + lm + l
113
+ rprime = integer(randomBits(ls))
114
+
115
+ phi_N = (sk['p']-1)*(sk['q']-1)
116
+ e2 = e % phi_N
117
+
118
+ v = (((Cx)*(pk['b'] ** rprime)*pk['c']) ** (e2 ** -1)) % pk['N']
119
+
120
+ sig = { 'e':e, 'rprime':rprime, 'v':v }
121
+
122
+ return sig
123
+
124
+ def verify(self, pk, m, sig):
125
+ if debug: print("\nVERIFY\n\n")
126
+
127
+ lhs = (sig['v'] ** sig['e']) % pk['N']
128
+ rhs = ((pk['a'] ** m)*(pk['b'] ** sig['s'])*pk['c']) % pk['N']
129
+
130
+ if (sig['e'] <= 2**(le - 1) or sig['e'] >= 2**(le)):
131
+ return False
132
+
133
+ if(lhs == rhs):
134
+ return True
135
+
136
+ return False
137
+
138
+ def verifyCommit(self, pk, sig, Cx):
139
+ if debug: print("\nVERIFY\n\n")
140
+
141
+ lhs = (sig['v'] ** sig['e']) % pk['N']
142
+ rhs = (Cx*(pk['b'] ** sig['rprime'])*pk['c']) % pk['N']
143
+
144
+ if (sig['e'] <= 2**(le - 1)):
145
+ return False
146
+
147
+ if(lhs == rhs):
148
+ return True
149
+
150
+ return False
@@ -0,0 +1,87 @@
1
+ '''
2
+ **Camenisch-Lysyanskaya Signature (CL04)**
3
+
4
+ *Authors:* J. Camenisch, A. Lysyanskaya
5
+
6
+ | **Title:** "Signature Schemes and Anonymous Credentials from Bilinear Maps"
7
+ | **Published in:** CRYPTO, 2004
8
+ | **Available from:** http://www.cs.brown.edu/~anna/papers/cl04.pdf
9
+ | **Notes:** Scheme A on page 5, section 3.1.
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** LRSW
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 1/2012
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,pair
23
+ from charm.toolbox.PKSig import PKSig
24
+
25
+ debug = False
26
+ class CL04(PKSig):
27
+ """
28
+ >>> from charm.toolbox.pairinggroup import PairingGroup
29
+ >>> group = PairingGroup('MNT224')
30
+ >>> cl = CL04(group)
31
+ >>> master_public_key = cl.setup()
32
+ >>> (public_key, secret_key) = cl.keygen(master_public_key)
33
+ >>> msg = "Please sign this stupid message!"
34
+ >>> signature = cl.sign(public_key, secret_key, msg)
35
+ >>> cl.verify(public_key, msg, signature)
36
+ True
37
+ """
38
+ def __init__(self, groupObj):
39
+ global group
40
+ group = groupObj
41
+
42
+ def setup(self):
43
+ g = group.random(G1)
44
+ return { 'g': g }
45
+
46
+ def keygen(self, mpk):
47
+ x, y = group.random(ZR), group.random(ZR)
48
+ sk = { 'x':x, 'y':y }
49
+ pk = { 'X':mpk['g'] ** x, 'Y': mpk['g'] ** y, 'g':mpk['g'] }
50
+ return (pk, sk)
51
+
52
+ def sign(self, pk, sk, M):
53
+ a = group.random(G2)
54
+ m = group.hash(M, ZR)
55
+ sig = {'a':a, 'a_y':a ** sk['y'], 'a_xy':a ** (sk['x'] + (m * sk['x'] * sk['y'])) }
56
+ return sig
57
+
58
+ def verify(self, pk, M, sig):
59
+ (a, b, c) = sig['a'], sig['a_y'], sig['a_xy']
60
+ m = group.hash(M, ZR)
61
+ if pair(pk['Y'], a) == pair(pk['g'], b) and (pair(pk['X'], a) * (pair(pk['X'], b) ** m)) == pair(pk['g'], c):
62
+ return True
63
+ return False
64
+
65
+ def main():
66
+ grp = PairingGroup('MNT224')
67
+ cl = CL04(grp)
68
+
69
+ mpk = cl.setup()
70
+
71
+ (pk, sk) = cl.keygen(mpk)
72
+ if debug:
73
+ print("Keygen...")
74
+ print("pk :=", pk)
75
+ print("sk :=", sk)
76
+
77
+ M = "Please sign this stupid message!"
78
+ sig = cl.sign(pk, sk, M)
79
+ if debug: print("Signature: ", sig)
80
+
81
+ result = cl.verify(pk, M, sig)
82
+ assert result, "INVALID signature!"
83
+ if debug: print("Successful Verification!!!")
84
+
85
+ if __name__ == "__main__":
86
+ debug = True
87
+ main()
@@ -0,0 +1,142 @@
1
+ '''
2
+ **Chen-Lim-Ling-Wang-Wee Signature (CLLWW12)**
3
+
4
+ *Authors:* J. Chen, H. Lim, S. Ling, H. Wang, H. Wee
5
+
6
+ | **Title:** "Shorter IBE and Signatures via Asymmetric Pairings"
7
+ | **Published in:** Pairing, 2012
8
+ | **Available from:** http://eprint.iacr.org/2012/224
9
+ | **Notes:** Section 5. Shorter IBE construction based on SXDH.
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (identity-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** SXDH
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: Fan Zhang (zfwise@gwu.edu)
20
+ :Date: 3/2013
21
+ :Notes: Swapped g1 and g2 to make signature faster. Optimized pairing operations.
22
+ '''
23
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
24
+ from charm.core.crypto.cryptobase import *
25
+ from charm.toolbox.PKSig import PKSig
26
+ from charm.toolbox.matrixops import *
27
+
28
+ debug = False
29
+ class Sign_Chen12_z(PKSig):
30
+ """
31
+ >>> from charm.toolbox.pairinggroup import PairingGroup
32
+ >>> groupObj = PairingGroup('MNT224')
33
+ >>> m = "plese sign this message!!!!"
34
+ >>> cllww = Sign_Chen12_z(groupObj)
35
+ >>> (pk, sk) = cllww.keygen()
36
+ >>> signature = cllww.sign(pk, sk, m)
37
+ >>> cllww.verify(pk, signature, m)
38
+ True
39
+ """
40
+ def __init__(self, groupObj):
41
+ PKSig.__init__(self)
42
+ #IBEnc.setProperty(self, message_space=[GT, 'KEM'], secdef='IND_sID_CPA', assumption='DBDH', secmodel='ROM', other={'id':ZR})
43
+ global group
44
+ group = groupObj
45
+
46
+ def keygen(self):
47
+ g2 = group.random(G1)
48
+ g1 = group.random(G2)
49
+ alpha = group.random(ZR)
50
+
51
+ #generate the 4*4 dual pairing vector spaces.
52
+ d11, d12, d13, d14 = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR)
53
+ d21, d22, d23, d24 = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR)
54
+ d31, d32, d33, d34 = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR)
55
+ d41, d42, d43, d44 = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR)
56
+ D11, D12, D13, D14 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
57
+ D21, D22, D23, D24 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
58
+ D31, D32, D33, D34 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
59
+ D41, D42, D43, D44 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
60
+
61
+ one = group.random(ZR)
62
+
63
+ [D11, D12, D13, D14] = GaussEliminationinGroups([[d11, d12, d13, d14, one],
64
+ [d21, d22, d23, d24, group.init(ZR, 0)],
65
+ [d31, d32, d33, d34, group.init(ZR, 0)],
66
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
67
+ [D21, D22, D23, D24] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
68
+ [d21, d22, d23, d24, one],
69
+ [d31, d32, d33, d34, group.init(ZR, 0)],
70
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
71
+ [D31, D32, D33, D34] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
72
+ [d21, d22, d23, d24, group.init(ZR, 0)],
73
+ [d31, d32, d33, d34, one],
74
+ [d41, d42, d43, d44, group.init(ZR, 0)]])
75
+ [D41, D42, D43, D44] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
76
+ [d21, d22, d23, d24, group.init(ZR, 0)],
77
+ [d31, d32, d33, d34, group.init(ZR, 0)],
78
+ [d41, d42, d43, d44, one]])
79
+
80
+
81
+ #generate public parameters.
82
+ #PP2 = (pair(g1, g2))**(alpha*one)
83
+ PP2 = (pair(g2, g1))**(alpha*one)
84
+ gd11 = g1**d11
85
+ gd12 = g1**d12
86
+ gd13 = g1**d13
87
+ gd14 = g1**d14
88
+ gd21 = g1**d21
89
+ gd22 = g1**d22
90
+ gd23 = g1**d23
91
+ gd24 = g1**d24
92
+ pk = { 'PP2':PP2, 'gd11':gd11, 'gd12':gd12, 'gd13':gd13, 'gd14':gd14,
93
+ 'gd21':gd21, 'gd22':gd22, 'gd23':gd23, 'gd24':gd24 }
94
+ #generate private parameters
95
+
96
+ sk = {'alpha': alpha, 'g2':g2,
97
+ 'D11':D11, 'D12':D12, 'D13':D13, 'D14':D14,
98
+ 'D21':D21, 'D22':D22, 'D23':D23, 'D24':D24}
99
+
100
+ if(debug):
101
+ print("Public parameters...")
102
+ group.debug(pk)
103
+ print("Secret parameters...")
104
+ group.debug(sk)
105
+ return (pk, sk)
106
+
107
+ def sign(self, pk, sk, m):
108
+ r = group.random(ZR)
109
+ M = group.hash(m)
110
+ s1 = sk['g2']**((sk['alpha']+ r * M) * sk['D11'] - r * sk['D21'])
111
+ s2 = sk['g2']**((sk['alpha']+ r * M) * sk['D12'] - r * sk['D22'])
112
+ s3 = sk['g2']**((sk['alpha']+ r * M) * sk['D13'] - r * sk['D23'])
113
+ s4 = sk['g2']**((sk['alpha']+ r * M) * sk['D14'] - r * sk['D24'])
114
+
115
+ signature = { 's1':s1, 's2':s2, 's3':s3, 's4':s4 }
116
+ return signature
117
+
118
+ def verify(self, pk, sig, m):
119
+ M = group.hash(m)
120
+ if pk['PP2'] == (pair(sig['s1'],pk['gd11']*(pk['gd21']**M)) *
121
+ pair(sig['s2'],pk['gd12']*(pk['gd22']**M)) *
122
+ pair(sig['s3'],pk['gd13']*(pk['gd23']**M)) *
123
+ pair(sig['s4'],pk['gd14']*(pk['gd24']**M)) ):
124
+ return True
125
+ return False
126
+
127
+
128
+ def main():
129
+ groupObj = PairingGroup('MNT224')
130
+ m = "plese sign this message!!!!"
131
+ cllww = Sign_Chen12_z(groupObj)
132
+ (pk, sk) = cllww.keygen()
133
+ signature = cllww.sign(pk, sk, m)
134
+
135
+ if debug: print("Signature :=", signature)
136
+
137
+ assert cllww.verify(pk, signature, m), "Invalid Verification!!!!"
138
+ if debug: print("Successful Individual Verification!")
139
+
140
+ if __name__ == "__main__":
141
+ debug = True
142
+ main()
@@ -0,0 +1,132 @@
1
+ '''
2
+ **Chow-Yiu-Hui Identity-Based Ring Signature (CYH05)**
3
+
4
+ *Authors:* S. Chow, S. Yiu, L. Hui
5
+
6
+ | **Title:** "Efficient Identity Based Ring Signature"
7
+ | **Published in:** ACNS, 2005
8
+ | **Available from:** LNCS Vol. 3531, pages 499-512
9
+ | **Notes:**
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (ring-based)
14
+ * **Setting:** bilinear groups (asymmetric)
15
+ * **Assumption:** CDH
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 11/2011
21
+ '''
22
+ from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,pair
23
+ from charm.toolbox.PKSig import PKSig
24
+ from charm.toolbox.iterate import dotprod
25
+
26
+ debug = False
27
+
28
+ class CYH(PKSig):
29
+ """
30
+
31
+ >>> from charm.toolbox.pairinggroup import PairingGroup
32
+ >>> users = [ "alice", "bob", "carlos", "dexter", "eddie"]
33
+ >>> signer = "bob"
34
+ >>> group = PairingGroup('SS512')
35
+ >>> cyh = CYH(group)
36
+ >>> (master_public_key, master_secret_key) = cyh.setup()
37
+ >>> (signer, public_key, secret_key) = cyh.keygen(master_secret_key, signer)
38
+ >>> secret_key = (signer, public_key, secret_key)
39
+ >>> msg = 'please sign this new message!'
40
+ >>> signature = cyh.sign(secret_key, users, msg)
41
+ >>> cyh.verify(master_public_key, users, msg, signature)
42
+ True
43
+ """
44
+ def __init__(self, groupObj):
45
+ global group
46
+ group = groupObj
47
+
48
+ def concat(self, L_id):
49
+ result = ""
50
+ for i in L_id:
51
+ result += ":"+i
52
+ return result
53
+
54
+ def setup(self):
55
+ global H1,H2,lam_func
56
+ H1 = lambda x: group.hash(('1', str(x)), G1)
57
+ H2 = lambda a, b, c: group.hash(('2', a, b, c), ZR)
58
+ lam_func = lambda i,a,b,c: a[i] * (b[i] ** c[i]) # => u * (pk ** h) for all signers
59
+ g, alpha = group.random(G2), group.random(ZR)
60
+ P = g ** alpha
61
+ msk = alpha
62
+ mpk = {'Pub':P, 'g':g }
63
+ return (mpk, msk)
64
+
65
+ def keygen(self, msk, ID):
66
+ sk = H1(ID) ** msk
67
+ pk = H1(ID)
68
+ return (ID, pk, sk)
69
+
70
+ def sign(self, sk, L, M):
71
+ (IDs, IDpk, IDsk) = sk
72
+ assert IDs in L, "signer should be an element in L"
73
+ Lt = self.concat(L)
74
+ num_signers = len(L)
75
+
76
+ u = [1 for i in range(num_signers)]
77
+ h = [group.init(ZR, 1) for i in range(num_signers)]
78
+ for i in range(num_signers):
79
+ if IDs != L[i]:
80
+ u[i] = group.random(G1)
81
+ h[i] = H2(M, Lt, u[i])
82
+ else:
83
+ s = i
84
+
85
+ r = group.random(ZR)
86
+ pk = [ H1(i) for i in L] # get all signers pub keys
87
+ u[s] = (IDpk ** r) * (dotprod(1, s, num_signers, lam_func, u, pk, h) ** -1)
88
+ h[s] = H2(M, Lt, u[s])
89
+ S = IDsk ** (h[s] + r)
90
+ sig = { 'u':u, 'S':S }
91
+ return sig
92
+
93
+ def verify(self, mpk, L, M, sig):
94
+ u, S = sig['u'], sig['S']
95
+ Lt = self.concat(L)
96
+ num_signers = len(L)
97
+ h = [group.init(ZR, 1) for i in range(num_signers)]
98
+ for i in range(num_signers):
99
+ h[i] = H2(M, Lt, u[i])
100
+
101
+ pk = [ H1(i) for i in L] # get all signers pub keys
102
+ result = dotprod(1, -1, num_signers, lam_func, u, pk, h)
103
+ if pair(result, mpk['Pub']) == pair(S, mpk['g']):
104
+ return True
105
+ return False
106
+
107
+
108
+ def main():
109
+ L = [ "alice", "bob", "carlos", "dexter", "eddie"]
110
+ ID = "bob"
111
+ groupObj = PairingGroup('SS512')
112
+ cyh = CYH(groupObj)
113
+ (mpk, msk) = cyh.setup()
114
+
115
+ (ID, Pk, Sk) = cyh.keygen(msk, ID)
116
+ sk = (ID, Pk, Sk)
117
+ if debug:
118
+ print("Keygen...")
119
+ print("sk =>", sk)
120
+
121
+ M = 'please sign this new message!'
122
+ sig = cyh.sign(sk, L, M)
123
+ if debug:
124
+ print("Signature...")
125
+ print("sig =>", sig)
126
+
127
+ assert cyh.verify(mpk, L, M, sig), "invalid signature!"
128
+ if debug: print("Verification successful!")
129
+
130
+ if __name__ == "__main__":
131
+ debug = True
132
+ main()
@@ -0,0 +1,76 @@
1
+ '''
2
+ **Digital Signature Algorithm (DSA)**
3
+
4
+ *Authors:* NIST
5
+
6
+ | **Title:** "Digital Signature Standard (DSS)"
7
+ | **Published in:** FIPS 186, 1994
8
+ | **Available from:** https://csrc.nist.gov/publications/detail/fips/186/4/final
9
+ | **Notes:** Originally proposed by NIST in August 1991.
10
+
11
+ .. rubric:: Scheme Properties
12
+
13
+ * **Type:** signature (public key)
14
+ * **Setting:** integer groups
15
+ * **Assumption:** Discrete Logarithm
16
+
17
+ .. rubric:: Implementation
18
+
19
+ :Authors: J. Ayo Akinyele
20
+ :Date: 5/2011
21
+ '''
22
+
23
+ from charm.toolbox.integergroup import IntegerGroupQ
24
+ from charm.toolbox.PKSig import PKSig
25
+
26
+ debug = False
27
+ class DSA(PKSig):
28
+ """
29
+ >>> from charm.core.math.integer import integer
30
+ >>> p = integer(156053402631691285300957066846581395905893621007563090607988086498527791650834395958624527746916581251903190331297268907675919283232442999706619659475326192111220545726433895802392432934926242553363253333261282122117343404703514696108330984423475697798156574052962658373571332699002716083130212467463571362679)
31
+ >>> q = integer(78026701315845642650478533423290697952946810503781545303994043249263895825417197979312263873458290625951595165648634453837959641616221499853309829737663096055610272863216947901196216467463121276681626666630641061058671702351757348054165492211737848899078287026481329186785666349501358041565106233731785681339)
32
+ >>> dsa = DSA(p, q)
33
+ >>> (public_key, secret_key) = dsa.keygen(1024)
34
+ >>> msg = "hello world test message!!!"
35
+ >>> signature = dsa.sign(public_key, secret_key, msg)
36
+ >>> dsa.verify(public_key, signature, msg)
37
+ True
38
+ """
39
+ def __init__(self, p=0, q=0):
40
+ global group
41
+ group = IntegerGroupQ()
42
+ group.p, group.q, group.r = p, q, 2
43
+
44
+ def keygen(self, bits):
45
+ if group.p == 0 or group.q == 0:
46
+ group.paramgen(bits)
47
+ global p,q
48
+ p,q = group.p, group.q
49
+ x = group.random()
50
+ g = group.randomGen()
51
+ y = (g ** x) % p
52
+ return ({'g':g, 'y':y}, x)
53
+
54
+ def sign(self, pk, x, M):
55
+ while True:
56
+ k = group.random()
57
+ r = (pk['g'] ** k) % q
58
+ s = (k ** -1) * ((group.hash(M) + x*r) % q)
59
+ if (r == 0 or s == 0):
60
+ print("unlikely error r = %s, s = %s" % (r,s))
61
+ continue
62
+ else:
63
+ break
64
+ return { 'r':r, 's':s }
65
+
66
+ def verify(self, pk, sig, M):
67
+ w = (sig['s'] ** -1) % q
68
+ u1 = (group.hash(M) * w) % q
69
+ u2 = (sig['r'] * w) % q
70
+ v = ((pk['g'] ** u1) * (pk['y'] ** u2)) % p
71
+ v %= q
72
+ if v == sig['r']:
73
+ return True
74
+ else:
75
+ return False
76
+