string and StringSource (load):dom
string spki = ...; StringSource ss(spki, true /*pumpAll*/); RSA::PublicKey publicKey; publicKey.Load(ss);
vector and ArraySource (load):spa
vector<byte> spki = ...; ArraySource as(&spki[0], spki.length(), true /*pumpAll*/); RSA::PublicKey publicKey; publicKey.Load(as);
string and StringSink (save)code
string spki; StringSink ss(spki); RSA::PublicKey publicKey(...); publicKey.Save(ss);
vector (save)blog
Below is an example of saving to and loading from a std::vector
. You have to use an intermediate ByteQueue
to save because you can't easily create a VectorSink
.ci
AutoSeededRandomPool prng; RSA::PrivateKey pk1, pk2; pk1.Initialize(prng, 1024); ByteQueue queue; pk1.Save(queue); vector<byte> spki; spki.resize(queue.MaxRetrievable()); ArraySink as1(&spki[0], spki.size()); queue.CopyTo(as1); ArraySource as2(&spki[0], spki.size(), true); pk2.Load(as2); bool valid = pk2.Validate(prng, 3); if(valid) cout << "Validated private key" << endl; else cout << "Failed to validate private key" << endl;
We don't have an explicit VectorSink
, and we can't easily create one because of an implicit expectation of traits_type::char_type
. For example:string
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);
http://c/questions/29050575/how-would-i-load-a-private-public-key-from-a-string-byte-array-or-any-otherit