将Crypto ++对象保存到std :: vector

时间:2016-09-06 13:32:43

标签: c++ stdvector crypto++

我想将Crypto ++密钥保存到std::vector<uint8_t>。不幸的是,只有CryptoPP::StringSinkstd::string参考,但没有CryptoPP::VectorSink会引用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,因此无法使用typedef创建

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

1 个答案:

答案 0 :(得分:4)

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;
};

}