/* Boneh-Lynn-Shacham short signature scheme - signature phase cl /O2 /GX bls_sign.cpp ecn.cpp big.cpp miracl.lib The required file mnt.ecs is created from a curve generated by the mnt utility, and created by the cm utility. For convenience the value of (p^2-p+1)/q and the 6th root of unity (cnr^(p-1)/6) have been manually calculated and appended to this file (replacing the x,y values in the original .ecs file) */ #include #include #include #include "ecn.h" #include // cofactor - number of points on curve=CF.q #define CF 2 #define CNR 2 using namespace std; Miracl precision(40,16); // Using SHA-1 as basic hash algorithm #define HASH_LEN 20 // // Hash functions // Big H1(char *string,int len) { // Hash a zero-terminated string to a number < modulus Big h,p; char s[HASH_LEN]; int i,j; sha sh; shs_init(&sh); for (i=0;i=p) break; } h%=p; return h; } // Hash and map a Client Identity to a curve point E_(Fp) of order q ECn hash_and_map(char *ID,int len) { ECn Q; Big x0=H1(ID,len); while (!Q.set(x0,x0)) x0+=1; Q*=CF; return Q; } int main() { ifstream common("mnt.ecs"); // MNT elliptic curve parameters ifstream private_key("bls_private.key"); ofstream signature("bls_signature.sig"); miracl* mip=&precision; ECn PM; Big x,s,p,q,B; int bits,A,lsb; common >> bits; mip->IOBASE=16; common >> p; common >> A; common >> B >> q; private_key >> s; ecurve(A,B,p,MR_PROJECTIVE); PM=hash_and_map((char *)"This a quick test of the method",32); cout << "Short message has been signed - signature in bls_signature.sig " << endl; PM*=s; lsb=PM.get(x); signature << x << endl; signature << lsb << endl; return 0; }