1 #include <gtest/gtest.h>
6 static dipe_param_t param
;
8 TEST(DipeTest
, DipeMasterKeygen
) {
9 dipe_master_publickey_t pk
;
10 dipe_master_secretkey_t sk
;
12 dipe_master_keygen(param
, 12, &pk
, &sk
);
14 dipe_free_master_secretkey(sk
);
15 dipe_free_master_publickey(pk
);
18 TEST(DipeTest
, DipeKeygen
) {
19 dipe_master_publickey_t pk
;
20 dipe_master_secretkey_t msk
;
23 for (size_t i
= 0; i
< 5; ++i
) {
24 element_init_Zr(y
[i
], *dipe_get_pairing(param
));
28 dipe_master_keygen(param
, 5, &pk
, &msk
);
29 dipe_keygen(param
, msk
, "1234567890abcdef", y
, &sk
);
31 dipe_free_master_secretkey(msk
);
32 dipe_free_master_publickey(pk
);
33 dipe_free_secretkey(sk
);
35 for (size_t i
= 0; i
< 5; ++i
) {
40 TEST(DipeTest
, DipeDecapFail
) {
42 dipe_master_publickey_t pk
;
43 dipe_master_secretkey_t msk
;
47 for (size_t i
= 0; i
< 5; ++i
) {
48 element_init_Zr(y
[i
], *dipe_get_pairing(param
));
52 dipe_master_keygen(param
, 5, &pk
, &msk
);
53 dipe_keygen(param
, msk
, "1234567890abcdef", y
, &sk
);
55 element_t ptxt
, ptxtp
;
56 element_init_GT(ptxt
, *dipe_get_pairing(param
));
57 element_init_GT(ptxtp
, *dipe_get_pairing(param
));
61 dipe_encap(param
, pk
, y
, ptxt
, &ctxt
);
62 dipe_decap(param
, sk
, "1234567890abcdef", y
, ctxt
, ptxtp
);
64 EXPECT_NE(element_cmp(ptxt
, ptxtp
), 0);
66 for (size_t i
= 0; i
< 5; ++i
) {
73 dipe_free_master_secretkey(msk
);
74 dipe_free_master_publickey(pk
);
75 dipe_free_secretkey(sk
);
79 TEST(DipeTest
, DipeDecapTrivialSuccess
) {
81 dipe_master_publickey_t pk
;
82 dipe_master_secretkey_t msk
;
86 for (size_t i
= 0; i
< 5; ++i
) {
87 element_init_Zr(y
[i
], *dipe_get_pairing(param
));
91 dipe_master_keygen(param
, 5, &pk
, &msk
);
92 dipe_keygen(param
, msk
, "1234567890abcdef", y
, &sk
);
94 element_t ptxt
, ptxtp
;
95 element_init_GT(ptxt
, *dipe_get_pairing(param
));
96 element_init_GT(ptxtp
, *dipe_get_pairing(param
));
100 dipe_encap(param
, pk
, y
, ptxt
, &ctxt
);
101 dipe_decap(param
, sk
, "1234567890abcdef", y
, ctxt
, ptxtp
);
103 EXPECT_EQ(element_cmp(ptxt
, ptxtp
), 0);
105 for (size_t i
= 0; i
< 5; ++i
) {
110 element_clear(ptxtp
);
112 dipe_free_master_secretkey(msk
);
113 dipe_free_master_publickey(pk
);
114 dipe_free_secretkey(sk
);
115 dipe_free_ctxt(ctxt
);
118 TEST(DipeTest
, DipeDecapSuccess
) {
120 dipe_master_publickey_t pk
;
121 dipe_master_secretkey_t msk
;
127 for (size_t i
= 0; i
< 6; i
+=2) {
128 element_init_Zr(y
[i
], *dipe_get_pairing(param
));
129 element_init_Zr(x
[i
], *dipe_get_pairing(param
));
130 element_init_Zr(y
[i
+1], *dipe_get_pairing(param
));
131 element_init_Zr(x
[i
+1], *dipe_get_pairing(param
));
134 element_set1(x
[i
+1]);
135 element_random(y
[i
+1]);
136 element_neg(x
[i
], y
[i
+1]);
139 dipe_master_keygen(param
, 6, &pk
, &msk
);
140 dipe_keygen(param
, msk
, "1234567890abcdef", y
, &sk
);
142 element_t ptxt
, ptxtp
;
143 element_init_GT(ptxt
, *dipe_get_pairing(param
));
144 element_init_GT(ptxtp
, *dipe_get_pairing(param
));
146 element_random(ptxt
);
148 dipe_encap(param
, pk
, x
, ptxt
, &ctxt
);
150 dipe_decap(param
, sk
, "1234567890abcdef", y
, ctxt
, ptxtp
);
151 EXPECT_EQ(element_cmp(ptxt
, ptxtp
), 0);
153 /* non-matching CID */
154 dipe_decap(param
, sk
, "fedcba0987654321", y
, ctxt
, ptxtp
);
155 EXPECT_NE(element_cmp(ptxt
, ptxtp
), 0);
157 /* inconsistent y value */
158 dipe_decap(param
, sk
, "1234567890abcdef", x
, ctxt
, ptxtp
);
159 EXPECT_NE(element_cmp(ptxt
, ptxtp
), 0);
161 for (size_t i
= 0; i
< 6; ++i
) {
167 element_clear(ptxtp
);
169 dipe_free_master_secretkey(msk
);
170 dipe_free_master_publickey(pk
);
171 dipe_free_secretkey(sk
);
172 dipe_free_ctxt(ctxt
);
175 TEST(DipeTest
, DipeDecryptSuccessSmall
) {
180 dipe_master_publickey_t pk
;
181 dipe_master_secretkey_t msk
;
187 for (size_t i
= 0; i
< 6; i
+=2) {
188 element_init_Zr(y
[i
], *dipe_get_pairing(param
));
189 element_init_Zr(x
[i
], *dipe_get_pairing(param
));
190 element_init_Zr(y
[i
+1], *dipe_get_pairing(param
));
191 element_init_Zr(x
[i
+1], *dipe_get_pairing(param
));
194 element_set1(x
[i
+1]);
195 element_random(y
[i
+1]);
196 element_neg(x
[i
], y
[i
+1]);
199 dipe_master_keygen(param
, 6, &pk
, &msk
);
200 dipe_keygen(param
, msk
, "1234567890abcdef", y
, &sk
);
201 overhead
= dipe_ciphertext_overhead(param
, 6);
203 for (size_t clen
= overhead
; clen
< 768; ++clen
) {
204 memset(ctxt
, 0, 768);
205 memset(ptxt
, 0, 768);
206 memcpy(ptxt
, "test", 4);
208 dipe_encrypt(param
, pk
, x
, 4, ptxt
, clen
, ctxt
);
209 ptxt_len
= dipe_decrypt(param
, sk
, "1234567890abcdef", y
, clen
, ctxt
, ptxt
);
211 if (clen
>= overhead
) {
212 ASSERT_EQ(ptxt_len
, 4);
213 ASSERT_STREQ(ptxt
, "test");
216 ASSERT_EQ(ptxt_len
, 0);
220 for (size_t i
= 0; i
< 6; ++i
) {
225 dipe_free_master_secretkey(msk
);
226 dipe_free_master_publickey(pk
);
227 dipe_free_secretkey(sk
);
231 int main(int argc
, char **argv
) {
232 ::testing::InitGoogleTest(&argc
, argv
);
234 dipe_init(fopen("../tests/a.param", "r"), ¶m
);
236 int result
= RUN_ALL_TESTS();
237 dipe_free_param(param
);