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,496 @@
1
+ /*
2
+ * _counter.c: Fast counter for use with CTR-mode ciphers
3
+ *
4
+ * Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
5
+ *
6
+ * ===================================================================
7
+ * The contents of this file are dedicated to the public domain. To
8
+ * the extent that dedication to the public domain is not available,
9
+ * everyone is granted a worldwide, perpetual, royalty-free,
10
+ * non-exclusive license to exercise all rights associated with the
11
+ * contents of this file for any purpose whatsoever.
12
+ * No rights are reserved.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ * ===================================================================
23
+ */
24
+
25
+ #include <assert.h>
26
+ #include <stddef.h>
27
+ #include <string.h>
28
+
29
+ #include "_counter.h"
30
+
31
+ /* NB: This can be called multiple times for a given object, via the __init__ method. Be careful. */
32
+ static int
33
+ CounterObject_init(PCT_CounterObject *self, PyObject *args, PyObject *kwargs)
34
+ {
35
+ PyObject *prefix=NULL, *suffix=NULL, *initval=NULL;
36
+ int allow_wraparound = 0;
37
+ int disable_shortcut = 0;
38
+ Py_ssize_t size;
39
+
40
+ static char *kwlist[] = {"prefix", "suffix", "initval", "allow_wraparound", "disable_shortcut", NULL};
41
+ /* S format expects PyBytesObject* in Python 3 */
42
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "SSS|ii", kwlist, &prefix, &suffix, &initval, &allow_wraparound, &disable_shortcut))
43
+ return -1;
44
+
45
+ /* Check string size and set nbytes */
46
+ size = PyBytes_GET_SIZE(initval);
47
+ if (size < 1) {
48
+ PyErr_SetString(PyExc_ValueError, "initval length too small (must be >= 1 byte)");
49
+ return -1;
50
+ } else if (size > 0xffff) {
51
+ PyErr_SetString(PyExc_ValueError, "initval length too large (must be <= 65535 bytes)");
52
+ return -1;
53
+ }
54
+ self->nbytes = (uint16_t) size;
55
+
56
+ /* Check prefix length */
57
+ size = PyBytes_GET_SIZE(prefix);
58
+ assert(size >= 0);
59
+ if (size > 0xffff) {
60
+ PyErr_SetString(PyExc_ValueError, "prefix length too large (must be <= 65535 bytes)");
61
+ return -1;
62
+ }
63
+
64
+ /* Check suffix length */
65
+ size = PyBytes_GET_SIZE(suffix);
66
+ assert(size >= 0);
67
+ if (size > 0xffff) {
68
+ PyErr_SetString(PyExc_ValueError, "suffix length too large (must be <= 65535 bytes)");
69
+ return -1;
70
+ }
71
+
72
+ /* Set prefix, being careful to properly discard any old reference */
73
+ Py_CLEAR(self->prefix);
74
+ Py_INCREF(prefix);
75
+ self->prefix = prefix;
76
+
77
+ /* Set suffix, being careful to properly discard any old reference */
78
+ Py_CLEAR(self->suffix);
79
+ Py_INCREF(suffix);
80
+ self->suffix = suffix;
81
+
82
+ /* Free old buffer (if any) */
83
+ if (self->val) {
84
+ PyMem_Free(self->val);
85
+ self->val = self->p = NULL;
86
+ self->buf_size = 0;
87
+ }
88
+
89
+ /* Allocate new buffer */
90
+ /* buf_size won't overflow because the length of each string will always be <= 0xffff */
91
+ self->buf_size = PyBytes_GET_SIZE(prefix) + PyBytes_GET_SIZE(suffix) + self->nbytes;
92
+ self->val = self->p = PyMem_Malloc(self->buf_size);
93
+ if (self->val == NULL) {
94
+ self->buf_size = 0;
95
+ return -1;
96
+ }
97
+ self->p = self->val + PyBytes_GET_SIZE(prefix);
98
+
99
+ /* Sanity-check pointers */
100
+ assert(self->val <= self->p);
101
+ assert(self->p + self->nbytes <= self->val + self->buf_size);
102
+ assert(self->val + PyBytes_GET_SIZE(self->prefix) == self->p);
103
+ assert(PyBytes_GET_SIZE(self->prefix) + self->nbytes + PyBytes_GET_SIZE(self->suffix) == self->buf_size);
104
+
105
+ /* Copy the prefix, suffix, and initial value into the buffer. */
106
+ memcpy(self->val, PyBytes_AS_STRING(prefix), PyBytes_GET_SIZE(prefix));
107
+ memcpy(self->p, PyBytes_AS_STRING(initval), self->nbytes);
108
+ memcpy(self->p + self->nbytes, PyBytes_AS_STRING(suffix), PyBytes_GET_SIZE(suffix));
109
+
110
+ /* Set shortcut_disabled and allow_wraparound */
111
+ self->shortcut_disabled = disable_shortcut;
112
+ self->allow_wraparound = allow_wraparound;
113
+
114
+ /* Clear the carry flag */
115
+ self->carry = 0;
116
+
117
+ return 0;
118
+ }
119
+
120
+ static void
121
+ CounterObject_dealloc(PCT_CounterObject *self)
122
+ {
123
+ /* Free the buffer */
124
+ if (self->val) {
125
+ memset(self->val, 0, self->buf_size); /* wipe the buffer before freeing it */
126
+ PyMem_Free(self->val);
127
+ self->val = self->p = NULL;
128
+ self->buf_size = 0;
129
+ }
130
+
131
+ /* Deallocate the prefix and suffix, if they are present. */
132
+ Py_CLEAR(self->prefix);
133
+ Py_CLEAR(self->suffix);
134
+
135
+ /* Free this object */
136
+ PyObject_Del(self);
137
+ }
138
+
139
+ static inline PyObject *
140
+ _CounterObject_next_value(PCT_CounterObject *self, int little_endian)
141
+ {
142
+ unsigned int i;
143
+ int increment;
144
+ uint8_t *p;
145
+ PyObject *eight = NULL;
146
+ PyObject *ch = NULL;
147
+ PyObject *y = NULL;
148
+ PyObject *x = NULL;
149
+
150
+ if (self->carry && !self->allow_wraparound) {
151
+ PyErr_SetString(PyExc_OverflowError,
152
+ "counter wrapped without allow_wraparound");
153
+ goto err_out;
154
+ }
155
+
156
+ eight = PyLong_FromLong(8);
157
+ if (!eight)
158
+ goto err_out;
159
+
160
+ /* Make a new Python long integer */
161
+ x = PyLong_FromUnsignedLong(0);
162
+ if (!x)
163
+ goto err_out;
164
+
165
+ if (little_endian) {
166
+ /* little endian */
167
+ p = self->p + self->nbytes - 1;
168
+ increment = -1;
169
+ } else {
170
+ /* big endian */
171
+ p = self->p;
172
+ increment = 1;
173
+ }
174
+ for (i = 0; i < self->nbytes; i++, p += increment) {
175
+ /* Sanity check pointer */
176
+ assert(self->p <= p);
177
+ assert(p < self->p + self->nbytes);
178
+
179
+ /* ch = ord(p) */
180
+ Py_CLEAR(ch); /* delete old ch */
181
+ ch = PyLong_FromLong((long) *p);
182
+ if (!ch)
183
+ goto err_out;
184
+
185
+ /* y = x << 8 */
186
+ Py_CLEAR(y); /* delete old y */
187
+ y = PyNumber_Lshift(x, eight);
188
+ if (!y)
189
+ goto err_out;
190
+
191
+ /* x = y | ch */
192
+ Py_CLEAR(x); /* delete old x */
193
+ x = PyNumber_Or(y, ch);
194
+ }
195
+
196
+ Py_CLEAR(eight);
197
+ Py_CLEAR(ch);
198
+ Py_CLEAR(y);
199
+ return x;
200
+
201
+ err_out:
202
+ Py_CLEAR(eight);
203
+ Py_CLEAR(ch);
204
+ Py_CLEAR(y);
205
+ Py_CLEAR(x);
206
+ return NULL;
207
+ }
208
+
209
+ static PyObject *
210
+ CounterLEObject_next_value(PCT_CounterObject *self, PyObject *args)
211
+ {
212
+ return _CounterObject_next_value(self, 1);
213
+ }
214
+
215
+ static PyObject *
216
+ CounterBEObject_next_value(PCT_CounterObject *self, PyObject *args)
217
+ {
218
+ return _CounterObject_next_value(self, 0);
219
+ }
220
+
221
+ static void
222
+ CounterLEObject_increment(PCT_CounterObject *self)
223
+ {
224
+ unsigned int i, tmp, carry;
225
+ uint8_t *p;
226
+
227
+ assert(sizeof(i) >= sizeof(self->nbytes));
228
+
229
+ carry = 1;
230
+ p = self->p;
231
+ for (i = 0; i < self->nbytes; i++, p++) {
232
+ /* Sanity check pointer */
233
+ assert(self->p <= p);
234
+ assert(p < self->p + self->nbytes);
235
+
236
+ tmp = *p + carry;
237
+ carry = tmp >> 8; /* This will only ever be 0 or 1 */
238
+ *p = tmp & 0xff;
239
+ }
240
+ self->carry = carry;
241
+ }
242
+
243
+ static void
244
+ CounterBEObject_increment(PCT_CounterObject *self)
245
+ {
246
+ unsigned int i, tmp, carry;
247
+ uint8_t *p;
248
+
249
+ assert(sizeof(i) >= sizeof(self->nbytes));
250
+
251
+ carry = 1;
252
+ p = self->p + self->nbytes-1;
253
+ for (i = 0; i < self->nbytes; i++, p--) {
254
+ /* Sanity check pointer */
255
+ assert(self->p <= p);
256
+ assert(p < self->p + self->nbytes);
257
+
258
+ tmp = *p + carry;
259
+ carry = tmp >> 8; /* This will only ever be 0 or 1 */
260
+ *p = tmp & 0xff;
261
+ }
262
+ self->carry = carry;
263
+ }
264
+
265
+ static PyObject *
266
+ CounterObject_call(PCT_CounterObject *self, PyObject *args, PyObject *kwargs)
267
+ {
268
+ PyObject *retval;
269
+
270
+ if (self->carry && !self->allow_wraparound) {
271
+ PyErr_SetString(PyExc_OverflowError,
272
+ "counter wrapped without allow_wraparound");
273
+ return NULL;
274
+ }
275
+
276
+ /* Return bytes object for CTR mode counter */
277
+ retval = PyBytes_FromStringAndSize((const char *)self->val, self->buf_size);
278
+
279
+ self->inc_func(self);
280
+
281
+ return retval;
282
+ }
283
+
284
+ static PyMethodDef CounterLEObject_methods[] = {
285
+ {"next_value", (PyCFunction)CounterLEObject_next_value, METH_VARARGS,
286
+ "Get the numerical value of next value of the counter."},
287
+
288
+ {NULL} /* sentinel */
289
+ };
290
+
291
+ static PyMethodDef CounterBEObject_methods[] = {
292
+ {"next_value", (PyCFunction)CounterBEObject_next_value, METH_VARARGS,
293
+ "Get the numerical value of next value of the counter."},
294
+
295
+ {NULL} /* sentinel */
296
+ };
297
+
298
+ /* Custom getattro for accessing carry attribute and shortcut flag */
299
+ static PyObject *
300
+ CounterLEObject_getattro(PyObject *s, PyObject *name)
301
+ {
302
+ PCT_CounterObject *self = (PCT_CounterObject *)s;
303
+ const char *name_str = PyUnicode_AsUTF8(name);
304
+ if (name_str == NULL) {
305
+ return NULL;
306
+ }
307
+ if (strcmp(name_str, "carry") == 0) {
308
+ return PyLong_FromLong((long)self->carry);
309
+ } else if (!self->shortcut_disabled && strcmp(name_str, "__PCT_CTR_SHORTCUT__") == 0) {
310
+ /* Shortcut hack - See block_template.c */
311
+ Py_INCREF(Py_True);
312
+ return Py_True;
313
+ }
314
+ return PyObject_GenericGetAttr(s, name);
315
+ }
316
+
317
+ static PyObject *
318
+ CounterBEObject_getattro(PyObject *s, PyObject *name)
319
+ {
320
+ PCT_CounterObject *self = (PCT_CounterObject *)s;
321
+ const char *name_str = PyUnicode_AsUTF8(name);
322
+ if (name_str == NULL) {
323
+ return NULL;
324
+ }
325
+ if (strcmp(name_str, "carry") == 0) {
326
+ return PyLong_FromLong((long)self->carry);
327
+ } else if (!self->shortcut_disabled && strcmp(name_str, "__PCT_CTR_SHORTCUT__") == 0) {
328
+ /* Shortcut hack - See block_template.c */
329
+ Py_INCREF(Py_True);
330
+ return Py_True;
331
+ }
332
+ return PyObject_GenericGetAttr(s, name);
333
+ }
334
+
335
+ static PyTypeObject
336
+ my_CounterLEType = {
337
+ PyVarObject_HEAD_INIT(NULL, 0)
338
+ "_counter.CounterLE", /* tp_name */
339
+ sizeof(PCT_CounterObject), /* tp_basicsize */
340
+ 0, /* tp_itemsize */
341
+ (destructor)CounterObject_dealloc, /* tp_dealloc */
342
+ 0, /* tp_vectorcall_offset */
343
+ 0, /* tp_getattr (deprecated) */
344
+ 0, /* tp_setattr (deprecated) */
345
+ 0, /* tp_as_async */
346
+ 0, /* tp_repr */
347
+ 0, /* tp_as_number */
348
+ 0, /* tp_as_sequence */
349
+ 0, /* tp_as_mapping */
350
+ 0, /* tp_hash */
351
+ (ternaryfunc)CounterObject_call, /* tp_call */
352
+ 0, /* tp_str */
353
+ CounterLEObject_getattro, /* tp_getattro */
354
+ 0, /* tp_setattro */
355
+ 0, /* tp_as_buffer */
356
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
357
+ "Counter (little endian)", /* tp_doc */
358
+ 0, /* tp_traverse */
359
+ 0, /* tp_clear */
360
+ 0, /* tp_richcompare */
361
+ 0, /* tp_weaklistoffset */
362
+ 0, /* tp_iter */
363
+ 0, /* tp_iternext */
364
+ CounterLEObject_methods, /* tp_methods */
365
+ };
366
+
367
+ static PyTypeObject
368
+ my_CounterBEType = {
369
+ PyVarObject_HEAD_INIT(NULL, 0)
370
+ "_counter.CounterBE", /* tp_name */
371
+ sizeof(PCT_CounterObject), /* tp_basicsize */
372
+ 0, /* tp_itemsize */
373
+ (destructor)CounterObject_dealloc, /* tp_dealloc */
374
+ 0, /* tp_vectorcall_offset */
375
+ 0, /* tp_getattr (deprecated) */
376
+ 0, /* tp_setattr (deprecated) */
377
+ 0, /* tp_as_async */
378
+ 0, /* tp_repr */
379
+ 0, /* tp_as_number */
380
+ 0, /* tp_as_sequence */
381
+ 0, /* tp_as_mapping */
382
+ 0, /* tp_hash */
383
+ (ternaryfunc)CounterObject_call, /* tp_call */
384
+ 0, /* tp_str */
385
+ CounterBEObject_getattro, /* tp_getattro */
386
+ 0, /* tp_setattro */
387
+ 0, /* tp_as_buffer */
388
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
389
+ "Counter (big endian)", /* tp_doc */
390
+ 0, /* tp_traverse */
391
+ 0, /* tp_clear */
392
+ 0, /* tp_richcompare */
393
+ 0, /* tp_weaklistoffset */
394
+ 0, /* tp_iter */
395
+ 0, /* tp_iternext */
396
+ CounterBEObject_methods, /* tp_methods */
397
+ };
398
+
399
+ /*
400
+ * Python 2.1 doesn't seem to allow a C equivalent of the __init__ method, so
401
+ * we use the module-level functions newLE and newBE here.
402
+ */
403
+ static PyObject *
404
+ CounterLE_new(PyObject *self, PyObject *args, PyObject *kwargs)
405
+ {
406
+ PCT_CounterObject *obj = NULL;
407
+
408
+ /* Create the new object */
409
+ obj = PyObject_New(PCT_CounterObject, &my_CounterLEType);
410
+ if (obj == NULL) {
411
+ return NULL;
412
+ }
413
+
414
+ /* Zero the custom portion of the structure */
415
+ memset(&obj->prefix, 0, sizeof(PCT_CounterObject) - offsetof(PCT_CounterObject, prefix));
416
+
417
+ /* Call the object's initializer. Delete the object if this fails. */
418
+ if (CounterObject_init(obj, args, kwargs) != 0) {
419
+ return NULL;
420
+ }
421
+
422
+ /* Set the inc_func pointer */
423
+ obj->inc_func = (void (*)(void *))CounterLEObject_increment;
424
+
425
+ /* Return the object */
426
+ return (PyObject *)obj;
427
+ }
428
+
429
+ static PyObject *
430
+ CounterBE_new(PyObject *self, PyObject *args, PyObject *kwargs)
431
+ {
432
+ PCT_CounterObject *obj = NULL;
433
+
434
+ /* Create the new object */
435
+ obj = PyObject_New(PCT_CounterObject, &my_CounterBEType);
436
+ if (obj == NULL) {
437
+ return NULL;
438
+ }
439
+
440
+ /* Zero the custom portion of the structure */
441
+ memset(&obj->prefix, 0, sizeof(PCT_CounterObject) - offsetof(PCT_CounterObject, prefix));
442
+
443
+ /* Call the object's initializer. Delete the object if this fails. */
444
+ if (CounterObject_init(obj, args, kwargs) != 0) {
445
+ return NULL;
446
+ }
447
+
448
+ /* Set the inc_func pointer */
449
+ obj->inc_func = (void (*)(void *))CounterBEObject_increment;
450
+
451
+ /* Return the object */
452
+ return (PyObject *)obj;
453
+ }
454
+
455
+ /*
456
+ * Module-level method table and module initialization function
457
+ */
458
+
459
+ static PyMethodDef module_methods[] = {
460
+ {"_newLE", (PyCFunction) CounterLE_new, METH_VARARGS|METH_KEYWORDS, NULL},
461
+ {"_newBE", (PyCFunction) CounterBE_new, METH_VARARGS|METH_KEYWORDS, NULL},
462
+ {NULL, NULL, 0, NULL} /* end-of-list sentinel value */
463
+ };
464
+
465
+ static struct PyModuleDef moduledef = {
466
+ PyModuleDef_HEAD_INIT,
467
+ "_counter",
468
+ "Fast counter for use with CTR-mode ciphers",
469
+ -1,
470
+ module_methods,
471
+ NULL,
472
+ NULL,
473
+ NULL,
474
+ NULL
475
+ };
476
+
477
+ PyMODINIT_FUNC
478
+ PyInit__counter(void)
479
+ {
480
+ PyObject *m;
481
+
482
+ /* Initialize the types */
483
+ if (PyType_Ready(&my_CounterLEType) < 0)
484
+ return NULL;
485
+ if (PyType_Ready(&my_CounterBEType) < 0)
486
+ return NULL;
487
+
488
+ /* Initialize the module */
489
+ m = PyModule_Create(&moduledef);
490
+ if (m == NULL)
491
+ return NULL;
492
+
493
+ return m;
494
+ }
495
+
496
+ /* vim:set ts=4 sw=4 sts=4 expandtab: */
@@ -0,0 +1,54 @@
1
+ /*
2
+ * _counter.h: Fast counter for use with CTR-mode ciphers
3
+ *
4
+ * Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
5
+ *
6
+ * ===================================================================
7
+ * The contents of this file are dedicated to the public domain. To
8
+ * the extent that dedication to the public domain is not available,
9
+ * everyone is granted a worldwide, perpetual, royalty-free,
10
+ * non-exclusive license to exercise all rights associated with the
11
+ * contents of this file for any purpose whatsoever.
12
+ * No rights are reserved.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ * ===================================================================
23
+ */
24
+ #ifndef PCT__COUNTER_H
25
+ #define PCT__COUNTER_H
26
+
27
+ #ifndef PY_SSIZE_T_CLEAN
28
+ #define PY_SSIZE_T_CLEAN
29
+ #endif
30
+
31
+ #include <stdint.h>
32
+ #include "Python.h"
33
+
34
+ /* Python 3.14+ compatibility - PyUnicode_GET_SIZE was removed */
35
+ #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 14
36
+ #define PyUnicode_GET_SIZE(o) PyUnicode_GetLength(o)
37
+ #define PyUnicode_AS_STRING(o) PyUnicode_AsUTF8(o)
38
+ #endif
39
+
40
+ typedef struct {
41
+ PyObject_HEAD
42
+ PyObject *prefix; /* Prefix bytes (useful for a nonce) */
43
+ PyObject *suffix; /* Suffix bytes (useful for a nonce) */
44
+ uint8_t *val; /* Buffer for our output string */
45
+ uint32_t buf_size; /* Size of the buffer */
46
+ uint8_t *p; /* Pointer to the part of the buffer that we're allowed to update */
47
+ uint16_t nbytes; /* The number of bytes that from .p that are part of the counter */
48
+ void (*inc_func)(void *); /* Pointer to the counter increment function */
49
+ int shortcut_disabled; /* This gets set to a non-zero value when the shortcut mechanism is disabled */
50
+ int carry; /* This gets set by Counter*Object_increment when the counter wraps around */
51
+ int allow_wraparound; /* When this is false, we raise OverflowError on next_value() or __call__() when the counter wraps around */
52
+ } PCT_CounterObject;
53
+
54
+ #endif /* PCT__COUNTER_H */