С ++ Segmentation fault, печать беззнакового символа - PullRequest
0 голосов
/ 30 мая 2020

Я получаю ошибку сегментации при попытке распечатать буфер, который был заполнен функцией:

    int ret = 0;
    unsigned char plaintext;

    /* ret will contain the length of the "plaintext" output buffer */
    ret = gcm_decrypt( &ciphertext[0], ciphertext_len, &aad[0], aad_len, &tag[0], (unsigned char*)decoded_key.c_str(), &iv[0], iv_len, &plaintext );

    /* This will segfault BUT it actually prints out the correct data */
    std::string sName(reinterpret_cast<char*>(&plaintext)
    cout << "ret: " << ret << endl;
    cout << "plaintext: " << sName << endl;

Я пробовал много вещей, чтобы получить std :: string из этого буфера открытого текста, но я не могу это понять.

функция требует unsigned char *

int gcm_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *aad, int aad_len, unsigned char *tag, unsigned char *key, unsigned char *iv, int iv_len, unsigned char *plaintext)

1 Ответ

0 голосов
/ 30 мая 2020

Следуя совету @drescherjm, я обновил его до:

Конечный код

int main(void)
{
    std::string key_encoded = "DgvkCrkyBNSy9yHP1Yznyc2DkHTIUXaO6NlEw4CSq0E=";
    std::string decoded_key = base64_decode(key_encoded);

    std::string token_encoded = "rj_ZkkZUOZMxZOfOmLpEUB3siU7u6RjZFeM9s-gb_xCR56WFKFAJiMyF2T6CBRmlh_Sy0i_lfyT9AI8sEif8MTIIszyzSl_aDnG48aO50yaHGuRSYbUbSYm9WIiQ0g==";
    std::string token_decoded_tmp = base64_decode( token_encoded );
    std::string token_decoded( token_decoded_tmp.begin()+32, token_decoded_tmp.end() );
    int ciphertext_len = token_decoded.size();

    std::string aad = "xxxxxxxxxxxxxxx";
    int aad_len = aad.size();

    std::string tag( token_decoded_tmp.begin()+16, token_decoded_tmp.end()+32 );
    std::string iv( token_decoded_tmp.begin(), token_decoded_tmp.begin()+16 );
    int iv_len = iv.size();

    int ret = 0;
    unsigned char plaintext[1024];
    ret = gcm_decrypt( 
        (unsigned char*)token_decoded.c_str(),
        ciphertext_len, 
        (unsigned char*)aad.c_str(), 
        aad_len, 
        (unsigned char*)tag.c_str(),
        (unsigned char*)decoded_key.c_str(), 
        (unsigned char*)iv.c_str(), 
        iv_len, 
        plaintext 
    );
    cout << "ret: " << ret << endl;
    cout << "plaintext: <" << plaintext << ">" << endl;

    return 0;
}

И теперь он идеален. Спасибо!

@ drescherjm Я не могу отметить ваш ответ как правильный.

...