I am trying to use cryptopp, the below code cause access violation at the stringsource function. What could be the possible cause of this ? I have previously run the similar code with little difference successfully.
AesHelper.cpp
#include "dll.h"
#include "AesHelper.h"
#include "aes.h"
using CryptoPP::AES;
#include "ccm.h"
using CryptoPP::CBC_Mode;
#include "filters.h"
using CryptoPP::StringSink;
using CryptoPP::StringSource;
using CryptoPP::StreamTransformationFilter;
#include "hex.h"
using CryptoPP::HexEncoder;
using CryptoPP::HexDecoder;
#include <string>
using namespace std;
#include "osrng.h"
using CryptoPP::AutoSeededRandomPool;
byte AesHelper::_key[AES::DEFAULT_KEYLENGTH];
byte AesHelper::_iv[AES::BLOCKSIZE];
void AesHelper::encrypt(const char* str, char ** outIv, char ** encrypted )
{
try
{
AutoSeededRandomPool prng;
byte key[AES::DEFAULT_KEYLENGTH];
prng.GenerateBlock(key, sizeof(key));
byte iv[AES::BLOCKSIZE];
prng.GenerateBlock(iv, sizeof(iv));
string cipher, encoded;
string plain = "CBC Test Mode";
CBC_Mode<AES>::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);
// The StreamTransformationFilter removes
// padding as required.
StreamTransformationFilter *stf = new StreamTransformationFilter(e,
new StringSink(cipher),
CryptoPP::BlockPaddingSchemeDef::ZEROS_PADDING
);
StringSource s(plain, true, stf); // This line cause Access Violation
StreamTransformationFilter filter(e);
filter.Put((const byte*)plain.data(), plain.size());
filter.MessageEnd();
const size_t ret = filter.MaxRetrievable();
cipher.resize(ret);
filter.Get((byte*)cipher.data(), cipher.size());
//encode the cipher to hexadecimal
StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
//set the output parameter
outIv = (char**)_iv;
encrypted = (char**)cipher.c_str();
}
catch(const CryptoPP::Exception& e)
{
cerr << "exception : " << e.what() << endl;
exit(1);
}
}
Error
Unhandled exception at 0x550714CA (cryptopp.dll) in PaymentManager.exe: 0xC0000005: Access violation reading location 0x74736554.
cryptopp.dll!memcpy(unsigned char * dst, unsigned char * src, unsigned long count) Line 188 Unknown
UPDATE : Problem solved after making both DLL and Exe program to "Release". But now there's new problem. on this line, the problem also in stringsource function
StringSource(cipher, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
error
PaymentManager.exe has triggered a breakpoint.
The program stop at
void __cdecl _free_base (void * pBlock) {
int retval = 0;
if (pBlock == NULL)
return;
RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
retval = HeapFree(_crtheap, 0, pBlock); // program stop at this line
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
} }
I don't know this library, but as I see StringSource
get std::string
as first parameter. In this case you should be absolutely sure, that both DLL and your program compiled and linked with exactly the same STL, with exactly the same compilers and their options