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.
- charm/__init__.py +5 -0
- charm/adapters/__init__.py +0 -0
- charm/adapters/abenc_adapt_hybrid.py +90 -0
- charm/adapters/dabenc_adapt_hybrid.py +145 -0
- charm/adapters/ibenc_adapt_hybrid.py +72 -0
- charm/adapters/ibenc_adapt_identityhash.py +80 -0
- charm/adapters/kpabenc_adapt_hybrid.py +91 -0
- charm/adapters/pkenc_adapt_bchk05.py +121 -0
- charm/adapters/pkenc_adapt_chk04.py +91 -0
- charm/adapters/pkenc_adapt_hybrid.py +98 -0
- charm/adapters/pksig_adapt_naor01.py +89 -0
- charm/config.py +7 -0
- charm/core/__init__.py +0 -0
- charm/core/benchmark/benchmark_util.c +353 -0
- charm/core/benchmark/benchmark_util.h +61 -0
- charm/core/benchmark/benchmarkmodule.c +476 -0
- charm/core/benchmark/benchmarkmodule.h +162 -0
- charm/core/benchmark.cpython-313-darwin.so +0 -0
- charm/core/crypto/AES/AES.c +1464 -0
- charm/core/crypto/AES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES/DES.c +113 -0
- charm/core/crypto/DES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES3/DES3.c +26 -0
- charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
- charm/core/crypto/__init__.py +0 -0
- charm/core/crypto/cryptobase/XOR.c +80 -0
- charm/core/crypto/cryptobase/_counter.c +496 -0
- charm/core/crypto/cryptobase/_counter.h +54 -0
- charm/core/crypto/cryptobase/block_template.c +900 -0
- charm/core/crypto/cryptobase/block_template.h +69 -0
- charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
- charm/core/crypto/cryptobase/stream_template.c +271 -0
- charm/core/crypto/cryptobase/strxor.c +229 -0
- charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
- charm/core/engine/__init__.py +5 -0
- charm/core/engine/protocol.py +293 -0
- charm/core/engine/util.py +174 -0
- charm/core/math/__init__.py +0 -0
- charm/core/math/elliptic_curve/ecmodule.c +1986 -0
- charm/core/math/elliptic_curve/ecmodule.h +230 -0
- charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
- charm/core/math/elliptic_curve.pyi +63 -0
- charm/core/math/integer/integermodule.c +2539 -0
- charm/core/math/integer/integermodule.h +145 -0
- charm/core/math/integer.cpython-313-darwin.so +0 -0
- charm/core/math/integer.pyi +76 -0
- charm/core/math/pairing/miracl/miracl_config.h +37 -0
- charm/core/math/pairing/miracl/miracl_interface.h +118 -0
- charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
- charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
- charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
- charm/core/math/pairing/pairingmodule.c +2230 -0
- charm/core/math/pairing/pairingmodule.h +241 -0
- charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
- charm/core/math/pairing/relic/pairingmodule3.h +233 -0
- charm/core/math/pairing/relic/relic_interface.c +1337 -0
- charm/core/math/pairing/relic/relic_interface.h +217 -0
- charm/core/math/pairing/relic/test_relic.c +171 -0
- charm/core/math/pairing.cpython-313-darwin.so +0 -0
- charm/core/math/pairing.pyi +69 -0
- charm/core/utilities/base64.c +248 -0
- charm/core/utilities/base64.h +15 -0
- charm/schemes/__init__.py +0 -0
- charm/schemes/abenc/__init__.py +0 -0
- charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
- charm/schemes/abenc/abenc_bsw07.py +146 -0
- charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
- charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
- charm/schemes/abenc/abenc_lsw08.py +159 -0
- charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
- charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
- charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
- charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
- charm/schemes/abenc/abenc_waters09.py +144 -0
- charm/schemes/abenc/abenc_yct14.py +208 -0
- charm/schemes/abenc/abenc_yllc15.py +178 -0
- charm/schemes/abenc/ac17.py +248 -0
- charm/schemes/abenc/bsw07.py +141 -0
- charm/schemes/abenc/cgw15.py +277 -0
- charm/schemes/abenc/dabe_aw11.py +204 -0
- charm/schemes/abenc/dfa_fe12.py +144 -0
- charm/schemes/abenc/pk_hve08.py +179 -0
- charm/schemes/abenc/waters11.py +143 -0
- charm/schemes/aggrsign_MuSig.py +150 -0
- charm/schemes/aggrsign_bls.py +267 -0
- charm/schemes/blindsig_ps16.py +654 -0
- charm/schemes/chamhash_adm05.py +113 -0
- charm/schemes/chamhash_rsa_hw09.py +100 -0
- charm/schemes/commit/__init__.py +0 -0
- charm/schemes/commit/commit_gs08.py +77 -0
- charm/schemes/commit/commit_pedersen92.py +53 -0
- charm/schemes/encap_bchk05.py +62 -0
- charm/schemes/grpsig/__init__.py +0 -0
- charm/schemes/grpsig/groupsig_bgls04.py +114 -0
- charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
- charm/schemes/hibenc/__init__.py +0 -0
- charm/schemes/hibenc/hibenc_bb04.py +105 -0
- charm/schemes/hibenc/hibenc_lew11.py +193 -0
- charm/schemes/ibenc/__init__.py +0 -0
- charm/schemes/ibenc/clpkc_rp03.py +119 -0
- charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
- charm/schemes/ibenc/ibenc_bb03.py +94 -0
- charm/schemes/ibenc/ibenc_bf01.py +121 -0
- charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
- charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
- charm/schemes/ibenc/ibenc_lsw08.py +120 -0
- charm/schemes/ibenc/ibenc_sw05.py +238 -0
- charm/schemes/ibenc/ibenc_waters05.py +144 -0
- charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
- charm/schemes/ibenc/ibenc_waters09.py +107 -0
- charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
- charm/schemes/joye_scheme.py +106 -0
- charm/schemes/lem_scheme.py +207 -0
- charm/schemes/pk_fre_ccv11.py +107 -0
- charm/schemes/pk_vrf.py +127 -0
- charm/schemes/pkenc/__init__.py +0 -0
- charm/schemes/pkenc/pkenc_cs98.py +108 -0
- charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
- charm/schemes/pkenc/pkenc_gm82.py +98 -0
- charm/schemes/pkenc/pkenc_paillier99.py +118 -0
- charm/schemes/pkenc/pkenc_rabin.py +254 -0
- charm/schemes/pkenc/pkenc_rsa.py +186 -0
- charm/schemes/pksig/__init__.py +0 -0
- charm/schemes/pksig/pksig_CW13_z.py +135 -0
- charm/schemes/pksig/pksig_bls04.py +87 -0
- charm/schemes/pksig/pksig_boyen.py +156 -0
- charm/schemes/pksig/pksig_chch.py +97 -0
- charm/schemes/pksig/pksig_chp.py +70 -0
- charm/schemes/pksig/pksig_cl03.py +150 -0
- charm/schemes/pksig/pksig_cl04.py +87 -0
- charm/schemes/pksig/pksig_cllww12_z.py +142 -0
- charm/schemes/pksig/pksig_cyh.py +132 -0
- charm/schemes/pksig/pksig_dsa.py +76 -0
- charm/schemes/pksig/pksig_ecdsa.py +71 -0
- charm/schemes/pksig/pksig_hess.py +104 -0
- charm/schemes/pksig/pksig_hw.py +110 -0
- charm/schemes/pksig/pksig_lamport.py +63 -0
- charm/schemes/pksig/pksig_ps01.py +135 -0
- charm/schemes/pksig/pksig_ps02.py +124 -0
- charm/schemes/pksig/pksig_ps03.py +119 -0
- charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
- charm/schemes/pksig/pksig_schnorr91.py +77 -0
- charm/schemes/pksig/pksig_waters.py +115 -0
- charm/schemes/pksig/pksig_waters05.py +121 -0
- charm/schemes/pksig/pksig_waters09.py +121 -0
- charm/schemes/pre_mg07.py +150 -0
- charm/schemes/prenc/pre_afgh06.py +126 -0
- charm/schemes/prenc/pre_bbs98.py +123 -0
- charm/schemes/prenc/pre_nal16.py +216 -0
- charm/schemes/protocol_a01.py +272 -0
- charm/schemes/protocol_ao00.py +215 -0
- charm/schemes/protocol_cns07.py +274 -0
- charm/schemes/protocol_schnorr91.py +125 -0
- charm/schemes/sigma1.py +64 -0
- charm/schemes/sigma2.py +129 -0
- charm/schemes/sigma3.py +126 -0
- charm/schemes/threshold/__init__.py +59 -0
- charm/schemes/threshold/dkls23_dkg.py +556 -0
- charm/schemes/threshold/dkls23_presign.py +1089 -0
- charm/schemes/threshold/dkls23_sign.py +761 -0
- charm/schemes/threshold/xrpl_wallet.py +967 -0
- charm/test/__init__.py +0 -0
- charm/test/adapters/__init__.py +0 -0
- charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
- charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
- charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
- charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
- charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
- charm/test/benchmark/abenc_yllc15_bench.py +92 -0
- charm/test/benchmark/benchmark_test.py +148 -0
- charm/test/benchmark_threshold.py +260 -0
- charm/test/conftest.py +38 -0
- charm/test/fuzz/__init__.py +1 -0
- charm/test/fuzz/conftest.py +5 -0
- charm/test/fuzz/fuzz_policy_parser.py +76 -0
- charm/test/fuzz/fuzz_serialization.py +83 -0
- charm/test/schemes/__init__.py +0 -0
- charm/test/schemes/abenc/__init__.py +0 -0
- charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
- charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
- charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
- charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
- charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
- charm/test/schemes/chamhash_adm05_test.py +31 -0
- charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
- charm/test/schemes/commit/__init__.py +0 -0
- charm/test/schemes/commit/commit_gs08_test.py +24 -0
- charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
- charm/test/schemes/dabe_aw11_test.py +45 -0
- charm/test/schemes/encap_bchk05_test.py +21 -0
- charm/test/schemes/grpsig/__init__.py +0 -0
- charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
- charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
- charm/test/schemes/hibenc/__init__.py +0 -0
- charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
- charm/test/schemes/ibenc/__init__.py +0 -0
- charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
- charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
- charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
- charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
- charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
- charm/test/schemes/pk_vrf_test.py +29 -0
- charm/test/schemes/pkenc/__init__.py +0 -0
- charm/test/schemes/pkenc_test.py +255 -0
- charm/test/schemes/pksig/__init__.py +0 -0
- charm/test/schemes/pksig_test.py +376 -0
- charm/test/schemes/rsa_alg_test.py +340 -0
- charm/test/schemes/threshold_test.py +1792 -0
- charm/test/serialize/__init__.py +0 -0
- charm/test/serialize/serialize_test.py +40 -0
- charm/test/toolbox/__init__.py +0 -0
- charm/test/toolbox/conversion_test.py +30 -0
- charm/test/toolbox/ecgroup_test.py +53 -0
- charm/test/toolbox/integer_arithmetic_test.py +441 -0
- charm/test/toolbox/paddingschemes_test.py +238 -0
- charm/test/toolbox/policy_parser_stress_test.py +969 -0
- charm/test/toolbox/secretshare_test.py +28 -0
- charm/test/toolbox/symcrypto_test.py +108 -0
- charm/test/toolbox/test_policy_expression.py +16 -0
- charm/test/vectors/__init__.py +1 -0
- charm/test/vectors/test_bls_vectors.py +289 -0
- charm/test/vectors/test_pedersen_vectors.py +315 -0
- charm/test/vectors/test_schnorr_vectors.py +368 -0
- charm/test/zkp_compiler/__init__.py +9 -0
- charm/test/zkp_compiler/benchmark_zkp.py +258 -0
- charm/test/zkp_compiler/test_and_proof.py +240 -0
- charm/test/zkp_compiler/test_batch_verify.py +248 -0
- charm/test/zkp_compiler/test_dleq_proof.py +264 -0
- charm/test/zkp_compiler/test_or_proof.py +231 -0
- charm/test/zkp_compiler/test_proof_serialization.py +121 -0
- charm/test/zkp_compiler/test_range_proof.py +241 -0
- charm/test/zkp_compiler/test_representation_proof.py +325 -0
- charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
- charm/test/zkp_compiler/test_thread_safety.py +169 -0
- charm/test/zkp_compiler/test_zkp_parser.py +139 -0
- charm/toolbox/ABEnc.py +26 -0
- charm/toolbox/ABEncMultiAuth.py +66 -0
- charm/toolbox/ABEnumeric.py +800 -0
- charm/toolbox/Commit.py +24 -0
- charm/toolbox/DFA.py +89 -0
- charm/toolbox/FSA.py +1254 -0
- charm/toolbox/Hash.py +39 -0
- charm/toolbox/IBEnc.py +62 -0
- charm/toolbox/IBSig.py +64 -0
- charm/toolbox/PKEnc.py +66 -0
- charm/toolbox/PKSig.py +56 -0
- charm/toolbox/PREnc.py +32 -0
- charm/toolbox/ZKProof.py +289 -0
- charm/toolbox/__init__.py +0 -0
- charm/toolbox/bitstring.py +49 -0
- charm/toolbox/broadcast.py +220 -0
- charm/toolbox/conversion.py +100 -0
- charm/toolbox/eccurve.py +149 -0
- charm/toolbox/ecgroup.py +143 -0
- charm/toolbox/enum.py +60 -0
- charm/toolbox/hash_module.py +91 -0
- charm/toolbox/integergroup.py +323 -0
- charm/toolbox/iterate.py +22 -0
- charm/toolbox/matrixops.py +76 -0
- charm/toolbox/mpc_utils.py +296 -0
- charm/toolbox/msp.py +175 -0
- charm/toolbox/mta.py +985 -0
- charm/toolbox/node.py +120 -0
- charm/toolbox/ot/__init__.py +22 -0
- charm/toolbox/ot/base_ot.py +374 -0
- charm/toolbox/ot/dpf.py +642 -0
- charm/toolbox/ot/mpfss.py +228 -0
- charm/toolbox/ot/ot_extension.py +589 -0
- charm/toolbox/ot/silent_ot.py +378 -0
- charm/toolbox/paddingschemes.py +423 -0
- charm/toolbox/paddingschemes_test.py +238 -0
- charm/toolbox/pairingcurves.py +85 -0
- charm/toolbox/pairinggroup.py +186 -0
- charm/toolbox/policy_expression_spec.py +70 -0
- charm/toolbox/policytree.py +189 -0
- charm/toolbox/reCompiler.py +346 -0
- charm/toolbox/redundancyschemes.py +65 -0
- charm/toolbox/schemebase.py +188 -0
- charm/toolbox/secretshare.py +104 -0
- charm/toolbox/secretutil.py +174 -0
- charm/toolbox/securerandom.py +73 -0
- charm/toolbox/sigmaprotocol.py +46 -0
- charm/toolbox/specialprimes.py +45 -0
- charm/toolbox/symcrypto.py +279 -0
- charm/toolbox/threshold_sharing.py +553 -0
- charm/toolbox/xmlserialize.py +94 -0
- charm/toolbox/zknode.py +105 -0
- charm/zkp_compiler/__init__.py +89 -0
- charm/zkp_compiler/and_proof.py +460 -0
- charm/zkp_compiler/batch_verify.py +324 -0
- charm/zkp_compiler/dleq_proof.py +423 -0
- charm/zkp_compiler/or_proof.py +305 -0
- charm/zkp_compiler/range_proof.py +417 -0
- charm/zkp_compiler/representation_proof.py +466 -0
- charm/zkp_compiler/schnorr_proof.py +273 -0
- charm/zkp_compiler/thread_safe.py +150 -0
- charm/zkp_compiler/zk_demo.py +489 -0
- charm/zkp_compiler/zkp_factory.py +330 -0
- charm/zkp_compiler/zkp_generator.py +370 -0
- charm/zkp_compiler/zkparser.py +269 -0
- charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
- charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
- charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
- charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
- 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: */
|