blob: 584730036e579cc91b5e5c880004651d6f333054 [file] [log] [blame]
/**
* @file test_ecp8_arithmetics_ZZZ.c
* @author Alessandro Budroni
* @brief Test for aritmetics with ECP8_ZZZ
*
* LICENSE
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arch.h"
#include "amcl.h"
#include "utils.h"
#include "ecp8_ZZZ.h"
#define LINE_LEN 3000
void read_BIG_XXX(BIG_XXX A, char* string, int len)
{
char bin[MODBYTES_XXX];
amcl_hex2bin(string,bin,len);
BIG_XXX_fromBytes(A,bin);
}
void read_FP2_ZZZ(FP2_YYY *fp2, char* str)
{
BIG_XXX X,Y;
read_BIG_XXX(X,str,2*MODBYTES_XXX);
read_BIG_XXX(Y,str+2*MODBYTES_XXX,2*MODBYTES_XXX);
FP2_YYY_from_BIGs(fp2,X,Y);
}
int read_ECP8_ZZZ(ECP8_ZZZ *ecp8, char* str)
{
char octstr[16*MODBYTES_XXX];
octet OCTstr = {sizeof(octstr),sizeof(octstr),octstr};
amcl_hex2bin(str,OCTstr.val,strlen(str));
return ECP8_ZZZ_fromOctet(ecp8,&OCTstr);
}
int main(int argc, char** argv)
{
if (argc != 2)
{
printf("usage: ./test_ecp8_arithmetics_ZZZ [path to test vector file]\n");
exit(EXIT_FAILURE);
}
int i=0, k, len=0;
char line[LINE_LEN];
char * linePtr = NULL;
ECP8_ZZZ ECP8aux1, ECP8aux2, inf;
FP8_YYY FP8aux1,FP8aux2;
char oct[LINE_LEN];
octet OCTaux= {0,sizeof(oct),oct};
ECP8_ZZZ ecp81, ecp8frobs[16];
const char* ECP81line = "ECP81 = ";
ECP8_ZZZ ecp82;
const char* ECP82line = "ECP82 = ";
ECP8_ZZZ ecp8sum;
const char* ECP8sumline = "ECP8sum = ";
ECP8_ZZZ ecp8neg;
const char* ECP8negline = "ECP8neg = ";
ECP8_ZZZ ecp8sub;
const char* ECP8subline = "ECP8sub = ";
ECP8_ZZZ ecp8dbl;
const char* ECP8dblline = "ECP8dbl = ";
BIG_XXX BIGscalar[16];
const char* BIGscalarlines[16] =
{
"BIGscalar1 = ",
"BIGscalar2 = ",
"BIGscalar3 = ",
"BIGscalar4 = ",
"BIGscalar5 = ",
"BIGscalar6 = ",
"BIGscalar7 = ",
"BIGscalar8 = ",
"BIGscalar9 = ",
"BIGscalar10 = ",
"BIGscalar11 = ",
"BIGscalar12 = ",
"BIGscalar13 = ",
"BIGscalar14 = ",
"BIGscalar15 = ",
"BIGscalar16 = ",
};
ECP8_ZZZ ecp8mul;
const char* ECP8mulline = "ECP8mul = ";
FP2_YYY fp2fr;
const char* FP2frline[3] =
{
"FP2fr1 = ",
"FP2fr2 = ",
"FP2fr3 = "
};
ECP8_ZZZ ecp8frob;
const char* ECP8frobline = "ECP8frob = ";
ECP8_ZZZ ecp8mul16;
const char* ECP8mul16line = "ECP8mul16 = ";
ECP8_ZZZ ecp8wrong;
const char* ECP8wrongline = "ECP8wrong = ";
ECP8_ZZZ ecp8inf;
const char* ECP8infline = "ECP8inf = ";
ECP8_ZZZ ecp8set1;
const char* ECP8set1line = "ECP8set1 = ";
ECP8_ZZZ ecp8set2;
const char* ECP8set2line = "ECP8set2 = ";
FP2_YYY F[3];
ECP8_ZZZ_frob_constants(F);
ECP8_ZZZ_inf(&inf);
if(!ECP8_ZZZ_isinf(&inf))
{
printf("ERROR setting ECP8_ZZZ to infinity\n");
exit(EXIT_FAILURE);
}
FILE *fp;
fp = fopen(argv[1],"r");
if (fp == NULL)
{
printf("ERROR opening test vector file\n");
exit(EXIT_FAILURE);
}
while (fgets(line, LINE_LEN, fp) != NULL)
{
i++;
if (!strncmp(line, ECP81line, strlen(ECP81line)))
{
len = strlen(ECP81line);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp81,linePtr) || ECP8_ZZZ_isinf(&ecp81))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_get(&FP8aux1,&FP8aux2,&ecp81);
FP8_YYY_sqr(&FP8aux2,&FP8aux2);
ECP8_ZZZ_rhs(&FP8aux1,&FP8aux1);
if (!FP8_YYY_equals(&FP8aux1,&FP8aux2))
{
printf("ERROR computing right hand side of equation ECP, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_toOctet(&OCTaux,&ecp81);
ECP8_ZZZ_fromOctet(&ECP8aux1,&OCTaux);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp81))
{
printf("ERROR converting ECP8_ZZZ to/from OCTET, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(ecp8frobs,&ecp81);
for(k=1; k<16; k++)
{
ECP8_ZZZ_copy(ecp8frobs+k,ecp8frobs+k-1);
ECP8_ZZZ_frob(ecp8frobs+k,F,1);
}
}
if (!strncmp(line, ECP82line, strlen(ECP82line)))
{
len = strlen(ECP82line);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp82,linePtr) || ECP8_ZZZ_isinf(&ecp82))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8sumline, strlen(ECP8sumline)))
{
len = strlen(ECP8sumline);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8sum,linePtr))
{
printf("ERROR reading test vector input ECP8_ZZZs, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_add(&ECP8aux1,&ecp82);
ECP8_ZZZ_reduce(&ECP8aux1);
ECP8_ZZZ_affine(&ECP8aux1);
ECP8_ZZZ_copy(&ECP8aux2,&ecp82); // testing commutativity P+Q = Q+P
ECP8_ZZZ_add(&ECP8aux2,&ecp81);
ECP8_ZZZ_reduce(&ECP8aux1);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8sum) || !ECP8_ZZZ_equals(&ECP8aux2,&ecp8sum))
{
printf("ERROR adding two ECP8_ZZZs, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81); // testing associativity (P+Q)+R = P+(Q+R)
ECP8_ZZZ_add(&ECP8aux1,&ecp82);
ECP8_ZZZ_add(&ECP8aux1,ecp8frobs+2);
ECP8_ZZZ_affine(&ECP8aux1);
ECP8_ZZZ_copy(&ECP8aux2,ecp8frobs+2);
ECP8_ZZZ_add(&ECP8aux2,&ecp82);
ECP8_ZZZ_add(&ECP8aux2,&ecp81);
ECP8_ZZZ_affine(&ECP8aux2);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ECP8aux2))
{
printf("ERROR testing associativity bewtween three ECP8_ZZZs, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8negline, strlen(ECP8negline)))
{
len = strlen(ECP8negline);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8neg,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_neg(&ECP8aux1);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8neg))
{
printf("ERROR computing negative of ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8subline, strlen(ECP8subline)))
{
len = strlen(ECP8subline);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8sub,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_sub(&ECP8aux1,&ecp82);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8sub))
{
printf("ERROR performing subtraction bewtween two ECP8_ZZZs, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8dblline, strlen(ECP8dblline)))
{
len = strlen(ECP8dblline);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8dbl,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_dbl(&ECP8aux1);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8dbl))
{
printf("ERROR computing double of ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
}
for(k=0; k<16; k++)
{
if (!strncmp(line, BIGscalarlines[k], strlen(BIGscalarlines[k])))
{
len = strlen(BIGscalarlines[k]);
linePtr = line + len;
read_BIG_XXX(BIGscalar[k],linePtr,strlen(linePtr));
}
}
if (!strncmp(line, ECP8mulline, strlen(ECP8mulline)))
{
len = strlen(ECP8mulline);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8mul,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_mul(&ECP8aux1,BIGscalar[0]);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8mul))
{
printf("ERROR computing multiplication of ECP8_ZZZ by a scalar, line %d\n",i);
exit(EXIT_FAILURE);
}
}
for (k=0; k<3; k++)
{
if(!strncmp(line, FP2frline[k], strlen(FP2frline[k])))
{
len = strlen(FP2frline[k]);
linePtr = line+len;
read_FP2_ZZZ(&fp2fr,linePtr);
if(!FP2_YYY_equals(&fp2fr,F+k))
{
printf("ERROR computing %d-th frobenius constant, line %d\n",k+1,i);
exit(EXIT_FAILURE);
}
}
}
if(!strncmp(line, ECP8frobline, strlen(ECP8frobline)))
{
len = strlen(ECP8frobline);
linePtr = line+len;
read_ECP8_ZZZ(&ecp8frob,linePtr);
ECP8_ZZZ_copy(&ECP8aux1,&ecp81);
ECP8_ZZZ_frob(&ECP8aux1,F,3);
if(!ECP8_ZZZ_equals(&ecp8frob,&ECP8aux1))
{
printf("ERROR computing frobenius action (P^3), line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8mul16line, strlen(ECP8mul16line)))
{
len = strlen(ECP8mul16line);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8mul16,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_mul16(&ECP8aux1,ecp8frobs,BIGscalar);
ECP8_ZZZ_affine(&ECP8aux1);
if(!ECP8_ZZZ_equals(&ECP8aux1,&ecp8mul16))
{
printf("ERROR computing linear combination of 8 ECP8_ZZZs, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8wrongline, strlen(ECP8wrongline)))
{
len = strlen(ECP8wrongline);
linePtr = line + len;
if(read_ECP8_ZZZ(&ecp8wrong,linePtr) || !ECP8_ZZZ_isinf(&ecp8wrong) || !ECP8_ZZZ_equals(&ecp8wrong,&inf))
{
printf("ERROR identifying a wrong ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8infline, strlen(ECP8infline)))
{
len = strlen(ECP8infline);
linePtr = line + len;
if(read_ECP8_ZZZ(&ecp8inf,linePtr) || !ECP8_ZZZ_isinf(&ecp8inf) || !ECP8_ZZZ_equals(&ecp8inf,&inf))
{
printf("ERROR identifying infinite point ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
}
if (!strncmp(line, ECP8set1line, strlen(ECP8set1line)))
{
len = strlen(ECP8set1line);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8set1,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
ECP8_ZZZ_get(&FP8aux1,&FP8aux2,&ecp81);
ECP8_ZZZ_setx(&ECP8aux1,&FP8aux1);
}
if (!strncmp(line, ECP8set2line, strlen(ECP8set2line)))
{
len = strlen(ECP8set2line);
linePtr = line + len;
if(!read_ECP8_ZZZ(&ecp8set2,linePtr))
{
printf("ERROR getting test vector input ECP8_ZZZ, line %d\n",i);
exit(EXIT_FAILURE);
}
if((!ECP8_ZZZ_equals(&ECP8aux1,&ecp8set2)) && (!ECP8_ZZZ_equals(&ECP8aux1,&ecp8set1)))
{
printf("ERROR computing ECP8_ZZZ from coordinate x and with y set2, line %d\n",i);
exit(EXIT_FAILURE);
}
}
}
fclose(fp);
printf("SUCCESS TEST ARITMETIC OF ECP8_ZZZ PASSED\n");
exit(EXIT_SUCCESS);
}