gpt4 book ai didi

c++ - 基于对的密码库 (PBC) 调用 element_to_mpz() 时堆损坏

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:52 25 4
gpt4 key购买 nike

我在 Visual Studio 2012 中工作。在 Debug模式下,程序运行良好,但是,当更改为 Release模式时,程序无法调用由 PBC 调用的 element_to_mpz()函数element_pow_zn()

我从他们的下载页面使用 PBC 的 MS VC++ Convertion

调用堆栈似乎表明调用 _realloc() 时出错。我相信我发现这条线负责。在 PBC 源代码中,montfp.c 的第 133 行(_mpz_realloc() 调用)

static void fp_to_mpz(mpz_ptr z, element_ptr e) {
eptr ep = e->data;
if (!ep->flag) mpz_set_ui(z, 0);
else {
// x is stored as xR.
// We must divide out R to convert to standard representation.
fptr p = e->field->data;
mp_limb_t tmp[2 * p->limbs];

memcpy(tmp, ep->d, p->limbs * sizeof(mp_limb_t));
memset(&tmp[p->limbs], 0, p->limbs * sizeof(mp_limb_t));

/**************************************************************************
* The line I believe to be failing - However I can't step into PBC.dll as
* I do not have the symbols.
**************************************************************************/
_mpz_realloc(z, p->limbs);//This is a call into the GMP library

mont_reduce(z->_mp_d, tmp, p);
// Remove leading zero limbs.
for (z->_mp_size = p->limbs; !z->_mp_d[z->_mp_size - 1]; z->_mp_size--);
}
}

我用来实际调用 element_to_mpz() 的代码是:

bswabe_cph_t*
bswabe_enc( bswabe_pub_t* pub, element_t m, char* policy )
{
bswabe_cph_t* cph;
element_t s;

cph = (bswabe_cph_t*)malloc(sizeof(bswabe_cph_t));

element_init_Zr(s, pub->p);
element_init_GT(m, pub->p);
element_init_GT(cph->cs, pub->p);
element_init_G1(cph->c, pub->p);
cph->p = parse_policy_postfix(policy);

element_random(m);
element_random(s);

/****************************************************
* The call to element_to_mpz() is in element_pow_zn()
*****************************************************/
element_pow_zn(cph->cs, pub->g_hat_alpha, s);

element_mul(cph->cs, cph->cs, m);

element_pow_zn(cph->c, pub->h, s);

fill_policy(cph->p, pub, s);

return cph;
}

以上代码来自 CPABE - 这是一个基于策略的加密库。参数 pubmpolicy 都从调用环境中正确初始化。

我不确定这是 CPABE 代码、PBC、代码中的错误还是 GMP 中的错误。 (因为那是定义 _mpz_realloc() 的地方)

如有任何帮助,我们将不胜感激。

最佳答案

为解决此问题,我将 GMP 要求替换为 MPIR .它可以用 VS2012 构建,并用作 GMP 的直接替代品。切换到这个库后,问题就消失了。

我猜我的问题的原因是 GMP-4.1 中的错误。由于我也无法编译 GMP-5.1 并使用 VC++,因此我永远无法验证该错误是否确实已从 GMP 中消失。

关于c++ - 基于对的密码库 (PBC) 调用 element_to_mpz() 时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com