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,900 @@
1
+
2
+ /* -*- C -*- */
3
+ /*
4
+ * block_template.c : Generic framework for block encryption algorithms
5
+ *
6
+ * Written by Andrew Kuchling and others
7
+ *
8
+ * ===================================================================
9
+ * The contents of this file are dedicated to the public domain. To
10
+ * the extent that dedication to the public domain is not available,
11
+ * everyone is granted a worldwide, perpetual, royalty-free,
12
+ * non-exclusive license to exercise all rights associated with the
13
+ * contents of this file for any purpose whatsoever.
14
+ * No rights are reserved.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ * ===================================================================
25
+ */
26
+
27
+ #include "block_template.h"
28
+
29
+ static ALGobject *
30
+ newALGobject(void)
31
+ {
32
+ ALGobject * new;
33
+ new = PyObject_New(ALGobject, &ALGtype);
34
+ new->mode = MODE_ECB;
35
+ new->counter = NULL;
36
+ new->counter_shortcut = 0;
37
+ new->prf_mode = FALSE;
38
+ return new;
39
+ }
40
+
41
+ static void
42
+ ALGdealloc(PyObject *ptr)
43
+ {
44
+ ALGobject *self = (ALGobject *)ptr;
45
+
46
+ /* Overwrite the contents of the object */
47
+ Py_XDECREF(self->counter);
48
+ self->counter = NULL;
49
+ memset(self->IV, 0, BLOCK_SIZE);
50
+ memset(self->oldCipher, 0, BLOCK_SIZE);
51
+ memset((char*)&(self->st), 0, sizeof(block_state));
52
+ self->mode = self->count = self->segment_size = self->prf_mode = 0;
53
+ PyObject_Del(ptr);
54
+ }
55
+
56
+
57
+ static char ALGnew__doc__[] =
58
+ "new(key, [mode], [IV]): Return a new " _MODULE_STRING " encryption object.";
59
+
60
+ static char *kwlist[] = {"key", "mode", "IV", "counter", "segment_size",
61
+ #ifdef PCT_ARC2_MODULE
62
+ "effective_keylen",
63
+ #endif
64
+ NULL};
65
+
66
+ static ALGobject *
67
+ ALGnew(PyObject *self, PyObject *args, PyObject *kwdict)
68
+ {
69
+ unsigned char *key, *IV;
70
+ ALGobject * new=NULL;
71
+ Py_ssize_t keylen, IVlen=0, mode=MODE_ECB, segment_size=0;
72
+ PyObject *counter = NULL;
73
+ int counter_shortcut = 0;
74
+ #ifdef PCT_ARC2_MODULE
75
+ int effective_keylen = 1024; /* this is a weird default, but it's compatible with old versions of PyCrypto */
76
+ #endif
77
+ /* Set default values */
78
+ if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s#|ns#Oi"
79
+ #ifdef PCT_ARC2_MODULE
80
+ "i"
81
+ #endif
82
+ , kwlist,
83
+ &key, &keylen, &mode, &IV, &IVlen,
84
+ &counter, &segment_size
85
+ #ifdef PCT_ARC2_MODULE
86
+ , &effective_keylen
87
+ #endif
88
+ ))
89
+ {
90
+ return NULL;
91
+ }
92
+
93
+ if (KEY_SIZE!=0 && keylen!=KEY_SIZE)
94
+ {
95
+ PyErr_Format(PyExc_ValueError,
96
+ "Key must be %i bytes long, not %i",
97
+ KEY_SIZE, keylen);
98
+ return NULL;
99
+ }
100
+ if (KEY_SIZE==0 && keylen==0)
101
+ {
102
+ PyErr_SetString(PyExc_ValueError,
103
+ "Key cannot be the null string");
104
+ return NULL;
105
+ }
106
+ if (IVlen != BLOCK_SIZE && IVlen != 0)
107
+ {
108
+ PyErr_Format(PyExc_ValueError,
109
+ "IV must be %i bytes long", BLOCK_SIZE);
110
+ return NULL;
111
+ }
112
+ if (mode<MODE_ECB || mode>MODE_CTR)
113
+ {
114
+ PyErr_Format(PyExc_ValueError,
115
+ "Unknown cipher feedback mode %i",
116
+ mode);
117
+ return NULL;
118
+ }
119
+
120
+ /* Mode-specific checks */
121
+ if (mode == MODE_CFB) {
122
+ if (segment_size == 0) segment_size = 8;
123
+ if (segment_size < 1 || segment_size > BLOCK_SIZE*8 || ((segment_size & 7) != 0)) {
124
+ PyErr_Format(PyExc_ValueError,
125
+ "segment_size must be multiple of 8 (bits) "
126
+ "between 1 and %i", BLOCK_SIZE*8);
127
+ return NULL;
128
+ }
129
+ }
130
+
131
+ if (mode == MODE_CTR) {
132
+ if (counter == NULL) {
133
+ PyErr_SetString(PyExc_TypeError,
134
+ "'counter' keyword parameter is required with CTR mode");
135
+ return NULL;
136
+ } else if (PyObject_HasAttrString(counter, "__PCT_CTR_SHORTCUT__")) {
137
+ counter_shortcut = 1;
138
+ } else if (!PyCallable_Check(counter)) {
139
+ PyErr_SetString(PyExc_ValueError,
140
+ "'counter' parameter must be a callable object");
141
+ return NULL;
142
+ }
143
+ } else {
144
+ if (counter != NULL) {
145
+ PyErr_SetString(PyExc_ValueError,
146
+ "'counter' parameter only useful with CTR mode");
147
+ return NULL;
148
+ }
149
+ }
150
+
151
+ /* Cipher-specific checks */
152
+ #ifdef PCT_ARC2_MODULE
153
+ if (effective_keylen<0 || effective_keylen>1024) {
154
+ PyErr_Format(PyExc_ValueError,
155
+ "RC2: effective_keylen must be between 0 and 1024, not %i",
156
+ effective_keylen);
157
+ return NULL;
158
+ }
159
+ #endif
160
+
161
+ /* Copy parameters into object */
162
+ new = newALGobject();
163
+ new->segment_size = segment_size;
164
+ new->counter = counter;
165
+ Py_XINCREF(counter);
166
+ new->counter_shortcut = counter_shortcut;
167
+ #ifdef PCT_ARC2_MODULE
168
+ new->st.effective_keylen = effective_keylen;
169
+ #endif
170
+
171
+ block_init(&(new->st), key, keylen);
172
+ if (PyErr_Occurred())
173
+ {
174
+ Py_XDECREF(counter);
175
+ Py_DECREF(new);
176
+ return NULL;
177
+ }
178
+ memset(new->IV, 0, BLOCK_SIZE);
179
+ memset(new->oldCipher, 0, BLOCK_SIZE);
180
+ memcpy(new->IV, IV, IVlen);
181
+ new->mode = mode;
182
+ switch(mode) {
183
+ case MODE_PGP:
184
+ new->count=8;
185
+ break;
186
+ case MODE_CTR:
187
+ default:
188
+ new->count=BLOCK_SIZE; /* stores how many bytes in new->oldCipher have been used */
189
+ }
190
+ return new;
191
+ }
192
+
193
+ static char ALG_Encrypt__doc__[] =
194
+ "Encrypt the provided string of binary data.";
195
+
196
+ static PyObject *
197
+ ALG_Encrypt(ALGobject *self, PyObject *args)
198
+ {
199
+ unsigned char *buffer, *str;
200
+ unsigned char temp[BLOCK_SIZE];
201
+ Py_ssize_t i, j, len;
202
+ PyObject *result;
203
+
204
+ #if PY_MAJOR_VERSION >= 3
205
+ if (!PyArg_ParseTuple(args, "y#", &str, &len))
206
+ #else
207
+ if (!PyArg_ParseTuple(args, "s#", &str, &len))
208
+ #endif
209
+ return NULL;
210
+ if (len==0) /* Handle empty string */
211
+ {
212
+ return PyUnicode_FromStringAndSize(NULL, 0);
213
+ }
214
+ if ( (len % BLOCK_SIZE) !=0 &&
215
+ (self->mode!=MODE_CFB) && (self->mode!=MODE_PGP) &&
216
+ (self->mode!=MODE_CTR))
217
+ {
218
+ PyErr_Format(PyExc_ValueError,
219
+ "Input strings must be "
220
+ "a multiple of %i in length",
221
+ BLOCK_SIZE);
222
+ return NULL;
223
+ }
224
+ if (self->mode == MODE_CFB &&
225
+ (len % (self->segment_size/8) !=0)) {
226
+ PyErr_Format(PyExc_ValueError,
227
+ "Input strings must be a multiple of "
228
+ "the segment size %i in length",
229
+ self->segment_size/8);
230
+ return NULL;
231
+ }
232
+
233
+ buffer=malloc(len);
234
+ if (buffer==NULL)
235
+ {
236
+ PyErr_SetString(PyExc_MemoryError,
237
+ "No memory available in "
238
+ _MODULE_STRING " encrypt");
239
+ return NULL;
240
+ }
241
+ Py_BEGIN_ALLOW_THREADS;
242
+ switch(self->mode)
243
+ {
244
+ case(MODE_ECB):
245
+ for(i=0; i<len; i+=BLOCK_SIZE)
246
+ {
247
+ block_encrypt(&(self->st), str+i, buffer+i);
248
+ }
249
+ break;
250
+
251
+ case(MODE_CBC):
252
+ for(i=0; i<len; i+=BLOCK_SIZE)
253
+ {
254
+ for(j=0; j<BLOCK_SIZE; j++)
255
+ {
256
+ temp[j]=str[i+j]^self->IV[j];
257
+ }
258
+ block_encrypt(&(self->st), temp, buffer+i);
259
+ memcpy(self->IV, buffer+i, BLOCK_SIZE);
260
+ }
261
+ break;
262
+
263
+ case(MODE_CFB):
264
+ for(i=0; i<len; i+=self->segment_size/8)
265
+ {
266
+ block_encrypt(&(self->st), self->IV, temp);
267
+ for (j=0; j<self->segment_size/8; j++) {
268
+ buffer[i+j] = str[i+j] ^ temp[j];
269
+ }
270
+ if (self->segment_size == BLOCK_SIZE * 8) {
271
+ /* s == b: segment size is identical to
272
+ the algorithm block size */
273
+ memcpy(self->IV, buffer + i, BLOCK_SIZE);
274
+ }
275
+ else if ((self->segment_size % 8) == 0) {
276
+ int sz = self->segment_size/8;
277
+ memmove(self->IV, self->IV + sz,
278
+ BLOCK_SIZE-sz);
279
+ memcpy(self->IV + BLOCK_SIZE - sz, buffer + i,
280
+ sz);
281
+ }
282
+ else {
283
+ /* segment_size is not a multiple of 8;
284
+ currently this can't happen */
285
+ }
286
+ }
287
+ break;
288
+
289
+ case(MODE_PGP):
290
+ if (len<=BLOCK_SIZE-self->count)
291
+ {
292
+ /* If less than one block, XOR it in */
293
+ for(i=0; i<len; i++)
294
+ buffer[i] = self->IV[self->count+i] ^= str[i];
295
+ self->count += len;
296
+ }
297
+ else
298
+ {
299
+ int j;
300
+ for(i=0; i<BLOCK_SIZE-self->count; i++)
301
+ buffer[i] = self->IV[self->count+i] ^= str[i];
302
+ self->count=0;
303
+ for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE)
304
+ {
305
+ block_encrypt(&(self->st), self->oldCipher,
306
+ self->IV);
307
+ for(j=0; j<BLOCK_SIZE; j++)
308
+ buffer[i+j] = self->IV[j] ^= str[i+j];
309
+ }
310
+ /* Do the remaining 1 to BLOCK_SIZE bytes */
311
+ block_encrypt(&(self->st), self->oldCipher, self->IV);
312
+ self->count=len-i;
313
+ for(j=0; j<len-i; j++)
314
+ {
315
+ buffer[i+j] = self->IV[j] ^= str[i+j];
316
+ }
317
+ }
318
+ break;
319
+
320
+ case(MODE_OFB):
321
+ for(i=0; i<len; i+=BLOCK_SIZE)
322
+ {
323
+ block_encrypt(&(self->st), self->IV, temp);
324
+ memcpy(self->IV, temp, BLOCK_SIZE);
325
+ for(j=0; j<BLOCK_SIZE; j++)
326
+ {
327
+ buffer[i+j] = str[i+j] ^ temp[j];
328
+ }
329
+ }
330
+ break;
331
+
332
+ case(MODE_CTR):
333
+ /* CTR mode is a stream cipher whose keystream is generated by encrypting unique counter values.
334
+ * - self->counter points to the Counter callable, which is
335
+ * responsible for generating keystream blocks
336
+ * - self->count indicates the current offset within the current keystream block
337
+ * - self->IV stores the current keystream block
338
+ * - str stores the input string
339
+ * - buffer stores the output string
340
+ * - len indicates the length if the input and output strings
341
+ * - i indicates the current offset within the input and output strings
342
+ * - (len-i) is the number of bytes remaining to encrypt
343
+ * - (BLOCK_SIZE-self->count) is the number of bytes remaining in the current keystream block
344
+ */
345
+ i = 0;
346
+ while (i < len) {
347
+ /* If we don't need more than what remains of the current keystream block, then just XOR it in */
348
+ if (len-i <= BLOCK_SIZE-self->count) { /* remaining_bytes_to_encrypt <= remaining_bytes_in_IV */
349
+ /* XOR until the input is used up */
350
+ for(j=0; j<(len-i); j++) {
351
+ assert(i+j < len);
352
+ assert(self->count+j < BLOCK_SIZE);
353
+ buffer[i+j] = (self->IV[self->count+j] ^= str[i+j]);
354
+ }
355
+ self->count += len-i;
356
+ i = len;
357
+ continue;
358
+ }
359
+
360
+ /* Use up the current keystream block */
361
+ for(j=0; j<BLOCK_SIZE-self->count; j++) {
362
+ assert(i+j < len);
363
+ assert(self->count+j < BLOCK_SIZE);
364
+ buffer[i+j] = (self->IV[self->count+j] ^= str[i+j]);
365
+ }
366
+ i += BLOCK_SIZE-self->count;
367
+ self->count = BLOCK_SIZE;
368
+
369
+ /* Generate a new keystream block */
370
+ if (self->counter_shortcut) {
371
+ /* CTR mode shortcut: If we're using Util.Counter,
372
+ * bypass the normal Python function call mechanism
373
+ * and manipulate the counter directly. */
374
+
375
+ PCT_CounterObject *ctr = (PCT_CounterObject *)(self->counter);
376
+ if (ctr->carry && !ctr->allow_wraparound) {
377
+ Py_BLOCK_THREADS;
378
+ PyErr_SetString(PyExc_OverflowError,
379
+ "counter wrapped without allow_wraparound");
380
+ free(buffer);
381
+ return NULL;
382
+ }
383
+ if (ctr->buf_size != BLOCK_SIZE) {
384
+ Py_BLOCK_THREADS;
385
+ PyErr_Format(PyExc_TypeError,
386
+ "CTR counter function returned "
387
+ "string not of length %i",
388
+ BLOCK_SIZE);
389
+ free(buffer);
390
+ return NULL;
391
+ }
392
+ block_encrypt(&(self->st),
393
+ (unsigned char *)ctr->val,
394
+ self->IV);
395
+ ctr->inc_func(ctr);
396
+ } else {
397
+ PyObject *ctr;
398
+ Py_BLOCK_THREADS;
399
+ ctr = PyObject_CallObject(self->counter, NULL);
400
+ if (ctr == NULL) {
401
+ free(buffer);
402
+ return NULL;
403
+ }
404
+ if (!PyUnicode_Check(ctr))
405
+ {
406
+ PyErr_SetString(PyExc_TypeError,
407
+ "CTR counter function didn't return a string");
408
+ Py_DECREF(ctr);
409
+ free(buffer);
410
+ return NULL;
411
+ }
412
+ if (PyUnicode_GET_LENGTH(ctr) != BLOCK_SIZE) {
413
+ PyErr_Format(PyExc_TypeError,
414
+ "CTR counter function returned "
415
+ "string not of length %i",
416
+ BLOCK_SIZE);
417
+ Py_DECREF(ctr);
418
+ free(buffer);
419
+ return NULL;
420
+ }
421
+ Py_UNBLOCK_THREADS;
422
+ PyObject *_ctr = PyUnicode_AsASCIIString(ctr);
423
+ block_encrypt(&(self->st), (unsigned char *)PyBytes_AsString(_ctr),
424
+ self->IV);
425
+ Py_BLOCK_THREADS;
426
+ Py_DECREF(ctr);
427
+ Py_DECREF(_ctr);
428
+ Py_UNBLOCK_THREADS;
429
+ }
430
+
431
+ /* Move the pointer to the start of the keystream block */
432
+ self->count = 0;
433
+ }
434
+ break;
435
+
436
+ default:
437
+ Py_BLOCK_THREADS;
438
+ PyErr_Format(PyExc_SystemError,
439
+ "Unknown ciphertext feedback mode %i; "
440
+ "this shouldn't happen",
441
+ self->mode);
442
+ free(buffer);
443
+ return NULL;
444
+ }
445
+ Py_END_ALLOW_THREADS;
446
+ result=PyBytes_FromStringAndSize((char *) buffer, len);
447
+ free(buffer);
448
+ return(result);
449
+ }
450
+
451
+ static char ALG_Decrypt__doc__[] =
452
+ "decrypt(string): Decrypt the provided string of binary data.";
453
+
454
+
455
+ static PyObject *
456
+ ALG_Decrypt(ALGobject *self, PyObject *args)
457
+ {
458
+ unsigned char *buffer, *str;
459
+ unsigned char temp[BLOCK_SIZE];
460
+ Py_ssize_t i, j, len;
461
+ PyObject *result;
462
+
463
+ if(self->prf_mode) {
464
+ // PRF mode enabled, therefore, skip decrypt
465
+ PyErr_Format(PyExc_ValueError, "decrypt function not enabled.");
466
+ return NULL;
467
+ }
468
+
469
+ /* CTR mode decryption is identical to encryption */
470
+ if (self->mode == MODE_CTR)
471
+ return ALG_Encrypt(self, args);
472
+
473
+ #if PY_MAJOR_VERSION >= 3
474
+ if (!PyArg_ParseTuple(args, "y#", &str, &len))
475
+ #else
476
+ if (!PyArg_ParseTuple(args, "s#", &str, &len))
477
+ #endif
478
+ return NULL;
479
+ if (len==0) /* Handle empty string */
480
+ {
481
+ return PyUnicode_FromStringAndSize(NULL, 0);
482
+ }
483
+ if ( (len % BLOCK_SIZE) !=0 &&
484
+ (self->mode!=MODE_CFB && self->mode!=MODE_PGP))
485
+ {
486
+ PyErr_Format(PyExc_ValueError,
487
+ "Input strings must be "
488
+ "a multiple of %i in length",
489
+ BLOCK_SIZE);
490
+ return NULL;
491
+ }
492
+ if (self->mode == MODE_CFB &&
493
+ (len % (self->segment_size/8) !=0)) {
494
+ PyErr_Format(PyExc_ValueError,
495
+ "Input strings must be a multiple of "
496
+ "the segment size %i in length",
497
+ self->segment_size/8);
498
+ return NULL;
499
+ }
500
+ buffer=malloc(len);
501
+ if (buffer==NULL)
502
+ {
503
+ PyErr_SetString(PyExc_MemoryError,
504
+ "No memory available in " _MODULE_STRING
505
+ " decrypt");
506
+ return NULL;
507
+ }
508
+ Py_BEGIN_ALLOW_THREADS;
509
+ switch(self->mode)
510
+ {
511
+ case(MODE_ECB):
512
+ for(i=0; i<len; i+=BLOCK_SIZE)
513
+ {
514
+ block_decrypt(&(self->st), str+i, buffer+i);
515
+ }
516
+ break;
517
+
518
+ case(MODE_CBC):
519
+ for(i=0; i<len; i+=BLOCK_SIZE)
520
+ {
521
+ memcpy(self->oldCipher, self->IV, BLOCK_SIZE);
522
+ block_decrypt(&(self->st), str+i, temp);
523
+ for(j=0; j<BLOCK_SIZE; j++)
524
+ {
525
+ buffer[i+j]=temp[j]^self->IV[j];
526
+ self->IV[j]=str[i+j];
527
+ }
528
+ }
529
+ break;
530
+
531
+ case(MODE_CFB):
532
+ for(i=0; i<len; i+=self->segment_size/8)
533
+ {
534
+ block_encrypt(&(self->st), self->IV, temp);
535
+ for (j=0; j<self->segment_size/8; j++) {
536
+ buffer[i+j] = str[i+j]^temp[j];
537
+ }
538
+ if (self->segment_size == BLOCK_SIZE * 8) {
539
+ /* s == b: segment size is identical to
540
+ the algorithm block size */
541
+ memcpy(self->IV, str + i, BLOCK_SIZE);
542
+ }
543
+ else if ((self->segment_size % 8) == 0) {
544
+ int sz = self->segment_size/8;
545
+ memmove(self->IV, self->IV + sz,
546
+ BLOCK_SIZE-sz);
547
+ memcpy(self->IV + BLOCK_SIZE - sz, str + i,
548
+ sz);
549
+ }
550
+ else {
551
+ /* segment_size is not a multiple of 8;
552
+ currently this can't happen */
553
+ }
554
+ }
555
+ break;
556
+
557
+ case(MODE_PGP):
558
+ if (len<=BLOCK_SIZE-self->count)
559
+ {
560
+ /* If less than one block, XOR it in */
561
+ unsigned char t;
562
+ for(i=0; i<len; i++)
563
+ {
564
+ t=self->IV[self->count+i];
565
+ buffer[i] = t ^ (self->IV[self->count+i] = str[i]);
566
+ }
567
+ self->count += len;
568
+ }
569
+ else
570
+ {
571
+ int j;
572
+ unsigned char t;
573
+ for(i=0; i<BLOCK_SIZE-self->count; i++)
574
+ {
575
+ t=self->IV[self->count+i];
576
+ buffer[i] = t ^ (self->IV[self->count+i] = str[i]);
577
+ }
578
+ self->count=0;
579
+ for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE)
580
+ {
581
+ block_encrypt(&(self->st), self->oldCipher, self->IV);
582
+ for(j=0; j<BLOCK_SIZE; j++)
583
+ {
584
+ t=self->IV[j];
585
+ buffer[i+j] = t ^ (self->IV[j] = str[i+j]);
586
+ }
587
+ }
588
+ /* Do the remaining 1 to BLOCK_SIZE bytes */
589
+ block_encrypt(&(self->st), self->oldCipher, self->IV);
590
+ self->count=len-i;
591
+ for(j=0; j<len-i; j++)
592
+ {
593
+ t=self->IV[j];
594
+ buffer[i+j] = t ^ (self->IV[j] = str[i+j]);
595
+ }
596
+ }
597
+ break;
598
+
599
+ case (MODE_OFB):
600
+ for(i=0; i<len; i+=BLOCK_SIZE)
601
+ {
602
+ block_encrypt(&(self->st), self->IV, temp);
603
+ memcpy(self->IV, temp, BLOCK_SIZE);
604
+ for(j=0; j<BLOCK_SIZE; j++)
605
+ {
606
+ buffer[i+j] = str[i+j] ^ self->IV[j];
607
+ }
608
+ }
609
+ break;
610
+
611
+ default:
612
+ Py_BLOCK_THREADS;
613
+ PyErr_Format(PyExc_SystemError,
614
+ "Unknown ciphertext feedback mode %i; "
615
+ "this shouldn't happen",
616
+ self->mode);
617
+ free(buffer);
618
+ return NULL;
619
+ }
620
+ Py_END_ALLOW_THREADS;
621
+ result=PyBytes_FromStringAndSize((char *) buffer, len);
622
+ free(buffer);
623
+ return(result);
624
+ }
625
+
626
+ static char ALG_Sync__doc__[] =
627
+ "sync(): For objects using the PGP feedback mode, this method modifies "
628
+ "the IV, synchronizing it with the preceding ciphertext.";
629
+
630
+ static PyObject *
631
+ ALG_Sync(ALGobject *self, PyObject *args)
632
+ {
633
+ if (!PyArg_ParseTuple(args, "")) {
634
+ return NULL;
635
+ }
636
+
637
+ if (self->mode!=MODE_PGP)
638
+ {
639
+ PyErr_SetString(PyExc_SystemError, "sync() operation not defined for "
640
+ "this feedback mode");
641
+ return NULL;
642
+ }
643
+
644
+ if (self->count!=8)
645
+ {
646
+ memmove(self->IV+BLOCK_SIZE-self->count, self->IV,
647
+ self->count);
648
+ memcpy(self->IV, self->oldCipher+self->count,
649
+ BLOCK_SIZE-self->count);
650
+ self->count=8;
651
+ }
652
+ Py_INCREF(Py_None);
653
+ return Py_None;
654
+ }
655
+
656
+ static char ALG_SetMode__doc__[] =
657
+ "setMode(): set whether PRF mode (TRUE or FALSE).";
658
+
659
+ static PyObject *
660
+ ALG_SetMode(ALGobject *self, PyObject *args) {
661
+ int enable_prf;
662
+
663
+ if(PyArg_ParseTuple(args, "i", &enable_prf)) {
664
+ if(enable_prf >= TRUE) {
665
+ //printf("Enabling PRF mode.\n");
666
+ self->prf_mode = enable_prf;
667
+ }
668
+ Py_INCREF(Py_None);
669
+ return Py_None;
670
+ }
671
+
672
+ return NULL;
673
+ }
674
+
675
+
676
+ #if 0
677
+ void PrintState(self, msg)
678
+ ALGobject *self;
679
+ char * msg;
680
+ {
681
+ int count;
682
+
683
+ printf("%sing: %i IV ", msg, (int)self->count);
684
+ for(count=0; count<8; count++) printf("%i ", self->IV[count]);
685
+ printf("\noldCipher:");
686
+ for(count=0; count<8; count++) printf("%i ", self->oldCipher[count]);
687
+ printf("\n");
688
+ }
689
+ #endif
690
+
691
+
692
+ /* ALG object methods */
693
+
694
+ PyMethodDef ALGmethods[] =
695
+ {
696
+ {"encrypt", (PyCFunction) ALG_Encrypt, METH_VARARGS, ALG_Encrypt__doc__},
697
+ {"decrypt", (PyCFunction) ALG_Decrypt, METH_VARARGS, ALG_Decrypt__doc__},
698
+ {"sync", (PyCFunction) ALG_Sync, METH_VARARGS, ALG_Sync__doc__},
699
+ {"setMode", (PyCFunction) ALG_SetMode, METH_VARARGS, ALG_SetMode__doc__},
700
+ {NULL, NULL} /* sentinel */
701
+ };
702
+
703
+ PyMemberDef ALGmembers[] =
704
+ {
705
+ {"IV", T_STRING_INPLACE, offsetof(ALGobject, IV), READONLY, "the initialization vector"},
706
+ {"mode", T_PYSSIZET, offsetof(ALGobject, mode), READONLY, "the mode of operation"},
707
+ {NULL},
708
+ };
709
+
710
+ //static int
711
+ //ALGsetattr(PyObject *ptr, char *name, PyObject *v)
712
+ //{
713
+ // ALGobject *self=(ALGobject *)ptr;
714
+ // if (strcmp(name, "IV") != 0)
715
+ // {
716
+ // PyErr_Format(PyExc_AttributeError,
717
+ // "non-existent block cipher object attribute '%s'",
718
+ // name);
719
+ // return -1;
720
+ // }
721
+ // if (v==NULL)
722
+ // {
723
+ // PyErr_SetString(PyExc_AttributeError,
724
+ // "Can't delete IV attribute of block cipher object");
725
+ // return -1;
726
+ // }
727
+ // if (!PyUnicode_Check(v))
728
+ // {
729
+ // PyErr_SetString(PyExc_TypeError,
730
+ // "IV attribute of block cipher object must be string");
731
+ // return -1;
732
+ // }
733
+ // if (PyUnicode_GET_SIZE(v)!=BLOCK_SIZE)
734
+ // {
735
+ // PyErr_Format(PyExc_ValueError,
736
+ // _MODULE_STRING " IV must be %i bytes long",
737
+ // BLOCK_SIZE);
738
+ // return -1;
739
+ // }
740
+ // memcpy(self->IV, PyBytes_AsString(PyUnicode_AsASCIIString(v)), BLOCK_SIZE);
741
+ // return 0;
742
+ //}
743
+ //
744
+ //static PyObject *
745
+ //ALGgetattr(PyObject *s, char *name)
746
+ //{
747
+ // ALGobject *self = (ALGobject*)s;
748
+ // if (strcmp(name, "IV") == 0)
749
+ // {
750
+ // return(PyUnicode_FromStringAndSize((char *) self->IV, BLOCK_SIZE));
751
+ // }
752
+ // if (strcmp(name, "mode") == 0)
753
+ // {
754
+ // return(PyLong_FromLong((long)(self->mode)));
755
+ // }
756
+ // if (strcmp(name, "block_size") == 0)
757
+ // {
758
+ // return PyLong_FromLong(BLOCK_SIZE);
759
+ // }
760
+ // if (strcmp(name, "key_size") == 0)
761
+ // {
762
+ // return PyLong_FromLong(KEY_SIZE);
763
+ // }
764
+ //// return Py_FindMethod(ALGmethods, (PyObject *) self, name);
765
+ // return NULL;
766
+ //}
767
+
768
+ /* List of functions defined in the module */
769
+ struct module_state {
770
+ PyObject *error;
771
+ };
772
+
773
+ #if PY_MAJOR_VERSION >= 3
774
+ #define GETSTATE(m) ((struct module_state *) PyModule_GetState(m))
775
+ #else
776
+ #define GETSTATE(m) (&_state)
777
+ static struct module_state _state;
778
+ #endif
779
+
780
+ static PyMethodDef modulemethods[] =
781
+ {
782
+ {"new", (PyCFunction) ALGnew, METH_VARARGS|METH_KEYWORDS, ALGnew__doc__},
783
+ {NULL, NULL} /* sentinel */
784
+ };
785
+
786
+ static PyTypeObject ALGtype =
787
+ {
788
+ PyVarObject_HEAD_INIT(NULL, 0)
789
+ _MODULE_STRING, /*tp_name*/
790
+ sizeof(ALGobject), /*tp_size*/
791
+ 0, /*tp_itemsize*/
792
+ /* methods */
793
+ ALGdealloc, /*tp_dealloc*/
794
+ 0, /*tp_print*/
795
+ 0, // ALGgetattr, /*tp_getattr*/
796
+ 0, // ALGsetattr, /*tp_setattr*/
797
+ 0, /*tp_compare*/
798
+ (reprfunc) 0, /*tp_repr*/
799
+ 0, /*tp_as_number*/
800
+ 0, /*tp_as_sequence*/
801
+ 0, /*tp_as_mapping*/
802
+ 0, /*tp_hash */
803
+ 0, /*tp_call*/
804
+ 0, /*tp_str*/
805
+ PyObject_GenericGetAttr, /*tp_getattro*/
806
+ 0, /*tp_setattro*/
807
+ 0, /*tp_as_buffer*/
808
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
809
+ "ALG object", /* tp_doc */
810
+ 0, /* tp_traverse */
811
+ 0, /* tp_clear */
812
+ 0, /* tp_richcompare */
813
+ 0, /* tp_weaklistoffset */
814
+ 0, /* tp_iter */
815
+ 0, /* tp_iternext */
816
+ ALGmethods, /* tp_methods */
817
+ ALGmembers, /* tp_members */
818
+ };
819
+
820
+ /* Initialization function for the module */
821
+
822
+ //#if PY_MAJOR_VERSION < 1011
823
+ //#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v);
824
+ // if (o!=NULL)
825
+ // {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}}
826
+ //#endif
827
+
828
+ //#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
829
+ //#define PyMODINIT_FUNC void
830
+ //#endif
831
+ //PyMODINIT_FUNC
832
+ //_MODULE_NAME (void)
833
+ //{
834
+ #if PY_MAJOR_VERSION >= 3
835
+ static int block_traverse(PyObject *m, visitproc visit, void *arg) {
836
+ Py_VISIT(GETSTATE(m)->error);
837
+ return 0;
838
+ }
839
+
840
+ static int block_clear(PyObject *m) {
841
+ Py_CLEAR(GETSTATE(m)->error);
842
+ return 0;
843
+ }
844
+
845
+ static struct PyModuleDef moduledef = {
846
+ PyModuleDef_HEAD_INIT,
847
+ _MODULE_STRING,
848
+ NULL,
849
+ sizeof(struct module_state),
850
+ modulemethods,
851
+ NULL,
852
+ block_traverse,
853
+ block_clear,
854
+ NULL
855
+ };
856
+
857
+ #define INITERROR return NULL
858
+ PyMODINIT_FUNC
859
+ _MODULE_NAME(void) {
860
+ #else
861
+ #define INITERROR return
862
+ void _MODULE_NAME(void) {
863
+ #endif
864
+ PyObject *m;
865
+ // ALGtype.ob_type = &PyType_Type;
866
+ if(PyType_Ready(&ALGtype) < 0) INITERROR;
867
+
868
+ #if PY_MAJOR_VERSION >= 3
869
+ m = PyModule_Create(&moduledef);
870
+ #else
871
+ /* Create the module and add the functions */
872
+ m = Py_InitModule(_MODULE_STRING, modulemethods);
873
+ #endif
874
+
875
+ if(m == NULL) INITERROR;
876
+ struct module_state *st = GETSTATE(m);
877
+ st->error = PyErr_NewException(_MODULE_STRING".Error", NULL, NULL);
878
+ if(st->error == NULL) {
879
+ Py_DECREF(m);
880
+ INITERROR;
881
+ }
882
+
883
+ PyModule_AddIntConstant(m, "MODE_ECB", MODE_ECB);
884
+ PyModule_AddIntConstant(m, "MODE_CBC", MODE_CBC);
885
+ PyModule_AddIntConstant(m, "MODE_CFB", MODE_CFB);
886
+ PyModule_AddIntConstant(m, "MODE_PGP", MODE_PGP);
887
+ PyModule_AddIntConstant(m, "MODE_OFB", MODE_OFB);
888
+ PyModule_AddIntConstant(m, "MODE_CTR", MODE_CTR);
889
+ PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE);
890
+ PyModule_AddIntConstant(m, "key_size", KEY_SIZE);
891
+
892
+ /* Check for errors */
893
+ if (PyErr_Occurred())
894
+ Py_FatalError("can't initialize module " _MODULE_STRING);
895
+ #if PY_MAJOR_VERSION >= 3
896
+ return m;
897
+ #endif
898
+ }
899
+
900
+ /* vim:set ts=8 sw=8 sts=0 noexpandtab: */