крипто библиотека openssl - преобразование base64 - PullRequest
4 голосов
/ 01 апреля 2010

Я использую объекты openssl BIO для преобразования двоичной строки в строку base64. Код выглядит следующим образом:

void ToBase64(std::string & s_in) {
    BIO * b_s = BIO_new( BIO_s_mem() );
    BIO * b64_f = BIO_new( BIO_f_base64() );

    b_s = BIO_push( b64_f , b_s);

    std::cout << "IN::" << s_in.length();
    BIO_write(b_s, s_in.c_str(), s_in.length());


    char * pp;
    int sz = BIO_get_mem_data(b_s, &pp);

    std::cout << "OUT::"  << sz << endl;

    s_in.assign(pp,sz);
    //std::cout << sz << " " << std::string(pp,sz) << std::endl;

    BIO_free (b64_f); // TODO ret error potential
    BIO_free (b_s);   // 
  }

Длина составляет 64 или 72. Однако выход всегда равен 65, что неверно, оно должно быть намного больше, чем это. Документация не самая лучшая в мире, AFAIK объект bio_s_mem должен динамически расти. Что я делаю неправильно ?

Возможно, мне лучше найти автономный класс C ++, который не предлагает потоковую поддержку и поддерживает преобразования base64. Поддержка потоковой передачи не подходит для моего приложения. Однако я просто хотел придерживаться openSSL, так как я уже зависел от некоторых крипто-подпрограмм. Во всяком случае, я приму такое решение после профилирования.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

У вас есть две проблемы:

  • Вам нужно вызвать BIO_get_mem_data() в mem bio - но вы потеряли ссылку на него (вы перезаписываете его возвращаемым значением из BIO_push, которое равно b64_f).
  • Вам следует позвонить BIO_flush() в биографию base64 после того, как вы записали в нее все свои данные.
0 голосов
/ 01 апреля 2010

Я думаю, что вы хотите изменить порядок аргументов на BIO_push.

b_s = BIO_push (b_s, b64_f)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...