Skip to content

Commit f6dd856

Browse files
committed
add MCL CH, CH_NIZK test
Skip Action
1 parent b06f6b9 commit f6dd856

17 files changed

Lines changed: 3190 additions & 4 deletions

File tree

PBCTest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
'CH_KEF_DLP_LLA_2012',
1414
'CH_KEF_MH_RSA_F_AM_2004',
1515
'CH_KEF_MH_RSANN_F_AM_2004',
16-
'CH_KEF_MH_SDH_DL_AM_2004'
16+
'CH_KEF_MH_SDH_DL_AM_2004',
17+
'CHET_RSA_CDK_2017'
1718
] + late
1819

1920
os.system(f'mvn -Dtest=PBCTest.BasicTimeTest test')
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package scheme.CH.CH_FS_ECC_CCT_2024;
2+
3+
import base.GroupParam.MCL.SingleGroup;
4+
import com.herumi.mcl.Fr;
5+
import com.herumi.mcl.GT;
6+
import com.herumi.mcl.Mcl;
7+
import utils.Hash;
8+
9+
/*
10+
* Reconstructing Chameleon Hash: Full Security and the Multi-Party Setting
11+
* P6. 3.2 ECC-based Construction
12+
*/
13+
14+
@SuppressWarnings("SuspiciousNameCombination")
15+
public class MCL_GT {
16+
public static class PublicParam {
17+
public SingleGroup.SingleGroupGT GP = new SingleGroup.SingleGroupGT();
18+
public GT g = new GT();
19+
20+
public PublicParam() {
21+
GP.GetGElement(g);
22+
}
23+
24+
private void H_p(Fr res, String m) {
25+
Hash.H_MCL_Zr_1(res, m);
26+
}
27+
28+
public void H(GT res, Fr m) {
29+
Hash.H_MCL_GT_1(res, m.toString());
30+
}
31+
32+
public void H_p(Fr res, GT m1, GT m2, GT m3, Fr m4) {
33+
H_p(res, String.format("%s|%s|%s|%s", m1, m2, m3, m4));
34+
}
35+
}
36+
37+
public static class PublicKey {
38+
public GT g_x = new GT();
39+
}
40+
41+
public static class SecretKey {
42+
public Fr x = new Fr();
43+
}
44+
45+
public static class HashValue {
46+
public GT h = new GT();
47+
}
48+
49+
public static class Randomness {
50+
public Fr z_1 = new Fr(), z_2 = new Fr(), c_1 = new Fr();
51+
}
52+
53+
private final GT[] G_tmp = new GT[]{new GT(), new GT(), new GT()};
54+
private final Fr[] Fr_tmp = new Fr[]{new Fr(), new Fr()};
55+
56+
public void KeyGen(PublicKey pk, SecretKey sk, PublicParam pp) {
57+
pp.GP.GetZrElement(sk.x);
58+
Mcl.pow(pk.g_x, pp.g, sk.x);
59+
}
60+
61+
public void Hash(HashValue H, Randomness R, PublicParam pp, PublicKey pk, Fr m) {
62+
pp.GP.GetZrElement(Fr_tmp[0]);
63+
Mcl.pow(H.h, pp.g, Fr_tmp[0]);
64+
65+
pp.GP.GetZrElement(Fr_tmp[1]);
66+
67+
Mcl.pow(G_tmp[0], pp.g, Fr_tmp[1]);
68+
pp.H_p(R.c_1, G_tmp[0], pk.g_x, H.h, m);
69+
70+
pp.GP.GetZrElement(R.z_1);
71+
Mcl.pow(G_tmp[0], pp.g, R.z_1);
72+
Mcl.pow(G_tmp[1], pk.g_x, R.c_1);
73+
Mcl.mul(G_tmp[0], G_tmp[0], G_tmp[1]);
74+
pp.H_p(R.z_2, G_tmp[0], pk.g_x, H.h, m);
75+
76+
Mcl.mul(R.z_2, R.z_2, Fr_tmp[0]);
77+
Mcl.sub(R.z_2, Fr_tmp[1], R.z_2);
78+
79+
pp.H(G_tmp[0], m);
80+
Mcl.mul(H.h, H.h, G_tmp[0]);
81+
}
82+
83+
public boolean Check(HashValue H, Randomness R, PublicParam pp, PublicKey pk, Fr m) {
84+
pp.H(G_tmp[0], m);
85+
Mcl.inv(G_tmp[0], G_tmp[0]);
86+
Mcl.mul(G_tmp[0], H.h, G_tmp[0]);
87+
88+
Mcl.pow(G_tmp[1], pp.g, R.z_1);
89+
Mcl.pow(G_tmp[2], pk.g_x, R.c_1);
90+
Mcl.mul(G_tmp[1], G_tmp[1], G_tmp[2]);
91+
pp.H_p(Fr_tmp[0], G_tmp[1], pk.g_x, G_tmp[0], m);
92+
93+
Mcl.pow(G_tmp[1], pp.g, R.z_2);
94+
Mcl.pow(G_tmp[2], G_tmp[0], Fr_tmp[0]);
95+
Mcl.mul(G_tmp[1], G_tmp[1], G_tmp[2]);
96+
pp.H_p(Fr_tmp[0], G_tmp[1], pk.g_x, G_tmp[0], m);
97+
return R.c_1.equals(Fr_tmp[0]);
98+
}
99+
100+
public void Adapt(Randomness R_p, HashValue H, Randomness R, PublicParam pp, PublicKey pk, SecretKey sk, Fr m, Fr m_p) {
101+
if(!Check(H, R, pp, pk, m)) throw new RuntimeException("wrong hash value");
102+
pp.H(G_tmp[0], m_p);
103+
Mcl.inv(G_tmp[0], G_tmp[0]);
104+
Mcl.mul(G_tmp[0], H.h, G_tmp[0]);
105+
pp.GP.GetZrElement(Fr_tmp[0]);
106+
pp.GP.GetZrElement(R_p.z_2);
107+
Mcl.pow(G_tmp[1], pp.g, Fr_tmp[0]);
108+
pp.H_p(Fr_tmp[1], G_tmp[1], pk.g_x, G_tmp[0], m_p);
109+
110+
Mcl.pow(G_tmp[1], pp.g, R_p.z_2);
111+
Mcl.pow(G_tmp[2], G_tmp[0], Fr_tmp[1]);
112+
Mcl.mul(G_tmp[1], G_tmp[1], G_tmp[2]);
113+
pp.H_p(R_p.c_1, G_tmp[1], pk.g_x, G_tmp[0], m_p);
114+
115+
Mcl.mul(R_p.z_1, R_p.c_1, sk.x);
116+
Mcl.sub(R_p.z_1, Fr_tmp[0], R_p.z_1);
117+
}
118+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package scheme.CH.CH_KEF_CZK_2004;
2+
3+
import base.GroupParam.MCL.SingleGroup;
4+
import com.herumi.mcl.Fr;
5+
import com.herumi.mcl.GT;
6+
import com.herumi.mcl.Mcl;
7+
import utils.Hash;
8+
9+
/*
10+
* Chameleon Hashing without Key Exposure
11+
* P7. 3.3.1 The scheme
12+
*/
13+
14+
@SuppressWarnings("SuspiciousNameCombination")
15+
public class MCL_GT {
16+
public static class PublicParam {
17+
public SingleGroup.SingleGroupGT GP = new SingleGroup.SingleGroupGT();
18+
GT g = new GT();
19+
20+
public PublicParam() {
21+
GP.GetGElement(g);
22+
}
23+
24+
public void H(GT res, String m) {
25+
Hash.H_MCL_GT_1(res, m);
26+
}
27+
}
28+
29+
public static class PublicKey {
30+
public GT y = new GT();
31+
}
32+
33+
public static class SecretKey {
34+
public Fr x = new Fr();
35+
}
36+
37+
public static class HashValue {
38+
public GT h = new GT();
39+
}
40+
41+
public static class Randomness {
42+
public GT g_a = new GT(), y_a = new GT();
43+
}
44+
45+
private final GT[] G_tmp = new GT[]{new GT()};
46+
private final Fr[] Fr_tmp = new Fr[]{new Fr()};
47+
48+
private static void getHashValue(GT res, Randomness R, PublicParam SP, GT I, Fr m) {
49+
Mcl.mul(res, SP.g, I);
50+
Mcl.pow(res, res, m);
51+
Mcl.mul(res, res, R.y_a);
52+
}
53+
54+
public void KeyGen(PublicKey pk, SecretKey sk, PublicParam SP) {
55+
SP.GP.GetZrElement(sk.x);
56+
Mcl.pow(pk.y, SP.g, sk.x);
57+
}
58+
59+
public void Hash(HashValue H, Randomness R, PublicParam SP, PublicKey pk, GT I, Fr m) {
60+
SP.GP.GetZrElement(Fr_tmp[0]);
61+
Mcl.pow(R.g_a, SP.g, Fr_tmp[0]);
62+
Mcl.pow(R.y_a, pk.y, Fr_tmp[0]);
63+
getHashValue(H.h, R, SP, I, m);
64+
}
65+
66+
public boolean Check(HashValue H, Randomness R, PublicParam SP, GT I, Fr m) {
67+
getHashValue(G_tmp[0], R, SP, I, m);
68+
return H.h.equals(G_tmp[0]);
69+
}
70+
71+
public void Adapt(Randomness R_p, Randomness R, PublicParam SP, SecretKey sk, GT I, Fr m, Fr m_p) {
72+
Mcl.mul(R_p.g_a, SP.g, I);
73+
Mcl.sub(Fr_tmp[0], m, m_p);
74+
Mcl.pow(R_p.y_a, R_p.g_a, Fr_tmp[0]);
75+
Mcl.mul(R_p.y_a, R_p.y_a, R.y_a);
76+
77+
Mcl.div(Fr_tmp[0], Fr_tmp[0], sk.x);
78+
Mcl.pow(R_p.g_a, R_p.g_a, Fr_tmp[0]);
79+
Mcl.mul(R_p.g_a, R_p.g_a, R.g_a);
80+
}
81+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package scheme.CH.CH_KEF_DLP_LLA_2012;
2+
3+
import base.GroupParam.MCL.SingleGroup;
4+
import com.herumi.mcl.Fr;
5+
import com.herumi.mcl.GT;
6+
import com.herumi.mcl.Mcl;
7+
import utils.Hash;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
@SuppressWarnings({"DuplicatedCode", "SuspiciousNameCombination"})
13+
public class MCL_GT {
14+
public static class Label {
15+
public GT L = new GT(), R = new GT();
16+
}
17+
18+
public static class LabelGen {
19+
public GT y_1 = new GT(), omega_1 = new GT();
20+
}
21+
22+
public static class LabelManager {
23+
public Map<String, LabelGen> Dict = new HashMap<>();
24+
public PublicParam pp;
25+
26+
public LabelManager(PublicParam pp) {
27+
this.pp = pp;
28+
}
29+
30+
public void add(PublicKey pk, LabelGen lg) {
31+
Dict.put(pk.toString(), lg);
32+
}
33+
34+
public void get(Label L, PublicKey pk) {
35+
get(L, pk, new GT[]{new GT()}, new Fr[]{new Fr()});
36+
}
37+
38+
public void get(Label L, PublicKey pk, GT[] G_tmp, Fr[] Fr_tmp) {
39+
pp.GP.GetGElement(G_tmp[0]);
40+
pp.H2(Fr_tmp[0], G_tmp[0]);
41+
LabelGen lg = Dict.get(pk.toString());
42+
Mcl.pow(L.L, lg.y_1, Fr_tmp[0]);
43+
Mcl.pow(L.R, lg.omega_1, Fr_tmp[0]);
44+
Mcl.mul(L.R, G_tmp[0], L.R);
45+
}
46+
}
47+
48+
public static class PublicParam {
49+
public SingleGroup.SingleGroupGT GP = new SingleGroup.SingleGroupGT();
50+
51+
public void H1(Fr res, GT m1, GT m2, GT m3) {
52+
Hash.H_MCL_Zr_1(res, String.format("%s|%s|%s", m1, m2, m3));
53+
}
54+
55+
public void H2(Fr res, GT m1) {
56+
Hash.H_MCL_Zr_1(res, m1.toString());
57+
}
58+
}
59+
60+
public static class PublicKey {
61+
public GT g = new GT(), y_2 = new GT();
62+
63+
public String toString() {
64+
return String.format("%s|%s", g, y_2);
65+
}
66+
}
67+
68+
public static class SecretKey {
69+
public Fr alpha = new Fr(), x_1 = new Fr(), x_2 = new Fr();
70+
}
71+
72+
public static class HashValue {
73+
public GT S = new GT();
74+
}
75+
76+
public static class Randomness {
77+
Fr r = new Fr();
78+
}
79+
80+
private final GT[] G_tmp = new GT[]{new GT(), new GT()};
81+
private final Fr[] Fr_tmp = new Fr[]{new Fr(), new Fr()};
82+
83+
private void getHashValue(GT res, Randomness r, Label L, PublicParam PP, PublicKey pk, Fr m) {
84+
Mcl.pow(res, pk.g, m);
85+
PP.H1(Fr_tmp[0], L.L, L.R, L.L);
86+
Mcl.pow(G_tmp[0], pk.y_2, Fr_tmp[0]);
87+
Mcl.mul(G_tmp[0], G_tmp[0], L.L);
88+
Mcl.pow(G_tmp[0], G_tmp[0], r.r);
89+
Mcl.mul(res, res, G_tmp[0]);
90+
}
91+
92+
public void KeyGen(PublicKey pk, SecretKey sk, PublicParam PP, LabelManager LM) {
93+
PP.GP.GetGElement(pk.g);
94+
PP.GP.GetZrElement(sk.alpha);
95+
PP.GP.GetZrElement(sk.x_1);
96+
PP.GP.GetZrElement(sk.x_2);
97+
LabelGen lg = new LabelGen();
98+
Mcl.pow(lg.y_1, pk.g, sk.x_1);
99+
Mcl.pow(pk.y_2, pk.g, sk.x_2);
100+
101+
Mcl.pow(lg.omega_1, lg.y_1, sk.alpha);
102+
LM.add(pk, lg);
103+
}
104+
105+
public void Hash(HashValue h, Randomness r, Label L, PublicParam PP, LabelManager LM, PublicKey pk, Fr m) {
106+
LM.get(L, pk, G_tmp, Fr_tmp);
107+
PP.GP.GetZrElement(r.r);
108+
getHashValue(h.S, r, L, PP, pk, m);
109+
}
110+
111+
public boolean Check(HashValue h, Randomness r, PublicParam PP, PublicKey pk, Label L, Fr m) {
112+
getHashValue(G_tmp[1], r, L, PP, pk, m);
113+
return h.S.equals(G_tmp[1]);
114+
}
115+
116+
public void UForge(Randomness r_p, HashValue h, Randomness r, Label L, PublicParam PP, PublicKey pk, SecretKey sk, Fr m, Fr m_p) {
117+
if (!Check(h, r, PP, pk, L, m)) throw new RuntimeException("illegal hash");
118+
Mcl.pow(G_tmp[0], L.L, sk.alpha);
119+
Mcl.inv(G_tmp[0], G_tmp[0]);
120+
Mcl.mul(G_tmp[0], L.R, G_tmp[0]);
121+
122+
PP.H2(Fr_tmp[0], G_tmp[0]);
123+
124+
Mcl.pow(G_tmp[0], pk.g, sk.x_1);
125+
Mcl.pow(G_tmp[0], G_tmp[0], Fr_tmp[0]);
126+
Mcl.mul(Fr_tmp[0], sk.x_1, Fr_tmp[0]);
127+
Mcl.pow(G_tmp[0], pk.g, Fr_tmp[0]);
128+
if (!G_tmp[0].equals(L.L)) throw new RuntimeException("illegal label");
129+
130+
PP.H1(Fr_tmp[1], L.L, L.R, L.L);
131+
Mcl.mul(Fr_tmp[1], sk.x_2, Fr_tmp[1]);
132+
Mcl.add(Fr_tmp[1], Fr_tmp[0], Fr_tmp[1]);
133+
Mcl.sub(r_p.r, m, m_p);
134+
Mcl.div(r_p.r, r_p.r, Fr_tmp[1]);
135+
Mcl.add(r_p.r, r.r, r_p.r);
136+
}
137+
138+
public void IForge(Randomness r_pp, Randomness r, Randomness r_p, Fr m, Fr m_p, Fr m_pp) {
139+
Mcl.sub(r_pp.r, r_p.r, r.r);
140+
Mcl.sub(Fr_tmp[0], m_p, m_pp);
141+
Mcl.mul(r_pp.r, r_pp.r, Fr_tmp[0]);
142+
Mcl.sub(Fr_tmp[0], m, m_p);
143+
Mcl.div(r_pp.r, r_pp.r, Fr_tmp[0]);
144+
Mcl.add(r_pp.r, r_p.r, r_pp.r);
145+
}
146+
}

0 commit comments

Comments
 (0)