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,91 @@
|
|
|
1
|
+
import charm.core.crypto.cryptobase
|
|
2
|
+
from charm.core.math.pairing import pairing,pc_element,ZR
|
|
3
|
+
from charm.core.math.integer import integer,int2Bytes
|
|
4
|
+
from charm.toolbox.conversion import Conversion
|
|
5
|
+
from charm.toolbox.bitstring import Bytes
|
|
6
|
+
import hashlib, base64
|
|
7
|
+
|
|
8
|
+
class Hash():
|
|
9
|
+
def __init__(self, pairingElement=None, htype='sha256', integerElement=None):
|
|
10
|
+
self.hash_type = htype
|
|
11
|
+
# instance of PairingGroup
|
|
12
|
+
self.group = pairingElement
|
|
13
|
+
|
|
14
|
+
def hashToZn(self, value):
|
|
15
|
+
if type(value) == pc_element:
|
|
16
|
+
h = hashlib.new(self.hash_type)
|
|
17
|
+
h.update(self.group.serialize(value))
|
|
18
|
+
#print "digest => %s" % h.hexdigest()
|
|
19
|
+
# get raw bytes of digest and hash to Zr
|
|
20
|
+
val = h.digest()
|
|
21
|
+
return integer(int(self.group.hash(val, ZR)))
|
|
22
|
+
# do something related to that
|
|
23
|
+
if type(value) == integer:
|
|
24
|
+
str_value = int2Bytes(value)
|
|
25
|
+
#print("str_value =>", str_value)
|
|
26
|
+
#val = self.group.hash(str_value, ZR)
|
|
27
|
+
#print("hash =>", val)
|
|
28
|
+
return integer(int(self.group.hash(str_value, ZR)))
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
# takes two arbitrary strings and hashes to an element of Zr
|
|
32
|
+
def hashToZr(self, *args):
|
|
33
|
+
if isinstance(args, tuple):
|
|
34
|
+
#print("Hashing =>", args)
|
|
35
|
+
strs = ""
|
|
36
|
+
for i in args:
|
|
37
|
+
if type(i) == str:
|
|
38
|
+
strs += str(base64.encodebytes(bytes(i, 'utf8')))
|
|
39
|
+
elif type(i) == bytes:
|
|
40
|
+
strs += str(base64.encodebytes(i))
|
|
41
|
+
elif type(i) == integer:
|
|
42
|
+
strs += str(base64.encodebytes(int2Bytes(i)))
|
|
43
|
+
elif type(i) == pc_element:
|
|
44
|
+
strs += str(base64.encodebytes(self.group.serialize(i)))
|
|
45
|
+
|
|
46
|
+
if len(strs) > 0:
|
|
47
|
+
return self.group.hash(strs, ZR)
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
"""
|
|
52
|
+
Waters Hash technique: how to hash in standard model.
|
|
53
|
+
Default - len=8, bits=32 ==> 256-bits total (for SHA-256)
|
|
54
|
+
For SHA1, len=5 bits=32 ==> 160-bits total
|
|
55
|
+
"""
|
|
56
|
+
class Waters:
|
|
57
|
+
"""
|
|
58
|
+
>>> from charm.toolbox.pairinggroup import *
|
|
59
|
+
>>> from charm.toolbox.hash_module import Waters
|
|
60
|
+
>>> group = PairingGroup("SS512")
|
|
61
|
+
>>> waters = Waters(group, length=8, bits=32)
|
|
62
|
+
>>> a = waters.hash("user@email.com")
|
|
63
|
+
"""
|
|
64
|
+
def __init__(self, group, length=8, bits=32, hash_func='sha256'):
|
|
65
|
+
self._group = group
|
|
66
|
+
self._length = length
|
|
67
|
+
self._bitsize = bits
|
|
68
|
+
self.hash_function = hash_func
|
|
69
|
+
self._hashObj = hashlib.new(self.hash_function)
|
|
70
|
+
self.hashLen = len(self._hashObj.digest())
|
|
71
|
+
|
|
72
|
+
def sha2(self, message):
|
|
73
|
+
h = self._hashObj.copy()
|
|
74
|
+
h.update(bytes(message, 'utf-8'))
|
|
75
|
+
return Bytes(h.digest())
|
|
76
|
+
|
|
77
|
+
def hash(self, strID):
|
|
78
|
+
'''Hash the identity string and break it up in to l bit pieces'''
|
|
79
|
+
assert type(strID) == str, "invalid input type"
|
|
80
|
+
hash = self.sha2(strID)
|
|
81
|
+
|
|
82
|
+
val = Conversion.OS2IP(hash) #Convert to integer format
|
|
83
|
+
bstr = bin(val)[2:] #cut out the 0b header
|
|
84
|
+
|
|
85
|
+
v=[]
|
|
86
|
+
for i in range(self._length): #z must be greater than or equal to 1
|
|
87
|
+
binsubstr = bstr[self._bitsize*i : self._bitsize*(i+1)]
|
|
88
|
+
intval = int(binsubstr, 2)
|
|
89
|
+
intelement = self._group.init(ZR, intval)
|
|
90
|
+
v.append(intelement)
|
|
91
|
+
return v
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
try:
|
|
2
|
+
#from charm.core.math.integer import integer,randomBits,random,randomPrime,isPrime,encode,decode,hashInt,bitsize,legendre,gcd,lcm,serialize,deserialize,int2Bytes,toInt
|
|
3
|
+
from charm.core.math.integer import * #InitBenchmark,StartBenchmark,EndBenchmark,GetBenchmark,GetGeneralBenchmarks,ClearBenchmark
|
|
4
|
+
# Verify we got actual implementations, not mocks (for Sphinx autodoc)
|
|
5
|
+
_test = integer
|
|
6
|
+
except Exception as err:
|
|
7
|
+
# Provide stub implementations for documentation purposes (Sphinx autodoc)
|
|
8
|
+
# These allow modules to be imported for documentation generation
|
|
9
|
+
# but will raise errors if actually used at runtime
|
|
10
|
+
class integer:
|
|
11
|
+
"""Stub class for documentation. Requires C extension for actual use."""
|
|
12
|
+
pass
|
|
13
|
+
def randomBits(bits): raise NotImplementedError("Requires C extension")
|
|
14
|
+
def random(max): raise NotImplementedError("Requires C extension")
|
|
15
|
+
def randomPrime(bits, safe=False): raise NotImplementedError("Requires C extension")
|
|
16
|
+
def isPrime(n): raise NotImplementedError("Requires C extension")
|
|
17
|
+
def encode(M, p, q): raise NotImplementedError("Requires C extension")
|
|
18
|
+
def decode(element, p, q): raise NotImplementedError("Requires C extension")
|
|
19
|
+
def hashInt(args, p, q, flag): raise NotImplementedError("Requires C extension")
|
|
20
|
+
def bitsize(n): raise NotImplementedError("Requires C extension")
|
|
21
|
+
def legendre(a, p): raise NotImplementedError("Requires C extension")
|
|
22
|
+
def gcd(a, b): raise NotImplementedError("Requires C extension")
|
|
23
|
+
def lcm(a, b): raise NotImplementedError("Requires C extension")
|
|
24
|
+
def serialize(obj): raise NotImplementedError("Requires C extension")
|
|
25
|
+
def deserialize(data): raise NotImplementedError("Requires C extension")
|
|
26
|
+
def int2Bytes(n): raise NotImplementedError("Requires C extension")
|
|
27
|
+
def toInt(obj): raise NotImplementedError("Requires C extension")
|
|
28
|
+
def InitBenchmark(): raise NotImplementedError("Requires C extension")
|
|
29
|
+
def StartBenchmark(options): raise NotImplementedError("Requires C extension")
|
|
30
|
+
def EndBenchmark(): raise NotImplementedError("Requires C extension")
|
|
31
|
+
def GetBenchmark(option): raise NotImplementedError("Requires C extension")
|
|
32
|
+
def GetGeneralBenchmarks(): raise NotImplementedError("Requires C extension")
|
|
33
|
+
def ClearBenchmark(): raise NotImplementedError("Requires C extension")
|
|
34
|
+
|
|
35
|
+
class IntegerGroup:
|
|
36
|
+
def __init__(self, start=0):
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
def setparam(self, p, q):
|
|
40
|
+
if p == (2 * q) + 1 and isPrime(p) and isPrime(q):
|
|
41
|
+
self.p = integer(p)
|
|
42
|
+
self.q = integer(q)
|
|
43
|
+
return True
|
|
44
|
+
else:
|
|
45
|
+
print("p and q are not safe primes!")
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
def __str__(self):
|
|
49
|
+
outStr = ""
|
|
50
|
+
outStr += "p = " + str(self.p) + "\n"
|
|
51
|
+
outStr += "q = " + str(self.q) + "\n"
|
|
52
|
+
return outStr
|
|
53
|
+
|
|
54
|
+
def paramgen(self, bits, r=2):
|
|
55
|
+
# determine which group
|
|
56
|
+
while True:
|
|
57
|
+
self.p = randomPrime(bits, 1)
|
|
58
|
+
self.q = (self.p - 1) / 2
|
|
59
|
+
if (isPrime(self.p) and isPrime(self.q)):
|
|
60
|
+
break
|
|
61
|
+
self.r = r
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
def randomGen(self):
|
|
65
|
+
while True:
|
|
66
|
+
h = random(self.p)
|
|
67
|
+
g = (h ** self.r) % self.p
|
|
68
|
+
if not g == 1:
|
|
69
|
+
break
|
|
70
|
+
return g
|
|
71
|
+
|
|
72
|
+
def groupSetting(self):
|
|
73
|
+
return 'integer'
|
|
74
|
+
|
|
75
|
+
def groupType(self):
|
|
76
|
+
return 'SchnorrGroup mod p'
|
|
77
|
+
|
|
78
|
+
def groupOrder(self):
|
|
79
|
+
return bitsize(self.q)
|
|
80
|
+
|
|
81
|
+
def bitsize(self):
|
|
82
|
+
return bitsize(self.q) / 8
|
|
83
|
+
|
|
84
|
+
def isMember(self, x):
|
|
85
|
+
return x.isCongruent()
|
|
86
|
+
|
|
87
|
+
def random(self, max=0):
|
|
88
|
+
if max == 0:
|
|
89
|
+
return random(self.p)
|
|
90
|
+
else:
|
|
91
|
+
return random(max)
|
|
92
|
+
|
|
93
|
+
def encode(self, M):
|
|
94
|
+
return encode(M, self.p, self.q)
|
|
95
|
+
|
|
96
|
+
def decode(self, element):
|
|
97
|
+
return decode(element, self.p, self.q)
|
|
98
|
+
|
|
99
|
+
def serialize(self, object):
|
|
100
|
+
assert type(object) == integer, "cannot serialize non-integer types"
|
|
101
|
+
return serialize(object)
|
|
102
|
+
|
|
103
|
+
def deserialize(self, bytes_object):
|
|
104
|
+
assert type(bytes_object) == bytes, "cannot deserialize object"
|
|
105
|
+
return deserialize(bytes_object)
|
|
106
|
+
|
|
107
|
+
def hash(self, *args):
|
|
108
|
+
if isinstance(args, tuple):
|
|
109
|
+
#print "Hashing => '%s'" % args
|
|
110
|
+
return hashInt(args, self.p, self.q, False)
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
def InitBenchmark(self):
|
|
114
|
+
"""initiates the benchmark state"""
|
|
115
|
+
return InitBenchmark()
|
|
116
|
+
|
|
117
|
+
def StartBenchmark(self, options):
|
|
118
|
+
"""starts the benchmark with any of these options:
|
|
119
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
120
|
+
return StartBenchmark(options)
|
|
121
|
+
|
|
122
|
+
def EndBenchmark(self):
|
|
123
|
+
"""ends an ongoing benchmark"""
|
|
124
|
+
return EndBenchmark()
|
|
125
|
+
|
|
126
|
+
def GetGeneralBenchmarks(self):
|
|
127
|
+
"""retrieves benchmark count for all group operations"""
|
|
128
|
+
return GetGeneralBenchmarks()
|
|
129
|
+
|
|
130
|
+
def GetBenchmark(self, option):
|
|
131
|
+
"""retrieves benchmark results for any of these options:
|
|
132
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
133
|
+
return GetBenchmark(option)
|
|
134
|
+
|
|
135
|
+
class IntegerGroupQ:
|
|
136
|
+
def __init__(self, start=0):
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
def __str__(self):
|
|
140
|
+
outStr = ""
|
|
141
|
+
outStr += "p = " + str(self.p) + "\n"
|
|
142
|
+
outStr += "q = " + str(self.q) + "\n"
|
|
143
|
+
return outStr
|
|
144
|
+
|
|
145
|
+
def setparam(self, p, q):
|
|
146
|
+
if p == (2 * q) + 1 and isPrime(p) and isPrime(q):
|
|
147
|
+
self.p = integer(p)
|
|
148
|
+
self.q = integer(q)
|
|
149
|
+
return True
|
|
150
|
+
else:
|
|
151
|
+
print("p and q are not safe primes!")
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
def paramgen(self, bits, r=2):
|
|
155
|
+
# determine which group
|
|
156
|
+
while True:
|
|
157
|
+
self.p = randomPrime(bits, 1)
|
|
158
|
+
self.q = (self.p - 1) / 2
|
|
159
|
+
if (isPrime(self.p) and isPrime(self.q)):
|
|
160
|
+
break
|
|
161
|
+
self.r = r
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
def randomG(self):
|
|
165
|
+
return self.randomGen()
|
|
166
|
+
|
|
167
|
+
def randomGen(self):
|
|
168
|
+
while True:
|
|
169
|
+
h = random(self.p)
|
|
170
|
+
g = (h ** self.r) % self.p
|
|
171
|
+
if not g == 1:
|
|
172
|
+
#print "g => %s" % g
|
|
173
|
+
break
|
|
174
|
+
return g
|
|
175
|
+
|
|
176
|
+
def groupSetting(self):
|
|
177
|
+
return 'integer'
|
|
178
|
+
|
|
179
|
+
def groupType(self):
|
|
180
|
+
return 'SchnorrGroup mod q'
|
|
181
|
+
|
|
182
|
+
def groupOrder(self):
|
|
183
|
+
return bitsize(self.q)
|
|
184
|
+
|
|
185
|
+
def messageSize(self):
|
|
186
|
+
return bitsize(self.q) / 8
|
|
187
|
+
|
|
188
|
+
def isMember(self, x):
|
|
189
|
+
return x.isCongruent()
|
|
190
|
+
|
|
191
|
+
def random(self, max=0):
|
|
192
|
+
if max == 0:
|
|
193
|
+
return random(self.q)
|
|
194
|
+
else:
|
|
195
|
+
return random(max)
|
|
196
|
+
|
|
197
|
+
def encode(self, M):
|
|
198
|
+
return encode(M, self.p, self.q)
|
|
199
|
+
|
|
200
|
+
def decode(self, element):
|
|
201
|
+
return decode(element, self.p, self.q)
|
|
202
|
+
|
|
203
|
+
def hash(self, *args):
|
|
204
|
+
if isinstance(args, tuple):
|
|
205
|
+
return hashInt(args, self.p, self.q, True)
|
|
206
|
+
List = []
|
|
207
|
+
for i in args:
|
|
208
|
+
List.append(i)
|
|
209
|
+
return hashInt(tuple(List), self.p, self.q, True)
|
|
210
|
+
|
|
211
|
+
def serialize(self, object):
|
|
212
|
+
assert type(object) == integer, "cannot serialize non-integer types"
|
|
213
|
+
return serialize(object)
|
|
214
|
+
|
|
215
|
+
def deserialize(self, bytes_object):
|
|
216
|
+
assert type(bytes_object) == bytes, "cannot deserialize object"
|
|
217
|
+
return deserialize(bytes_object)
|
|
218
|
+
|
|
219
|
+
def InitBenchmark(self):
|
|
220
|
+
"""initiates the benchmark state"""
|
|
221
|
+
return InitBenchmark()
|
|
222
|
+
|
|
223
|
+
def StartBenchmark(self, options):
|
|
224
|
+
"""starts the benchmark with any of these options:
|
|
225
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
226
|
+
return StartBenchmark(options)
|
|
227
|
+
|
|
228
|
+
def EndBenchmark(self):
|
|
229
|
+
"""ends an ongoing benchmark"""
|
|
230
|
+
return EndBenchmark()
|
|
231
|
+
|
|
232
|
+
def GetGeneralBenchmarks(self):
|
|
233
|
+
"""retrieves benchmark count for all group operations"""
|
|
234
|
+
return GetGeneralBenchmarks()
|
|
235
|
+
|
|
236
|
+
def GetBenchmark(self, option):
|
|
237
|
+
"""retrieves benchmark results for any of these options:
|
|
238
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
239
|
+
return GetBenchmark(option)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class RSAGroup:
|
|
243
|
+
def __init__(self):
|
|
244
|
+
self.p = self.q = self.n = 0
|
|
245
|
+
|
|
246
|
+
def __str__(self):
|
|
247
|
+
outStr = ""
|
|
248
|
+
outStr += "p = " + str(self.p) + "\n"
|
|
249
|
+
outStr += "q = " + str(self.q) + "\n"
|
|
250
|
+
outStr += "N = " + str(self.n) + "\n"
|
|
251
|
+
return outStr
|
|
252
|
+
|
|
253
|
+
def paramgen(self, secparam):
|
|
254
|
+
# Generate two random primes for RSA/Paillier
|
|
255
|
+
# Note: gcd(p*q, (p-1)*(q-1)) is always 1 for distinct primes p, q
|
|
256
|
+
# so we don't need to check that condition
|
|
257
|
+
p, q = randomPrime(secparam), randomPrime(secparam)
|
|
258
|
+
n = p * q
|
|
259
|
+
self.p = p
|
|
260
|
+
self.q = q
|
|
261
|
+
self.n = n
|
|
262
|
+
return (p, q, n)
|
|
263
|
+
|
|
264
|
+
def setparam(self, p, q):
|
|
265
|
+
if isPrime(p) and isPrime(q) and p != q:
|
|
266
|
+
self.p = integer(p)
|
|
267
|
+
self.q = integer(q)
|
|
268
|
+
self.n = self.p * self.q
|
|
269
|
+
return True
|
|
270
|
+
else:
|
|
271
|
+
print("p and q are not primes!")
|
|
272
|
+
return False
|
|
273
|
+
|
|
274
|
+
def serialize(self, object):
|
|
275
|
+
assert type(object) == integer, "cannot serialize non-integer types"
|
|
276
|
+
return serialize(object)
|
|
277
|
+
|
|
278
|
+
def deserialize(self, bytes_object):
|
|
279
|
+
assert type(bytes_object) == bytes, "cannot deserialize object"
|
|
280
|
+
return deserialize(bytes_object)
|
|
281
|
+
|
|
282
|
+
def random(self, max=0):
|
|
283
|
+
if max == 0:
|
|
284
|
+
return random(self.n)
|
|
285
|
+
else:
|
|
286
|
+
return random(max)
|
|
287
|
+
|
|
288
|
+
def groupSetting(self):
|
|
289
|
+
return 'integer'
|
|
290
|
+
|
|
291
|
+
def groupType(self):
|
|
292
|
+
return 'RSAGroup mod p'
|
|
293
|
+
|
|
294
|
+
def groupOrder(self):
|
|
295
|
+
return bitsize(self.n)
|
|
296
|
+
|
|
297
|
+
def encode(self, value):
|
|
298
|
+
pass
|
|
299
|
+
|
|
300
|
+
def decode(self, value):
|
|
301
|
+
pass
|
|
302
|
+
|
|
303
|
+
def InitBenchmark(self):
|
|
304
|
+
"""initiates the benchmark state"""
|
|
305
|
+
return InitBenchmark()
|
|
306
|
+
|
|
307
|
+
def StartBenchmark(self, options):
|
|
308
|
+
"""starts the benchmark with any of these options:
|
|
309
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
310
|
+
return StartBenchmark(options)
|
|
311
|
+
|
|
312
|
+
def EndBenchmark(self):
|
|
313
|
+
"""ends an ongoing benchmark"""
|
|
314
|
+
return EndBenchmark()
|
|
315
|
+
|
|
316
|
+
def GetGeneralBenchmarks(self):
|
|
317
|
+
"""retrieves benchmark count for all group operations"""
|
|
318
|
+
return GetGeneralBenchmarks()
|
|
319
|
+
|
|
320
|
+
def GetBenchmark(self, option):
|
|
321
|
+
"""retrieves benchmark results for any of these options:
|
|
322
|
+
RealTime, CpuTime, Mul, Div, Add, Sub, Exp"""
|
|
323
|
+
return GetBenchmark(option)
|
charm/toolbox/iterate.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
# simple example
|
|
3
|
+
#>>> a = [1,2,3,4,5]
|
|
4
|
+
#>>> dotprod(1, 1, len(a), lambda i,b: (b[i] ** 2), a)
|
|
5
|
+
# TODO: support caching of values at each stage of product?
|
|
6
|
+
|
|
7
|
+
def dotprod(init, skip, n, func, *args):
|
|
8
|
+
prod = init
|
|
9
|
+
i = 0
|
|
10
|
+
for j in range(i, n):
|
|
11
|
+
if j != skip:
|
|
12
|
+
result = func(j, *args)
|
|
13
|
+
# cache if necessary
|
|
14
|
+
prod *= result
|
|
15
|
+
#print("product =>", prod)
|
|
16
|
+
return prod
|
|
17
|
+
|
|
18
|
+
def dotprod2(iterator, func, *args):
|
|
19
|
+
prod = 1
|
|
20
|
+
for j in iterator:
|
|
21
|
+
prod *= func(j, *args)
|
|
22
|
+
return prod
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
|
|
2
|
+
'''
|
|
3
|
+
:Authors: Fan Zhang(zfwise@gwu.edu), supported by GWU computer science department
|
|
4
|
+
:Date: 3/2013
|
|
5
|
+
:Note: Matrix operations over finite fields
|
|
6
|
+
'''
|
|
7
|
+
def GaussEliminationinGroups(m):
|
|
8
|
+
#The code was original found at: http://ine.scripts.mit.edu/blog/2011/05/gaussian-elimination-in-python/
|
|
9
|
+
#Here is an example: suppose you have A= [[1,2],
|
|
10
|
+
# [3,4]]
|
|
11
|
+
#and you want AX = I.
|
|
12
|
+
#if X = [[x1,x2],[x3,x4]] and I = [[1,0],[0,1]]
|
|
13
|
+
#GaussEliminationinGroups([1,2,1],[3,4,0])-->[x1,x3]
|
|
14
|
+
#GaussEliminationinGroups([1,2,0],[3,4,1])-->[x2,x4]
|
|
15
|
+
#then X = MatrixTransGroups[[x1,x3],[x2,x4]]
|
|
16
|
+
|
|
17
|
+
#eliminate columns
|
|
18
|
+
for col in range(len(m[0])):
|
|
19
|
+
for row in range(col+1, len(m)):
|
|
20
|
+
r = [(rowValue * (-(m[row][col] / m[col][col]))) for rowValue in m[col]]
|
|
21
|
+
m[row] = [ (pair[0]+pair[1]) for pair in zip(m[row], r)]
|
|
22
|
+
#now backsolve by substitution
|
|
23
|
+
ans = []
|
|
24
|
+
m.reverse() #makes it easier to backsolve
|
|
25
|
+
for sol in range(len(m)):
|
|
26
|
+
if sol == 0:
|
|
27
|
+
ans.append(m[sol][-1] / m[sol][-2])
|
|
28
|
+
else:
|
|
29
|
+
inner = 0
|
|
30
|
+
#substitute in all known coefficients
|
|
31
|
+
for x in range(sol):
|
|
32
|
+
inner += (ans[x]*m[sol][-2-x])
|
|
33
|
+
#the equation is now reduced to ax + b = c form
|
|
34
|
+
#solve with (c - b) / a
|
|
35
|
+
ans.append((m[sol][-1]-inner)/m[sol][-sol-2])
|
|
36
|
+
ans.reverse()
|
|
37
|
+
return ans
|
|
38
|
+
|
|
39
|
+
def MatrixMulGroups(matrix1,matrix2):
|
|
40
|
+
# Matrix multiplication
|
|
41
|
+
if len(matrix1[0]) != len(matrix2):
|
|
42
|
+
# Check matrix dimensions
|
|
43
|
+
print('Matrices must be m*n and n*p to multiply!')
|
|
44
|
+
else:
|
|
45
|
+
# Multiply if correct dimensions
|
|
46
|
+
new_matrix = [[0 for row in range(len(matrix2[0]))] for col in range(len(matrix1))]
|
|
47
|
+
for i in range(len(matrix1)):
|
|
48
|
+
for j in range(len(matrix2[0])):
|
|
49
|
+
for k in range(len(matrix2)):
|
|
50
|
+
new_matrix[i][j] += matrix1[i][k]*matrix2[k][j]
|
|
51
|
+
return new_matrix
|
|
52
|
+
|
|
53
|
+
def MatrixAddGroups(matrix1,matrix2):
|
|
54
|
+
# Matrix Addition
|
|
55
|
+
if (len(matrix1[0]) != len(matrix2[0]) or len(matrix1) != len(matrix2)):
|
|
56
|
+
# Check matrix dimensions
|
|
57
|
+
print('Matrices must be m*m and m*m to Add!')
|
|
58
|
+
else:
|
|
59
|
+
# Add if correct dimensions
|
|
60
|
+
rows = len(matrix1)
|
|
61
|
+
columns =len(matrix1[0])
|
|
62
|
+
result = [[matrix1[row][col] + matrix2[row][col] for col in range(columns)] for row in range(rows)]
|
|
63
|
+
return result
|
|
64
|
+
|
|
65
|
+
def MatrixScalarMulGroups(lamda , matrix):
|
|
66
|
+
# Matrix Scalar Mul
|
|
67
|
+
rows = len(matrix)
|
|
68
|
+
columns =len(matrix[0])
|
|
69
|
+
result = [[matrix[row][col] * lamda for col in range(columns)] for row in range(rows)]
|
|
70
|
+
return result
|
|
71
|
+
|
|
72
|
+
def MatrixTransGroups(matrix):
|
|
73
|
+
# Matrix transpose,
|
|
74
|
+
result = [[r[col] for r in matrix] for col in range(len(matrix[0]))]
|
|
75
|
+
return result
|
|
76
|
+
|