typedef unsigned char boolean;
typedef unsigned char byte;
typedef unsigned short word16;
typedef word16 unit;
typedef unit *unitptr;
typedef short signedunit;
typedef unsigned long int ulint;
class CRSALib
{
public:
enum { MAX_BIT_PRECISION = 2048, MAX_UNIT_PRECISION = MAX_BIT_PRECISION/(sizeof(word16)*8) };
private:
unit moduli_buf[16][(MAX_UNIT_PRECISION)];
unitptr moduli[16+1];
unit msu_moduli[16+1];
unit nmsu_moduli[16+1];
unit mpdbuf[16-1][(MAX_UNIT_PRECISION)];
unitptr mpd[16];
public:
short global_precision;
void set_precision(short prec);
CRSALib(short glob_pres=0);
boolean mp_addc(register unitptr r1,register unitptr r2,register boolean carry);
boolean mp_subb(register unitptr r1,register unitptr r2,register boolean borrow);
boolean mp_rotate_left(register unitptr r1,register boolean carry);
boolean mp_rotate_right(register unitptr r1,register boolean carry);
short mp_compare(register unitptr r1,register unitptr r2);
boolean mp_inc(register unitptr r);
boolean mp_dec(register unitptr r);
void mp_neg(register unitptr r);
void mp_move(register unitptr dst,register unitptr src);
void mp_init(register unitptr r, word16 value);
short significance(register unitptr r);
void unitfill0(unitptr r,word16 unitcount);
int mp_udiv(register unitptr remainder,register unitptr quotient,
register unitptr dividend,register unitptr divisor);
int mp_div(register unitptr remainder,register unitptr quotient,
register unitptr dividend,register unitptr divisor);
word16 mp_shortdiv(register unitptr quotient,
register unitptr dividend,register word16 divisor);
int mp_mod(register unitptr remainder,
register unitptr dividend,register unitptr divisor);
word16 mp_shortmod(register unitptr dividend,register word16 divisor);
int mp_mult(register unitptr prod,
register unitptr multiplicand,register unitptr multiplier);
private:
void mp_lshift_unit(register unitptr r1);
void stage_mp_images(unitptr images[16],unitptr r);
public:
int stage_merritt_modulus(unitptr n);
int merritt_modmult(register unitptr prod,
unitptr multiplicand,register unitptr multiplier);
private:
void merritt_burn(void);
public:
int countbits(unitptr r);
int mp_modexp(register unitptr expout,register unitptr expin,
register unitptr exponent,register unitptr modulus);
int rsa_decrypt(unitptr M, unitptr C, unitptr d, unitptr p, unitptr q, unitptr u);
int mp_sqrt(unitptr quotient,unitptr dividend);
};
inline void CRSALib::set_precision(short prec) {global_precision = prec;}