/* map octet string to point on curve */ static void mapit(octet *h,ECP *P) { BIG q,px; BIG_fromBytes(px,h->val); BIG_rcopy(q,Modulus); BIG_mod(px,q); while (!ECP_setx(P,px,0)) BIG_inc(px,1); }
/* needed for SOK */ static void mapit2(octet *h,ECP2 *Q) { BIG q,one,Fx,Fy,x,hv; FP2 X; ECP2 T,K; BIG_fromBytes(hv,h->val); BIG_rcopy(q,Modulus); BIG_one(one); BIG_mod(hv,q); for (;;) { FP2_from_BIGs(&X,one,hv); if (ECP2_setx(Q,&X)) break; BIG_inc(hv,1); } /* Fast Hashing to G2 - Fuentes-Castaneda, Knapp and Rodriguez-Henriquez */ BIG_rcopy(Fx,CURVE_Fra); BIG_rcopy(Fy,CURVE_Frb); FP2_from_BIGs(&X,Fx,Fy); BIG_rcopy(x,CURVE_Bnx); ECP2_copy(&T,Q); ECP2_mul(&T,x); ECP2_neg(&T); /* our x is negative */ ECP2_copy(&K,&T); ECP2_dbl(&K); ECP2_add(&K,&T); ECP2_affine(&K); ECP2_frob(&K,&X); ECP2_frob(Q,&X); ECP2_frob(Q,&X); ECP2_frob(Q,&X); ECP2_add(Q,&T); ECP2_add(Q,&K); ECP2_frob(&T,&X); ECP2_frob(&T,&X); ECP2_add(Q,&T); ECP2_affine(Q); }
int test_ecdsa_keypair(int argc, char** argv) { if (argc != 2) { printf("usage: ./test_ecdsa_sign [path to test vector file]\n"); exit(EXIT_FAILURE); } int rc; FILE * fp = NULL; char line[LINE_LEN]; char * linePtr = NULL; int l1=0; int l2=0; char * d = NULL; const char* dStr = "d = "; octet dOct; char Qx[EGS]; const char* QxStr = "Qx = "; octet QxOct = {EGS,EGS,Qx}; char Qy[EGS]; const char* QyStr = "Qy = "; octet QyOct = {EGS,EGS,Qy}; char q2[2*EFS+1]; octet Q2Oct= {0,sizeof(q2),q2}; fp = fopen(argv[1], "r"); if (fp == NULL) { printf("ERROR opening test vector file\n"); exit(EXIT_FAILURE); } bool readLine = false; int i=0; while (fgets(line, LINE_LEN, fp) != NULL) { i++; readLine = true; if (!strncmp(line, dStr, strlen(dStr))) { #ifdef DEBUG printf("line %d %s\n", i,line); #endif // Find hex value in string linePtr = line + strlen(dStr); // Allocate memory l1 = strlen(linePtr)-1; l2 = l1/2; d = (char*) malloc (l2); if (d==NULL) exit(EXIT_FAILURE); // d binary value amcl_hex2bin(linePtr, d, l1); dOct.len=l2; dOct.max=l2; dOct.val=d; } if (!strncmp(line, QxStr, strlen(QxStr))) { #ifdef DEBUG printf("line %d %s\n", i,line); #endif // Find hex value in string linePtr = line + strlen(QxStr); // Allocate data l1 = strlen(linePtr)-1; // Qx binary value amcl_hex2bin(linePtr, Qx, l1); } if (!strncmp(line, QyStr, strlen(QyStr))) { #ifdef DEBUG printf("line %d %s\n", i,line); #endif // Find hex value in string linePtr = line + strlen(QyStr); // Allocate data l1 = strlen(linePtr)-1; // Qy binary value amcl_hex2bin(linePtr, Qy, l1); // Assign Public Key BIG qx, qy; char q[2*EFS+1]; BIG_fromBytes(qx,QxOct.val); BIG_fromBytes(qy,QyOct.val); octet QOct= {sizeof(q),sizeof(q),q}; QOct.val[0]=4; BIG_toBytes(&(QOct.val[1]),qx); BIG_toBytes(&(QOct.val[EFS+1]),qy); // Generate Key pair ECP_KEY_PAIR_GENERATE(NULL,&dOct,&Q2Oct); #ifdef DEBUG printf("QOct: "); OCT_output(&QOct); printf("\r\n"); printf("Q2Oct: "); OCT_output(&Q2Oct); printf("\r\n"); #endif rc = OCT_comp(&QOct,&Q2Oct); if (!rc) { printf("TEST ECDSA KEYPAIR FAILED LINE %d\n",i); exit(EXIT_FAILURE); } free(d); d = NULL; } } fclose(fp); if (!readLine) { printf("ERROR Empty test vector file\n"); exit(EXIT_FAILURE); } printf("SUCCESS TEST ECDSA KEYPAIR PASSED\n"); exit(EXIT_SUCCESS); }
/* Restore g from octet string w */ void FP12_fromOctet(FP12 *g,octet *W) { BIG_fromBytes((*g).a.a.a,&W->val[0]); FP_nres((*g).a.a.a); BIG_fromBytes((*g).a.a.b,&W->val[MODBYTES]); FP_nres((*g).a.a.b); BIG_fromBytes((*g).a.b.a,&W->val[2*MODBYTES]); FP_nres((*g).a.b.a); BIG_fromBytes((*g).a.b.b,&W->val[3*MODBYTES]); FP_nres((*g).a.b.b); BIG_fromBytes((*g).b.a.a,&W->val[4*MODBYTES]); FP_nres((*g).b.a.a); BIG_fromBytes((*g).b.a.b,&W->val[5*MODBYTES]); FP_nres((*g).b.a.b); BIG_fromBytes((*g).b.b.a,&W->val[6*MODBYTES]); FP_nres((*g).b.b.a); BIG_fromBytes((*g).b.b.b,&W->val[7*MODBYTES]); FP_nres((*g).b.b.b); BIG_fromBytes((*g).c.a.a,&W->val[8*MODBYTES]); FP_nres((*g).c.a.a); BIG_fromBytes((*g).c.a.b,&W->val[9*MODBYTES]); FP_nres((*g).c.a.b); BIG_fromBytes((*g).c.b.a,&W->val[10*MODBYTES]); FP_nres((*g).c.b.a); BIG_fromBytes((*g).c.b.b,&W->val[11*MODBYTES]); FP_nres((*g).c.b.b); }