/* FP12 full multiplication w=w*y */ void FP12_mul(FP12 *w,FP12 *y) { FP4 z0,z1,z2,z3,t0,t1; FP4_mul(&z0,&(w->a),&(y->a)); FP4_mul(&z2,&(w->b),&(y->b)); // FP4_add(&t0,&(w->a),&(w->b)); FP4_add(&t1,&(y->a),&(y->b)); // FP4_mul(&z1,&t0,&t1); FP4_add(&t0,&(w->b),&(w->c)); FP4_add(&t1,&(y->b),&(y->c)); // FP4_mul(&z3,&t0,&t1); FP4_neg(&t0,&z0); FP4_neg(&t1,&z2); FP4_add(&z1,&z1,&t0); // z1=z1-z0 #if CHUNK<64 FP4_norm(&z1); #endif FP4_add(&(w->b),&z1,&t1); // z1=z1-z2 FP4_add(&z3,&z3,&t1); // z3=z3-z2 FP4_add(&z2,&z2,&t0); // z2=z2-z0 FP4_add(&t0,&(w->a),&(w->c)); FP4_add(&t1,&(y->a),&(y->c)); FP4_mul(&t0,&t1,&t0); FP4_add(&z2,&z2,&t0); FP4_mul(&t0,&(w->c),&(y->c)); FP4_neg(&t1,&t0); #if CHUNK<64 FP4_norm(&z2); FP4_norm(&z3); FP4_norm(&(w->b)); #endif FP4_add(&(w->c),&z2,&t1); FP4_add(&z3,&z3,&t1); FP4_times_i(&t0); FP4_add(&(w->b),&(w->b),&t0); FP4_times_i(&z3); FP4_add(&(w->a),&z0,&z3); FP12_norm(w); }
/* SU= 160 */ void FP4_sub(FP4 *w,FP4 *x,FP4 *y) { FP4 my; FP4_neg(&my, y); FP4_add(w, x, &my); }
/* SU= 600 */ void FP12_sqr(FP12 *w,FP12 *x) { /* Use Chung-Hasan SQR2 method from http://cacr.uwaterloo.ca/techreports/2006/cacr2006-24.pdf */ FP4 A,B,C,D; FP4_sqr(&A,&(x->a)); FP4_mul(&B,&(x->b),&(x->c)); FP4_add(&B,&B,&B); FP4_sqr(&C,&(x->c)); FP4_mul(&D,&(x->a),&(x->b)); FP4_add(&D,&D,&D); FP4_add(&(w->c),&(x->a),&(x->c)); FP4_add(&(w->c),&(x->b),&(w->c)); FP4_sqr(&(w->c),&(w->c)); FP4_copy(&(w->a),&A); FP4_add(&A,&A,&B); #if CHUNK<64 FP4_norm(&A); #endif FP4_add(&A,&A,&C); FP4_add(&A,&A,&D); #if CHUNK<64 FP4_norm(&A); #endif FP4_neg(&A,&A); FP4_times_i(&B); FP4_times_i(&C); FP4_add(&(w->a),&(w->a),&B); FP4_add(&(w->b),&C,&D); FP4_add(&(w->c),&(w->c),&A); FP12_norm(w); }