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,28 @@
|
|
|
1
|
+
from charm.toolbox.secretshare import SecretShare
|
|
2
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR
|
|
3
|
+
import unittest
|
|
4
|
+
|
|
5
|
+
debug=False
|
|
6
|
+
|
|
7
|
+
class SecretShareTest(unittest.TestCase):
|
|
8
|
+
def testSecretShare(self):
|
|
9
|
+
# Testing Secret sharing python API
|
|
10
|
+
k = 3
|
|
11
|
+
n = 4
|
|
12
|
+
group = PairingGroup('SS512')
|
|
13
|
+
|
|
14
|
+
s = SecretShare(group, False)
|
|
15
|
+
sec = group.random(ZR)
|
|
16
|
+
shares = s.genShares(sec, k, n)
|
|
17
|
+
|
|
18
|
+
K = shares[0]
|
|
19
|
+
if debug: print('\nOriginal secret: %s' % K)
|
|
20
|
+
y = {group.init(ZR, 1):shares[1], group.init(ZR, 2):shares[2], group.init(ZR, 3):shares[3]}
|
|
21
|
+
|
|
22
|
+
secret = s.recoverSecret(y)
|
|
23
|
+
|
|
24
|
+
assert K == secret, "Could not recover the secret!"
|
|
25
|
+
if debug: print("Successfully recovered secret: ", secret)
|
|
26
|
+
|
|
27
|
+
if __name__ == "__main__":
|
|
28
|
+
unittest.main()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
from charm.toolbox.symcrypto import SymmetricCryptoAbstraction,AuthenticatedCryptoAbstraction, MessageAuthenticator
|
|
3
|
+
from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
4
|
+
from charm.core.math.pairing import hashPair as sha2
|
|
5
|
+
class SymmetricCryptoAbstractionTest(unittest.TestCase):
|
|
6
|
+
|
|
7
|
+
def testAESCBC(self):
|
|
8
|
+
self.MsgtestAESCBC(b"hello world")
|
|
9
|
+
|
|
10
|
+
def testAESCBCLong(self):
|
|
11
|
+
self.MsgtestAESCBC(b"Lots of people working in cryptography have no deep \
|
|
12
|
+
concern with real application issues. They are trying to discover things \
|
|
13
|
+
clever enough to write papers about -- Whitfield Diffie.")
|
|
14
|
+
|
|
15
|
+
def testAESCBC_Seperate(self):
|
|
16
|
+
self.MsgTestAESCBCSeperate(b"Lots of people working in cryptography have no deep \
|
|
17
|
+
concern with real application issues. They are trying to discover things \
|
|
18
|
+
clever enough to write papers about -- Whitfield Diffie.")
|
|
19
|
+
|
|
20
|
+
def MsgtestAESCBC(self,msg):
|
|
21
|
+
groupObj = PairingGroup('SS512')
|
|
22
|
+
a = SymmetricCryptoAbstraction(sha2(groupObj.random(GT)))
|
|
23
|
+
ct = a.encrypt(msg)
|
|
24
|
+
dmsg = a.decrypt(ct);
|
|
25
|
+
assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
|
|
26
|
+
|
|
27
|
+
def MsgTestAESCBCSeperate(self,msg):
|
|
28
|
+
groupObj = PairingGroup('SS512')
|
|
29
|
+
ran = groupObj.random(GT)
|
|
30
|
+
a = SymmetricCryptoAbstraction(sha2(ran))
|
|
31
|
+
ct = a.encrypt(msg)
|
|
32
|
+
b = SymmetricCryptoAbstraction(sha2(ran))
|
|
33
|
+
dmsg = b.decrypt(ct);
|
|
34
|
+
assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
|
|
35
|
+
|
|
36
|
+
class AuthenticatedCryptoAbstractionTest(unittest.TestCase):
|
|
37
|
+
|
|
38
|
+
def testAESCBC(self):
|
|
39
|
+
self.MsgtestAESCBC(b"hello world")
|
|
40
|
+
|
|
41
|
+
def testAESCBCLong(self):
|
|
42
|
+
self.MsgtestAESCBC(b"Lots of people working in cryptography have no deep \
|
|
43
|
+
concern with real application issues. They are trying to discover things \
|
|
44
|
+
clever enough to write papers about -- Whitfield Diffie.")
|
|
45
|
+
def testAESCBC_Seperate(self):
|
|
46
|
+
self.MsgTestAESCBCSeperate(b"Lots of people working in cryptography have no deep \
|
|
47
|
+
concern with real application issues. They are trying to discover things \
|
|
48
|
+
clever enough to write papers about -- Whitfield Diffie.")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def MsgtestAESCBC(self,msg):
|
|
52
|
+
groupObj = PairingGroup('SS512')
|
|
53
|
+
a = AuthenticatedCryptoAbstraction(sha2(groupObj.random(GT)))
|
|
54
|
+
ct = a.encrypt(msg)
|
|
55
|
+
dmsg = a.decrypt(ct);
|
|
56
|
+
assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
|
|
57
|
+
|
|
58
|
+
def MsgTestAESCBCSeperate(self,msg):
|
|
59
|
+
groupObj = PairingGroup('SS512')
|
|
60
|
+
ran = groupObj.random(GT)
|
|
61
|
+
a = AuthenticatedCryptoAbstraction(sha2(ran))
|
|
62
|
+
ct = a.encrypt(msg)
|
|
63
|
+
b = AuthenticatedCryptoAbstraction(sha2(ran))
|
|
64
|
+
dmsg = b.decrypt(ct);
|
|
65
|
+
assert msg == dmsg , 'o: =>%s\nm: =>%s' % (msg, dmsg)
|
|
66
|
+
|
|
67
|
+
class MessageAuthenticatorTest(unittest.TestCase):
|
|
68
|
+
def testSelfVerify(self):
|
|
69
|
+
key = sha2(PairingGroup('SS512').random(GT))
|
|
70
|
+
m = MessageAuthenticator(key)
|
|
71
|
+
a = m.mac('hello world')
|
|
72
|
+
assert m.verify(a), "expected message to verify";
|
|
73
|
+
|
|
74
|
+
def testSeperateVerify(self):
|
|
75
|
+
key = sha2(PairingGroup('SS512').random(GT))
|
|
76
|
+
m = MessageAuthenticator(key)
|
|
77
|
+
a = m.mac('hello world')
|
|
78
|
+
m1 = MessageAuthenticator(key)
|
|
79
|
+
assert m1.verify(a), "expected message to verify";
|
|
80
|
+
|
|
81
|
+
def testTamperData(self):
|
|
82
|
+
key = sha2(PairingGroup('SS512').random(GT))
|
|
83
|
+
m = MessageAuthenticator(key)
|
|
84
|
+
a = m.mac('hello world')
|
|
85
|
+
m1 = MessageAuthenticator(key)
|
|
86
|
+
a["msg"]= "tampered"
|
|
87
|
+
assert not m1.verify(a), "expected message to verify";
|
|
88
|
+
|
|
89
|
+
def testTamperMac(self):
|
|
90
|
+
key = sha2(PairingGroup('SS512').random(GT))
|
|
91
|
+
m = MessageAuthenticator(key)
|
|
92
|
+
a = m.mac('hello world')
|
|
93
|
+
m1 = MessageAuthenticator(key)
|
|
94
|
+
a["digest"]= "tampered"
|
|
95
|
+
assert not m1.verify(a), "expected message to verify";
|
|
96
|
+
|
|
97
|
+
def testTamperAlg(self):
|
|
98
|
+
key = sha2(PairingGroup('SS512').random(GT))
|
|
99
|
+
m = MessageAuthenticator(key)
|
|
100
|
+
a = m.mac('hello world')
|
|
101
|
+
m1 = MessageAuthenticator(key)
|
|
102
|
+
m1._algorithm = "alg" # bypassing the algorithm check to verify the mac is over the alg + data
|
|
103
|
+
a["alg"]= "alg"
|
|
104
|
+
assert not m1.verify(a), "expected message to verify";
|
|
105
|
+
|
|
106
|
+
if __name__ == "__main__":
|
|
107
|
+
unittest.main()
|
|
108
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from hypothesis import given
|
|
4
|
+
|
|
5
|
+
from charm.toolbox.policy_expression_spec import policy_expressions, assert_valid, alland_policy_expressions
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TestPolicyExpressionSpec(unittest.TestCase):
|
|
9
|
+
|
|
10
|
+
@given(policy_expressions())
|
|
11
|
+
def test_policy_expression_spec(self, policy_expression):
|
|
12
|
+
assert_valid(policy_expression)
|
|
13
|
+
|
|
14
|
+
@given(alland_policy_expressions())
|
|
15
|
+
def test_allAND_policy_expressions(self, policy_expression):
|
|
16
|
+
assert_valid(policy_expression)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"""
|
|
2
|
+
BLS Signature Test Vectors
|
|
3
|
+
|
|
4
|
+
Test vectors for BLS (Boneh-Lynn-Shacham) signatures based on:
|
|
5
|
+
- Original paper: "Short Signatures from the Weil Pairing" (Boneh, Lynn, Shacham, 2004)
|
|
6
|
+
- IETF draft-irtf-cfrg-bls-signature (for reference structure)
|
|
7
|
+
|
|
8
|
+
Note: Charm's BLS implementation uses PBC library with specific curve parameters.
|
|
9
|
+
These test vectors verify mathematical correctness and consistency.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import unittest
|
|
13
|
+
from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
|
|
14
|
+
from charm.schemes.pksig.pksig_bls04 import BLS01
|
|
15
|
+
from charm.core.engine.util import objectToBytes
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TestBLSMathematicalProperties(unittest.TestCase):
|
|
19
|
+
"""
|
|
20
|
+
Test mathematical properties that must hold for any correct BLS implementation.
|
|
21
|
+
|
|
22
|
+
These tests verify the fundamental algebraic properties of BLS signatures
|
|
23
|
+
as defined in the original Boneh-Lynn-Shacham paper.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def setUp(self):
|
|
27
|
+
"""Set up test fixtures with BN254 curve (128-bit security)."""
|
|
28
|
+
self.group = PairingGroup('BN254')
|
|
29
|
+
self.bls = BLS01(self.group)
|
|
30
|
+
|
|
31
|
+
def test_signature_verification_equation(self):
|
|
32
|
+
"""
|
|
33
|
+
Test Vector BLS-1: Signature Verification Equation
|
|
34
|
+
|
|
35
|
+
Property: e(σ, g) = e(H(m), pk) where σ = H(m)^sk, pk = g^sk
|
|
36
|
+
|
|
37
|
+
Source: Boneh-Lynn-Shacham 2004, Section 2.1
|
|
38
|
+
"""
|
|
39
|
+
# Generate keys
|
|
40
|
+
(pk, sk) = self.bls.keygen()
|
|
41
|
+
|
|
42
|
+
# Sign a message
|
|
43
|
+
message = {'content': 'test message for BLS verification'}
|
|
44
|
+
signature = self.bls.sign(sk['x'], message)
|
|
45
|
+
|
|
46
|
+
# Verify using the BLS verification equation
|
|
47
|
+
# e(σ, g) = e(H(m), g^x)
|
|
48
|
+
M = objectToBytes(message, self.group)
|
|
49
|
+
h = self.group.hash(M, G1)
|
|
50
|
+
|
|
51
|
+
lhs = pair(signature, pk['g'])
|
|
52
|
+
rhs = pair(h, pk['g^x'])
|
|
53
|
+
|
|
54
|
+
self.assertEqual(lhs, rhs,
|
|
55
|
+
"BLS verification equation e(σ, g) = e(H(m), pk) must hold")
|
|
56
|
+
|
|
57
|
+
def test_signature_determinism(self):
|
|
58
|
+
"""
|
|
59
|
+
Test Vector BLS-2: Signature Determinism
|
|
60
|
+
|
|
61
|
+
Property: For fixed (sk, m), sign(sk, m) always produces the same σ
|
|
62
|
+
|
|
63
|
+
Source: BLS signatures are deterministic by construction
|
|
64
|
+
"""
|
|
65
|
+
(pk, sk) = self.bls.keygen()
|
|
66
|
+
message = {'content': 'determinism test message'}
|
|
67
|
+
|
|
68
|
+
# Sign the same message multiple times
|
|
69
|
+
sig1 = self.bls.sign(sk['x'], message)
|
|
70
|
+
sig2 = self.bls.sign(sk['x'], message)
|
|
71
|
+
sig3 = self.bls.sign(sk['x'], message)
|
|
72
|
+
|
|
73
|
+
self.assertEqual(sig1, sig2, "BLS signatures must be deterministic")
|
|
74
|
+
self.assertEqual(sig2, sig3, "BLS signatures must be deterministic")
|
|
75
|
+
|
|
76
|
+
def test_different_messages_different_signatures(self):
|
|
77
|
+
"""
|
|
78
|
+
Test Vector BLS-3: Message Binding
|
|
79
|
+
|
|
80
|
+
Property: Different messages produce different signatures (with overwhelming probability)
|
|
81
|
+
|
|
82
|
+
Source: Security requirement from BLS paper
|
|
83
|
+
"""
|
|
84
|
+
(pk, sk) = self.bls.keygen()
|
|
85
|
+
|
|
86
|
+
msg1 = {'content': 'message one'}
|
|
87
|
+
msg2 = {'content': 'message two'}
|
|
88
|
+
|
|
89
|
+
sig1 = self.bls.sign(sk['x'], msg1)
|
|
90
|
+
sig2 = self.bls.sign(sk['x'], msg2)
|
|
91
|
+
|
|
92
|
+
self.assertNotEqual(sig1, sig2,
|
|
93
|
+
"Different messages must produce different signatures")
|
|
94
|
+
|
|
95
|
+
def test_wrong_key_verification_fails(self):
|
|
96
|
+
"""
|
|
97
|
+
Test Vector BLS-4: Key Binding
|
|
98
|
+
|
|
99
|
+
Property: Signature valid under sk1 must not verify under pk2
|
|
100
|
+
|
|
101
|
+
Source: Unforgeability requirement
|
|
102
|
+
"""
|
|
103
|
+
(pk1, sk1) = self.bls.keygen()
|
|
104
|
+
(pk2, sk2) = self.bls.keygen()
|
|
105
|
+
|
|
106
|
+
message = {'content': 'key binding test'}
|
|
107
|
+
signature = self.bls.sign(sk1['x'], message)
|
|
108
|
+
|
|
109
|
+
# Should verify with correct key
|
|
110
|
+
self.assertTrue(self.bls.verify(pk1, signature, message),
|
|
111
|
+
"Signature must verify with correct public key")
|
|
112
|
+
|
|
113
|
+
# Should NOT verify with wrong key
|
|
114
|
+
self.assertFalse(self.bls.verify(pk2, signature, message),
|
|
115
|
+
"Signature must NOT verify with wrong public key")
|
|
116
|
+
|
|
117
|
+
def test_modified_message_verification_fails(self):
|
|
118
|
+
"""
|
|
119
|
+
Test Vector BLS-5: Message Integrity
|
|
120
|
+
|
|
121
|
+
Property: Modifying the message must cause verification to fail
|
|
122
|
+
|
|
123
|
+
Source: Unforgeability requirement
|
|
124
|
+
"""
|
|
125
|
+
(pk, sk) = self.bls.keygen()
|
|
126
|
+
|
|
127
|
+
original_message = {'content': 'original message'}
|
|
128
|
+
modified_message = {'content': 'modified message'}
|
|
129
|
+
|
|
130
|
+
signature = self.bls.sign(sk['x'], original_message)
|
|
131
|
+
|
|
132
|
+
self.assertTrue(self.bls.verify(pk, signature, original_message),
|
|
133
|
+
"Signature must verify with original message")
|
|
134
|
+
self.assertFalse(self.bls.verify(pk, signature, modified_message),
|
|
135
|
+
"Signature must NOT verify with modified message")
|
|
136
|
+
|
|
137
|
+
def test_bilinearity_property(self):
|
|
138
|
+
"""
|
|
139
|
+
Test Vector BLS-6: Bilinearity
|
|
140
|
+
|
|
141
|
+
Property: e(g^a, h^b) = e(g, h)^(ab)
|
|
142
|
+
|
|
143
|
+
Source: Fundamental pairing property required for BLS security
|
|
144
|
+
"""
|
|
145
|
+
g = self.group.random(G1)
|
|
146
|
+
h = self.group.random(G2)
|
|
147
|
+
a = self.group.random(ZR)
|
|
148
|
+
b = self.group.random(ZR)
|
|
149
|
+
|
|
150
|
+
lhs = pair(g ** a, h ** b)
|
|
151
|
+
rhs = pair(g, h) ** (a * b)
|
|
152
|
+
|
|
153
|
+
self.assertEqual(lhs, rhs,
|
|
154
|
+
"Bilinearity property e(g^a, h^b) = e(g,h)^(ab) must hold")
|
|
155
|
+
|
|
156
|
+
def test_non_degeneracy(self):
|
|
157
|
+
"""
|
|
158
|
+
Test Vector BLS-7: Non-degeneracy
|
|
159
|
+
|
|
160
|
+
Property: e(g, h) ≠ 1 for generators g, h
|
|
161
|
+
|
|
162
|
+
Source: Required pairing property for BLS security
|
|
163
|
+
"""
|
|
164
|
+
g = self.group.random(G1)
|
|
165
|
+
h = self.group.random(G2)
|
|
166
|
+
|
|
167
|
+
pairing_result = pair(g, h)
|
|
168
|
+
identity = self.group.init(GT, 1)
|
|
169
|
+
|
|
170
|
+
self.assertNotEqual(pairing_result, identity,
|
|
171
|
+
"Pairing of generators must not be identity (non-degeneracy)")
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class TestBLSKnownAnswerTests(unittest.TestCase):
|
|
175
|
+
"""
|
|
176
|
+
Known Answer Tests (KATs) for BLS signatures.
|
|
177
|
+
|
|
178
|
+
These tests use fixed seeds to generate reproducible test vectors
|
|
179
|
+
that can be verified across implementations.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
def setUp(self):
|
|
183
|
+
"""Set up with BN254 curve."""
|
|
184
|
+
self.group = PairingGroup('BN254')
|
|
185
|
+
self.bls = BLS01(self.group)
|
|
186
|
+
|
|
187
|
+
def test_kat_signature_structure(self):
|
|
188
|
+
"""
|
|
189
|
+
Test Vector BLS-KAT-1: Signature Structure
|
|
190
|
+
|
|
191
|
+
Verify that signatures are elements of G1 (for Type-3 pairings).
|
|
192
|
+
"""
|
|
193
|
+
(pk, sk) = self.bls.keygen()
|
|
194
|
+
message = {'content': 'structure test'}
|
|
195
|
+
signature = self.bls.sign(sk['x'], message)
|
|
196
|
+
|
|
197
|
+
# Signature should be a valid group element
|
|
198
|
+
# Verify by checking it can be used in pairing operations
|
|
199
|
+
try:
|
|
200
|
+
result = pair(signature, pk['g'])
|
|
201
|
+
self.assertIsNotNone(result, "Signature must be valid G1 element")
|
|
202
|
+
except Exception as e:
|
|
203
|
+
self.fail(f"Signature is not a valid G1 element: {e}")
|
|
204
|
+
|
|
205
|
+
def test_kat_empty_message(self):
|
|
206
|
+
"""
|
|
207
|
+
Test Vector BLS-KAT-2: Empty Message Handling
|
|
208
|
+
|
|
209
|
+
Verify correct handling of edge case: empty message.
|
|
210
|
+
"""
|
|
211
|
+
(pk, sk) = self.bls.keygen()
|
|
212
|
+
message = {} # Empty message
|
|
213
|
+
|
|
214
|
+
# Should be able to sign and verify empty message
|
|
215
|
+
signature = self.bls.sign(sk['x'], message)
|
|
216
|
+
self.assertTrue(self.bls.verify(pk, signature, message),
|
|
217
|
+
"Empty message must be signable and verifiable")
|
|
218
|
+
|
|
219
|
+
def test_kat_large_message(self):
|
|
220
|
+
"""
|
|
221
|
+
Test Vector BLS-KAT-3: Large Message Handling
|
|
222
|
+
|
|
223
|
+
Verify correct handling of large messages (hashing works correctly).
|
|
224
|
+
"""
|
|
225
|
+
(pk, sk) = self.bls.keygen()
|
|
226
|
+
|
|
227
|
+
# Create a large message (10KB of data)
|
|
228
|
+
large_content = 'x' * 10240
|
|
229
|
+
message = {'content': large_content}
|
|
230
|
+
|
|
231
|
+
signature = self.bls.sign(sk['x'], message)
|
|
232
|
+
self.assertTrue(self.bls.verify(pk, signature, message),
|
|
233
|
+
"Large messages must be signable and verifiable")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class TestBLSSecurityProperties(unittest.TestCase):
|
|
237
|
+
"""
|
|
238
|
+
Security-focused tests for BLS implementation.
|
|
239
|
+
|
|
240
|
+
These tests verify that the implementation resists known attacks.
|
|
241
|
+
"""
|
|
242
|
+
|
|
243
|
+
def setUp(self):
|
|
244
|
+
"""Set up with BN254 curve."""
|
|
245
|
+
self.group = PairingGroup('BN254')
|
|
246
|
+
self.bls = BLS01(self.group)
|
|
247
|
+
|
|
248
|
+
def test_identity_element_rejection(self):
|
|
249
|
+
"""
|
|
250
|
+
Test Vector BLS-SEC-1: Identity Element Attack
|
|
251
|
+
|
|
252
|
+
Verify that identity element is not accepted as valid signature.
|
|
253
|
+
|
|
254
|
+
Attack: Attacker submits identity element as signature.
|
|
255
|
+
Expected: Verification must fail.
|
|
256
|
+
"""
|
|
257
|
+
(pk, sk) = self.bls.keygen()
|
|
258
|
+
message = {'content': 'identity attack test'}
|
|
259
|
+
|
|
260
|
+
# Create identity element in G1
|
|
261
|
+
identity = self.group.init(G1, 1)
|
|
262
|
+
|
|
263
|
+
# Identity should NOT verify as a valid signature
|
|
264
|
+
# (unless the message hashes to identity, which is negligible probability)
|
|
265
|
+
result = self.bls.verify(pk, identity, message)
|
|
266
|
+
self.assertFalse(result,
|
|
267
|
+
"Identity element must not be accepted as valid signature")
|
|
268
|
+
|
|
269
|
+
def test_random_signature_rejection(self):
|
|
270
|
+
"""
|
|
271
|
+
Test Vector BLS-SEC-2: Random Signature Rejection
|
|
272
|
+
|
|
273
|
+
Verify that random group elements are rejected as signatures.
|
|
274
|
+
"""
|
|
275
|
+
(pk, sk) = self.bls.keygen()
|
|
276
|
+
message = {'content': 'random signature test'}
|
|
277
|
+
|
|
278
|
+
# Generate random element (not a valid signature)
|
|
279
|
+
random_sig = self.group.random(G1)
|
|
280
|
+
|
|
281
|
+
# Random element should not verify
|
|
282
|
+
result = self.bls.verify(pk, random_sig, message)
|
|
283
|
+
self.assertFalse(result,
|
|
284
|
+
"Random group element must not verify as valid signature")
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
if __name__ == '__main__':
|
|
288
|
+
unittest.main()
|
|
289
|
+
|