raw
ch1_mpi                 1 #include "mpi.h"
eucrypt_mpi_fix_c... 2 #include "mpi-internal.h" /* for BITS_PER_MPI_LIMB */
ch1_mpi 3 #include <stdlib.h>
ch1_mpi 4
ch1_mpi 5 void err(char *msg)
ch1_mpi 6 {
ch1_mpi 7 fprintf(stderr, "%s\n", msg);
ch1_mpi 8 exit(1);
ch1_mpi 9 }
ch1_mpi 10
ch1_mpi 11 void terpri(FILE *fp)
ch1_mpi 12 {
ch1_mpi 13 fprintf(fp, "\n");
ch1_mpi 14 }
ch1_mpi 15
eucrypt_mpi_fix_c... 16 void print_results(MPI in, MPI out, char * title)
eucrypt_mpi_fix_c... 17 {
eucrypt_mpi_fix_c... 18 fprintf(stdout, "******** %s ********", title);
eucrypt_mpi_fix_c... 19 terpri(stdout);
eucrypt_mpi_fix_c... 20
eucrypt_mpi_fix_c... 21 fprintf(stdout, "input : ");
eucrypt_mpi_fix_c... 22 mpi_print(stdout, in, 1);
eucrypt_mpi_fix_c... 23 terpri(stdout);
eucrypt_mpi_fix_c... 24
eucrypt_mpi_fix_c... 25 fprintf(stdout, "output: ");
eucrypt_mpi_fix_c... 26 mpi_print(stdout, out, 1);
eucrypt_mpi_fix_c... 27 terpri(stdout);
eucrypt_mpi_fix_c... 28
eucrypt_mpi_fix_c... 29 terpri(stdout);
eucrypt_mpi_fix_c... 30 fflush(stdout);
eucrypt_mpi_fix_c... 31 }
eucrypt_mpi_fix_c... 32
eucrypt_mpi_fix_c... 33 /*
eucrypt_mpi_fix_c... 34 * Test that will fail on original code and will pass after EuCrypt fix is applied.
eucrypt_mpi_fix_c... 35 */
eucrypt_mpi_fix_c... 36 void test_rshift()
eucrypt_mpi_fix_c... 37 {
eucrypt_mpi_fix_c... 38 MPI out, in, copy_in;
eucrypt_mpi_fix_c... 39 out = mpi_alloc(0);
eucrypt_mpi_fix_c... 40 in = mpi_alloc(0);
eucrypt_mpi_fix_c... 41 copy_in = mpi_alloc(0);
eucrypt_mpi_fix_c... 42
eucrypt_mpi_fix_c... 43 mpi_fromstr(out, "0x20E92FE28E1929"); /* some value */
eucrypt_mpi_fix_c... 44 mpi_fromstr(in, "0x2000000010000001000000002");
eucrypt_mpi_fix_c... 45 mpi_fromstr(copy_in, "0x2000000010000001000000002"); /* to make sure the actual input is print, since call can modify in */
eucrypt_mpi_fix_c... 46
eucrypt_mpi_fix_c... 47 /* print value of BITS_PER_MPI_LIMB */
eucrypt_mpi_fix_c... 48 fprintf(stdout, "BITS_PER_MPI_LIMB is %d\n", BITS_PER_MPI_LIMB);
eucrypt_mpi_fix_c... 49
eucrypt_mpi_fix_c... 50 /* shift by 0 */
eucrypt_mpi_fix_c... 51 mpi_tdiv_q_2exp(out, in, 0);
eucrypt_mpi_fix_c... 52 print_results(copy_in, out, "TEST: right shift by 0");
eucrypt_mpi_fix_c... 53
eucrypt_mpi_fix_c... 54 /* shift by multiple of BITS_PER_MPI_LIMB */
eucrypt_mpi_fix_c... 55 mpi_fromstr(in, "0x2000000010000001000000002");
eucrypt_mpi_fix_c... 56
eucrypt_mpi_fix_c... 57 mpi_tdiv_q_2exp(out, in, BITS_PER_MPI_LIMB);
eucrypt_mpi_fix_c... 58 print_results(copy_in, out, "TEST: right shift by BITS_PER_MPI_LIMB");
eucrypt_mpi_fix_c... 59
eucrypt_mpi_fix_c... 60 /* shift by non-multiple of BITS_PER_MPI_LIMB */
eucrypt_mpi_fix_c... 61 mpi_fromstr(in, "0x2000000010000001000000002");
eucrypt_mpi_fix_c... 62 mpi_tdiv_q_2exp(out, in, BITS_PER_MPI_LIMB - 3);
eucrypt_mpi_fix_c... 63 print_results(copy_in, out, "TEST: right shift by BITS_PER_MPI_LIMB - 3");
eucrypt_mpi_fix_c... 64
eucrypt_mpi_fix_c... 65 mpi_free(copy_in);
eucrypt_mpi_fix_c... 66 mpi_free(out);
eucrypt_mpi_fix_c... 67 mpi_free(in);
eucrypt_mpi_fix_c... 68 }
eucrypt_mpi_fix_c... 69
ch1_mpi 70 int main(int ac, char **av)
ch1_mpi 71 {
ch1_mpi 72 MPI a, b, y;
ch1_mpi 73 int r;
eucrypt_mpi_fix_c... 74
eucrypt_mpi_fix_c... 75 test_rshift();
ch1_mpi 76
ch1_mpi 77 r = secmem_init(1000);
ch1_mpi 78 if (r==0) err("secmem init");
ch1_mpi 79
ch1_mpi 80 a = mpi_alloc_secure(0);
ch1_mpi 81 b = mpi_alloc_secure(0);
ch1_mpi 82 y = mpi_alloc_secure(0);
ch1_mpi 83 mpi_fromstr(a, "0x1B0B206C488601");
ch1_mpi 84 mpi_fromstr(b, "0x20E92FE28E1929");
ch1_mpi 85 mpi_mul(y, a, b);
ch1_mpi 86 mpi_free(a);
ch1_mpi 87 mpi_free(b);
ch1_mpi 88
eucrypt_mpi_fix_c... 89 fprintf(stdout, "******** TEST: mpi_mul, see README ********");
eucrypt_mpi_fix_c... 90 terpri(stdout);
ch1_mpi 91 mpi_print(stdout, y, 1);
ch1_mpi 92 mpi_free(y);
ch1_mpi 93
ch1_mpi 94 terpri(stdout);
ch1_mpi 95 secmem_term();
ch1_mpi 96
ch1_mpi 97 return 0;
ch1_mpi 98 }