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
charm/toolbox/Hash.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from charm.toolbox.schemebase import *
|
|
2
|
+
|
|
3
|
+
class Hash(SchemeBase):
|
|
4
|
+
''' Base class for Hash functions
|
|
5
|
+
|
|
6
|
+
Notes: This class implements an interface for a standard hash function scheme.
|
|
7
|
+
A hash function consists of two algorithms: (paramgen or keygen and hash).
|
|
8
|
+
'''
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
SchemeBase.__init__(self)
|
|
12
|
+
SchemeBase._setProperty(self, scheme='Hash')
|
|
13
|
+
self.baseSecDefs = None # Enum('EU_CMA')
|
|
14
|
+
# base methods?
|
|
15
|
+
def paramgen(self, *args):
|
|
16
|
+
raise NotImplementedError
|
|
17
|
+
|
|
18
|
+
def hash(self, *args):
|
|
19
|
+
raise NotImplementedError
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ChamHash(Hash):
|
|
23
|
+
'''
|
|
24
|
+
Notes: This class implements an interface for a chameleon hash function.
|
|
25
|
+
A standard charmeleon hash scheme has two algorithms paramgen and hash.
|
|
26
|
+
paramgen accepts a security parameter and the length of p and q. Hash accepts
|
|
27
|
+
public key, label, a message and a random element.
|
|
28
|
+
'''
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
Hash.__init__(self)
|
|
32
|
+
Hash._setProperty(self, scheme='ChamHash')
|
|
33
|
+
self.baseSecDefs = None # Enum('EU_CMA')
|
|
34
|
+
|
|
35
|
+
def paramgen(self, secparam, p=None, q=None):
|
|
36
|
+
raise NotImplementedError
|
|
37
|
+
|
|
38
|
+
def hash(self, pk, prefix, message, r):
|
|
39
|
+
raise NotImplementedError
|
charm/toolbox/IBEnc.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Base class for identity-based encryption
|
|
3
|
+
|
|
4
|
+
Notes: This class implements an interface for a standard identity-based encryption scheme.
|
|
5
|
+
Identity-based encryption consists of three algorithms: (setup, extract, encrypt, and decrypt).
|
|
6
|
+
'''
|
|
7
|
+
from charm.toolbox.schemebase import *
|
|
8
|
+
|
|
9
|
+
ibeBaseSecDefs = Enum('IND_ID_CPA','IND_sID_CPA','IND_ID_CCA','IND_sID_CCA', 'IND_ID_CCA2')
|
|
10
|
+
IND_ID_CPA,IND_sID_CPA,IND_ID_CCA,IND_sID_CCA,IND_ID_CCA2='IND_ID_CPA','IND_sID_CPA','IND_ID_CCA','IND_sID_CCA', 'IND_ID_CCA2'
|
|
11
|
+
|
|
12
|
+
ibeSchemeType='ibeScheme'
|
|
13
|
+
|
|
14
|
+
class IBEnc(SchemeBase):
|
|
15
|
+
def __init__(self):
|
|
16
|
+
SchemeBase.__init__(self)
|
|
17
|
+
SchemeBase._setProperty(self, scheme='IBEnc')
|
|
18
|
+
|
|
19
|
+
def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
20
|
+
assert secDef is not None and secDef in ibeBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
21
|
+
SchemeBase._setProperty(self, None, ibeBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
22
|
+
return True
|
|
23
|
+
|
|
24
|
+
def getProperty(self):
|
|
25
|
+
baseProp = SchemeBase._getProperty(self)
|
|
26
|
+
return baseProp
|
|
27
|
+
|
|
28
|
+
def checkProperty(self, schemeObj, _reqProps):
|
|
29
|
+
reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
|
|
30
|
+
result = SchemeBase._checkProperty(self, schemeObj, reqProps)
|
|
31
|
+
return result
|
|
32
|
+
|
|
33
|
+
def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
34
|
+
# 1. inherit the scheme's properties
|
|
35
|
+
assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
|
|
36
|
+
self.properties.update(scheme.getProperty())
|
|
37
|
+
# 2. make sure things are consistent, then update to new properties
|
|
38
|
+
assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
|
|
39
|
+
assert secDef is not None and secDef in ibeBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
40
|
+
SchemeBase._setProperty(self, None, ibeBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
def printProperties(self):
|
|
44
|
+
name = str(self.__class__).split("'")[-2].split(".")[-1]
|
|
45
|
+
print("<=== %s Properties ===>" % name)
|
|
46
|
+
for k,v in self.properties.items():
|
|
47
|
+
print(k, ":", v)
|
|
48
|
+
print("<=== %s Properties ===>" % name)
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
def setup(self):
|
|
52
|
+
raise NotImplementedError
|
|
53
|
+
|
|
54
|
+
def extract(self, mk, ID):
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
|
|
57
|
+
def encrypt(self, pk, ID, message):
|
|
58
|
+
raise NotImplementedError
|
|
59
|
+
|
|
60
|
+
def decrypt(self, pk, sk, ct):
|
|
61
|
+
raise NotImplementedError
|
|
62
|
+
|
charm/toolbox/IBSig.py
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Base class for identity-based signatures
|
|
3
|
+
|
|
4
|
+
Notes: This class implements an interface for a standard identity-based signatures scheme.
|
|
5
|
+
Identity-based signatures consists of four algorithms: (setup, keygen, sign and verify).
|
|
6
|
+
'''
|
|
7
|
+
from charm.toolbox.schemebase import *
|
|
8
|
+
|
|
9
|
+
ibsigBaseSecDefs = Enum('EU_CMA', 'wEU_CMA', 'sEU_CMA')
|
|
10
|
+
EU_CMA,wEU_CMA,sEU_CMA="EU_CMA","wEU_CMA","sEU_CMA"
|
|
11
|
+
|
|
12
|
+
ibsigSchemeType='ibsigScheme'
|
|
13
|
+
|
|
14
|
+
class IBSig(SchemeBase):
|
|
15
|
+
def __init__(self):
|
|
16
|
+
SchemeBase.__init__(self)
|
|
17
|
+
SchemeBase._setProperty(self, scheme='IBSig')
|
|
18
|
+
|
|
19
|
+
def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
20
|
+
assert secDef is not None and secDef in ibsigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
21
|
+
SchemeBase._setProperty(self, None, ibsigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
22
|
+
return True
|
|
23
|
+
|
|
24
|
+
def getProperty(self):
|
|
25
|
+
baseProp = SchemeBase._getProperty(self)
|
|
26
|
+
return baseProp
|
|
27
|
+
|
|
28
|
+
def checkProperty(self, schemeObj, _reqProps):
|
|
29
|
+
reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
|
|
30
|
+
result = SchemeBase._checkProperty(self, schemeObj, reqProps)
|
|
31
|
+
if result == True:
|
|
32
|
+
self.setScheme(schemeObj)
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
36
|
+
# 1. inherit the scheme's properties
|
|
37
|
+
assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
|
|
38
|
+
self.properties.update(scheme.getProperty())
|
|
39
|
+
# 2. make sure things are consistent, then update to new properties
|
|
40
|
+
assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
|
|
41
|
+
assert secDef is not None and secDef in ibsigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
42
|
+
SchemeBase._setProperty(self, None, ibsigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
def printProperties(self):
|
|
46
|
+
name = str(self.__class__).split("'")[-2].split(".")[-1]
|
|
47
|
+
print("<=== %s Properties ===>" % name)
|
|
48
|
+
for k,v in self.properties.items():
|
|
49
|
+
print(k, ":", v)
|
|
50
|
+
print("<=== %s Properties ===>" % name)
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
def setup(self):
|
|
54
|
+
raise NotImplementedError
|
|
55
|
+
|
|
56
|
+
def keygen(self, msk, ID):
|
|
57
|
+
raise NotImplementedError
|
|
58
|
+
|
|
59
|
+
def sign(self, pk, sk, M):
|
|
60
|
+
raise NotImplementedError
|
|
61
|
+
|
|
62
|
+
def verify(self, pk, M, sig):
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
charm/toolbox/PKEnc.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Base class for public-key encryption
|
|
3
|
+
|
|
4
|
+
Notes: This class implements an interface for a standard public-key encryption scheme.
|
|
5
|
+
A public key encryption consists of four algorithms: (paramgen, keygen, encrypt, decrypt).
|
|
6
|
+
'''
|
|
7
|
+
from charm.toolbox.schemebase import *
|
|
8
|
+
|
|
9
|
+
encBaseSecDefs = Enum('OW_CPA','OW_CCA1','OW_CCA','IND_CPA','IND_CCA1','IND_CCA',
|
|
10
|
+
'NM_CPA','NM_CCA1','NM_CCA','KA_CPA','KA_CCA1','KA_CCA')
|
|
11
|
+
|
|
12
|
+
OW_CPA,OW_CCA1,OW_CCA="OW_CPA","OW_CCA1","OW_CCA"
|
|
13
|
+
IND_CPA,IND_CCA1,IND_CCA="IND_CPA","IND_CCA1","IND_CCA"
|
|
14
|
+
NM_CPA,NM_CCA1,NM_CCA="NM_CPA","NM_CCA1","NM_CCA"
|
|
15
|
+
KA_CPA,KA_CCA1,KA_CCA='KA_CPA','KA_CCA1','KA_CCA'
|
|
16
|
+
|
|
17
|
+
pkencSchemeType="pkeScheme"
|
|
18
|
+
|
|
19
|
+
class PKEnc(SchemeBase):
|
|
20
|
+
def __init__(self):
|
|
21
|
+
SchemeBase.__init__(self)
|
|
22
|
+
SchemeBase._setProperty(self, scheme='PKEnc')
|
|
23
|
+
|
|
24
|
+
def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
25
|
+
assert secDef is not None and secDef in encBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
26
|
+
SchemeBase._setProperty(self, None, encBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
27
|
+
return True
|
|
28
|
+
|
|
29
|
+
def getProperty(self):
|
|
30
|
+
baseProp = SchemeBase._getProperty(self)
|
|
31
|
+
return baseProp
|
|
32
|
+
|
|
33
|
+
def checkProperty(self, schemeObj, _reqProps):
|
|
34
|
+
reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
|
|
35
|
+
result = SchemeBase._checkProperty(self, schemeObj, reqProps)
|
|
36
|
+
return result
|
|
37
|
+
|
|
38
|
+
def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
39
|
+
# 1. inherit the scheme's properties
|
|
40
|
+
assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
|
|
41
|
+
self.properties.update(scheme.getProperty())
|
|
42
|
+
# 2. make sure things are consistent, then update to new properties
|
|
43
|
+
assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
|
|
44
|
+
assert secDef is not None and secDef in encBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
45
|
+
SchemeBase._setProperty(self, None, encBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
def printProperties(self):
|
|
49
|
+
name = str(self.__class__).split("'")[-2].split(".")[-1]
|
|
50
|
+
print("<=== %s Properties ===>" % name)
|
|
51
|
+
for k,v in self.properties.items():
|
|
52
|
+
print(k, ":", v)
|
|
53
|
+
print("<=== %s Properties ===>" % name)
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
def paramgen(self, param1=None, param2=None):
|
|
57
|
+
return NotImplemented
|
|
58
|
+
|
|
59
|
+
def keygen(self, securityparam):
|
|
60
|
+
return NotImplemented
|
|
61
|
+
|
|
62
|
+
def encrypt(self, pk, M):
|
|
63
|
+
return NotImplemented
|
|
64
|
+
|
|
65
|
+
def decrypt(self, pk, sk, c):
|
|
66
|
+
return NotImplemented
|
charm/toolbox/PKSig.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Base class for public-key signatures
|
|
3
|
+
|
|
4
|
+
Notes: This class implements an interface for a standard public-key signature scheme.
|
|
5
|
+
A public key signature consists of three algorithms: (keygen, sign, verify).
|
|
6
|
+
'''
|
|
7
|
+
from charm.toolbox.schemebase import *
|
|
8
|
+
|
|
9
|
+
pksigBaseSecDefs = Enum('EU_CMA', 'wEU_CMA', 'sEU_CMA')
|
|
10
|
+
EU_CMA,wEU_CMA,sEU_CMA="EU_CMA","wEU_CMA","sEU_CMA"
|
|
11
|
+
|
|
12
|
+
class PKSig(SchemeBase):
|
|
13
|
+
def __init__(self):
|
|
14
|
+
SchemeBase.__init__(self)
|
|
15
|
+
SchemeBase._setProperty(self, scheme='PKSig')
|
|
16
|
+
|
|
17
|
+
def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
18
|
+
assert secDef is not None and secDef in pksigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
19
|
+
SchemeBase._setProperty(self, None, pksigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
20
|
+
return True
|
|
21
|
+
|
|
22
|
+
def getProperty(self):
|
|
23
|
+
baseProp = SchemeBase._getProperty(self)
|
|
24
|
+
return baseProp
|
|
25
|
+
|
|
26
|
+
def checkProperty(self, schemeObj, _reqProps):
|
|
27
|
+
reqProps = [ (str(k), str(v)) for k,v in _reqProps ]
|
|
28
|
+
result = SchemeBase._checkProperty(self, schemeObj, reqProps)
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
def updateProperty(self, scheme, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
32
|
+
# 1. inherit the scheme's properties
|
|
33
|
+
assert hasattr(scheme, 'properties'), "schemeObj does not have getProperty() method."
|
|
34
|
+
self.properties.update(scheme.getProperty())
|
|
35
|
+
# 2. make sure things are consistent, then update to new properties
|
|
36
|
+
assert self.properties[schemeType] is not None, "scheme type wasn't specified on initialization"
|
|
37
|
+
assert secDef is not None and secDef in pksigBaseSecDefs.getList(), "not a valid security definition for this scheme type."
|
|
38
|
+
SchemeBase._setProperty(self, None, pksigBaseSecDefs[secDef], str(assumption), messageSpace, str(secModel), **kwargs)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
def printProperties(self):
|
|
42
|
+
name = str(self.__class__).split("'")[-2].split(".")[-1]
|
|
43
|
+
print("<=== %s Properties ===>" % name)
|
|
44
|
+
for k,v in self.properties.items():
|
|
45
|
+
print(k, ":", v)
|
|
46
|
+
print("<=== %s Properties ===>" % name)
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
def keygen(self, securityparam):
|
|
50
|
+
raise NotImplementedError
|
|
51
|
+
|
|
52
|
+
def sign(self, pk, sk, message):
|
|
53
|
+
raise NotImplementedError
|
|
54
|
+
|
|
55
|
+
def verify(self, pk, message, sig):
|
|
56
|
+
raise NotImplementedError
|
charm/toolbox/PREnc.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
''' Base class for Proxy Re-Encryption
|
|
2
|
+
|
|
3
|
+
Notes: This class implements an interface for a standard proxy re-encryption scheme.
|
|
4
|
+
|
|
5
|
+
A proxy re-encryption scheme consists of six algorithms:
|
|
6
|
+
(setup, keygen, encrypt, decrypt, rekeygen, re_encrypt).
|
|
7
|
+
'''
|
|
8
|
+
from charm.toolbox.schemebase import *
|
|
9
|
+
|
|
10
|
+
class PREnc(SchemeBase):
|
|
11
|
+
def __init__(self):
|
|
12
|
+
SchemeBase.__init__(self)
|
|
13
|
+
SchemeBase._setProperty(self, scheme='PREnc')
|
|
14
|
+
#self.baseSecDefs = Enum('IND_AB_CPA', 'IND_AB_CCA', 'sIND_AB_CPA', 'sIND_AB_CCA')
|
|
15
|
+
|
|
16
|
+
def setup(self):
|
|
17
|
+
raise NotImplementedError
|
|
18
|
+
|
|
19
|
+
def keygen(self, params):
|
|
20
|
+
raise NotImplementedError
|
|
21
|
+
|
|
22
|
+
def encrypt(self, params, pk, M):
|
|
23
|
+
raise NotImplementedError
|
|
24
|
+
|
|
25
|
+
def decrypt(self, params, sk, ct):
|
|
26
|
+
raise NotImplementedError
|
|
27
|
+
|
|
28
|
+
def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
|
|
29
|
+
raise NotImplementedError
|
|
30
|
+
|
|
31
|
+
def re_encrypt(self, params, rk, c_a):
|
|
32
|
+
raise NotImplementedError
|
charm/toolbox/ZKProof.py
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base class for Zero-Knowledge Proof systems.
|
|
3
|
+
|
|
4
|
+
This module provides a base class for implementing zero-knowledge proof schemes
|
|
5
|
+
in the Charm cryptographic library. Zero-knowledge proofs allow a prover to
|
|
6
|
+
convince a verifier that a statement is true without revealing any additional
|
|
7
|
+
information beyond the validity of the statement.
|
|
8
|
+
|
|
9
|
+
The module defines:
|
|
10
|
+
- Security definitions for ZK proofs (HVZK, ZK, NIZK, SIM)
|
|
11
|
+
- Exception classes for error handling
|
|
12
|
+
- ZKProofBase class for implementing concrete ZK proof schemes
|
|
13
|
+
- Proof dataclass for storing proof components
|
|
14
|
+
|
|
15
|
+
Security Properties:
|
|
16
|
+
- HVZK: Honest-Verifier Zero-Knowledge - secure against honest verifiers
|
|
17
|
+
- ZK: Zero-Knowledge - secure against malicious verifiers
|
|
18
|
+
- NIZK: Non-Interactive Zero-Knowledge - no interaction required
|
|
19
|
+
- SIM: Simulation Sound - proofs cannot be simulated without witness
|
|
20
|
+
|
|
21
|
+
Example:
|
|
22
|
+
class SchnorrProof(ZKProofBase):
|
|
23
|
+
def setup(self, group):
|
|
24
|
+
# Initialize with the group
|
|
25
|
+
...
|
|
26
|
+
def prove(self, statement, witness):
|
|
27
|
+
# Generate Schnorr proof
|
|
28
|
+
...
|
|
29
|
+
def verify(self, statement, proof):
|
|
30
|
+
# Verify Schnorr proof
|
|
31
|
+
...
|
|
32
|
+
"""
|
|
33
|
+
from charm.toolbox.schemebase import *
|
|
34
|
+
from charm.toolbox.enum import *
|
|
35
|
+
from dataclasses import dataclass
|
|
36
|
+
from typing import Any, Optional
|
|
37
|
+
|
|
38
|
+
# Security definitions for zero-knowledge proofs
|
|
39
|
+
zkpSecDefs = Enum('HVZK', 'ZK', 'NIZK', 'SIM')
|
|
40
|
+
HVZK, ZK, NIZK, SIM = "HVZK", "ZK", "NIZK", "SIM"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ZKProofError(Exception):
|
|
44
|
+
"""Base exception for the ZKP module.
|
|
45
|
+
|
|
46
|
+
All ZKP-related exceptions inherit from this class, allowing
|
|
47
|
+
for broad exception catching when needed.
|
|
48
|
+
"""
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ZKParseError(ZKProofError):
|
|
53
|
+
"""Error parsing ZK statements.
|
|
54
|
+
|
|
55
|
+
Raised when a zero-knowledge statement cannot be parsed,
|
|
56
|
+
typically due to malformed input or invalid syntax.
|
|
57
|
+
"""
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class ZKValidationError(ZKProofError):
|
|
62
|
+
"""Error validating inputs.
|
|
63
|
+
|
|
64
|
+
Raised when inputs to ZKP operations fail validation,
|
|
65
|
+
such as invalid group elements or malformed witnesses.
|
|
66
|
+
"""
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ZKProofVerificationError(ZKProofError):
|
|
71
|
+
"""Proof verification failed.
|
|
72
|
+
|
|
73
|
+
Raised when a zero-knowledge proof fails verification,
|
|
74
|
+
indicating either an invalid proof or mismatched statement.
|
|
75
|
+
"""
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass
|
|
80
|
+
class Proof:
|
|
81
|
+
"""Dataclass to hold zero-knowledge proof components.
|
|
82
|
+
|
|
83
|
+
This class encapsulates all components of a zero-knowledge proof,
|
|
84
|
+
following the standard Sigma protocol structure (commitment, challenge, response).
|
|
85
|
+
|
|
86
|
+
Attributes:
|
|
87
|
+
commitment: The prover's initial commitment value(s). This is the first
|
|
88
|
+
message in a Sigma protocol, committing the prover to random values.
|
|
89
|
+
challenge: The challenge value from the verifier (or derived via Fiat-Shamir
|
|
90
|
+
for non-interactive proofs). Must be unpredictable to the prover.
|
|
91
|
+
response: The prover's response computed using the witness and challenge.
|
|
92
|
+
This allows the verifier to check the proof without learning the witness.
|
|
93
|
+
proof_type: String identifier for the type of proof (e.g., 'schnorr', 'dleq',
|
|
94
|
+
'or', 'and'). Used for deserialization and validation.
|
|
95
|
+
version: Integer version number for the proof format. Allows for backward
|
|
96
|
+
compatibility when proof formats evolve.
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
proof = Proof(
|
|
100
|
+
commitment=g ** r,
|
|
101
|
+
challenge=hash(commitment, statement),
|
|
102
|
+
response=r + challenge * secret,
|
|
103
|
+
proof_type='schnorr',
|
|
104
|
+
version=1
|
|
105
|
+
)
|
|
106
|
+
"""
|
|
107
|
+
commitment: Any
|
|
108
|
+
challenge: Any
|
|
109
|
+
response: Any
|
|
110
|
+
proof_type: str
|
|
111
|
+
version: int = 1
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class ZKProofBase(SchemeBase):
|
|
115
|
+
"""Base class for zero-knowledge proof schemes.
|
|
116
|
+
|
|
117
|
+
This class provides the foundation for implementing zero-knowledge proof
|
|
118
|
+
systems in Charm. Concrete implementations should extend this class and
|
|
119
|
+
implement all abstract methods.
|
|
120
|
+
|
|
121
|
+
A zero-knowledge proof scheme consists of three core algorithms:
|
|
122
|
+
- setup: Initialize the proof system with group parameters
|
|
123
|
+
- prove: Generate a proof that a statement is true given a witness
|
|
124
|
+
- verify: Verify that a proof is valid for a given statement
|
|
125
|
+
|
|
126
|
+
Additionally, serialization methods are provided for proof persistence
|
|
127
|
+
and network transmission.
|
|
128
|
+
|
|
129
|
+
Security Properties:
|
|
130
|
+
Implementations should specify their security level using setProperty():
|
|
131
|
+
- HVZK: Secure against honest verifiers only
|
|
132
|
+
- ZK: Secure against malicious verifiers (requires simulation)
|
|
133
|
+
- NIZK: Non-interactive (typically via Fiat-Shamir transform)
|
|
134
|
+
- SIM: Simulation soundness (proofs unforgeable even with simulated proofs)
|
|
135
|
+
|
|
136
|
+
Example:
|
|
137
|
+
class MyZKProof(ZKProofBase):
|
|
138
|
+
def __init__(self):
|
|
139
|
+
ZKProofBase.__init__(self)
|
|
140
|
+
self.setProperty(secDef='NIZK', assumption='DL', secModel='ROM')
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
def __init__(self):
|
|
144
|
+
"""Initialize the ZKProof base class.
|
|
145
|
+
|
|
146
|
+
Calls the parent SchemeBase constructor and sets the scheme type
|
|
147
|
+
to 'ZKProof' for property tracking and type checking.
|
|
148
|
+
"""
|
|
149
|
+
SchemeBase.__init__(self)
|
|
150
|
+
SchemeBase._setProperty(self, scheme='ZKProof')
|
|
151
|
+
|
|
152
|
+
def setProperty(self, secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs):
|
|
153
|
+
"""Set security properties for this ZK proof scheme.
|
|
154
|
+
|
|
155
|
+
Configures the security properties of the proof scheme, including
|
|
156
|
+
the security definition, hardness assumption, and security model.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
secDef: Security definition, must be one of: 'HVZK', 'ZK', 'NIZK', 'SIM'.
|
|
160
|
+
Defines the zero-knowledge security level of the scheme.
|
|
161
|
+
assumption: The computational hardness assumption (e.g., 'DL', 'DDH').
|
|
162
|
+
Should be a string representing the underlying assumption.
|
|
163
|
+
messageSpace: Description of the valid message/statement space.
|
|
164
|
+
Can be a type or list of types.
|
|
165
|
+
secModel: Security model, typically 'SM' (standard), 'ROM' (random oracle),
|
|
166
|
+
or 'CRS' (common reference string).
|
|
167
|
+
**kwargs: Additional scheme-specific properties.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
bool: True if properties were set successfully.
|
|
171
|
+
|
|
172
|
+
Raises:
|
|
173
|
+
AssertionError: If secDef is not a valid security definition.
|
|
174
|
+
"""
|
|
175
|
+
assert secDef is not None and secDef in zkpSecDefs.getList(), \
|
|
176
|
+
"not a valid security definition for this scheme type."
|
|
177
|
+
SchemeBase._setProperty(self, None, zkpSecDefs[secDef], str(assumption),
|
|
178
|
+
messageSpace, str(secModel), **kwargs)
|
|
179
|
+
return True
|
|
180
|
+
|
|
181
|
+
def getProperty(self):
|
|
182
|
+
"""Get the security properties of this ZK proof scheme.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
dict: A dictionary containing all configured security properties,
|
|
186
|
+
including scheme type, security definition, assumption,
|
|
187
|
+
message space, and security model.
|
|
188
|
+
"""
|
|
189
|
+
baseProp = SchemeBase._getProperty(self)
|
|
190
|
+
return baseProp
|
|
191
|
+
|
|
192
|
+
def setup(self, group):
|
|
193
|
+
"""Initialize the proof system with group parameters.
|
|
194
|
+
|
|
195
|
+
This method should initialize any scheme-specific parameters
|
|
196
|
+
needed for proof generation and verification.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
group: The algebraic group to use for the proof system.
|
|
200
|
+
Typically a pairing group or integer group from Charm.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Implementation-specific setup parameters (e.g., public parameters).
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
207
|
+
"""
|
|
208
|
+
raise NotImplementedError
|
|
209
|
+
|
|
210
|
+
def prove(self, statement, witness):
|
|
211
|
+
"""Generate a zero-knowledge proof.
|
|
212
|
+
|
|
213
|
+
Creates a proof that the prover knows a witness satisfying the
|
|
214
|
+
given statement, without revealing the witness itself.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
statement: The public statement to prove. The format depends
|
|
218
|
+
on the specific proof type (e.g., public key for Schnorr).
|
|
219
|
+
witness: The secret witness known only to the prover
|
|
220
|
+
(e.g., private key for Schnorr).
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Proof: A Proof object containing commitment, challenge, and response.
|
|
224
|
+
|
|
225
|
+
Raises:
|
|
226
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
227
|
+
ZKValidationError: If statement or witness validation fails.
|
|
228
|
+
"""
|
|
229
|
+
raise NotImplementedError
|
|
230
|
+
|
|
231
|
+
def verify(self, statement, proof):
|
|
232
|
+
"""Verify a zero-knowledge proof.
|
|
233
|
+
|
|
234
|
+
Checks whether the given proof is valid for the statement,
|
|
235
|
+
confirming that the prover knows a valid witness.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
statement: The public statement that was proven.
|
|
239
|
+
proof: The Proof object to verify.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
bool: True if the proof is valid, False otherwise.
|
|
243
|
+
|
|
244
|
+
Raises:
|
|
245
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
246
|
+
ZKValidationError: If statement or proof format is invalid.
|
|
247
|
+
ZKProofVerificationError: If verification fails due to invalid proof.
|
|
248
|
+
"""
|
|
249
|
+
raise NotImplementedError
|
|
250
|
+
|
|
251
|
+
def serialize(self, proof, group):
|
|
252
|
+
"""Serialize a proof to bytes.
|
|
253
|
+
|
|
254
|
+
Converts a Proof object to a byte representation suitable for
|
|
255
|
+
storage or network transmission.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
proof: The Proof object to serialize.
|
|
259
|
+
group: The algebraic group used in the proof, needed for
|
|
260
|
+
serializing group elements.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
bytes: The serialized proof data.
|
|
264
|
+
|
|
265
|
+
Raises:
|
|
266
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
267
|
+
ZKValidationError: If proof format is invalid for serialization.
|
|
268
|
+
"""
|
|
269
|
+
raise NotImplementedError
|
|
270
|
+
|
|
271
|
+
def deserialize(self, data, group):
|
|
272
|
+
"""Deserialize bytes to a proof.
|
|
273
|
+
|
|
274
|
+
Reconstructs a Proof object from its byte representation.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
data: The serialized proof bytes.
|
|
278
|
+
group: The algebraic group used in the proof, needed for
|
|
279
|
+
deserializing group elements.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Proof: The reconstructed Proof object.
|
|
283
|
+
|
|
284
|
+
Raises:
|
|
285
|
+
NotImplementedError: Must be implemented by subclasses.
|
|
286
|
+
ZKParseError: If the data cannot be parsed as a valid proof.
|
|
287
|
+
"""
|
|
288
|
+
raise NotImplementedError
|
|
289
|
+
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'''
|
|
2
|
+
``bistring.Bytes`` is a replacement for Python's ``byte``.
|
|
3
|
+
'''
|
|
4
|
+
|
|
5
|
+
import string
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
py3 = False
|
|
9
|
+
if float(sys.version[:3]) >= 3.0:
|
|
10
|
+
py3 = True
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Bytes(bytes):
|
|
14
|
+
def __init__(self, value, enc=None):
|
|
15
|
+
if enc != None:
|
|
16
|
+
if py3: bytes.__init__(value, enc)
|
|
17
|
+
else: bytes.__init__(value)
|
|
18
|
+
else:
|
|
19
|
+
bytes.__init__(value)
|
|
20
|
+
|
|
21
|
+
def __xor__(self, other):
|
|
22
|
+
'''Overload the ``^`` operator to provide xor '''
|
|
23
|
+
assert len(self) == len(other), "xor: operands differ in length."
|
|
24
|
+
res = bytearray()
|
|
25
|
+
for i in range(0,len(self)):
|
|
26
|
+
if py3: res.append(self[i] ^ other[i])
|
|
27
|
+
else: res.append(chr(ord(self[i]) ^ ord(other[i])))
|
|
28
|
+
#print("res[%s] = %s" % (i, res[i]))
|
|
29
|
+
return Bytes(res)
|
|
30
|
+
|
|
31
|
+
def __add__(self, other):
|
|
32
|
+
return Bytes(bytes.__add__(self, other))
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def fill(self, prefix, length):
|
|
36
|
+
'''Provides an easy way to create a byte array of a specified length and content'''
|
|
37
|
+
bits = b''
|
|
38
|
+
for i in range(0, int(length)):
|
|
39
|
+
bits += prefix
|
|
40
|
+
return Bytes(bits)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
if py3:
|
|
44
|
+
def getBytes(arg1, arg2='utf-8'):
|
|
45
|
+
return Bytes(arg1, arg2)
|
|
46
|
+
else:
|
|
47
|
+
def getBytes(arg1, arg2=None):
|
|
48
|
+
return bytes(arg1)
|
|
49
|
+
# TODO: add left and right bit shifting
|