crypto/dh/dh_key.c:190: error: BUFFER_OVERRUN_L3
  Offset added: [8, +oo] Size: [0, 536870848] by call to `DH_check_pub_key`.
Showing all 14 steps of the trace


crypto/dh/dh_key.c:156:1: Parameter `dh->p->top`
154.   }
155.   
156. > static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
157.   {
158.       BN_CTX *ctx = NULL;

crypto/dh/dh_key.c:164:9: Call
162.       int check_result;
163.   
164.       if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {
               ^
165.           DHerr(DH_F_COMPUTE_KEY, DH_R_MODULUS_TOO_LARGE);
166.           goto err;

crypto/bn/bn_lib.c:166:9: Call
  164.       bn_check_top(a);
  165.   
  166.       if (BN_is_zero(a))
                 ^
  167.           return 0;
  168.       return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));

crypto/bn/bn_lib.c:855:1: Parameter `a->top`
    853.   }
    854.   
    855. > int BN_is_zero(const BIGNUM *a)
    856.   {
    857.       return a->top == 0;

crypto/dh/dh_key.c:190:10: Call
188.       }
189.   
190.       if (!DH_check_pub_key(dh, pub_key, &check_result) || check_result) {
                ^
191.           DHerr(DH_F_COMPUTE_KEY, DH_R_INVALID_PUBKEY);
192.           goto err;

crypto/dh/dh_check.c:145:1: Parameter `dh->p->top`
  143.   }
  144.   
  145. > int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *ret)
  146.   {
  147.       int ok = 0;

crypto/dh/dh_check.c:161:9: Call
  159.       if (BN_cmp(pub_key, tmp) <= 0)
  160.           *ret |= DH_CHECK_PUBKEY_TOO_SMALL;
  161.       if (BN_copy(tmp, dh->p) == NULL || !BN_sub_word(tmp, 1))
                 ^
  162.           goto err;
  163.       if (BN_cmp(pub_key, tmp) >= 0)

crypto/bn/bn_lib.c:323:1: <Offset trace>
321.   }
322.   
323. > BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
324.   {
325.       bn_check_top(b);

crypto/bn/bn_lib.c:323:1: Parameter `b->top`
    321.   }
    322.   
    323. > BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
    324.   {
    325.       bn_check_top(b);

crypto/bn/bn_lib.c:323:1: <Length trace>
321.   }
322.   
323. > BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
324.   {
325.       bn_check_top(b);

crypto/bn/bn_lib.c:323:1: Parameter `*a->d`
    321.   }
    322.   
    323. > BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
    324.   {
    325.       bn_check_top(b);

crypto/bn/bn_lib.c:329:9: Call
    327.       if (a == b)
    328.           return a;
    329.       if (bn_wexpand(a, b->top) == NULL)
                   ^
    330.           return NULL;
    331.   

crypto/bn/bn_lib.c:951:1: Parameter `*a->d`
      949.   }
      950.   
      951. > BIGNUM *bn_wexpand(BIGNUM *a, int words)
      952.   {
      953.       return (words <= a->dmax) ? a : bn_expand2(a, words);

crypto/bn/bn_lib.c:333:9: Array access: Offset added: [8, +oo] Size: [0, 536870848] by call to `DH_check_pub_key` 
    331.   
    332.       if (b->top > 0)
    333.           memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
                   ^
    334.   
    335.       if (BN_get_flags(b, BN_FLG_CONSTTIME) != 0)

BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
{
    bn_check_top(b);
    if (a == b)
        return a;
    if (bn_wexpand(a, b->top) == NULL)
        return NULL;
    if (b->top > 0)
        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
    if (BN_get_flags(b, BN_FLG_CONSTTIME) != 0)
        BN_set_flags(a, BN_FLG_CONSTTIME);
    a->top = b->top;
    a->neg = b->neg;
    bn_check_top(a);
    return a;
}
['static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)\n{\n    BN_CTX *ctx = NULL;\n    BN_MONT_CTX *mont = NULL;\n    BIGNUM *tmp;\n    int ret = -1;\n    int check_result;\n    if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {\n        DHerr(DH_F_COMPUTE_KEY, DH_R_MODULUS_TOO_LARGE);\n        goto err;\n    }\n    ctx = BN_CTX_new();\n    if (ctx == NULL)\n        goto err;\n    BN_CTX_start(ctx);\n    tmp = BN_CTX_get(ctx);\n    if (tmp == NULL)\n        goto err;\n    if (dh->priv_key == NULL) {\n        DHerr(DH_F_COMPUTE_KEY, DH_R_NO_PRIVATE_VALUE);\n        goto err;\n    }\n    if (dh->flags & DH_FLAG_CACHE_MONT_P) {\n        mont = BN_MONT_CTX_set_locked(&dh->method_mont_p,\n                                      dh->lock, dh->p, ctx);\n        BN_set_flags(dh->priv_key, BN_FLG_CONSTTIME);\n        if (!mont)\n            goto err;\n    }\n    if (!DH_check_pub_key(dh, pub_key, &check_result) || check_result) {\n        DHerr(DH_F_COMPUTE_KEY, DH_R_INVALID_PUBKEY);\n        goto err;\n    }\n    if (!dh->\n        meth->bn_mod_exp(dh, tmp, pub_key, dh->priv_key, dh->p, ctx, mont)) {\n        DHerr(DH_F_COMPUTE_KEY, ERR_R_BN_LIB);\n        goto err;\n    }\n    ret = BN_bn2bin(tmp, key);\n err:\n    if (ctx != NULL) {\n        BN_CTX_end(ctx);\n        BN_CTX_free(ctx);\n    }\n    return (ret);\n}', 'int BN_num_bits(const BIGNUM *a)\n{\n    int i = a->top - 1;\n    bn_check_top(a);\n    if (BN_is_zero(a))\n        return 0;\n    return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));\n}', 'int BN_is_zero(const BIGNUM *a)\n{\n    return a->top == 0;\n}', 'int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *ret)\n{\n    int ok = 0;\n    BIGNUM *tmp = NULL;\n    BN_CTX *ctx = NULL;\n    *ret = 0;\n    ctx = BN_CTX_new();\n    if (ctx == NULL)\n        goto err;\n    BN_CTX_start(ctx);\n    tmp = BN_CTX_get(ctx);\n    if (tmp == NULL || !BN_set_word(tmp, 1))\n        goto err;\n    if (BN_cmp(pub_key, tmp) <= 0)\n        *ret |= DH_CHECK_PUBKEY_TOO_SMALL;\n    if (BN_copy(tmp, dh->p) == NULL || !BN_sub_word(tmp, 1))\n        goto err;\n    if (BN_cmp(pub_key, tmp) >= 0)\n        *ret |= DH_CHECK_PUBKEY_TOO_LARGE;\n    if (dh->q != NULL) {\n        if (!BN_mod_exp(tmp, pub_key, dh->q, dh->p, ctx))\n            goto err;\n        if (!BN_is_one(tmp))\n            *ret |= DH_CHECK_PUBKEY_INVALID;\n    }\n    ok = 1;\n err:\n    if (ctx != NULL) {\n        BN_CTX_end(ctx);\n        BN_CTX_free(ctx);\n    }\n    return (ok);\n}', 'BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)\n{\n    bn_check_top(b);\n    if (a == b)\n        return a;\n    if (bn_wexpand(a, b->top) == NULL)\n        return NULL;\n    if (b->top > 0)\n        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);\n    if (BN_get_flags(b, BN_FLG_CONSTTIME) != 0)\n        BN_set_flags(a, BN_FLG_CONSTTIME);\n    a->top = b->top;\n    a->neg = b->neg;\n    bn_check_top(a);\n    return a;\n}', 'BIGNUM *bn_wexpand(BIGNUM *a, int words)\n{\n    return (words <= a->dmax) ? a : bn_expand2(a, words);\n}']