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,179 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Hidden-Vector Encryption (HVE08)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Vincenzo Iovino, Giuseppe Persiano
|
|
5
|
+
|
|
6
|
+
| **Title:** "Hidden-Vector Encryption with Groups of Prime Order"
|
|
7
|
+
| **Published in:** Pairing-Based Cryptography (Pairing), 2008
|
|
8
|
+
| **Available from:** http://dl.acm.org/citation.cfm?id=1431889
|
|
9
|
+
| **Notes:** Predicate encryption supporting hidden-vector queries
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** predicate encryption (public key)
|
|
14
|
+
* **Setting:** Pairing groups (prime order)
|
|
15
|
+
* **Assumption:** Decisional Linear
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Matthew W. Pagano
|
|
20
|
+
:Date: 12/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
|
|
24
|
+
debug = True
|
|
25
|
+
class HVE08:
|
|
26
|
+
def __init__(self, groupObj):
|
|
27
|
+
global group
|
|
28
|
+
group = groupObj
|
|
29
|
+
|
|
30
|
+
def setup(self, n):
|
|
31
|
+
g1 = group.random(G1)
|
|
32
|
+
g2 = group.random(G2)
|
|
33
|
+
y = group.random(ZR)
|
|
34
|
+
Y = pair(g1, g2) ** y
|
|
35
|
+
|
|
36
|
+
T = {}; t = {}; V = {}; v = {}; R = {}
|
|
37
|
+
r = {}; M = {}; m = {}
|
|
38
|
+
|
|
39
|
+
for i in range(0, n):
|
|
40
|
+
t[i] = group.random(ZR)
|
|
41
|
+
v[i] = group.random(ZR)
|
|
42
|
+
r[i] = group.random(ZR)
|
|
43
|
+
m[i] = group.random(ZR)
|
|
44
|
+
|
|
45
|
+
T[i] = g1 ** t[i]
|
|
46
|
+
V[i] = g1 ** v[i]
|
|
47
|
+
R[i] = g1 ** r[i]
|
|
48
|
+
M[i] = g1 ** m[i]
|
|
49
|
+
|
|
50
|
+
pk = {'g1':g1, 'g2':g2, 'n':n, 'Y':Y, 'T':T, 'V':V, 'R':R, 'M':M}
|
|
51
|
+
msk = {'y':y, 't':t, 'v':v, 'r':r, 'm':m}
|
|
52
|
+
return (pk, msk)
|
|
53
|
+
|
|
54
|
+
def keygen(self, pk, msk, yVector):
|
|
55
|
+
"""yVector: expects binary attributes of 0 or 1 and "dont care" attribute is represented by the value 2.
|
|
56
|
+
"""
|
|
57
|
+
g1 = pk['g1']
|
|
58
|
+
g2 = pk['g2']
|
|
59
|
+
n = pk['n']
|
|
60
|
+
y = msk['y']
|
|
61
|
+
|
|
62
|
+
yVectorLen = len(yVector)
|
|
63
|
+
assert (n == yVectorLen),"pk_hve08.py: length of yVector passed in to keygen is unequal to n passed in to setup."
|
|
64
|
+
|
|
65
|
+
numNonDontCares = 0
|
|
66
|
+
for i in range(0, yVectorLen):
|
|
67
|
+
if (yVector[i] != 2):
|
|
68
|
+
numNonDontCares += 1
|
|
69
|
+
|
|
70
|
+
if (numNonDontCares == 0):
|
|
71
|
+
sk = g2 ** y
|
|
72
|
+
return sk
|
|
73
|
+
|
|
74
|
+
a = {}
|
|
75
|
+
sum_ais_soFar = 0
|
|
76
|
+
|
|
77
|
+
for i in range(0, (numNonDontCares - 1)):
|
|
78
|
+
a[i] = group.random(ZR)
|
|
79
|
+
sum_ais_soFar += a[i]
|
|
80
|
+
|
|
81
|
+
a[(numNonDontCares - 1)] = y - sum_ais_soFar
|
|
82
|
+
|
|
83
|
+
YVector = {}
|
|
84
|
+
LVector = {}
|
|
85
|
+
current_a_index = 0
|
|
86
|
+
|
|
87
|
+
for i in range(0, yVectorLen):
|
|
88
|
+
if (yVector[i] == 0):
|
|
89
|
+
YVector[i] = g2 ** (a[current_a_index] / msk['r'][i])
|
|
90
|
+
LVector[i] = g2 ** (a[current_a_index] / msk['m'][i])
|
|
91
|
+
current_a_index += 1
|
|
92
|
+
elif (yVector[i] == 1):
|
|
93
|
+
YVector[i] = g2 ** (a[current_a_index] / msk['t'][i])
|
|
94
|
+
LVector[i] = g2 ** (a[current_a_index] / msk['v'][i])
|
|
95
|
+
current_a_index += 1
|
|
96
|
+
elif (yVector[i] == 2): # dont care attribute
|
|
97
|
+
YVector[i] = group.init(G2)
|
|
98
|
+
LVector[i] = group.init(G2)
|
|
99
|
+
else:
|
|
100
|
+
assert False,"pk_hve08.py: one of the yVector elements is not 0, 1, or 2 (only allowable values)."
|
|
101
|
+
|
|
102
|
+
sk = (YVector, LVector)
|
|
103
|
+
return sk
|
|
104
|
+
|
|
105
|
+
def encrypt(self, M, xVector, pk):
|
|
106
|
+
g1 = pk['g1']
|
|
107
|
+
n = pk['n']
|
|
108
|
+
Y = pk['Y']
|
|
109
|
+
|
|
110
|
+
s = group.random(ZR)
|
|
111
|
+
|
|
112
|
+
xVectorLen = len(xVector)
|
|
113
|
+
assert (n == xVectorLen),"pk_hve08.py: the length of the xVector passed in to encrypt is unequal to the n value passed in to setup."
|
|
114
|
+
|
|
115
|
+
s_i = {}
|
|
116
|
+
|
|
117
|
+
for i in range(0, n):
|
|
118
|
+
s_i[i] = group.random(ZR)
|
|
119
|
+
|
|
120
|
+
omega = M * (Y ** (-s))
|
|
121
|
+
C0 = g1 ** s
|
|
122
|
+
|
|
123
|
+
XVector = {}
|
|
124
|
+
WVector = {}
|
|
125
|
+
|
|
126
|
+
for i in range(0, n):
|
|
127
|
+
if (xVector[i] == 0):
|
|
128
|
+
XVector[i] = pk['R'][i] ** (s - s_i[i])
|
|
129
|
+
WVector[i] = pk['M'][i] ** (s_i[i])
|
|
130
|
+
elif (xVector[i] == 1):
|
|
131
|
+
XVector[i] = pk['T'][i] ** (s - s_i[i])
|
|
132
|
+
WVector[i] = pk['V'][i] ** (s_i[i])
|
|
133
|
+
else:
|
|
134
|
+
assert False,"pk_hve08.py: one of the xVector elements passed into encrypt is not either 0 or 1 (only allowable values)."
|
|
135
|
+
|
|
136
|
+
CT = (omega, C0, XVector, WVector)
|
|
137
|
+
return CT
|
|
138
|
+
|
|
139
|
+
def decrypt(self, CT, sk):
|
|
140
|
+
(omega, C0, XVector, WVector) = CT
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
(YVector, LVector) = sk
|
|
144
|
+
except:
|
|
145
|
+
M = omega * pair(C0, sk)
|
|
146
|
+
return M
|
|
147
|
+
|
|
148
|
+
dotProd = 1
|
|
149
|
+
|
|
150
|
+
n = len(YVector)
|
|
151
|
+
if ( (n != len(LVector)) or (n != len(XVector)) or (n != len(WVector)) ):
|
|
152
|
+
assert False, "pk_hve08.py: lengths of the vectors passed to decrypt are unequal in at least one case."
|
|
153
|
+
for i in range(0, n):
|
|
154
|
+
if ( (YVector[i] != group.init(G2)) and (LVector[i] != group.init(G2)) ):
|
|
155
|
+
dotProd *= ( pair(XVector[i], YVector[i]) * pair(WVector[i], LVector[i]) )
|
|
156
|
+
|
|
157
|
+
M = omega * dotProd
|
|
158
|
+
return M
|
|
159
|
+
|
|
160
|
+
def main():
|
|
161
|
+
grp = PairingGroup("MNT224")
|
|
162
|
+
|
|
163
|
+
hve08 = HVE08(grp)
|
|
164
|
+
(pk, msk) = hve08.setup(4)
|
|
165
|
+
sk = hve08.keygen(pk, msk, [0, 1, 0, 0])
|
|
166
|
+
M = group.random(GT)
|
|
167
|
+
print(M)
|
|
168
|
+
print("\n\n")
|
|
169
|
+
CT = hve08.encrypt(M, [0, 1, 0, 0], pk)
|
|
170
|
+
M2 = hve08.decrypt(CT, sk)
|
|
171
|
+
print(M2)
|
|
172
|
+
if (M == M2):
|
|
173
|
+
print("success")
|
|
174
|
+
else:
|
|
175
|
+
print("failed")
|
|
176
|
+
|
|
177
|
+
if __name__ == "__main__":
|
|
178
|
+
debug = True
|
|
179
|
+
main()
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Ciphertext-Policy ABE: Expressive and Efficient (Waters11)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Ciphertext-Policy Attribute-Based Encryption: An Expressive, Efficient, and Provably Secure Realization"
|
|
7
|
+
| **Published in:** Public Key Cryptography (PKC), 2011
|
|
8
|
+
| **Available from:** https://doi.org/10.1007/978-3-642-19379-8_4
|
|
9
|
+
| **Notes:** Asymmetric version of the scheme in Section 3
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** ciphertext-policy attribute-based encryption
|
|
14
|
+
* **Setting:** Pairing groups
|
|
15
|
+
* **Assumption:** Decisional Parallel Bilinear Diffie-Hellman Exponent
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Shashank Agrawal
|
|
20
|
+
:Date: 05/2016
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup, ZR, G1, G2, GT, pair
|
|
24
|
+
from charm.toolbox.ABEnc import ABEnc
|
|
25
|
+
from charm.toolbox.msp import MSP
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Waters11(ABEnc):
|
|
31
|
+
|
|
32
|
+
def __init__(self, group_obj, uni_size, verbose=False):
|
|
33
|
+
ABEnc.__init__(self)
|
|
34
|
+
self.group = group_obj
|
|
35
|
+
self.uni_size = uni_size # bound on the size of the universe of attributes
|
|
36
|
+
self.util = MSP(self.group, verbose)
|
|
37
|
+
|
|
38
|
+
def setup(self):
|
|
39
|
+
"""
|
|
40
|
+
Generates public key and master secret key.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
if debug:
|
|
44
|
+
print('Setup algorithm:\n')
|
|
45
|
+
|
|
46
|
+
# pick a random element each from two source groups and pair them
|
|
47
|
+
g1 = self.group.random(G1)
|
|
48
|
+
g2 = self.group.random(G2)
|
|
49
|
+
alpha = self.group.random(ZR)
|
|
50
|
+
g1_alpha = g1 ** alpha
|
|
51
|
+
e_gg_alpha = pair(g1_alpha, g2)
|
|
52
|
+
|
|
53
|
+
a = self.group.random(ZR)
|
|
54
|
+
g1_a = g1 ** a
|
|
55
|
+
|
|
56
|
+
h = [0]
|
|
57
|
+
for i in range(self.uni_size):
|
|
58
|
+
h.append(self.group.random(G1))
|
|
59
|
+
|
|
60
|
+
pk = {'g1': g1, 'g2': g2, 'g1_a': g1_a, 'h': h, 'e_gg_alpha': e_gg_alpha}
|
|
61
|
+
msk = {'g1_alpha': g1_alpha}
|
|
62
|
+
return pk, msk
|
|
63
|
+
|
|
64
|
+
def keygen(self, pk, msk, attr_list):
|
|
65
|
+
"""
|
|
66
|
+
Generate a key for a set of attributes.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
if debug:
|
|
70
|
+
print('Key generation algorithm:\n')
|
|
71
|
+
|
|
72
|
+
t = self.group.random(ZR)
|
|
73
|
+
k0 = msk['g1_alpha'] * (pk['g1_a'] ** t)
|
|
74
|
+
L = pk['g2'] ** t
|
|
75
|
+
|
|
76
|
+
K = {}
|
|
77
|
+
for attr in attr_list:
|
|
78
|
+
K[attr] = pk['h'][int(attr)] ** t
|
|
79
|
+
|
|
80
|
+
return {'attr_list': attr_list, 'k0': k0, 'L': L, 'K': K}
|
|
81
|
+
|
|
82
|
+
def encrypt(self, pk, msg, policy_str):
|
|
83
|
+
"""
|
|
84
|
+
Encrypt a message M under a monotone span program.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if debug:
|
|
88
|
+
print('Encryption algorithm:\n')
|
|
89
|
+
|
|
90
|
+
policy = self.util.createPolicy(policy_str)
|
|
91
|
+
mono_span_prog = self.util.convert_policy_to_msp(policy)
|
|
92
|
+
num_cols = self.util.len_longest_row
|
|
93
|
+
|
|
94
|
+
# pick randomness
|
|
95
|
+
u = []
|
|
96
|
+
for i in range(num_cols):
|
|
97
|
+
rand = self.group.random(ZR)
|
|
98
|
+
u.append(rand)
|
|
99
|
+
s = u[0] # shared secret
|
|
100
|
+
|
|
101
|
+
c0 = pk['g2'] ** s
|
|
102
|
+
|
|
103
|
+
C = {}
|
|
104
|
+
D = {}
|
|
105
|
+
for attr, row in mono_span_prog.items():
|
|
106
|
+
cols = len(row)
|
|
107
|
+
sum = 0
|
|
108
|
+
for i in range(cols):
|
|
109
|
+
sum += row[i] * u[i]
|
|
110
|
+
attr_stripped = self.util.strip_index(attr)
|
|
111
|
+
r_attr = self.group.random(ZR)
|
|
112
|
+
c_attr = (pk['g1_a'] ** sum) / (pk['h'][int(attr_stripped)] ** r_attr)
|
|
113
|
+
d_attr = pk['g2'] ** r_attr
|
|
114
|
+
C[attr] = c_attr
|
|
115
|
+
D[attr] = d_attr
|
|
116
|
+
|
|
117
|
+
c_m = (pk['e_gg_alpha'] ** s) * msg
|
|
118
|
+
|
|
119
|
+
return {'policy': policy, 'c0': c0, 'C': C, 'D': D, 'c_m': c_m}
|
|
120
|
+
|
|
121
|
+
def decrypt(self, pk, ctxt, key):
|
|
122
|
+
"""
|
|
123
|
+
Decrypt ciphertext ctxt with key key.
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
if debug:
|
|
127
|
+
print('Decryption algorithm:\n')
|
|
128
|
+
|
|
129
|
+
nodes = self.util.prune(ctxt['policy'], key['attr_list'])
|
|
130
|
+
if not nodes:
|
|
131
|
+
print ("Policy not satisfied.")
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
prodG = 1
|
|
135
|
+
prodGT = 1
|
|
136
|
+
|
|
137
|
+
for node in nodes:
|
|
138
|
+
attr = node.getAttributeAndIndex()
|
|
139
|
+
attr_stripped = self.util.strip_index(attr)
|
|
140
|
+
prodG *= ctxt['C'][attr]
|
|
141
|
+
prodGT *= pair(key['K'][attr_stripped], ctxt['D'][attr])
|
|
142
|
+
|
|
143
|
+
return (ctxt['c_m'] * pair(prodG, key['L']) * prodGT) / (pair(key['k0'], ctxt['c0']))
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**MuSig: Key Aggregation for Schnorr Signatures (MuSig)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Gregory Maxwell, Andrew Poelstra, Yannick Seurin, Pieter Wuille
|
|
5
|
+
|
|
6
|
+
| **Title:** "Simple Schnorr Multi-Signatures with Applications to Bitcoin"
|
|
7
|
+
| **Published in:** ePrint Archive, 2018
|
|
8
|
+
| **Available from:** https://eprint.iacr.org/2018/068
|
|
9
|
+
| **Notes:** Designed for Bitcoin multi-signature applications
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** aggregate signature (Schnorr-based)
|
|
14
|
+
* **Setting:** elliptic curve groups
|
|
15
|
+
* **Assumption:** DL
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Lovesh Harchandani
|
|
20
|
+
:Date: 6/2018
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from functools import reduce
|
|
24
|
+
|
|
25
|
+
from charm.toolbox.eccurve import secp256k1
|
|
26
|
+
from charm.toolbox.ecgroup import ZR, G, ECGroup
|
|
27
|
+
from charm.core.engine.util import objectToBytes
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
debug = False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class MuSig:
|
|
34
|
+
def __init__(self, groupObj):
|
|
35
|
+
global group
|
|
36
|
+
group = groupObj
|
|
37
|
+
|
|
38
|
+
def keygen(self, g, secparam=None):
|
|
39
|
+
x = group.random()
|
|
40
|
+
g_x = g ** x
|
|
41
|
+
pk = {'g^x': g_x, 'g': g, 'identity': str(g_x), 'secparam': secparam}
|
|
42
|
+
sk = {'x': x}
|
|
43
|
+
return pk, sk
|
|
44
|
+
|
|
45
|
+
def sign(self, nonce, sk, pk, challenge, all_pub_keys):
|
|
46
|
+
hash_of_pub_keys = MuSig.hash_pub_keys(all_pub_keys)
|
|
47
|
+
h = group.hash(MuSig.dump(pk['g^x']) + MuSig.dump(hash_of_pub_keys), ZR)
|
|
48
|
+
return nonce + challenge * sk['x'] * h
|
|
49
|
+
|
|
50
|
+
def verify(self, pub_keys, sig, message):
|
|
51
|
+
apk = self.aggregated_pub_key(pub_keys)
|
|
52
|
+
R, s = sig
|
|
53
|
+
challenge = self.compute_challenge(apk, R, message)
|
|
54
|
+
g = pub_keys[0]['g']
|
|
55
|
+
return g ** s == R * (apk ** challenge)
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def aggregate_sigs(signatures):
|
|
59
|
+
return sum(signatures)
|
|
60
|
+
|
|
61
|
+
@staticmethod
|
|
62
|
+
def new_nonce():
|
|
63
|
+
return group.random()
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def aggregate_nonce(g, nonces):
|
|
67
|
+
return MuSig.product([g ** n for n in nonces])
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def hash_pub_keys(pub_keys):
|
|
71
|
+
acc = b''
|
|
72
|
+
for p in pub_keys:
|
|
73
|
+
acc += MuSig.dump(p['g^x'])
|
|
74
|
+
return group.hash(acc, ZR)
|
|
75
|
+
|
|
76
|
+
@staticmethod
|
|
77
|
+
def aggregated_pub_key(pub_keys):
|
|
78
|
+
hash_of_pub_keys = MuSig.hash_pub_keys(pub_keys)
|
|
79
|
+
hash_dump = MuSig.dump(hash_of_pub_keys)
|
|
80
|
+
xs = []
|
|
81
|
+
for pk in pub_keys:
|
|
82
|
+
d = MuSig.dump(pk['g^x']) + hash_dump
|
|
83
|
+
xs.append(pk['g^x'] ** group.hash(d, ZR))
|
|
84
|
+
return MuSig.product(xs)
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def compute_challenge(aggregated_pub_key, aggregate_nonce, message):
|
|
88
|
+
m = MuSig.dump(message)
|
|
89
|
+
message_hash = group.hash(m, ZR)
|
|
90
|
+
return group.hash(MuSig.dump(aggregated_pub_key) + MuSig.dump(aggregate_nonce) + MuSig.dump(message_hash))
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def product(seq):
|
|
94
|
+
return reduce(lambda x, y: x * y, seq)
|
|
95
|
+
|
|
96
|
+
@staticmethod
|
|
97
|
+
def dump(obj):
|
|
98
|
+
return objectToBytes(obj, group)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def main():
|
|
102
|
+
grp = ECGroup(secp256k1)
|
|
103
|
+
ms = MuSig(grp)
|
|
104
|
+
g = grp.random(G)
|
|
105
|
+
if debug:
|
|
106
|
+
print('Generator...', g)
|
|
107
|
+
|
|
108
|
+
msg = 'hello there'
|
|
109
|
+
num_signers = 5
|
|
110
|
+
|
|
111
|
+
if debug:
|
|
112
|
+
print('{} signers will sign {}'.format(num_signers, msg))
|
|
113
|
+
|
|
114
|
+
signers = [ms.keygen(g) for _ in range(num_signers)]
|
|
115
|
+
|
|
116
|
+
nonces = [ms.new_nonce() for _ in range(num_signers)]
|
|
117
|
+
an = ms.aggregate_nonce(g, nonces)
|
|
118
|
+
all_pub_keys = [signer[0] for signer in signers]
|
|
119
|
+
|
|
120
|
+
if debug:
|
|
121
|
+
print('Public keys...')
|
|
122
|
+
for pk in all_pub_keys:
|
|
123
|
+
print(pk)
|
|
124
|
+
|
|
125
|
+
apk = ms.aggregated_pub_key(all_pub_keys)
|
|
126
|
+
if debug:
|
|
127
|
+
print('Aggregated Public key: ', apk)
|
|
128
|
+
|
|
129
|
+
challenge = ms.compute_challenge(apk, an, msg)
|
|
130
|
+
sigs = [ms.sign(nonces[i], signers[i][1], signers[i][0], challenge, all_pub_keys) for i in range(num_signers)]
|
|
131
|
+
|
|
132
|
+
if debug:
|
|
133
|
+
print('Signatures...')
|
|
134
|
+
for sig in sigs:
|
|
135
|
+
print(sig)
|
|
136
|
+
|
|
137
|
+
asig = ms.aggregate_sigs(sigs)
|
|
138
|
+
|
|
139
|
+
if debug:
|
|
140
|
+
print('Aggregated signature: ', asig)
|
|
141
|
+
|
|
142
|
+
assert ms.verify(all_pub_keys, (an, asig), msg), 'Aggregated sig verification failed'
|
|
143
|
+
|
|
144
|
+
if debug:
|
|
145
|
+
print('Verification succeeded')
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if __name__ == "__main__":
|
|
149
|
+
debug = True
|
|
150
|
+
main()
|