2017-02-26 8:27 GMT+01:00 Otto Moerbeek <o...@drijf.net>: > On Sat, Feb 25, 2017 at 11:28:43PM +0100, Daniel Cegiełka wrote: >
> > Bleh, they could have changed the implementation without changing the > API but they choose not to and place the burden on the user of the lib. > > Easy "fix" would be to remove the BN_check, but in current compat mode > that would lead to a unchecked mem allocation. Don't like that at all. > https://github.com/openbsd/src/blob/master/lib/libcrypto/bn/bn_lib.c#L564 BN_set_word() is not mark as DEPRECATED and bn_check() call it many times: $ grep BN_set_word bcode.c|grep bn_check bn_check(BN_set_word(a, 10)); bn_check(BN_set_word(p, abs_scale)); bn_check(BN_set_word(f, rem)); bn_check(BN_set_word(a, 10)); bn_check(BN_set_word(p, n->scale)); bn_check(BN_set_word(n->number, bmachine.scale)); bn_check(BN_set_word(n->number, bmachine.obase)); bn_check(BN_set_word(n->number, bmachine.ibase)); bn_check(BN_set_word(n->number, i)); bn_check(BN_set_word(n->number, scale)); bn_check(BN_set_word(n->number, digits)); bn_check(BN_set_word(n->number, digits)); bn_check(BN_set_word(a->number, BN_get_word(a->number) ? 0 : 1)); bn_check(BN_set_word(r->number, bn_check(BN_set_word(r->number, bn_check(BN_set_word(r->number, so instead BN_zero we can use BN_set_word() directly: bn_check(BN_set_word(BIGNUM_VAR, 0)); Daniel > -Otto
diff -urN dc.orig/bcode.c dc.new/bcode.c --- dc.orig/bcode.c Sat Feb 25 10:58:20 2017 +++ dc.new/bcode.c Sun Feb 26 10:40:55 2017 @@ -386,7 +386,7 @@ bn_checkp(BN_copy(i, n->number)); if (n->scale == 0 && f != NULL) - bn_check(BN_zero(f)); + bn_check(BN_set_word(f, 0)); else if (n->scale < sizeof(factors)/sizeof(factors[0])) { rem = BN_div_word(i, factors[n->scale]); if (f != NULL) @@ -804,7 +804,7 @@ v = stack_tos(&bmachine.reg[idx]); if (v == NULL) { n = new_number(); - bn_check(BN_zero(n->number)); + bn_check(BN_set_word(n->number, 0)); push_number(n); } else push(stack_dup_value(v, ©)); @@ -888,7 +888,7 @@ v = frame_retrieve(stack, idx); if (v == NULL || v->type == BCODE_NONE) { n = new_number(); - bn_check(BN_zero(n->number)); + bn_check(BN_set_word(n->number, 0)); push_number(n); } else diff -urN dc.orig/inout.c dc.new/inout.c --- dc.orig/inout.c Thu Feb 2 22:16:20 2017 +++ dc.new/inout.c Sun Feb 26 10:41:17 2017 @@ -186,7 +186,7 @@ u_int i; n = new_number(); - bn_check(BN_zero(n->number)); + bn_check(BN_set_word(n->number, 0)); while ((ch = (*src->vtable->readchar)(src)) != EOF) {