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,223 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Non-monotonic CP-ABE (YAHK14)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Shota Yamada, Nuttapong Attrapadung, Goichiro Hanaoka, Noboru Kunihiro
|
|
5
|
+
|
|
6
|
+
| **Title:** "A Framework and Compact Constructions for Non-monotonic Attribute-Based Encryption"
|
|
7
|
+
| **Published in:** Public-Key Cryptography (PKC) 2014, Pages 275-292
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2014/181 (Section 7)
|
|
9
|
+
| **Notes:** Supports non-monotonic access structures (with negation)
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** ciphertext-policy attribute-based encryption (public key)
|
|
14
|
+
* **Setting:** Bilinear pairing group of prime order
|
|
15
|
+
* **Assumption:** Complex q-type assumption
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: al, artjomb
|
|
20
|
+
:Date: 07/2015
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import *
|
|
24
|
+
from charm.toolbox.secretutil import SecretUtil
|
|
25
|
+
from charm.toolbox.ABEnc import *
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
debug = False
|
|
29
|
+
class CPABE_YAHK14(ABEnc):
|
|
30
|
+
"""
|
|
31
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
32
|
+
>>> group = PairingGroup('SS512')
|
|
33
|
+
>>> cpabe = CPABE_YAHK14(group)
|
|
34
|
+
>>> msg = group.random(GT)
|
|
35
|
+
>>> attributes = ['2', '3'] # must be integer strings
|
|
36
|
+
>>> access_policy = '2 and !1' # must be integer strings
|
|
37
|
+
>>> (master_public_key, master_key) = cpabe.setup()
|
|
38
|
+
>>> secret_key = cpabe.keygen(master_public_key, master_key, attributes)
|
|
39
|
+
>>> cipher_text = cpabe.encrypt(master_public_key, msg, access_policy)
|
|
40
|
+
>>> decrypted_msg = cpabe.decrypt(master_public_key, secret_key, cipher_text)
|
|
41
|
+
>>> msg == decrypted_msg
|
|
42
|
+
True
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, groupObj, verbose = False):
|
|
46
|
+
ABEnc.__init__(self)
|
|
47
|
+
global util, group
|
|
48
|
+
group = groupObj
|
|
49
|
+
util = SecretUtil(group, verbose)
|
|
50
|
+
|
|
51
|
+
# Defining a function to pick explicit exponents in the group
|
|
52
|
+
def exp(self,value):
|
|
53
|
+
return group.init(ZR, value)
|
|
54
|
+
|
|
55
|
+
def setup(self):
|
|
56
|
+
g = group.random(G1) # this element can also be in G2 and then PairingGroup('MNT224') can be used
|
|
57
|
+
g2, u, h, w, v = group.random(G1), group.random(G1), group.random(G1), group.random(G1), group.random(G1)
|
|
58
|
+
alpha, beta = group.random( ), group.random( )#from ZR
|
|
59
|
+
vDot = u ** beta
|
|
60
|
+
egg = pair(g2,g)**alpha
|
|
61
|
+
pp = {'g':g, 'g2':g2, 'u':u, 'h':h, 'w':w, 'v':v, 'vDot':vDot,'egg':egg}
|
|
62
|
+
mk = {'g2_alpha':g2 ** alpha, 'beta': beta }
|
|
63
|
+
return (pp, mk)
|
|
64
|
+
|
|
65
|
+
def keygen(self, pp, mk, S):
|
|
66
|
+
# S is a set of attributes written as STRINGS i.e. {'1', '2', '3',...}
|
|
67
|
+
r = group.random( )
|
|
68
|
+
|
|
69
|
+
D1 = mk['g2_alpha'] * (pp['w']**r)
|
|
70
|
+
D2 = pp['g']**r
|
|
71
|
+
|
|
72
|
+
vR = pp['v']**(-r)
|
|
73
|
+
|
|
74
|
+
K1, K1Dot, K2, K2Dot = {}, {}, {}, {}
|
|
75
|
+
rDotCumulative = r
|
|
76
|
+
for i, idx in zip(S, range(len(S))):
|
|
77
|
+
ri = group.random( )
|
|
78
|
+
if idx + 1 is len(S):
|
|
79
|
+
riDot = rDotCumulative
|
|
80
|
+
else:
|
|
81
|
+
riDot = group.random( )
|
|
82
|
+
rDotCumulative -= riDot
|
|
83
|
+
|
|
84
|
+
omega_i = self.exp(int(i))
|
|
85
|
+
K1[i] = vR * (pp['u']**omega_i * pp['h'])**ri
|
|
86
|
+
K1Dot[i] = (pp['u']**(omega_i * mk['beta']) * pp['h']**mk['beta'])**riDot
|
|
87
|
+
|
|
88
|
+
K2[i] = pp['g']**ri
|
|
89
|
+
K2Dot[i] = pp['g']**(mk['beta']*riDot)
|
|
90
|
+
S = [s for s in S] #Have to be an array for util.prune
|
|
91
|
+
|
|
92
|
+
return { 'S':S, 'D1': D1, 'D2' : D2, 'K1':K1, 'K1Dot':K1Dot, 'K2':K2, 'K2Dot':K2Dot }
|
|
93
|
+
|
|
94
|
+
def encrypt(self, pp, message, policy_str):
|
|
95
|
+
s = group.random()
|
|
96
|
+
|
|
97
|
+
policy = util.createPolicy(policy_str)
|
|
98
|
+
a_list = util.getAttributeList(policy)
|
|
99
|
+
|
|
100
|
+
shares = util.calculateSharesDict(s, policy) #These are correctly set to be exponents in Z_p
|
|
101
|
+
|
|
102
|
+
C0 = message * (pp['egg']**s)
|
|
103
|
+
C1 = pp['g']**s
|
|
104
|
+
|
|
105
|
+
C_1, C_2, C_3 = {}, {}, {}
|
|
106
|
+
for i in a_list:
|
|
107
|
+
ti = group.random()
|
|
108
|
+
if i[0] == '!':
|
|
109
|
+
inti = util.strip_index(i[1:])
|
|
110
|
+
C_1[i] = pp['w']**shares[i] * pp['vDot']**ti
|
|
111
|
+
else:
|
|
112
|
+
inti = util.strip_index(i)
|
|
113
|
+
C_1[i] = pp['w']**shares[i] * pp['v']**ti
|
|
114
|
+
|
|
115
|
+
inti = self.exp(int(inti))
|
|
116
|
+
C_2[i] = (pp['u']**inti * pp['h'])**(-ti)
|
|
117
|
+
C_3[i] = pp['g']**ti
|
|
118
|
+
|
|
119
|
+
#print('The exponent is ',inti)
|
|
120
|
+
|
|
121
|
+
return { 'Policy':policy_str, 'C0':C0, 'C1':C1, 'C_1':C_1, 'C_2':C_2, 'C_3':C_3 }
|
|
122
|
+
|
|
123
|
+
def decrypt(self, pp, sk, ct):
|
|
124
|
+
policy = util.createPolicy(ct['Policy'])
|
|
125
|
+
z = util.getCoefficients(policy)
|
|
126
|
+
|
|
127
|
+
# workaround to let the charm policy parser successfully parse the non-monotonic attributes
|
|
128
|
+
a_list = util.getAttributeList(policy)
|
|
129
|
+
nS = sk['S'][:]
|
|
130
|
+
for att in a_list:
|
|
131
|
+
if att[0] == '!' and att[1:] not in sk['S']:
|
|
132
|
+
nS.append(att)
|
|
133
|
+
|
|
134
|
+
pruned_list = util.prune(policy, nS)
|
|
135
|
+
|
|
136
|
+
if (pruned_list == False):
|
|
137
|
+
return group.init(GT,1)
|
|
138
|
+
|
|
139
|
+
B = pair(ct['C1'], sk['D1'])
|
|
140
|
+
for i in range(len(pruned_list)):
|
|
141
|
+
x = pruned_list[i].getAttribute( ) #without the underscore
|
|
142
|
+
y = pruned_list[i].getAttributeAndIndex( ) #with the underscore
|
|
143
|
+
|
|
144
|
+
a = pair( ct['C_1'][x], sk['D2'])
|
|
145
|
+
if x[0] == '!':
|
|
146
|
+
b = group.init(GT, 1)
|
|
147
|
+
inti = self.exp(int(x[1:]))
|
|
148
|
+
for xj in sk['S']:
|
|
149
|
+
if xj[0] == '!':
|
|
150
|
+
intj = self.exp(int(xj[1:]))
|
|
151
|
+
else:
|
|
152
|
+
intj = self.exp(int(xj))
|
|
153
|
+
b *= ( pair( ct['C_2'][x], sk['K2Dot'][str(intj)]) * pair( ct['C_3'][x], sk['K1Dot'][str(intj)]) ) ** (1 / (inti - intj))
|
|
154
|
+
else:
|
|
155
|
+
b = pair( ct['C_2'][x], sk['K2'][x]) * pair( ct['C_3'][x], sk['K1'][x])
|
|
156
|
+
d = - z[y]
|
|
157
|
+
B *= ( a * b )**d
|
|
158
|
+
|
|
159
|
+
return ct['C0'] / B
|
|
160
|
+
|
|
161
|
+
def randomMessage(self):
|
|
162
|
+
return group.random(GT)
|
|
163
|
+
|
|
164
|
+
def main():
|
|
165
|
+
curve = 'SS512'
|
|
166
|
+
|
|
167
|
+
groupObj = PairingGroup(curve)
|
|
168
|
+
scheme = CPABE_YAHK14(groupObj)
|
|
169
|
+
|
|
170
|
+
(pp, mk) = scheme.setup()
|
|
171
|
+
|
|
172
|
+
testCases = [
|
|
173
|
+
( '2 and !1', [
|
|
174
|
+
({'1', '2'}, False),
|
|
175
|
+
({'1'}, False),
|
|
176
|
+
({'2'}, True),
|
|
177
|
+
({'3'}, False),
|
|
178
|
+
({'2', '3'}, True)
|
|
179
|
+
] ),
|
|
180
|
+
( '2 and 1', [
|
|
181
|
+
({'1', '2'}, True),
|
|
182
|
+
({'1'}, False),
|
|
183
|
+
({'2'}, False),
|
|
184
|
+
({'3'}, False)
|
|
185
|
+
] ),
|
|
186
|
+
( '2', [
|
|
187
|
+
({'1', '2'}, True),
|
|
188
|
+
({'1'}, False),
|
|
189
|
+
({'2'}, True)
|
|
190
|
+
] ),
|
|
191
|
+
( '!2', [
|
|
192
|
+
({'1', '2'}, False),
|
|
193
|
+
({'1'}, True),
|
|
194
|
+
({'2'}, False)
|
|
195
|
+
] ),
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
for policy_str, users in testCases:
|
|
199
|
+
for S, success in users:
|
|
200
|
+
m = group.random(GT)
|
|
201
|
+
sk = scheme.keygen(pp, mk, S)
|
|
202
|
+
ct = scheme.encrypt(pp, m, policy_str)
|
|
203
|
+
res = scheme.decrypt(pp, sk, ct)
|
|
204
|
+
|
|
205
|
+
if (m == res) == success:
|
|
206
|
+
print("PASS", S, '' if success else 'not', "in '" + policy_str + "'")
|
|
207
|
+
else:
|
|
208
|
+
print("FAIL", S, '' if success else 'not', "in '" + policy_str + "'")
|
|
209
|
+
|
|
210
|
+
m = group.random(GT)
|
|
211
|
+
sk = scheme.keygen(pp, mk, {'1', '2'})
|
|
212
|
+
ct = scheme.encrypt(pp, m, '!1 and 2')
|
|
213
|
+
sk['S'].remove('1')
|
|
214
|
+
res = scheme.decrypt(pp, sk, ct)
|
|
215
|
+
|
|
216
|
+
if (m == res) == False:
|
|
217
|
+
print("PASS: attack failed")
|
|
218
|
+
else:
|
|
219
|
+
print("FAIL: attack succeeded")
|
|
220
|
+
|
|
221
|
+
if __name__ == '__main__':
|
|
222
|
+
debug = True
|
|
223
|
+
main()
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Ciphertext-Policy Attribute-Based Encryption (Waters09)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Ciphertext-Policy Attribute-Based Encryption: An Expressive, Efficient, and Provably Secure Realization"
|
|
7
|
+
| **Published in:** Cryptology ePrint Archive, 2008 (Appendix C)
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2008/290.pdf
|
|
9
|
+
| **Notes:** The sole disadvantage of this scheme is the high number of pairings that must be computed during the decryption process (2 + N) for N attributes matching in the key.
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** ciphertext-policy attribute-based encryption (public key)
|
|
14
|
+
* **Setting:** Pairing groups
|
|
15
|
+
* **Assumption:** parallel q-DBDHE
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele
|
|
20
|
+
:Date: 11/2010
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.toolbox.secretutil import SecretUtil
|
|
24
|
+
from charm.toolbox.ABEnc import ABEnc
|
|
25
|
+
|
|
26
|
+
debug = False
|
|
27
|
+
class CPabe09(ABEnc):
|
|
28
|
+
"""
|
|
29
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
30
|
+
>>> group = PairingGroup('SS512')
|
|
31
|
+
>>> cpabe = CPabe09(group)
|
|
32
|
+
>>> msg = group.random(GT)
|
|
33
|
+
>>> (master_secret_key, master_public_key) = cpabe.setup()
|
|
34
|
+
>>> policy = '((ONE or THREE) and (TWO or FOUR))'
|
|
35
|
+
>>> attr_list = ['THREE', 'ONE', 'TWO']
|
|
36
|
+
>>> secret_key = cpabe.keygen(master_public_key, master_secret_key, attr_list)
|
|
37
|
+
>>> cipher_text = cpabe.encrypt(master_public_key, msg, policy)
|
|
38
|
+
>>> decrypted_msg = cpabe.decrypt(master_public_key, secret_key, cipher_text)
|
|
39
|
+
>>> decrypted_msg == msg
|
|
40
|
+
True
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, groupObj):
|
|
44
|
+
ABEnc.__init__(self)
|
|
45
|
+
global util, group
|
|
46
|
+
util = SecretUtil(groupObj, debug)
|
|
47
|
+
group = groupObj
|
|
48
|
+
|
|
49
|
+
def setup(self):
|
|
50
|
+
g1, g2 = group.random(G1), group.random(G2)
|
|
51
|
+
alpha, a = group.random(), group.random()
|
|
52
|
+
e_gg_alpha = pair(g1,g2) ** alpha
|
|
53
|
+
msk = {'g1^alpha':g1 ** alpha, 'g2^alpha':g2 ** alpha}
|
|
54
|
+
pk = {'g1':g1, 'g2':g2, 'e(gg)^alpha':e_gg_alpha, 'g1^a':g1 ** a, 'g2^a':g2 ** a}
|
|
55
|
+
return (msk, pk)
|
|
56
|
+
|
|
57
|
+
def keygen(self, pk, msk, attributes):
|
|
58
|
+
t = group.random()
|
|
59
|
+
K = msk['g2^alpha'] * (pk['g2^a'] ** t)
|
|
60
|
+
L = pk['g2'] ** t
|
|
61
|
+
k_x = [group.hash(s, G1) ** t for s in attributes]
|
|
62
|
+
|
|
63
|
+
K_x = {}
|
|
64
|
+
for i in range(0, len(k_x)):
|
|
65
|
+
K_x[ attributes[i] ] = k_x[i]
|
|
66
|
+
|
|
67
|
+
key = { 'K':K, 'L':L, 'K_x':K_x, 'attributes':attributes }
|
|
68
|
+
return key
|
|
69
|
+
|
|
70
|
+
def encrypt(self, pk, M, policy_str):
|
|
71
|
+
# Extract the attributes as a list
|
|
72
|
+
policy = util.createPolicy(policy_str)
|
|
73
|
+
p_list = util.getAttributeList(policy)
|
|
74
|
+
s = group.random()
|
|
75
|
+
C_tilde = (pk['e(gg)^alpha'] ** s) * M
|
|
76
|
+
C_0 = pk['g1'] ** s
|
|
77
|
+
C, D = {}, {}
|
|
78
|
+
secret = s
|
|
79
|
+
shares = util.calculateSharesList(secret, policy)
|
|
80
|
+
|
|
81
|
+
# ciphertext
|
|
82
|
+
for i in range(len(p_list)):
|
|
83
|
+
r = group.random()
|
|
84
|
+
if shares[i][0] == p_list[i]:
|
|
85
|
+
attr = shares[i][0].getAttribute()
|
|
86
|
+
C[ p_list[i] ] = ((pk['g1^a'] ** shares[i][1]) * (group.hash(attr, G1) ** -r))
|
|
87
|
+
D[ p_list[i] ] = (pk['g2'] ** r)
|
|
88
|
+
|
|
89
|
+
if debug: print("SessionKey: %s" % C_tilde)
|
|
90
|
+
return { 'C0':C_0, 'C':C, 'D':D , 'C_tilde':C_tilde, 'policy':policy_str, 'attribute':p_list }
|
|
91
|
+
|
|
92
|
+
def decrypt(self, pk, sk, ct):
|
|
93
|
+
policy = util.createPolicy(ct['policy'])
|
|
94
|
+
pruned = util.prune(policy, sk['attributes'])
|
|
95
|
+
if pruned == False:
|
|
96
|
+
return False
|
|
97
|
+
coeffs = util.getCoefficients(policy)
|
|
98
|
+
numerator = pair(ct['C0'], sk['K'])
|
|
99
|
+
|
|
100
|
+
# create list for attributes in order...
|
|
101
|
+
k_x, w_i = {}, {}
|
|
102
|
+
for i in pruned:
|
|
103
|
+
j = i.getAttributeAndIndex()
|
|
104
|
+
k = i.getAttribute()
|
|
105
|
+
k_x[ j ] = sk['K_x'][k]
|
|
106
|
+
w_i[ j ] = coeffs[j]
|
|
107
|
+
#print('Attribute %s: coeff=%s, k_x=%s' % (j, w_i[j], k_x[j]))
|
|
108
|
+
|
|
109
|
+
C, D = ct['C'], ct['D']
|
|
110
|
+
denominator = 1
|
|
111
|
+
for i in pruned:
|
|
112
|
+
j = i.getAttributeAndIndex()
|
|
113
|
+
denominator *= ( pair(C[j] ** w_i[j], sk['L']) * pair(k_x[j] ** w_i[j], D[j]) )
|
|
114
|
+
return ct['C_tilde'] / (numerator / denominator)
|
|
115
|
+
|
|
116
|
+
def main():
|
|
117
|
+
#Get the eliptic curve with the bilinear mapping feature needed.
|
|
118
|
+
groupObj = PairingGroup('SS512')
|
|
119
|
+
|
|
120
|
+
cpabe = CPabe09(groupObj)
|
|
121
|
+
(msk, pk) = cpabe.setup()
|
|
122
|
+
pol = '((ONE or THREE) and (TWO or FOUR))'
|
|
123
|
+
attr_list = ['THREE', 'ONE', 'TWO']
|
|
124
|
+
|
|
125
|
+
if debug: print('Acces Policy: %s' % pol)
|
|
126
|
+
if debug: print('User credential list: %s' % attr_list)
|
|
127
|
+
m = groupObj.random(GT)
|
|
128
|
+
|
|
129
|
+
cpkey = cpabe.keygen(pk, msk, attr_list)
|
|
130
|
+
if debug: print("\nSecret key: %s" % attr_list)
|
|
131
|
+
if debug:groupObj.debug(cpkey)
|
|
132
|
+
cipher = cpabe.encrypt(pk, m, pol)
|
|
133
|
+
|
|
134
|
+
if debug: print("\nCiphertext...")
|
|
135
|
+
if debug:groupObj.debug(cipher)
|
|
136
|
+
orig_m = cpabe.decrypt(pk, cpkey, cipher)
|
|
137
|
+
|
|
138
|
+
assert m == orig_m, 'FAILED Decryption!!!'
|
|
139
|
+
if debug: print('Successful Decryption!')
|
|
140
|
+
del groupObj
|
|
141
|
+
|
|
142
|
+
if __name__ == '__main__':
|
|
143
|
+
debug = True
|
|
144
|
+
main()
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Lightweight Key-Policy ABE for IoT (YCT14)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Xuanxia Yao, Zhi Chen, Ye Tian
|
|
5
|
+
|
|
6
|
+
| **Title:** "A lightweight attribute-based encryption scheme for the Internet of things"
|
|
7
|
+
| **Published in:** Future Generation Computer Systems, 2014
|
|
8
|
+
| **Available from:** http://www.sciencedirect.com/science/article/pii/S0167739X14002039
|
|
9
|
+
| **Notes:** Designed for resource-constrained IoT devices
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** key-policy attribute-based encryption (public key)
|
|
14
|
+
* **Setting:** No Pairing (lightweight)
|
|
15
|
+
* **Assumption:** Computational Diffie-Hellman
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: artjomb
|
|
20
|
+
:Date: 10/2014
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.toolbox.secretutil import SecretUtil
|
|
24
|
+
from charm.toolbox.symcrypto import SymmetricCryptoAbstraction
|
|
25
|
+
from charm.toolbox.ABEnc import ABEnc
|
|
26
|
+
from charm.schemes.abenc.abenc_lsw08 import KPabe
|
|
27
|
+
from charm.core.math.pairing import hashPair as extractor
|
|
28
|
+
|
|
29
|
+
from time import time
|
|
30
|
+
|
|
31
|
+
debug = False
|
|
32
|
+
class EKPabe(ABEnc):
|
|
33
|
+
"""
|
|
34
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
35
|
+
>>> group = PairingGroup('MNT224')
|
|
36
|
+
>>> kpabe = EKPabe(group)
|
|
37
|
+
>>> attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
|
|
38
|
+
>>> (master_public_key, master_key) = kpabe.setup(attributes)
|
|
39
|
+
>>> policy = '(ONE or THREE) and (THREE or TWO)'
|
|
40
|
+
>>> secret_key = kpabe.keygen(master_public_key, master_key, policy)
|
|
41
|
+
>>> msg = b"Some Random Message"
|
|
42
|
+
>>> cipher_text = kpabe.encrypt(master_public_key, msg, attributes)
|
|
43
|
+
>>> decrypted_msg = kpabe.decrypt(cipher_text, secret_key)
|
|
44
|
+
>>> decrypted_msg == msg
|
|
45
|
+
True
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, groupObj, verbose=False):
|
|
49
|
+
ABEnc.__init__(self)
|
|
50
|
+
global group, util
|
|
51
|
+
group = groupObj
|
|
52
|
+
util = SecretUtil(group, verbose)
|
|
53
|
+
|
|
54
|
+
def setup(self, attributes):
|
|
55
|
+
s = group.random(ZR)
|
|
56
|
+
g = group.random(G1)
|
|
57
|
+
|
|
58
|
+
self.attributeSecrets = {}
|
|
59
|
+
self.attribute = {}
|
|
60
|
+
for attr in attributes:
|
|
61
|
+
si = group.random(ZR)
|
|
62
|
+
self.attributeSecrets[attr] = si
|
|
63
|
+
self.attribute[attr] = g**si
|
|
64
|
+
return (g**s, s) # (pk, mk)
|
|
65
|
+
|
|
66
|
+
def keygen(self, pk, mk, policy_str):
|
|
67
|
+
policy = util.createPolicy(policy_str)
|
|
68
|
+
attr_list = util.getAttributeList(policy)
|
|
69
|
+
|
|
70
|
+
s = mk
|
|
71
|
+
shares = util.calculateSharesDict(s, policy)
|
|
72
|
+
|
|
73
|
+
d = {}
|
|
74
|
+
D = { 'policy': policy_str, 'Du': d }
|
|
75
|
+
for x in attr_list:
|
|
76
|
+
y = util.strip_index(x)
|
|
77
|
+
d[y] = shares[x]/self.attributeSecrets[y]
|
|
78
|
+
if debug: print(str(y) + " d[y] " + str(d[y]))
|
|
79
|
+
if debug: print("Access Policy for key: %s" % policy)
|
|
80
|
+
if debug: print("Attribute list: %s" % attr_list)
|
|
81
|
+
return D
|
|
82
|
+
|
|
83
|
+
def encrypt(self, pk, M, attr_list):
|
|
84
|
+
if debug: print('Encryption Algorithm...')
|
|
85
|
+
k = group.random(ZR);
|
|
86
|
+
Cs = pk ** k
|
|
87
|
+
|
|
88
|
+
Ci = {}
|
|
89
|
+
for attr in attr_list:
|
|
90
|
+
Ci[attr] = self.attribute[attr] ** k
|
|
91
|
+
|
|
92
|
+
symcrypt = SymmetricCryptoAbstraction(extractor(Cs))
|
|
93
|
+
C = symcrypt.encrypt(M)
|
|
94
|
+
|
|
95
|
+
return { 'C': C, 'Ci': Ci, 'attributes': attr_list }
|
|
96
|
+
|
|
97
|
+
def decrypt(self, C, D):
|
|
98
|
+
policy = util.createPolicy(D['policy'])
|
|
99
|
+
attrs = util.prune(policy, C['attributes'])
|
|
100
|
+
if attrs == False:
|
|
101
|
+
return False
|
|
102
|
+
coeff = util.getCoefficients(policy)
|
|
103
|
+
|
|
104
|
+
Z = {}
|
|
105
|
+
prodT = 1
|
|
106
|
+
for i in range(len(attrs)):
|
|
107
|
+
x = attrs[i].getAttribute()
|
|
108
|
+
y = attrs[i].getAttributeAndIndex()
|
|
109
|
+
Z[y] = C['Ci'][x] ** D['Du'][x]
|
|
110
|
+
prodT *= Z[y] ** coeff[y]
|
|
111
|
+
|
|
112
|
+
symcrypt = SymmetricCryptoAbstraction(extractor(prodT))
|
|
113
|
+
|
|
114
|
+
return symcrypt.decrypt(C['C'])
|
|
115
|
+
|
|
116
|
+
def main():
|
|
117
|
+
groupObj = PairingGroup('MNT224')
|
|
118
|
+
kpabe = EKPabe(groupObj)
|
|
119
|
+
|
|
120
|
+
attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
|
|
121
|
+
|
|
122
|
+
(pk, mk) = kpabe.setup(attributes)
|
|
123
|
+
|
|
124
|
+
# policy = '(ONE or THREE) and (THREE or TWO)'
|
|
125
|
+
policy = 'THREE and (ONE or TWO)'
|
|
126
|
+
msg = b"Some Random Message"
|
|
127
|
+
|
|
128
|
+
mykey = kpabe.keygen(pk, mk, policy)
|
|
129
|
+
|
|
130
|
+
if debug: print("Encrypt under these attributes: ", attributes)
|
|
131
|
+
ciphertext = kpabe.encrypt(pk, msg, attributes)
|
|
132
|
+
if debug: print(ciphertext)
|
|
133
|
+
|
|
134
|
+
rec_msg = kpabe.decrypt(ciphertext, mykey)
|
|
135
|
+
assert rec_msg
|
|
136
|
+
if debug: print("rec_msg=%s" % str(rec_msg))
|
|
137
|
+
|
|
138
|
+
assert msg == rec_msg
|
|
139
|
+
if debug: print("Successful Decryption!")
|
|
140
|
+
|
|
141
|
+
def benchmark():
|
|
142
|
+
groupObj1 = PairingGroup('MNT224')
|
|
143
|
+
groupObj2 = PairingGroup('MNT224')
|
|
144
|
+
ekpabe = EKPabe(groupObj1)
|
|
145
|
+
kpabe = KPabe(groupObj2)
|
|
146
|
+
|
|
147
|
+
t1_s = 0
|
|
148
|
+
t1_k = 0
|
|
149
|
+
t1_e = 0
|
|
150
|
+
t1_d = 0
|
|
151
|
+
t2_s = 0
|
|
152
|
+
t2_k = 0
|
|
153
|
+
t2_e = 0
|
|
154
|
+
t2_d = 0
|
|
155
|
+
|
|
156
|
+
attributes = [ 'ONE', 'TWO', 'THREE', 'FOUR' ]
|
|
157
|
+
policy = 'THREE and (ONE or TWO)'
|
|
158
|
+
msg1 = b"Some Random Message"
|
|
159
|
+
msg2 = groupObj2.random(GT)
|
|
160
|
+
|
|
161
|
+
for b in range(4):
|
|
162
|
+
start = time()
|
|
163
|
+
(epk, emk) = ekpabe.setup(attributes)
|
|
164
|
+
t1_s += time() - start
|
|
165
|
+
|
|
166
|
+
start = time()
|
|
167
|
+
(pk, mk) = kpabe.setup()
|
|
168
|
+
t2_s += time() - start
|
|
169
|
+
|
|
170
|
+
start = time()
|
|
171
|
+
emykey = ekpabe.keygen(epk, emk, policy)
|
|
172
|
+
t1_k += time() - start
|
|
173
|
+
|
|
174
|
+
start = time()
|
|
175
|
+
mykey = kpabe.keygen(pk, mk, policy)
|
|
176
|
+
t2_k += time() - start
|
|
177
|
+
|
|
178
|
+
for i in range(50):
|
|
179
|
+
start = time()
|
|
180
|
+
eciphertext = ekpabe.encrypt(epk, msg1, attributes)
|
|
181
|
+
t1_e += time() - start
|
|
182
|
+
|
|
183
|
+
start = time()
|
|
184
|
+
ciphertext = kpabe.encrypt(pk, msg2, attributes)
|
|
185
|
+
t2_e += time() - start
|
|
186
|
+
|
|
187
|
+
start = time()
|
|
188
|
+
erec_msg = ekpabe.decrypt(eciphertext, emykey)
|
|
189
|
+
t1_d += time() - start
|
|
190
|
+
|
|
191
|
+
start = time()
|
|
192
|
+
rec_msg = kpabe.decrypt(ciphertext, mykey)
|
|
193
|
+
t2_d += time() - start
|
|
194
|
+
|
|
195
|
+
assert msg1 == erec_msg
|
|
196
|
+
assert msg2 == rec_msg
|
|
197
|
+
|
|
198
|
+
print ("yct14 s=%s k=%s e=%s d=%s" % (t1_s, t1_k, t1_e, t1_d))
|
|
199
|
+
print ("lsw08 s=%s k=%s e=%s d=%s" % (t2_s, t2_k, t2_e, t2_d))
|
|
200
|
+
|
|
201
|
+
# Result in VM:
|
|
202
|
+
# yct14 s=0.1 k=0.02 e=3.44 d=2.91
|
|
203
|
+
# lsw08 s=0.42 k=0.41 e=10.32 d=21.25
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
# debug = True
|
|
207
|
+
# main()
|
|
208
|
+
benchmark()
|