test/rsa_sp800_56b_test.c:600: error: BUFFER_OVERRUN_L3
  Offset: 0 Size: [0, 8388607] by call to `BN_add_word`.
Showing all 9 steps of the trace


test/rsa_sp800_56b_test.c:594:14: Call
592.             && TEST_false(rsa_sp800_56b_check_public(key))
593.             /* load public key */
594.             && TEST_ptr(e = bn_load_new(cav_e, sizeof(cav_e)))
                    ^
595.             && TEST_ptr(n = bn_load_new(cav_n, sizeof(cav_n)))
596.             && TEST_true(RSA_set0_key(key, n, e, NULL))

test/rsa_sp800_56b_test.c:161:9: Call
  159.       BIGNUM *ret = BN_new();
  160.       if (ret != NULL)
  161.           BN_bin2bn(data, sz, ret);
                 ^
  162.       return ret;
  163.   }

crypto/bn/bn_lib.c:372:1: Parameter `*ret->d`
    370.   }
    371.   
    372. > BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
    373.   {
    374.       unsigned int i, m;

test/rsa_sp800_56b_test.c:600:14: Call
598.             && TEST_true(rsa_sp800_56b_check_public(key))
599.             /* check fail if n is even */
600.             && TEST_true(BN_add_word(n, 1))
                    ^
601.             && TEST_false(rsa_sp800_56b_check_public(key))
602.             && TEST_true(BN_sub_word(n, 1))

crypto/bn/bn_word.c:98:1: Parameter `*a->d`
  96.   }
  97.   
  98. > int BN_add_word(BIGNUM *a, BN_ULONG w)
  99.   {
  100.       BN_ULONG l;

crypto/bn/bn_word.c:115:13: Call
  113.       if (a->neg) {
  114.           a->neg = 0;
  115.           i = BN_sub_word(a, w);
                     ^
  116.           if (!BN_is_zero(a))
  117.               a->neg = !(a->neg);

crypto/bn/bn_word.c:134:1: <Length trace>
132.   }
133.   
134. > int BN_sub_word(BIGNUM *a, BN_ULONG w)
135.   {
136.       int i;

crypto/bn/bn_word.c:134:1: Parameter `*a->d`
    132.   }
    133.   
    134. > int BN_sub_word(BIGNUM *a, BN_ULONG w)
    135.   {
    136.       int i;

crypto/bn/bn_word.c:159:27: Array access: Offset: 0 Size: [0, 8388607] by call to `BN_add_word` 
    157.       }
    158.   
    159.       if ((a->top == 1) && (a->d[0] < w)) {
                                     ^
    160.           a->d[0] = w - a->d[0];
    161.           a->neg = 1;

int BN_sub_word(BIGNUM *a, BN_ULONG w)
{
    int i;
    bn_check_top(a);
    w &= BN_MASK2;
    if (!w)
        return 1;
    if (BN_is_zero(a)) {
        i = BN_set_word(a, w);
        if (i != 0)
            BN_set_negative(a, 1);
        return i;
    }
    if (a->neg) {
        a->neg = 0;
        i = BN_add_word(a, w);
        a->neg = 1;
        return i;
    }
    if ((a->top == 1) && (a->d[0] < w)) {
        a->d[0] = w - a->d[0];
        a->neg = 1;
        return 1;
    }
    i = 0;
    for (;;) {
        if (a->d[i] >= w) {
            a->d[i] -= w;
            break;
        } else {
            a->d[i] = (a->d[i] - w) & BN_MASK2;
            i++;
            w = 1;
        }
    }
    if ((a->d[i] == 0) && (i == (a->top - 1)))
        a->top--;
    bn_check_top(a);
    return 1;
}
['static int test_check_public_key(void)\n{\n    int ret = 0;\n    BIGNUM *n = NULL, *e = NULL;\n    RSA *key = NULL;\n    ret = TEST_ptr(key = RSA_new())\n          && TEST_false(rsa_sp800_56b_check_public(key))\n          && TEST_ptr(e = bn_load_new(cav_e, sizeof(cav_e)))\n          && TEST_ptr(n = bn_load_new(cav_n, sizeof(cav_n)))\n          && TEST_true(RSA_set0_key(key, n, e, NULL))\n          && TEST_true(rsa_sp800_56b_check_public(key))\n          && TEST_true(BN_add_word(n, 1))\n          && TEST_false(rsa_sp800_56b_check_public(key))\n          && TEST_true(BN_sub_word(n, 1))\n          && TEST_true(BN_lshift1(n, n))\n          && TEST_false(rsa_sp800_56b_check_public(key))\n          && TEST_true(BN_rshift1(n, n))\n          && TEST_true(BN_add_word(e, 1))\n          && TEST_false(rsa_sp800_56b_check_public(key))\n          && TEST_true(BN_sub_word(e, 1))\n          && TEST_true(BN_add_word(n, 2))\n          && TEST_false(rsa_sp800_56b_check_public(key));\n    RSA_free(key);\n    return ret;\n}', 'static BIGNUM *bn_load_new(const unsigned char *data, int sz)\n{\n    BIGNUM *ret = BN_new();\n    if (ret != NULL)\n        BN_bin2bn(data, sz, ret);\n    return ret;\n}', 'BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)\n{\n    unsigned int i, m;\n    unsigned int n;\n    BN_ULONG l;\n    BIGNUM *bn = NULL;\n    if (ret == NULL)\n        ret = bn = BN_new();\n    if (ret == NULL)\n        return NULL;\n    bn_check_top(ret);\n    for ( ; len > 0 && *s == 0; s++, len--)\n        continue;\n    n = len;\n    if (n == 0) {\n        ret->top = 0;\n        return ret;\n    }\n    i = ((n - 1) / BN_BYTES) + 1;\n    m = ((n - 1) % (BN_BYTES));\n    if (bn_wexpand(ret, (int)i) == NULL) {\n        BN_free(bn);\n        return NULL;\n    }\n    ret->top = i;\n    ret->neg = 0;\n    l = 0;\n    while (n--) {\n        l = (l << 8L) | *(s++);\n        if (m-- == 0) {\n            ret->d[--i] = l;\n            l = 0;\n            m = BN_BYTES - 1;\n        }\n    }\n    bn_correct_top(ret);\n    return ret;\n}', 'int BN_add_word(BIGNUM *a, BN_ULONG w)\n{\n    BN_ULONG l;\n    int i;\n    bn_check_top(a);\n    w &= BN_MASK2;\n    if (!w)\n        return 1;\n    if (BN_is_zero(a))\n        return BN_set_word(a, w);\n    if (a->neg) {\n        a->neg = 0;\n        i = BN_sub_word(a, w);\n        if (!BN_is_zero(a))\n            a->neg = !(a->neg);\n        return i;\n    }\n    for (i = 0; w != 0 && i < a->top; i++) {\n        a->d[i] = l = (a->d[i] + w) & BN_MASK2;\n        w = (w > l) ? 1 : 0;\n    }\n    if (w && i == a->top) {\n        if (bn_wexpand(a, a->top + 1) == NULL)\n            return 0;\n        a->top++;\n        a->d[i] = w;\n    }\n    bn_check_top(a);\n    return 1;\n}', 'int BN_sub_word(BIGNUM *a, BN_ULONG w)\n{\n    int i;\n    bn_check_top(a);\n    w &= BN_MASK2;\n    if (!w)\n        return 1;\n    if (BN_is_zero(a)) {\n        i = BN_set_word(a, w);\n        if (i != 0)\n            BN_set_negative(a, 1);\n        return i;\n    }\n    if (a->neg) {\n        a->neg = 0;\n        i = BN_add_word(a, w);\n        a->neg = 1;\n        return i;\n    }\n    if ((a->top == 1) && (a->d[0] < w)) {\n        a->d[0] = w - a->d[0];\n        a->neg = 1;\n        return 1;\n    }\n    i = 0;\n    for (;;) {\n        if (a->d[i] >= w) {\n            a->d[i] -= w;\n            break;\n        } else {\n            a->d[i] = (a->d[i] - w) & BN_MASK2;\n            i++;\n            w = 1;\n        }\n    }\n    if ((a->d[i] == 0) && (i == (a->top - 1)))\n        a->top--;\n    bn_check_top(a);\n    return 1;\n}']