2016-09-06 2 views
2

Я хочу сохранить ключи Crypto ++ до std::vector<uint8_t>. К сожалению, есть только CryptoPP::StringSink, который принимает std::string ссылку, но не CryptoPP::VectorSink, которая будет ссылаться на std::vector.Сохранение объектов Crypto ++ для std :: vector

следующий код работает отлично

std::string spki; 
CryptoPP::StringSink ss(spki); 

CryptoPP::RSA::PublicKey publicKey(...); 
publicKey.Save(ss); 

Но я хочу эту

std::vector<uint8_t> spki; 
CryptoPP::VectorSink vs(spki); 

CryptoPP::RSA::PublicKey publicKey(...); 
publicKey.Save(vs); 

Проблема

VectorSink не может быть создан только с помощью ЬурейеЕ из-за traits_type::char_type внутри StringSinkTemplate:

using CryptoPP::StringSinkTemplate; 
typedef StringSinkTemplate< std::vector<byte> > VectorSink; 

In file included from cryptopp-test.cpp:65: 
In file included from /usr/local/include/cryptopp/files.h:5: 
/usr/local/include/cryptopp/filters.h:590:22: error: no member named 
     'traits_type' in 'std::vector<unsigned char, std::allocator<unsigned char> 
     >' 
     typedef typename T::traits_type::char_type char_type; 
         ~~~^ 
cryptopp-test.cpp:243:20: note: in instantiation of template class 
     'CryptoPP::StringSinkTemplate<std::vector<unsigned char, 
     std::allocator<unsigned char> > >' requested here 
     VectorSink vs(spki); 

Как я могу создать VectorSink?

+0

Вы можете объяснить, почему * * Вы хотите использовать вектор вместо строки? В противном случае этот вопрос является лишь примером [проблемы XY] (http://xyproblem.info/). –

+0

Это красиво и чисто. Вы можете добавить его на страницу [Патч] (http://www.cryptopp.com/wiki/Category:Patch) в вики Crypto ++. Чтобы претендовать на эту страницу, вы должны назначить авторские права на проект Crypto ++. Вот пример того, как это может выглядеть: [Написано и помещено в Public Domain by Roman. Авторское право назначено для Crypto ++ Project] (http://github.com/weidai11/cryptopp/blob/master/blake2.cpp). – jww

+0

Если вы не хотите назначать авторские права, то это нормально. Проект требует, чтобы авторские права (1) гарантировали, что пользователи получают единый лицензионный термин (Public Domain или Boost), и (2) Вэй Дай имеет необходимый контроль для соблюдения экспортных правил. Вэй копирует библиотеку в целом из-за экспортных правил и средств контроля. – jww

ответ

3

Рабочая реализация VectorSink

// Written and placed in the public domain by rrmmnn 
// Copyright assigned to the Crypto++ project. 

namespace CryptoPP { 

class VectorSink : public Bufferless<Sink> { 
public: 

    VectorSink(std::vector<uint8_t>& out) 
    : _out(&out) { 
    } 

    size_t Put2(const byte *inString, size_t length, int /*messageEnd*/, bool /*blocking*/) { 
    _out->insert(_out->end(), inString, inString + length); 
    return 0; 
    } 

private: 
    std::vector<uint8_t>* _out; 
}; 

}