blob: 378f015c6ea83e15abac4c79773826e9b575651c [file] [log] [blame]
/**
* @file test_output_functions.c
* @author Alessandro Budroni
* @brief Test output functions for debug
*
* 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 <string.h>
#include <stdlib.h>
#include "arch.h"
#include "amcl.h"
#include "utils.h"
#include "big_XXX.h"
#include "fp_YYY.h"
#include "fp2_YYY.h"
#include "fp4_YYY.h"
#include "ecp_ZZZ.h"
#if CURVE_SECURITY_ZZZ == 128
#include "fp12_YYY.h"
#include "ecp2_ZZZ.h"
#elif CURVE_SECURITY_ZZZ == 192
#include "fp8_YYY.h"
#include "fp24_YYY.h"
#include "ecp4_ZZZ.h"
#elif CURVE_SECURITY_ZZZ == 256
#include "fp8_YYY.h"
#include "fp16_YYY.h"
#include "fp48_YYY.h"
#include "ecp8_ZZZ.h"
#endif
extern int dup(int oldfd);
extern int dup2(int oldfd, int newfd);
extern int close(int fildes);
extern int fileno(FILE *stream);
#if CURVE_SECURITY_ZZZ == 128
#define LINE_LEN 2000
#elif CURVE_SECURITY_ZZZ == 192
#define LINE_LEN 4000
#elif CURVE_SECURITY_ZZZ == 256
#define LINE_LEN 8000
#endif
/*
* Skips n closed brackets.
* Null terminates after the nth bracket and
* returns a pointer to the next char
*/
char* skip_cb(char* str, int n)
{
int i;
char* next=str;
for(i=0; i<n; i++)
{
next = strchr(++next,']');
if (next == NULL)
{
printf("ERROR unexpected test vector\n");
exit(EXIT_FAILURE);
}
}
*(++next) = '\0';
return next++;
}
void read_BIG_XXX(BIG_XXX A, char* string)
{
int len;
char support[LINE_LEN];
BIG_XXX_zero(A);
len = strlen(string)+1;
amcl_hex2bin(string,support,len);
len = (len-1)/2;
BIG_XXX_fromBytesLen(A,support,len);
BIG_XXX_norm(A);
}
void read_DBIG_XXX(DBIG_XXX A, char* string)
{
int len;
char support[LINE_LEN] = "0";
BIG_XXX_dzero(A);
// replace eventual line feed
len=strlen(string);
if(string[len-1] == '\x0a')
{
string[len-1]='\0';
len--;
}
// Handle odd length strings
if(len %2 == 0)
support[0]='\0';
strcat(support,string);
len = strlen(support);
amcl_hex2bin(support,support,len);
BIG_XXX_dfromBytesLen(A,support,len/2);
BIG_XXX_dnorm(A);
}
void read_FP2_YYY(FP2_YYY *fp2, char* stringx)
{
char *stringy;
BIG_XXX x,y;
stringy = strchr(++stringx,',');
if (stringy == NULL)
{
printf("ERROR unexpected test vector\n");
exit(EXIT_FAILURE);
}
*(stringy)=0;
skip_cb(stringy++,1);
read_BIG_XXX(x,stringx);
read_BIG_XXX(y,stringy);
FP2_YYY_from_BIGs(fp2,x,y);
}
void read_FP4_YYY(FP4_YYY *fp4, char* stringx)
{
char *stringy;
FP2_YYY x,y;
stringy = skip_cb(stringx++,1);
skip_cb(stringy++,1);
read_FP2_YYY(&x,stringx);
read_FP2_YYY(&y,stringy);
FP4_YYY_from_FP2s(fp4,&x,&y);
}
int read_ECP_ZZZ(ECP_ZZZ *ecp, char* string)
{
BIG_XXX x;
char *end;
BIG_XXX y;
char *stringy;
string++;
stringy = strchr(string,',');
if (stringy == NULL)
{
printf("ERROR unexpected test vector\n");
exit(EXIT_FAILURE);
}
stringy[0] = '\0';
stringy++;
end = strchr(stringy,')');
if (end == NULL)
{
printf("ERROR unexpected test vector\n");
exit(EXIT_FAILURE);
}
end[0] = '\0';
read_BIG_XXX(x,string);
read_BIG_XXX(y,stringy);
return ECP_ZZZ_set(ecp,x,y);
}
#if CURVE_SECURITY_ZZZ == 128
void read_FP12_YYY(FP12_YYY *fp12, char *stringx)
{
char *stringy, *stringz;
FP4_YYY x,y,z;
stringy = skip_cb(stringx++,3);
stringz = skip_cb(stringy++,3);
skip_cb(stringz++,3);
read_FP4_YYY(&x,stringx);
read_FP4_YYY(&y,stringy);
read_FP4_YYY(&z,stringz);
FP12_YYY_from_FP4s(fp12,&x,&y,&z);
}
int read_ECP2_ZZZ(ECP2_ZZZ *ecp2, char* stringx)
{
char *stringy;
FP2_YYY x,y;
stringy = skip_cb(stringx++,1);
skip_cb(stringy++,1);
read_FP2_YYY(&x,stringx);
read_FP2_YYY(&y,stringy);
return ECP2_ZZZ_set(ecp2,&x,&y);
}
#else
void read_FP8_YYY(FP8_YYY *fp8, char* stringx)
{
char *stringy;
FP4_YYY x,y;
stringy = skip_cb(stringx++,3);
skip_cb(stringy++,3);
read_FP4_YYY(&x,stringx);
read_FP4_YYY(&y,stringy);
FP8_YYY_from_FP4s(fp8,&x,&y);
}
#if CURVE_SECURITY_ZZZ == 192
void read_FP24_YYY(FP24_YYY *fp24, char *stringx)
{
char *stringy, *stringz;
FP8_YYY x,y,z;
stringy = skip_cb(stringx++,7);
stringz = skip_cb(stringy++,7);
skip_cb(stringz++,7);
read_FP8_YYY(&x,stringx);
read_FP8_YYY(&y,stringy);
read_FP8_YYY(&z,stringz);
FP24_YYY_from_FP8s(fp24,&x,&y,&z);
}
int read_ECP4_ZZZ(ECP4_ZZZ *ecp4, char* stringx)
{
char *stringy;
FP4_YYY x,y;
stringy = skip_cb(stringx++,3);
skip_cb(stringy++,3);
read_FP4_YYY(&x,stringx);
read_FP4_YYY(&y,stringy);
return ECP4_ZZZ_set(ecp4,&x,&y);
}
#elif CURVE_SECURITY_ZZZ == 256
void read_FP16_YYY(FP16_YYY *fp16, char* stringx)
{
char *stringy;
FP8_YYY x,y;
stringy = skip_cb(stringx++,7);
skip_cb(stringy++,7);
read_FP8_YYY(&x,stringx);
read_FP8_YYY(&y,stringy);
FP16_YYY_from_FP8s(fp16,&x,&y);
}
void read_FP48_YYY(FP48_YYY *fp48, char *stringx)
{
char *stringy, *stringz;
FP16_YYY x,y,z;
stringy = skip_cb(stringx++,15);
stringz = skip_cb(stringy++,15);
skip_cb(stringz++,15);
read_FP16_YYY(&x,stringx);
read_FP16_YYY(&y,stringy);
read_FP16_YYY(&z,stringz);
FP48_YYY_from_FP16s(fp48,&x,&y,&z);
}
int read_ECP8_ZZZ(ECP8_ZZZ *ecp8, char* stringx)
{
char *stringy;
FP8_YYY x,y;
stringy = skip_cb(stringx++,7);
skip_cb(stringy++,7);
read_FP8_YYY(&x,stringx);
read_FP8_YYY(&y,stringy);
return ECP8_ZZZ_set(ecp8,&x,&y);
}
#endif
#endif
void read_OCT(octet *oct, char* string, int len)
{
char buff[len-1];
strncpy(buff,string,len-1);
buff[len-1] = '\0';
OCT_fromHex(oct,buff);
}
int main(int argc, char** argv)
{
if (argc != 3)
{
printf("usage: ./test_ECP2_ZZZ_arithmetics [path to test vector file] [path to output directory]\n");
exit(EXIT_FAILURE);
}
int fd, len, ch1 = 0, ch2 = 0, i=0, done;
fpos_t pos;
FILE *testVectFile, *writtenFile;
char line[LINE_LEN];
char * linePtr = NULL;
BIG_XXX big, bigaux1, bigaux2;
const char* BIGline = "BIG = ";
const char* BIGrawline = "BIGraw = ";
DBIG_XXX dbig;
const char* DBIGline = "DBIG = ";
FP_YYY fp;
const char* FPline = "FP = ";
const char* FPrawline = "FPraw = ";
ECP_ZZZ ecp;
ECP_ZZZ ecpinf;
const char* ECPline = "ECP = ";
const char* ECPxyzline = "ECPxyz = ";
const char* ECPrawline = "ECPraw = ";
const char* ECPinfline = "ECPinf = ";
const char* ECPinfxyzline = "ECPinfxyz = ";
const char* ECPinfrawline = "ECPinfraw = ";
FP2_YYY fp2;
const char* FP2line = "FP2 = ";
const char* FP2rawline = "FP2raw = ";
FP4_YYY fp4;
const char* FP4line = "FP4 = ";
const char* FP4rawline = "FP4raw = ";
# if CURVE_SECURITY_ZZZ == 128
FP12_YYY fp12;
const char* FP12line = "FP12 = ";
FP2_YYY fp2aux;
ECP2_ZZZ ecp2;
ECP2_ZZZ ecp2inf;
const char* ECP2line = "ECP2 = ";
const char* ECP2xyzline = "ECP2xyz = ";
const char* ECP2infline = "ECP2inf = ";
const char* ECP2infxyzline = "ECP2infxyz = ";
#else
FP8_YYY fp8;
const char* FP8line = "FP8 = ";
const char* FP8rawline = "FP8raw = ";
#if CURVE_SECURITY_ZZZ == 192
FP24_YYY fp24;
const char* FP24line = "FP24 = ";
FP4_YYY fp4aux;
ECP4_ZZZ ecp4;
ECP4_ZZZ ecp4inf;
const char* ECP4line = "ECP4 = ";
const char* ECP4infline = "ECP4inf = ";
#elif CURVE_SECURITY_ZZZ == 256
FP16_YYY fp16;
const char* FP16line = "FP16 = ";
const char* FP16rawline = "FP16raw = ";
FP48_YYY fp48;
const char* FP48line = "FP48 = ";
FP8_YYY fp8aux;
ECP8_ZZZ ecp8;
ECP8_ZZZ ecp8inf;
const char* ECP8line = "ECP8 = ";
const char* ECP8infline = "ECP8inf = ";
#endif
#endif
char octbuf[LINE_LEN];
octet oct = {0,sizeof(octbuf),octbuf};
const char* OCTline = "OCT = ";
//const char* OCTstringline = "OCTstring = ";
char bin[32];
const char* HEXline = "HEX = ";
testVectFile = fopen(argv[1],"r");
if (testVectFile == NULL)
{
printf("ERROR opening test vector file\n");
exit(EXIT_FAILURE);
}
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
if(freopen(argv[2], "w", stdout) == NULL)
{
printf("ERROR redirecting stdout\n");
exit(EXIT_FAILURE);
}
while (fgets(line, LINE_LEN, testVectFile) != NULL)
{
i++;
done=0;
if (!strncmp(line, BIGline, strlen(BIGline)))
{
len = strlen(BIGline);
linePtr = line + len;
read_BIG_XXX(big, linePtr);
printf("%s",BIGline);
BIG_XXX_output(big);
printf("\n");
printf("%s",BIGrawline);
BIG_XXX_rawoutput(big);
printf("\n");
done = 1;
}
if (!strncmp(line, DBIGline, strlen(DBIGline)))
{
len = strlen(DBIGline);
linePtr = line + len;
read_DBIG_XXX(dbig, linePtr);
printf("%s",DBIGline);
BIG_XXX_doutput(dbig);
printf("\n");
done = 1;
}
if (!strncmp(line, FPline, strlen(FPline)))
{
len = strlen(FPline);
linePtr = line + len;
read_BIG_XXX(big,linePtr);
FP_YYY_nres(&fp,big);
printf("%s",FPline);
FP_YYY_output(&fp);
printf("\n");
printf("%s",FPrawline);
FP_YYY_rawoutput(&fp);
printf("\n");
done = 1;
}
if (!strncmp(line, FP2line, strlen(FP2line)))
{
len = strlen(FP2line);
linePtr = line + len;
read_FP2_YYY(&fp2,linePtr);
printf("%s",FP2line);
FP2_YYY_output(&fp2);
printf("\n");
printf("%s",FP2rawline);
FP2_YYY_rawoutput(&fp2);
printf("\n");
done = 1;
}
if (!strncmp(line, FP4line, strlen(FP4line)))
{
len = strlen(FP4line);
linePtr = line + len;
read_FP4_YYY(&fp4,linePtr);
printf("%s",FP4line);
FP4_YYY_output(&fp4);
printf("\n");
printf("%s",FP4rawline);
FP4_YYY_rawoutput(&fp4);
printf("\n");
done = 1;
}
if (!strncmp(line, ECPline, strlen(ECPline)))
{
len = strlen(ECPline);
linePtr = line + len;
read_ECP_ZZZ(&ecp,linePtr);
printf("%s",ECPline);
ECP_ZZZ_output(&ecp);
printf("%s",ECPxyzline);
ECP_ZZZ_outputxyz(&ecp);
printf("%s",ECPrawline);
ECP_ZZZ_rawoutput(&ecp);
FP_YYY_redc(bigaux1,&ecp.x);
FP_YYY_redc(bigaux2,&ecp.y);
BIG_XXX_inc(bigaux1,100);
ECP_ZZZ_set(&ecpinf,bigaux1,bigaux2);
printf("%s",ECPinfline);
ECP_ZZZ_output(&ecpinf);
printf("%s",ECPinfxyzline);
ECP_ZZZ_outputxyz(&ecpinf);
printf("%s",ECPinfrawline);
ECP_ZZZ_rawoutput(&ecpinf);
done = 1;
}
#if CURVE_SECURITY_ZZZ == 128
if (!strncmp(line, FP12line, strlen(FP12line)))
{
len = strlen(FP12line);
linePtr = line + len;
read_FP12_YYY(&fp12,linePtr);
printf("%s",FP12line);
FP12_YYY_output(&fp12);
printf("\n");
done = 1;
}
if (!strncmp(line, ECP2line, strlen(ECP2line)))
{
len = strlen(ECP2line);
linePtr = line + len;
read_ECP2_ZZZ(&ecp2,linePtr);
printf("%s",ECP2line);
ECP2_ZZZ_output(&ecp2);
printf("%s",ECP2xyzline);
ECP2_ZZZ_outputxyz(&ecp2);
FP2_YYY_add(&fp2aux,&ecp2.x,&ecp2.y);
ECP2_ZZZ_set(&ecp2inf,&fp2aux,&fp2aux);
printf("%s",ECP2infline);
ECP2_ZZZ_output(&ecp2inf);
printf("%s",ECP2infxyzline);
ECP2_ZZZ_outputxyz(&ecp2inf);
done = 1;
}
#else
if (!strncmp(line, FP8line, strlen(FP8line)))
{
len = strlen(FP8line);
linePtr = line + len;
read_FP8_YYY(&fp8,linePtr);
printf("%s",FP8line);
FP8_YYY_output(&fp8);
printf("\n");
printf("%s",FP8rawline);
FP8_YYY_rawoutput(&fp8);
printf("\n");
done = 1;
}
#if CURVE_SECURITY_ZZZ == 192
if (!strncmp(line, FP24line, strlen(FP24line)))
{
len = strlen(FP24line);
linePtr = line + len;
read_FP24_YYY(&fp24,linePtr);
printf("%s",FP24line);
FP24_YYY_output(&fp24);
printf("\n");
done = 1;
}
if (!strncmp(line, ECP4line, strlen(ECP4line)))
{
len = strlen(ECP4line);
linePtr = line + len;
read_ECP4_ZZZ(&ecp4,linePtr);
printf("%s",ECP4line);
ECP4_ZZZ_output(&ecp4);
FP4_YYY_add(&fp4aux,&ecp4.x,&ecp4.y);
ECP4_ZZZ_set(&ecp4inf,&fp4aux,&fp4aux);
printf("%s",ECP4infline);
ECP4_ZZZ_output(&ecp4inf);
done = 1;
}
#elif CURVE_SECURITY_ZZZ == 256
if (!strncmp(line, FP16line, strlen(FP16line)))
{
len = strlen(FP16line);
linePtr = line + len;
read_FP16_YYY(&fp16,linePtr);
printf("%s",FP16line);
FP16_YYY_output(&fp16);
printf("\n");
printf("%s",FP16rawline);
FP16_YYY_rawoutput(&fp16);
printf("\n");
done = 1;
}
if (!strncmp(line, FP48line, strlen(FP48line)))
{
len = strlen(FP48line);
linePtr = line + len;
read_FP48_YYY(&fp48,linePtr);
printf("%s",FP48line);
FP48_YYY_output(&fp48);
printf("\n");
done = 1;
}
if (!strncmp(line, ECP8line, strlen(ECP8line)))
{
len = strlen(ECP8line);
linePtr = line + len;
read_ECP8_ZZZ(&ecp8,linePtr);
printf("%s",ECP8line);
ECP8_ZZZ_output(&ecp8);
FP8_YYY_add(&fp8aux,&ecp8.x,&ecp8.y);
ECP8_ZZZ_set(&ecp8inf,&fp8aux,&fp8aux);
printf("%s",ECP8infline);
ECP8_ZZZ_output(&ecp8inf);
done = 1;
}
#endif
#endif
if (!strncmp(line, OCTline, strlen(OCTline)))
{
len = strlen(OCTline);
linePtr = line + len;
read_OCT(&oct,linePtr,strlen(linePtr));
printf("%s",OCTline);
OCT_output(&oct);
done = 1;
}
if (!strncmp(line, HEXline, strlen(HEXline)))
{
len = strlen(HEXline);
linePtr = line + len;
amcl_hex2bin(linePtr, bin, 64);
printf("%s", HEXline);
amcl_print_hex(bin,32);
done = 1;
}
if (!strncmp(line, BIGrawline, strlen(BIGrawline))||
!strncmp(line, FPrawline, strlen(FPrawline))||
!strncmp(line, ECPxyzline, strlen(ECPxyzline))||
!strncmp(line, ECPrawline, strlen(ECPrawline))||
!strncmp(line, ECPinfline, strlen(ECPinfline))||
!strncmp(line, ECPinfxyzline, strlen(ECPinfxyzline))||
!strncmp(line, ECPinfrawline, strlen(ECPinfrawline))||
!strncmp(line, FP2rawline, strlen(FP2rawline))||
!strncmp(line, FP4rawline, strlen(FP4rawline)))
done=1;
#if CURVE_SECURITY_ZZZ == 128
if (!strncmp(line, ECP2xyzline, strlen(ECP2xyzline))||
!strncmp(line, ECP2infline, strlen(ECP2infline))||
!strncmp(line, ECP2infxyzline, strlen(ECP2infxyzline)))
done=1;
#elif CURVE_SECURITY_ZZZ == 192
if (!strncmp(line, FP8rawline, strlen(FP8rawline))||
!strncmp(line, ECP4infline, strlen(ECP4infline)))
done=1;
#elif CURVE_SECURITY_ZZZ == 256
if (!strncmp(line, FP8rawline, strlen(FP8rawline))||
!strncmp(line, FP16rawline, strlen(FP16rawline))||
!strncmp(line, ECP8infline, strlen(ECP8infline)))
done=1;
#endif
if(!done)
printf("%s",line);
}
// Restore stdout
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos); /* for C9X */
writtenFile = fopen(argv[2],"r");
if (writtenFile == NULL)
{
printf("ERROR opening output file\n");
exit(EXIT_FAILURE);
}
fclose(testVectFile);
// Check the equality of the output with the test vector file
testVectFile = fopen(argv[1],"r");
if (testVectFile == NULL)
{
printf("ERROR opening test vector file\n");
exit(EXIT_FAILURE);
}
ch1 = getc(testVectFile);
ch2 = getc(writtenFile);
while ((ch1 != EOF) && (ch2 != EOF) && (ch1 == ch2))
{
ch1 = getc(testVectFile);
ch2 = getc(writtenFile);
}
if (ch1 != ch2)
{
printf("ERROR output does not match the expected one \n");
exit(EXIT_FAILURE);
}
fclose(writtenFile);
fclose(testVectFile);
remove(argv[2]);
printf("SUCCESS TEST OUTPUT FUNCTIONS PASSED\n");
exit(EXIT_SUCCESS);
}