2014-03-06 29 views
1

我正在使用Visual Studio 2012.在調試模式下,程序工作正常,但是,當更改爲發佈模式時,程序在調用時失敗element_to_mpz()這是由PBC功能element_pow_zn()對基於密碼學庫(PBC)在調用element_to_mpz()時堆損壞

我使用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 - 這是一個基於策略的加密庫。參數pub,m策略都是從呼叫環境中正確初始化的。

我不確定這是否是CPABE代碼,PBC,代碼或GMP中的錯誤。 (因爲這是_mpz_realloc()被定義)

任何幫助將不勝感激。

回答

1

要解決此問題,我用MPIR替換了GMP要求。它可以與VS2012一起構建,並用作GMP的直接替代產品。切換到這個庫後,問題就消失了。

我猜我的問題的原因是GMP-4.1中的一個錯誤。由於我也無法使用VC++編譯並使用GMP-5.1,因此我無法驗證該錯誤實際上是否從GMP中消失。