BOOL integer_eq(Integer n, Integer m) { if (FIXNUM_P(n) && FIXNUM_P(m)) return fixnum_eq(n, m); if (BIGNUM_P(n) && BIGNUM_P(m)) return bignum_eq(n, m); if (FIXNUM_P(n)) return bignum_eq(fixnum2bignum(n), m); else return bignum_eq(n, fixnum2bignum(m)); }
unsigned char * generate_blocks(struct generator * g, unsigned int count, unsigned char * b) { int out_off = 0; unsigned int n; if (bignum_eq(g->counter, 0)) return 0; for (n = 0; n < count; n++) { aes(g->key, g->counter, b + out_off); out_off += 16; increment_bignum(g->counter, 1); } return b; }
bignum* bignum_dumb_mul(bignum a, bignum b) { // Optimisation if(bignum_absgt(b, a)) return bignum_dumb_mul(b, a); bignum* prod = bignum_fromstr("0"); bignum* zero = bignum_fromstr("0"); bignum* dec = bignum_fromstr("-1"); char sign = a.sign != b.sign; bignum* b_copy = bignum_copy(&b); b_copy->sign = 0; bignum* add_result = NULL; bignum* prod_result = NULL; a.sign = 0; while(!bignum_eq(*b_copy, *zero)) { add_result = bignum_add(*b_copy, *dec); bignum_destoroyah(b_copy); b_copy = add_result; prod_result = bignum_add(*prod, a); bignum_destoroyah(prod); prod = prod_result; } bignum_destoroyah(b_copy); bignum_destoroyah(zero); bignum_destoroyah(dec); prod->sign = sign; return prod; }