KGC_TEST/miracl/source/curve/pairing/ake.cpp

132 lines
3.2 KiB
C++

/*
Scott's AKE Client/Server testbed
Compile with modules as specified below
For MR_PAIRING_CP curve
cl /O2 /GX ake.cpp cp_pair.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
For MR_PAIRING_MNT curve
cl /O2 /GX ake.cpp mnt_pair.cpp zzn6a.cpp ecn3.cpp zzn3.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
For MR_PAIRING_BN curve
cl /O2 /GX ake.cpp bn_pair.cpp zzn12a.cpp ecn2.cpp zzn4.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
For MR_PAIRING_KSS curve
cl /O2 /GX ake.cpp kss_pair.cpp zzn18.cpp zzn6.cpp ecn3.cpp zzn3.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
For MR_PAIRING_BLS curve
cl /O2 /GX ake.cpp bls_pair.cpp zzn24.cpp zzn8.cpp zzn4.cpp zzn2.cpp ecn4.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
See http://eprint.iacr.org/2002/164
*/
#include <iostream>
#include <ctime>
//********* choose just one of these pairs **********
//#define MR_PAIRING_CP // AES-80 security
//#define AES_SECURITY 80
//#define MR_PAIRING_MNT // AES-80 security
//#define AES_SECURITY 80
//#define MR_PAIRING_BN // AES-128 or AES-192 security
//#define AES_SECURITY 128
//#define AES_SECURITY 192
//#define MR_PAIRING_KSS // AES-192 security
//#define AES_SECURITY 192
#define MR_PAIRING_BLS // AES-256 security
#define AES_SECURITY 256
//*********************************************
#include "pairing_3.h"
int main()
{
PFC pfc(AES_SECURITY); // initialise pairing-friendly curve
time_t seed;
G1 Alice,Bob,sA,sB;
G2 B6,Server,sS;
GT res,sp,ap,bp;
Big ss,s,a,b;
time(&seed);
irand((long)seed);
pfc.random(ss); // TA's super-secret
cout << "Mapping Server ID to point" << endl;
pfc.hash_and_map(Server,(char *)"Server");
cout << "Mapping Alice & Bob ID's to points" << endl;
pfc.hash_and_map(Alice,(char *)"Alice");
pfc.hash_and_map(Bob,(char *)"Robert");
cout << "Alice, Bob and the Server visit Trusted Authority" << endl;
sS=pfc.mult(Server,ss);
sA=pfc.mult(Alice,ss);
sB=pfc.mult(Bob,ss);
cout << "Alice and Server Key Exchange" << endl;
pfc.random(a); // Alice's random number
pfc.random(s); // Server's random number
res=pfc.pairing(Server,sA);
if (!pfc.member(res))
{
cout << "Wrong group order - aborting" << endl;
exit(0);
}
ap=pfc.power(res,a);
res=pfc.pairing(sS,Alice);
if (!pfc.member(res))
{
cout << "Wrong group order - aborting" << endl;
exit(0);
}
sp=pfc.power(res,s);
cout << "Alice Key= " << pfc.hash_to_aes_key(pfc.power(sp,a)) << endl;
cout << "Server Key= " << pfc.hash_to_aes_key(pfc.power(ap,s)) << endl;
cout << "Bob and Server Key Exchange" << endl;
pfc.random(b); // Bob's random number
pfc.random(s); // Server's random number
res=pfc.pairing(Server,sB);
if (!pfc.member(res))
{
cout << "Wrong group order - aborting" << endl;
exit(0);
}
bp=pfc.power(res,b);
res=pfc.pairing(sS,Bob);
if (!pfc.member(res))
{
cout << "Wrong group order - aborting" << endl;
exit(0);
}
sp=pfc.power(res,s);
cout << "Bob's Key= " << pfc.hash_to_aes_key(pfc.power(sp,b)) << endl;
cout << "Server Key= " << pfc.hash_to_aes_key(pfc.power(bp,s)) << endl;
return 0;
}