// test: for use with test.sh, i.e. make test, or directly: java gen | ./main // // input data sections contain: // // u, v, u*v, 2*u*v, u^v, v^u, u^-1, v^-1, (u+v)^2, (u-v)^2, (v-u)^2, (u+v)*(u-v) // #include #include #include #include "impl.h" #define SIZE 66 // 256-bit hex strings have length 64 + '\n' + '\0' int main( void) { char ustr[SIZE], vstr[SIZE], astr[SIZE], msg[100]; int count = 0; C u, v, r, r1, r2, a; E e; printf( "CONSTANT_TIME = %i\n", CONSTANT_TIME); while( fgets( ustr, SIZE, stdin) && fgets( vstr, SIZE, stdin) ) { ++count; convert( u, ustr); print( "u", u, N); convert( v, vstr); print( "v", v, N); for( int i = 1; i < 11; ++i) { switch(i) { case 1: mul( r, u, v); adjust( r); break; case 2: mul2( r, u, v); adjust( r); break; case 3: CtoE( e, v); modPow( r, u, e); adjust( r); break; case 4: CtoE( e, u); modPow( r, v, e); adjust( r); break; case 5: modInverse( r, u); adjust( r); break; case 6: modInverse( r, v); adjust( r); break; case 7: add( r, u, v); if( debug) print( "u+v", r, N); sqr( r, r); adjust( r); break; case 8: sub( r, u, v); if( debug) print( "u-v", r, N); sqr( r, r); adjust( r); break; case 9: sub( r, v, u); if( debug) print( "v-u", r, N); sqr( r, r); adjust( r); break; case 10: add( r1, u, v); if( debug) print( "u+v", r1, N); sub( r2, u, v); if( debug) print( "u-v", r2, N); mul( r, r1, r2); adjust( r); break; } sprintf( msg, "case %i test%i", count, i); print( msg, r, N); if( !fgets( astr, SIZE, stdin)) abort(); // expected answer convert( a, astr); if( memcmp( r, a, sizeof(r)) == 0) printf( "%s passed\n", msg); else { printf( "%s failed\n", msg); print( msg, a, N); } } } return 0; }