#include "mpi.h" #include "mpi-internal.h" /* for BITS_PER_MPI_LIMB */ #include void err(char *msg) { fprintf(stderr, "%s\n", msg); exit(1); } void terpri(FILE *fp) { fprintf(fp, "\n"); } void print_results(MPI in, MPI out, char * title) { fprintf(stdout, "******** %s ********", title); terpri(stdout); fprintf(stdout, "input : "); mpi_print(stdout, in, 1); terpri(stdout); fprintf(stdout, "output: "); mpi_print(stdout, out, 1); terpri(stdout); terpri(stdout); fflush(stdout); } /* * Test that will fail on original code and will pass after EuCrypt fix is applied. */ void test_rshift() { MPI out, in, copy_in; out = mpi_alloc(0); in = mpi_alloc(0); copy_in = mpi_alloc(0); mpi_fromstr(out, "0x20E92FE28E1929"); /* some value */ mpi_fromstr(in, "0x2000000010000001000000002"); mpi_fromstr(copy_in, "0x2000000010000001000000002"); /* to make sure the actual input is print, since call can modify in */ /* print value of BITS_PER_MPI_LIMB */ fprintf(stdout, "BITS_PER_MPI_LIMB is %d\n", BITS_PER_MPI_LIMB); /* shift by 0 */ mpi_tdiv_q_2exp(out, in, 0); print_results(copy_in, out, "TEST: right shift by 0"); /* shift by multiple of BITS_PER_MPI_LIMB */ mpi_fromstr(in, "0x2000000010000001000000002"); mpi_tdiv_q_2exp(out, in, BITS_PER_MPI_LIMB); print_results(copy_in, out, "TEST: right shift by BITS_PER_MPI_LIMB"); /* shift by non-multiple of BITS_PER_MPI_LIMB */ mpi_fromstr(in, "0x2000000010000001000000002"); mpi_tdiv_q_2exp(out, in, BITS_PER_MPI_LIMB - 3); print_results(copy_in, out, "TEST: right shift by BITS_PER_MPI_LIMB - 3"); mpi_free(copy_in); mpi_free(out); mpi_free(in); } void test_highbit() { MPI in, set_out, clear_out; in = mpi_alloc(0); set_out = mpi_alloc(0); clear_out = mpi_alloc(0); mpi_fromstr(in, "0x2000000010000002000000004"); mpi_fromstr(set_out, "0x2000000010000002000000004"); mpi_fromstr(clear_out, "0x2000000010000002000000004"); mpi_set_highbit(set_out, 91); print_results(in, set_out, "TEST: mpi_set_highbit(in, 91)"); mpi_fromstr(set_out, "0x2000000010000002000000004"); mpi_set_highbit(set_out, 96); print_results(in, set_out, "TEST: mpi_set_highbit(in, 96)"); mpi_clear_highbit(clear_out, 96); print_results(in, clear_out, "TEST: mpi_clear_highbit(in, 96)"); mpi_fromstr(clear_out, "0x2000000010000002000000004"); mpi_clear_highbit(clear_out, 1); print_results(in, clear_out, "TEST: mpi_clear_highbit(in, 1)"); mpi_free(in); mpi_free(set_out); mpi_free(clear_out); } void test_get_nbits() { MPI m; int nbits; m = mpi_alloc(0); mpi_fromstr(m, "0x0"); nbits = mpi_get_nbits(m); print_results(m, m, "TEST: get_nbits"); fprintf(stdout, "nbits: %d\n", nbits); mpi_free(m); } int main(int ac, char **av) { MPI a, b, y; int r; test_rshift(); test_highbit(); test_get_nbits(); r = secmem_init(1000); if (r==0) err("secmem init"); a = mpi_alloc_secure(0); b = mpi_alloc_secure(0); y = mpi_alloc_secure(0); mpi_fromstr(a, "0x1B0B206C488601"); mpi_fromstr(b, "0x20E92FE28E1929"); mpi_mul(y, a, b); mpi_free(a); mpi_free(b); fprintf(stdout, "******** TEST: mpi_mul, see README ********"); terpri(stdout); mpi_print(stdout, y, 1); mpi_free(y); terpri(stdout); secmem_term(); return 0; }