Example #1
0
/* 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);
}
Example #2
0
/* 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);
}
Example #3
0
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);
}
Example #4
0
/* 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);
}