Библиотека парной криптографии (PBC) Повреждение кучи при вызове element_to_mpz()

Я работаю в Visual Studio 2012. В режиме отладки программа работает нормально, однако при переходе в режим выпуска программа терпит неудачу при вызове element_to_mpz(), который вызывается PBC element_pow_zn()

Я использую преобразование MS VC++ PBC со страницы загрузки.

Стек вызовов указывает на наличие ошибки при вызове _realloc(). Я считаю, что я нашел линию ответственной. В исходном коде PBC строка 133 файла montfp.c (вызов _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 — библиотеки для шифрования на основе политик. Аргументы pub, m и policy правильно инициализируются из вызывающей среды.

Я не уверен, является ли это ошибкой в ​​коде CPABE, PBC, коде или ошибкой в ​​GMP. (поскольку именно здесь определяется _mpz_realloc())

Любая помощь будет принята с благодарностью.


person Sean    schedule 06.03.2014    source источник


Ответы (1)


Чтобы решить эту проблему, я заменил требование GMP на MPIR. Его можно построить с помощью VS2012 и использовать в качестве замены GMP. После перехода на эту библиотеку проблема исчезла.

Я предполагаю, что причиной моей проблемы была ошибка в GMP-4.1. Поскольку я также не смог скомпилировать GMP-5.1 и работать с VC++, я так и не смог убедиться, что ошибка действительно исчезла из GMP.

person Sean    schedule 11.03.2014