/*  poly.h  */

/*  This header is required for the polynomial math section.
	The purpose is to define intermediate structure sizes
	for use with the multiply and divide routines.
	Place include header after field2n.h
*/

#define DBLBITS		2*NUMBITS
#define DBLWORD		(DBLBITS/WORDSIZE)
#define	DBLSHIFT	(DBLBITS%WORDSIZE)
#define	MAXDBL		(DBLWORD+1)

#define	DERIVMASK	0x55555555

#define DBLLOOP(i)	for(i=0; i<MAXDBL; i++)

typedef struct {
	ELEMENT		e[MAXDBL];
} DBLFIELD;

/* prototypes */

void rot_left();
void rot_right();
void mul_shift();
void null();
void copy();
void poly_mul_partial();
void div_shift();
INDEX log_2();
INDEX degreeof();
void poly_div();
void poly_inv();
void sngltodbl();
void dbltosngl();
void dblnull();
void poly_gcd();
void mul_x_mod();
INDEX irreducible();
INDEX poly_matrix_invert();
INDEX init_poly_math();
void poly_mul();
INDEX poly_quadratic();
void poly_fofx();
void matrix_print();
void poly_embed();
void poly_esum();
void poly_edbl();
void poly_esub();
void copy_point ();
void poly_elptic_mul();
void print_field();
void print_dbl();
void print_point();
void print_curve();
void poly_gf8();
void Mother();
void random_field();
void rand_curve();
void rand_point();
void DH_gen_send_key();
void DH_key_share();
void send_elgamal();
void receive_elgamal();
void ECKGP();
void authen_secret();
