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

时间:2014-03-06 22:04:39

标签: c++ c visual-studio-2012 cryptography heap-corruption

我在Visual Studio 2012中工作。在调试模式下,程序运行正常,但是,当更改为发布模式时,程序在调用 element_to_mpz()时失败,该调用由{调用{3}}函数 element_pow_zn()

我在下载页面中使用了PBC的PBC。

调用堆栈似乎表明对 _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;
}

以上代码来自MS VC++ Convertion - 这是一个基于策略的加密库。参数 pub m 策略都可以从调用环境中正确初始化。

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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