2 Paterson ID-based signature.
3 Based on papers "K. G. Paterson. ID-Based Signatures from Pairings on Elliptic Curvers. Electron. Lett., Vol. 38". Available at http://eprint.iacr.org/2002/004."
4 Contributed by Dmitry Kosolapov.
10 int main(int argc
, char **argv
) {
13 element_t Ppub
, s
, P
, R
, k
, S
, Did
, Qid
, t1
, t2
, t4
, t5
, t6
, t7
, t8
,
17 pbc_demo_pairing_init(pairing
, argc
, argv
);
18 if (!pairing_is_symmetric(pairing
)) pbc_die("pairing must be symmetric");
20 element_init_G1(P
, pairing
);
21 element_init_G1(Ppub
, pairing
);
22 element_init_G1(Qid
, pairing
);
23 element_init_G1(Did
, pairing
);
24 element_init_G1(R
, pairing
);
25 element_init_G1(S
, pairing
);
26 element_init_G1(t2
, pairing
);
27 element_init_G1(t4
, pairing
);
28 element_init_G1(t5
, pairing
);
29 element_init_G1(t7
, pairing
);
31 element_init_Zr(s
, pairing
);
32 element_init_Zr(k
, pairing
);
33 element_init_Zr(t1
, pairing
);
35 element_init_GT(t6
, pairing
);
36 element_init_GT(t8
, pairing
);
37 element_init_GT(t9
, pairing
);
38 element_init_GT(t10
, pairing
);
39 element_init_GT(t11
, pairing
);
41 time1
= pbc_get_time();
42 printf("Paterson ID-based signature.\n");
46 element_mul_zn(Ppub
, P
, s
);
47 element_printf("P = %B\n", P
);
48 element_printf("Ppub = %B\n", Ppub
);
49 element_from_hash(Qid
, "ID", 2);
50 element_printf("Qid = %B\n", Qid
);
51 element_mul_zn(Did
, Qid
, s
);
55 element_mul_zn(R
, P
, k
);
56 element_from_hash(t1
, "Message", 7);
57 element_mul_zn(t2
, P
, t1
);
59 // int n = element_length_in_bytes(R);
60 // unsigned char *data=malloc(n);
61 // element_to_bytes(data, R);
62 // printf("data = %s\n", data);
63 element_to_mpz(t3
, R
);
64 element_mul_mpz(t4
, Did
, t3
);
65 element_add(t5
, t4
, t2
);
67 element_mul_zn(S
, t5
, k
);
68 printf("Signature of message \"Message\" is:\n");
69 element_printf("R = %B\n", R
);
70 element_printf("S = %B\n", S
);
73 element_from_hash(t1
, "Message", 7);
74 element_mul_zn(t7
, P
, t1
);
75 element_pairing(t6
, P
, t7
);
76 element_pairing(t8
, Ppub
, Qid
);
77 element_to_mpz(t3
, R
);
78 element_pow_mpz(t9
, t8
, t3
);
79 element_printf("t8 = %B\n", t8
);
80 element_printf("t9 = %B\n", t9
);
81 element_mul(t10
, t6
, t9
);
82 element_printf("t10 = %B\n", t10
);
83 element_pairing(t11
, R
, S
);
84 element_printf("[e(P, P)^H2(M)][e(Ppub, Qid)^H3(R)] = %B\n", t10
);
85 element_printf("e(R, S) = %B\n", t11
);
86 if (!element_cmp(t10
, t11
)) {
87 printf("Signature is valid!\n");
89 printf("Signature is invalid!\n");
91 time2
= pbc_get_time();
92 printf("All time = %fs\n", time2
- time1
);
111 pairing_clear(pairing
);