crypto/ec/ec_mult.c:220: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - 1):unsigned64.
Showing all 3 steps of the trace


crypto/ec/ec_mult.c:90:2: <LHS trace>
88.   	int k, t;
89.   	int r_is_at_infinity = 1;
90.   	size_t max_bits = 0;
       ^
91.   	size_t *wsize = NULL; /* individual window sizes */
92.   	unsigned long *wbits = NULL; /* individual window contents */

crypto/ec/ec_mult.c:90:2: Assignment
88.   	int k, t;
89.   	int r_is_at_infinity = 1;
90.   	size_t max_bits = 0;
       ^
91.   	size_t *wsize = NULL; /* individual window sizes */
92.   	unsigned long *wbits = NULL; /* individual window contents */

crypto/ec/ec_mult.c:220:7: Binary operation: ([0, +oo] - 1):unsigned64
218.   	r_is_at_infinity = 1;
219.   
220.   	for (k = max_bits - 1; k >= 0; k--)
             ^
221.   		{
222.   		if (!r_is_at_infinity)

int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
	size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx)
	{
	BN_CTX *new_ctx = NULL;
	EC_POINT *generator = NULL;
	EC_POINT *tmp = NULL;
	size_t totalnum;
	size_t i, j;
	int k, t;
	int r_is_at_infinity = 1;
	size_t max_bits = 0;
	size_t *wsize = NULL;
	unsigned long *wbits = NULL;
	int *wpos = NULL;
	size_t num_val;
	EC_POINT **val = NULL;
	EC_POINT **v;
	EC_POINT ***val_sub = NULL;
	int ret = 0;
	if (scalar != NULL)
		{
		generator = EC_GROUP_get0_generator(group);
		if (generator == NULL)
			{
			ECerr(EC_F_EC_POINTS_MUL, EC_R_UNDEFINED_GENERATOR);
			return 0;
			}
		}
	for (i = 0; i < num; i++)
		{
		if (group->meth != points[i]->meth)
			{
			ECerr(EC_F_EC_POINTS_MUL, EC_R_INCOMPATIBLE_OBJECTS);
			return 0;
			}
		}
	totalnum = num + (scalar != NULL);
	wsize = OPENSSL_malloc(totalnum * sizeof wsize[0]);
	wbits = OPENSSL_malloc(totalnum * sizeof wbits[0]);
	wpos = OPENSSL_malloc(totalnum * sizeof wpos[0]);
	if (wsize == NULL || wbits == NULL || wpos == NULL) goto err;
	num_val = 0;
	for (i = 0; i < totalnum; i++)
		{
		size_t bits;
		bits = i < num ? BN_num_bits(scalars[i]) : BN_num_bits(scalar);
		wsize[i] = EC_window_bits_for_scalar_size(bits);
		num_val += 1 << (wsize[i] - 1);
		if (bits > max_bits)
			max_bits = bits;
		wbits[i] = 0;
		wpos[i] = 0;
		}
	val = OPENSSL_malloc((num_val + 1) * sizeof val[0]);
	if (val == NULL) goto err;
	val[num_val] = NULL;
	val_sub = OPENSSL_malloc(totalnum * sizeof val_sub[0]);
	if (val_sub == NULL) goto err;
	v = val;
	for (i = 0; i < totalnum; i++)
		{
		val_sub[i] = v;
		for (j = 0; j < (1 << (wsize[i] - 1)); j++)
			{
			*v = EC_POINT_new(group);
			if (*v == NULL) goto err;
			v++;
			}
		}
	if (!(v == val + num_val))
		{
		ECerr(EC_F_EC_POINTS_MUL, ERR_R_INTERNAL_ERROR);
		goto err;
		}
	if (ctx == NULL)
		{
		ctx = new_ctx = BN_CTX_new();
		if (ctx == NULL)
			goto err;
		}
	tmp = EC_POINT_new(group);
	if (tmp == NULL) goto err;
	for (i = 0; i < totalnum; i++)
		{
		if (i < num)
			{
			if (!EC_POINT_copy(val_sub[i][0], points[i])) goto err;
			if (scalars[i]->neg)
				{
				if (!EC_POINT_invert(group, val_sub[i][0], ctx)) goto err;
				}
			}
		else
			{
			if (!EC_POINT_copy(val_sub[i][0], generator)) goto err;
			if (scalar->neg)
				{
				if (!EC_POINT_invert(group, val_sub[i][0], ctx)) goto err;
				}
			}
		if (wsize[i] > 1)
			{
			if (!EC_POINT_dbl(group, tmp, val_sub[i][0], ctx)) goto err;
			for (j = 1; j < (1 << (wsize[i] - 1)); j++)
				{
				if (!EC_POINT_add(group, val_sub[i][j], val_sub[i][j - 1], tmp, ctx)) goto err;
				}
			}
		}
#if 1
	if (!EC_POINTs_make_affine(group, num_val, val, ctx)) goto err;
#endif
	r_is_at_infinity = 1;
	for (k = max_bits - 1; k >= 0; k--)
		{
		if (!r_is_at_infinity)
			{
			if (!EC_POINT_dbl(group, r, r, ctx)) goto err;
			}
		for (i = 0; i < totalnum; i++)
			{
			if (wbits[i] == 0)
				{
				const BIGNUM *s;
				s = i < num ? scalars[i] : scalar;
				if (BN_is_bit_set(s, k))
					{
					t = k - wsize[i] + 1;
					while (!BN_is_bit_set(s, t))
						t++;
					wpos[i] = t;
					wbits[i] = 1;
					for (t = k - 1; t >= wpos[i]; t--)
						{
						wbits[i] <<= 1;
						if (BN_is_bit_set(s, t))
							wbits[i]++;
						}
					}
				}
			if ((wbits[i] != 0) && (wpos[i] == k))
				{
				if (r_is_at_infinity)
					{
					if (!EC_POINT_copy(r, val_sub[i][wbits[i] >> 1])) goto err;
					r_is_at_infinity = 0;
					}
				else
					{
					if (!EC_POINT_add(group, r, r, val_sub[i][wbits[i] >> 1], ctx)) goto err;
					}
				wbits[i] = 0;
				}
			}
		}
	if (r_is_at_infinity)
		if (!EC_POINT_set_to_infinity(group, r)) goto err;
	ret = 1;
 err:
	if (new_ctx != NULL)
		BN_CTX_free(new_ctx);
	if (tmp != NULL)
		EC_POINT_free(tmp);
	if (wsize != NULL)
		OPENSSL_free(wsize);
	if (wbits != NULL)
		OPENSSL_free(wbits);
	if (wpos != NULL)
		OPENSSL_free(wpos);
	if (val != NULL)
		{
		for (v = val; *v != NULL; v++)
			EC_POINT_clear_free(*v);
		OPENSSL_free(val);
		}
	if (val_sub != NULL)
		{
		OPENSSL_free(val_sub);
		}
	return ret;
	}
['int EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,\n\tsize_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx)\n\t{\n\tBN_CTX *new_ctx = NULL;\n\tEC_POINT *generator = NULL;\n\tEC_POINT *tmp = NULL;\n\tsize_t totalnum;\n\tsize_t i, j;\n\tint k, t;\n\tint r_is_at_infinity = 1;\n\tsize_t max_bits = 0;\n\tsize_t *wsize = NULL;\n\tunsigned long *wbits = NULL;\n\tint *wpos = NULL;\n\tsize_t num_val;\n\tEC_POINT **val = NULL;\n\tEC_POINT **v;\n\tEC_POINT ***val_sub = NULL;\n\tint ret = 0;\n\tif (scalar != NULL)\n\t\t{\n\t\tgenerator = EC_GROUP_get0_generator(group);\n\t\tif (generator == NULL)\n\t\t\t{\n\t\t\tECerr(EC_F_EC_POINTS_MUL, EC_R_UNDEFINED_GENERATOR);\n\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\tfor (i = 0; i < num; i++)\n\t\t{\n\t\tif (group->meth != points[i]->meth)\n\t\t\t{\n\t\t\tECerr(EC_F_EC_POINTS_MUL, EC_R_INCOMPATIBLE_OBJECTS);\n\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\ttotalnum = num + (scalar != NULL);\n\twsize = OPENSSL_malloc(totalnum * sizeof wsize[0]);\n\twbits = OPENSSL_malloc(totalnum * sizeof wbits[0]);\n\twpos = OPENSSL_malloc(totalnum * sizeof wpos[0]);\n\tif (wsize == NULL || wbits == NULL || wpos == NULL) goto err;\n\tnum_val = 0;\n\tfor (i = 0; i < totalnum; i++)\n\t\t{\n\t\tsize_t bits;\n\t\tbits = i < num ? BN_num_bits(scalars[i]) : BN_num_bits(scalar);\n\t\twsize[i] = EC_window_bits_for_scalar_size(bits);\n\t\tnum_val += 1 << (wsize[i] - 1);\n\t\tif (bits > max_bits)\n\t\t\tmax_bits = bits;\n\t\twbits[i] = 0;\n\t\twpos[i] = 0;\n\t\t}\n\tval = OPENSSL_malloc((num_val + 1) * sizeof val[0]);\n\tif (val == NULL) goto err;\n\tval[num_val] = NULL;\n\tval_sub = OPENSSL_malloc(totalnum * sizeof val_sub[0]);\n\tif (val_sub == NULL) goto err;\n\tv = val;\n\tfor (i = 0; i < totalnum; i++)\n\t\t{\n\t\tval_sub[i] = v;\n\t\tfor (j = 0; j < (1 << (wsize[i] - 1)); j++)\n\t\t\t{\n\t\t\t*v = EC_POINT_new(group);\n\t\t\tif (*v == NULL) goto err;\n\t\t\tv++;\n\t\t\t}\n\t\t}\n\tif (!(v == val + num_val))\n\t\t{\n\t\tECerr(EC_F_EC_POINTS_MUL, ERR_R_INTERNAL_ERROR);\n\t\tgoto err;\n\t\t}\n\tif (ctx == NULL)\n\t\t{\n\t\tctx = new_ctx = BN_CTX_new();\n\t\tif (ctx == NULL)\n\t\t\tgoto err;\n\t\t}\n\ttmp = EC_POINT_new(group);\n\tif (tmp == NULL) goto err;\n\tfor (i = 0; i < totalnum; i++)\n\t\t{\n\t\tif (i < num)\n\t\t\t{\n\t\t\tif (!EC_POINT_copy(val_sub[i][0], points[i])) goto err;\n\t\t\tif (scalars[i]->neg)\n\t\t\t\t{\n\t\t\t\tif (!EC_POINT_invert(group, val_sub[i][0], ctx)) goto err;\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tif (!EC_POINT_copy(val_sub[i][0], generator)) goto err;\n\t\t\tif (scalar->neg)\n\t\t\t\t{\n\t\t\t\tif (!EC_POINT_invert(group, val_sub[i][0], ctx)) goto err;\n\t\t\t\t}\n\t\t\t}\n\t\tif (wsize[i] > 1)\n\t\t\t{\n\t\t\tif (!EC_POINT_dbl(group, tmp, val_sub[i][0], ctx)) goto err;\n\t\t\tfor (j = 1; j < (1 << (wsize[i] - 1)); j++)\n\t\t\t\t{\n\t\t\t\tif (!EC_POINT_add(group, val_sub[i][j], val_sub[i][j - 1], tmp, ctx)) goto err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#if 1\n\tif (!EC_POINTs_make_affine(group, num_val, val, ctx)) goto err;\n#endif\n\tr_is_at_infinity = 1;\n\tfor (k = max_bits - 1; k >= 0; k--)\n\t\t{\n\t\tif (!r_is_at_infinity)\n\t\t\t{\n\t\t\tif (!EC_POINT_dbl(group, r, r, ctx)) goto err;\n\t\t\t}\n\t\tfor (i = 0; i < totalnum; i++)\n\t\t\t{\n\t\t\tif (wbits[i] == 0)\n\t\t\t\t{\n\t\t\t\tconst BIGNUM *s;\n\t\t\t\ts = i < num ? scalars[i] : scalar;\n\t\t\t\tif (BN_is_bit_set(s, k))\n\t\t\t\t\t{\n\t\t\t\t\tt = k - wsize[i] + 1;\n\t\t\t\t\twhile (!BN_is_bit_set(s, t))\n\t\t\t\t\t\tt++;\n\t\t\t\t\twpos[i] = t;\n\t\t\t\t\twbits[i] = 1;\n\t\t\t\t\tfor (t = k - 1; t >= wpos[i]; t--)\n\t\t\t\t\t\t{\n\t\t\t\t\t\twbits[i] <<= 1;\n\t\t\t\t\t\tif (BN_is_bit_set(s, t))\n\t\t\t\t\t\t\twbits[i]++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tif ((wbits[i] != 0) && (wpos[i] == k))\n\t\t\t\t{\n\t\t\t\tif (r_is_at_infinity)\n\t\t\t\t\t{\n\t\t\t\t\tif (!EC_POINT_copy(r, val_sub[i][wbits[i] >> 1])) goto err;\n\t\t\t\t\tr_is_at_infinity = 0;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\tif (!EC_POINT_add(group, r, r, val_sub[i][wbits[i] >> 1], ctx)) goto err;\n\t\t\t\t\t}\n\t\t\t\twbits[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tif (r_is_at_infinity)\n\t\tif (!EC_POINT_set_to_infinity(group, r)) goto err;\n\tret = 1;\n err:\n\tif (new_ctx != NULL)\n\t\tBN_CTX_free(new_ctx);\n\tif (tmp != NULL)\n\t\tEC_POINT_free(tmp);\n\tif (wsize != NULL)\n\t\tOPENSSL_free(wsize);\n\tif (wbits != NULL)\n\t\tOPENSSL_free(wbits);\n\tif (wpos != NULL)\n\t\tOPENSSL_free(wpos);\n\tif (val != NULL)\n\t\t{\n\t\tfor (v = val; *v != NULL; v++)\n\t\t\tEC_POINT_clear_free(*v);\n\t\tOPENSSL_free(val);\n\t\t}\n\tif (val_sub != NULL)\n\t\t{\n\t\tOPENSSL_free(val_sub);\n\t\t}\n\treturn ret;\n\t}']