common >> p >> q >> g; mip->IOBASE = 10; modulo(p); // set modulus G = (ZZn) g;
cout << \// CA generates its secret and public keys x = rand(q); // CA secret key, 0 < x < q Y = pow(G, x); // CA public key, Y=G^x cout << \// Visit to CA - a k = rand(q); Ra = pow(G, k); ra = (Big) Ra % q;
sa = (H(IDa) + (k * ra) % q); sa = (sa * inverse(x, q)) % q; // Visit to CA - b k = rand(q); Rb = pow(G, k); rb = (Big) Rb % q;
sb = (H(IDb) + (k * rb) % q); sb = (sb * inverse(x, q)) % q;
cout << \// offline calculation - a wa = rand(q);
Va = pow(G, wa); ta = rand(q); Ua = pow(Y, ta); // offline calculation - b wb = rand(q); Vb = pow(G, wb); tb = rand(q); Ub = pow(Y, tb); // Swap ID, R, U, V
cout << \// calculate key a
// Key = Vb^wa.Ub^sa.G^[(H(IDa)*tb)%q].Rb^[(rb*ta)%q] mod p rb = (Big) Rb % q;
A[0] = Vb; A[1] = Ub; A[2] = G; A[3] = Rb; b[0] = wa; b[1] = sa; b[2] = (H(IDb) * ta) % q; b[3] = (rb * ta) % q;
Key = pow(4, A, b); // extended exponentiation cout << \// calculate key - b ra = (Big) Ra % q;
A[0] = Va; A[1] = Ua; A[2] = G; A[3] = Ra; b[0] = wb; b[1] = sb; b[2] = (H(IDa) * tb) % q; b[3] = (ra * tb) % q;
Key = pow(4, A, b); // extended exponentiation
cout << \return 0; }
MIRACL演化出了一个复杂的类继承体系(见下图),尽可能多的类型直接在C/汇编的内核上直接建立。请注意对多项式,幂级数和扩展域的支持。
第九章 实例变量
这里列出了miracl.h中miracl结构的所有成员,它们都通过mip(Miracl Instance Pointer,Miracl实例指针)来访问。
BOOL EXACT 初始为TRUE,flash运算中发生圆整时置为FALSE。 int INPLEN 输入字符串的长度,输入二进制数据时使用。
int IOBASE 输入、输出时使用的“可打印”基数,在程序中可任意更改,必须大于等于2,小于等于256。 int IOBSIZ I/O缓冲区大小。
BOOL ERCON 错误发生时,默认产生一条错误消息并中止程序,用户可将此值置TRUE来处理错误。 int ERNUM 最后一次发生的错误的值。 char IOBUFF[] I/O缓冲区。
int NTRY isprime进行概率素数测试(probabalistic primality test)时迭代的次数,初始为6。 int *PRIMES 指向小素数表的指针。
BOOL RPOINT 置TRUE时数字使用小数形式输出,否则使用分数形式输出(默认)。 BOOL TRACER 置为ON时输出调试信息,默认为OFF。
第十一章 硬件/编译器接口
硬件/编译器细节通过mirdef.h向MIRACL指定。
移植到新的硬件环境中时必须编辑此文件,mrmuldv.any中一些时间关键的例程的汇编版本也要重新生成,不过大多数情况下C版本的mrmuldv.ccc可以直接拷贝到mrmuldv.c中。
可以的话最好使用交互式的config.c程序自动生成的mirdef.h文件。