michael@0: /* michael@0: * Simple test driver for MPI library michael@0: * michael@0: * Test GF2m: Binary Polynomial Arithmetic michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: #include "mp_gf2m.h" michael@0: michael@0: int main(int argc, char *argv[]) michael@0: { michael@0: int ix; michael@0: mp_int pp, a, b, x, y, order; michael@0: mp_int c, d, e; michael@0: mp_digit r; michael@0: mp_err res; michael@0: unsigned int p[] = {163,7,6,3,0}; michael@0: unsigned int ptemp[10]; michael@0: michael@0: printf("Test b: Binary Polynomial Arithmetic\n\n"); michael@0: michael@0: mp_init(&pp); michael@0: mp_init(&a); michael@0: mp_init(&b); michael@0: mp_init(&x); michael@0: mp_init(&y); michael@0: mp_init(&order); michael@0: michael@0: mp_read_radix(&pp, "0800000000000000000000000000000000000000C9", 16); michael@0: mp_read_radix(&a, "1", 16); michael@0: mp_read_radix(&b, "020A601907B8C953CA1481EB10512F78744A3205FD", 16); michael@0: mp_read_radix(&x, "03F0EBA16286A2D57EA0991168D4994637E8343E36", 16); michael@0: mp_read_radix(&y, "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", 16); michael@0: mp_read_radix(&order, "040000000000000000000292FE77E70C12A4234C33", 16); michael@0: printf("pp = "); mp_print(&pp, stdout); fputc('\n', stdout); michael@0: printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); michael@0: printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); michael@0: printf("x = "); mp_print(&x, stdout); fputc('\n', stdout); michael@0: printf("y = "); mp_print(&y, stdout); fputc('\n', stdout); michael@0: printf("order = "); mp_print(&order, stdout); fputc('\n', stdout); michael@0: michael@0: mp_init(&c); michael@0: mp_init(&d); michael@0: mp_init(&e); michael@0: michael@0: /* Test polynomial conversion */ michael@0: ix = mp_bpoly2arr(&pp, ptemp, 10); michael@0: if ( michael@0: (ix != 5) || michael@0: (ptemp[0] != p[0]) || michael@0: (ptemp[1] != p[1]) || michael@0: (ptemp[2] != p[2]) || michael@0: (ptemp[3] != p[3]) || michael@0: (ptemp[4] != p[4]) michael@0: ) { michael@0: printf("Polynomial to array conversion not correct\n"); michael@0: return -1; michael@0: } michael@0: michael@0: printf("Polynomial conversion test #1 successful.\n"); michael@0: MP_CHECKOK( mp_barr2poly(p, &c) ); michael@0: if (mp_cmp(&pp, &c) != 0) { michael@0: printf("Array to polynomial conversion not correct\n"); michael@0: return -1; michael@0: } michael@0: printf("Polynomial conversion test #2 successful.\n"); michael@0: michael@0: /* Test addition */ michael@0: MP_CHECKOK( mp_badd(&a, &a, &c) ); michael@0: if (mp_cmp_z(&c) != 0) { michael@0: printf("a+a should equal zero\n"); michael@0: return -1; michael@0: } michael@0: printf("Addition test #1 successful.\n"); michael@0: MP_CHECKOK( mp_badd(&a, &b, &c) ); michael@0: MP_CHECKOK( mp_badd(&b, &c, &c) ); michael@0: if (mp_cmp(&c, &a) != 0) { michael@0: printf("c = (a + b) + b should equal a\n"); michael@0: printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Addition test #2 successful.\n"); michael@0: michael@0: /* Test multiplication */ michael@0: mp_set(&c, 2); michael@0: MP_CHECKOK( mp_bmul(&b, &c, &c) ); michael@0: MP_CHECKOK( mp_badd(&b, &c, &c) ); michael@0: mp_set(&d, 3); michael@0: MP_CHECKOK( mp_bmul(&b, &d, &d) ); michael@0: if (mp_cmp(&c, &d) != 0) { michael@0: printf("c = (2 * b) + b should equal c = 3 * b\n"); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Multiplication test #1 successful.\n"); michael@0: michael@0: /* Test modular reduction */ michael@0: MP_CHECKOK( mp_bmod(&b, p, &c) ); michael@0: if (mp_cmp(&b, &c) != 0) { michael@0: printf("c = b mod p should equal b\n"); michael@0: printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular reduction test #1 successful.\n"); michael@0: MP_CHECKOK( mp_badd(&b, &pp, &c) ); michael@0: MP_CHECKOK( mp_bmod(&c, p, &c) ); michael@0: if (mp_cmp(&b, &c) != 0) { michael@0: printf("c = (b + p) mod p should equal b\n"); michael@0: printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular reduction test #2 successful.\n"); michael@0: MP_CHECKOK( mp_bmul(&b, &pp, &c) ); michael@0: MP_CHECKOK( mp_bmod(&c, p, &c) ); michael@0: if (mp_cmp_z(&c) != 0) { michael@0: printf("c = (b * p) mod p should equal 0\n"); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular reduction test #3 successful.\n"); michael@0: michael@0: /* Test modular multiplication */ michael@0: MP_CHECKOK( mp_bmulmod(&b, &pp, p, &c) ); michael@0: if (mp_cmp_z(&c) != 0) { michael@0: printf("c = (b * p) mod p should equal 0\n"); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular multiplication test #1 successful.\n"); michael@0: mp_set(&c, 1); michael@0: MP_CHECKOK( mp_badd(&pp, &c, &c) ); michael@0: MP_CHECKOK( mp_bmulmod(&b, &c, p, &c) ); michael@0: if (mp_cmp(&b, &c) != 0) { michael@0: printf("c = (b * (p + 1)) mod p should equal b\n"); michael@0: printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular multiplication test #2 successful.\n"); michael@0: michael@0: /* Test modular squaring */ michael@0: MP_CHECKOK( mp_copy(&b, &c) ); michael@0: MP_CHECKOK( mp_bmulmod(&b, &c, p, &c) ); michael@0: MP_CHECKOK( mp_bsqrmod(&b, p, &d) ); michael@0: if (mp_cmp(&c, &d) != 0) { michael@0: printf("c = (b * b) mod p should equal d = b^2 mod p\n"); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular squaring test #1 successful.\n"); michael@0: michael@0: /* Test modular division */ michael@0: MP_CHECKOK( mp_bdivmod(&b, &x, &pp, p, &c) ); michael@0: MP_CHECKOK( mp_bmulmod(&c, &x, p, &c) ); michael@0: if (mp_cmp(&b, &c) != 0) { michael@0: printf("c = (b / x) * x mod p should equal b\n"); michael@0: printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); michael@0: printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); michael@0: return -1; michael@0: } michael@0: printf("Modular division test #1 successful.\n"); michael@0: michael@0: CLEANUP: michael@0: michael@0: mp_clear(&order); michael@0: mp_clear(&y); michael@0: mp_clear(&x); michael@0: mp_clear(&b); michael@0: mp_clear(&a); michael@0: mp_clear(&pp); michael@0: michael@0: return 0; michael@0: }