1use super::ecp::ECP;
20use super::ecp2::ECP2;
21use std::str;
22use super::big;
24use super::big::BIG;
25use super::pair;
26use super::rom;
27
28use rand::RAND;
29use sha3::SHA3;
30use sha3::SHAKE256;
31
32pub const BFS: usize = big::MODBYTES as usize;
35pub const BGS: usize = big::MODBYTES as usize;
36pub const BLS_OK: isize = 0;
37pub const BLS_FAIL: isize = -1;
38
39#[allow(non_snake_case)]
42fn bls_hashit(m: &str) -> ECP {
43 let mut sh = SHA3::new(SHAKE256);
44 let mut hm: [u8; BFS] = [0; BFS];
45 let t = m.as_bytes();
46 for i in 0..m.len() {
47 sh.process(t[i]);
48 }
49 sh.shake(&mut hm, BFS);
50 let P = ECP::mapit(&hm);
51 return P;
52}
53
54pub fn key_pair_generate(mut rng: &mut RAND, s: &mut [u8], w: &mut [u8]) -> isize {
56 let q = BIG::new_ints(&rom::CURVE_ORDER);
57 let g = ECP2::generator();
58 let mut sc = BIG::randomnum(&q, &mut rng);
59 sc.tobytes(s);
60 pair::g2mul(&g, &mut sc).tobytes(w);
61 return BLS_OK;
62}
63
64pub fn sign(sig: &mut [u8], m: &str, s: &[u8]) -> isize {
67 let d = bls_hashit(m);
68 let mut sc = BIG::frombytes(&s);
69 pair::g1mul(&d, &mut sc).tobytes(sig, true);
70 return BLS_OK;
71}
72
73pub fn verify(sig: &[u8], m: &str, w: &[u8]) -> isize {
76 let hm = bls_hashit(m);
77 let mut d = ECP::frombytes(&sig);
78 let g = ECP2::generator();
79 let pk = ECP2::frombytes(&w);
80 d.neg();
81
82 let mut r = pair::initmp();
84 pair::another(&mut r, &g, &d);
85 pair::another(&mut r, &pk, &hm);
86 let mut v = pair::miller(&r);
87
88 v = pair::fexp(&v);
92 if v.isunity() {
93 return BLS_OK;
94 }
95 return BLS_FAIL;
96}