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, &copy));
@@ -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) {
 

Reply via email to