PDA

View Full Version : Compiling & using Crypto++ with mingw version of Qt



FS Lover
9th March 2010, 18:32
Hi pals!
I personally had much trouble with these.
apparently compiled version of crypto++ (cryptopp530win32win64.zip) is build using MSVC and does not work with mingw.
fortunately I could get it to work finally.
so I tell you too, step by step, how to do it.

first download the cryptopp552.zip (crypto++ v5.5.2 sources)
why cryptopp552.zip? apparently this is the latest version that is successfully compiled with mingw.

extract the contents of the cryptopp552.zip to C:\cryptopp552

edit the C:\cryptopp552\fipstest.cpp and replace every 'OutputDebugString' with 'OutputDebugStringA'. (3 replacements in total)
don't forget to save it!

delete the C:\cryptopp552\GNUmakefile

open the Qt command prompt (I used that of the Qt SDK 2009.05)
input the following commands at the Qt command line:
c:
cd \cryptopp552
qmake -project

open the cryptopp552.pro (that is now created in C:\cryptopp552)
in it:
change TEMPLATE = app to TEMPLATE = lib
add a line containing LIBS += -lws2_32 at the end.

type the following commands at the Qt command line:
qmake
mingw32-make all

wait for the build process to finish (may take many minutes)

now we should have files named libcryptopp552.a and cryptopp552.dll in directories C:\cryptopp552\release and C:\cryptopp552\debug

copy the C:\cryptopp552\release\libcryptopp552.a to <Qt dir>\lib
note that there is another directory named lib one level higher in the Qt SDK installation dir. So don't confuse them please.
copy the C:\cryptopp552\release\cryptopp552.dll to <Qt dir>\bin
note that there is another directory named bin one level higher in the Qt SDK installation dir. So don't confuse them please.

create a directory named cryptopp in <Qt dir>\include.
copy all header (.h) files from the C:\cryptopp552 to <Qt dir>\include\cryptopp.

now we can test crypto++ and see how to use it in our Qt programs.

first example is a program that computes an MD5 hash (of a hard coded string):

main.cpp


#include <iostream>

#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif
#include <cryptopp/md5.h>

USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)
const int MAX_PHRASE_LENGTH=250;

int main(int argc, char *argv[]) {

CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "Hello World!";

hash.CalculateDigest( digest, (const byte*)message.c_str(), message.length());

CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();

std::cout << "Input string: " << message << std::endl;
std::cout << "MD5: " << output << std::endl;

return 0;
}


code from: http://www.cryptopp.com/wiki/Hash_Functions

remember that you should add these lines to its .pro file before starting to build it:
LIBS += -lcryptopp552
CONFIG+=console

the program should print these on the console window:
Input string: Hello World!
MD5: ED076287532E86365E841E92BFC50D8C

second example is a program that takes 3 arguments at the command line.
arguments are file names.
the program then prompts for a Passphrase and then stores an encrypted version of the first file in the second file and then stores the result of decrypting the second file in the third file.
sample command line I used: release\cryptopptest.exe 1.jpg 2.jpg 3.jpg



#include <iostream>

#define CRYPTOPP_DEFAULT_NO_DLL
#include <cryptopp/dll.h>
#include <cryptopp/default.h>
#ifdef CRYPTOPP_WIN32_AVAILABLE
#include <windows.h>
#endif

USING_NAMESPACE(CryptoPP)
USING_NAMESPACE(std)

const int MAX_PHRASE_LENGTH=250;

void EncryptFile(const char *in,
const char *out,
const char *passPhrase);
void DecryptFile(const char *in,
const char *out,
const char *passPhrase);


int main(int argc, char *argv[])
{
try
{
char passPhrase[MAX_PHRASE_LENGTH];
cout << "Passphrase: ";
cin.getline(passPhrase, MAX_PHRASE_LENGTH);
EncryptFile(argv[1], argv[2], passPhrase);
DecryptFile(argv[2], argv[3], passPhrase);
}
catch(CryptoPP::Exception &e)
{
cout << "\nCryptoPP::Exception caught: "
<< e.what() << endl;
return -1;
}
catch(std::exception &e)
{
cout << "\nstd::exception caught: " << e.what() << endl;
return -2;
}
}


void EncryptFile(const char *in,
const char *out,
const char *passPhrase)
{
FileSource f(in, true, new DefaultEncryptorWithMAC(passPhrase,
new FileSink(out)));
}

void DecryptFile(const char *in,
const char *out,
const char *passPhrase)
{
FileSource f(in, true,
new DefaultDecryptorWithMAC(passPhrase, new FileSink(out)));
}

RandomPool & GlobalRNG()
{
static RandomPool randomPool;
return randomPool;
}
int (*AdhocTest)(int argc, char *argv[]) = NULL;


code from: http://www.codeguru.com/cpp/misc/misc/cryptoapi/article.php/c11953/

remember that you should add these lines to its .pro file before starting to build it:
LIBS += -lcryptopp552
CONFIG+=console

--------------------------------

I appreciate your feedback.
good luck!

FS Lover
11th March 2010, 18:22
this is a function I wrote & tested for encrypting an in memory file stored in a QByteArray.
it takes a QByteArray and a passPhrase and then encrypts the contents of the QByteArray.
Crypto++ encryption class which it uses is DefaultEncryptorWithMAC and according to the reference doc it uses Password-Based Encryptor using DES-EDE2 and HMAC/SHA-1.


void encrypt(QByteArray &in_out, const char *passPhrase) {

string tmp;
StringSource s((const byte *)in_out.constData(), in_out.size(), true, new DefaultEncryptorWithMAC(passPhrase, new StringSink(tmp)));
in_out.clear();
in_out.append(QByteArray(tmp.c_str(), tmp.size()));

}


for decrypting u simply need to a DefaultDecryptorWithMAC instead of the DefaultEncryptorWithMAC:


void decrypt(QByteArray &in_out, const char *passPhrase) {

string tmp;
StringSource s((const byte *)in_out.constData(), in_out.size(), true, new DefaultDecryptorWithMAC(passPhrase, new StringSink(tmp)));
in_out.clear();
in_out.append(QByteArray(tmp.c_str(), tmp.size()));

}


I am new to Crypto++ (and to cryptography in general) and haven't read the entire crypto++'s reference; Any idea about a better code is welcome.

FS Lover
14th March 2010, 07:37
compiled (with mingw) Crypto++ lib and include files: http://www.4shared.com/file/240824212/93394435/cryptopp522mingw-bin.html (12 MB)

and another download with no debug lib included: http://www.4shared.com/file/240828397/609eef3d/cryptopp522mingw-bin-nodebug.html (2.5 MB)

Thành Viên Mới
15th July 2010, 10:32
compiled (with mingw) Crypto++ lib and include files: http://www.4shared.com/file/240824212/93394435/cryptopp522mingw-bin.html (12 MB)

and another download with no debug lib included: http://www.4shared.com/file/240828397/609eef3d/cryptopp522mingw-bin-nodebug.html (2.5 MB)

if i want use Vmac in Crypto Plus Plus On QT then how do i do ?

_http://www.cryptopp.com/docs/ref/class_v_m_a_c.html

udit
8th September 2010, 17:46
Man your tutorial is just what a newbie needs
else i would have been a goner


Thank you really from my heart

I love working in Qt , the only thing i Fell Qt lacks is real tutorials of using external plugins,library or dll's etc
But you really made my day today
thanks again :o:o

udit
8th September 2010, 18:02
could you tell me waht would be the dependency when i run this program on different machine what parts of cryptolibrary need to be with the executable

tbscope
8th September 2010, 18:06
the only thing i Fell Qt lacks is real tutorials of using external plugins,library or dll's etc

That's because this has almost nothing to do with Qt.

FS Lover
11th January 2011, 19:05
Crypto++ v5.5.1 Reference Manual: http://www.4shared.com/file/S5jvueo-/CryptoPP551Ref.html

the_jinx
15th February 2011, 16:06
Thanks for all the help in this thread!
For all who might like, Crypto++ v 5.6.1 compiled on Windows 7 (32 bit) with the latest Qt 4.7 2010.05
http://jinx.etv.cx/media/cryptopp561-mingw32-qt47.zip (12.2 MB)

There might be a header or two too much in the includes etc, but they seem to be working.

lzdziana
12th December 2012, 15:44
Hi! It works nice but one thing: when I set CONFIG+=console, apart from my GUI windows, a console window appear (when running my application outside QtCreator). Any tricks to get rid of it?
Regards!

Added after 1 38 minutes:


Hi! It works nice but one thing: when I set CONFIG+=console, apart from my GUI windows, a console window appear (when running my application outside QtCreator). Any tricks to get rid of it?
Regards!

Well... I just tried without CONFIG+=console and it seems to work ;) I can't figure out what I did wrong previously (it seemd to me that cryptopp is crushing).

xeyos
27th March 2014, 19:51
A few years later.. this still works smooth on newest versions. Just want to add that i totally agree with this:

Man your tutorial is just what a newbie needs
else i would have been a goner


Thank you really from my heart

I love working in Qt , the only thing i Fell Qt lacks is real tutorials of using external plugins,library or dll's etc
But you really made my day today
thanks again

cemo
17th April 2014, 17:16
you're amazing ,still working till now :o

Stefan Fritzsche
10th April 2015, 23:29
Just for the sake of completeness:
Today I tried Crypto++ 5.6.2 under mingw (about one year old installation).
Just unzip, make and then run the validation (cryptest.exe v) as stated in the Readme-File ... "All tests passed!".

First I got scared by this thread. But so far, no problem at all.

Stefan Fritzsche
16th April 2015, 22:16
Ok, while compiling Crypto++ (v5.6.2) with a standalone MinGW installation was straight-forward, compiling and using it the Qt-way was a bit trickier.

When looking at the GNUmakefile one can seperate the files for the test-executable (a few cpp/h-files) and those for the library (all other cpp/h/asm-files).
Using QTCreator you can then create two seperate projets, add the existing files respectively and apply some tricks (prevent unicode linking problems etc.).

Let me give you a summary of all this (using crypto++ v5.6.2 and QT v5.3.1):

1) unzip crpypto562.zip into a new folder (e.g. "cryptopp562", somewhere where you store you QT-projects)
2) copy both CryptoPPLib.pro and CryptoPPTest.pro into that new folder

CryptoPPLib.pro:


QT -= core gui

TARGET = CryptoPPLib
TEMPLATE = lib

DEFINES += CRYPTOPPLIB_LIBRARY

SOURCES += 3way.cpp adler32.cpp algebra.cpp algparam.cpp arc4.cpp asn.cpp \
authenc.cpp base32.cpp base64.cpp basecode.cpp bfinit.cpp blowfish.cpp \
blumshub.cpp camellia.cpp cast.cpp casts.cpp cbcmac.cpp ccm.cpp \
channels.cpp cmac.cpp cpu.cpp crc.cpp cryptlib.cpp cryptlib_bds.cpp \
default.cpp des.cpp dessp.cpp dh.cpp dh2.cpp dll.cpp dsa.cpp eax.cpp \
ec2n.cpp eccrypto.cpp ecp.cpp elgamal.cpp emsa2.cpp eprecomp.cpp esign.cpp \
files.cpp filters.cpp fips140.cpp gcm.cpp gf256.cpp gf2_32.cpp gf2n.cpp \
gfpcrypt.cpp gost.cpp gzip.cpp hex.cpp hmac.cpp hrtimer.cpp ida.cpp \
idea.cpp integer.cpp iterhash.cpp luc.cpp mars.cpp marss.cpp md2.cpp \
md4.cpp md5.cpp misc.cpp modes.cpp mqueue.cpp mqv.cpp nbtheory.cpp \
network.cpp oaep.cpp osrng.cpp panama.cpp pch.cpp pkcspad.cpp polynomi.cpp \
pssr.cpp pubkey.cpp queue.cpp rabin.cpp randpool.cpp rc2.cpp rc5.cpp \
rc6.cpp rdtables.cpp rijndael.cpp ripemd.cpp rng.cpp rsa.cpp rw.cpp \
safer.cpp salsa.cpp seal.cpp seed.cpp serpent.cpp sha.cpp sha3.cpp \
shacal2.cpp shark.cpp sharkbox.cpp simple.cpp skipjack.cpp socketft.cpp \
sosemanuk.cpp square.cpp squaretb.cpp strciphr.cpp tea.cpp tftables.cpp \
tiger.cpp tigertab.cpp trdlocal.cpp ttmac.cpp twofish.cpp vmac.cpp \
wait.cpp wake.cpp whrlpool.cpp winpipes.cpp xtr.cpp xtrcrypt.cpp \
zdeflate.cpp zinflate.cpp zlib.cpp

HEADERS += 3way.h adler32.h aes.h algebra.h algparam.h arc4.h argnames.h \
asn.h authenc.h base32.h base64.h basecode.h blowfish.h blumshub.h \
camellia.h cast.h cbcmac.h ccm.h channels.h cmac.h config.h cpu.h crc.h \
cryptlib.h default.h des.h dh.h dh2.h dll.h dmac.h dsa.h eax.h ec2n.h \
eccrypto.h ecp.h elgamal.h emsa2.h eprecomp.h esign.h factory.h files.h \
filters.h fips140.h fltrimpl.h gcm.h gf256.h gf2_32.h gf2n.h gfpcrypt.h \
gost.h gzip.h hex.h hmac.h hrtimer.h ida.h idea.h integer.h iterhash.h \
lubyrack.h luc.h mars.h md2.h md4.h md5.h mdc.h misc.h modarith.h modes.h \
modexppc.h mqueue.h mqv.h nbtheory.h network.h nr.h oaep.h oids.h osrng.h \
panama.h pch.h pkcspad.h polynomi.h pssr.h pubkey.h pwdbased.h queue.h \
rabin.h randpool.h rc2.h rc5.h rc6.h resource.h rijndael.h ripemd.h rng.h \
rsa.h rw.h safer.h salsa.h seal.h secblock.h seckey.h seed.h serpent.h \
serpentp.h sha.h sha3.h shacal2.h shark.h simple.h skipjack.h smartptr.h \
socketft.h sosemanuk.h square.h stdcpp.h strciphr.h tea.h tiger.h \
trdlocal.h trunhash.h ttmac.h twofish.h vmac.h wait.h wake.h whrlpool.h \
winpipes.h words.h xtr.h xtrcrypt.h zdeflate.h zinflate.h zlib.h

unix {
target.path = /usr/lib
INSTALLS += target
}

# added manually
LIBS += -lws2_32
CONFIG += warn_off

CryptoPPTest.pro:


TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += bench.cpp bench2.cpp datatest.cpp dlltest.cpp fipsalgt.cpp \
fipstest.cpp regtest.cpp test.cpp validat1.cpp validat2.cpp validat3.cpp \


HEADERS += bench.h validate.h

#added manually
DEFINES -= UNICODE
CONFIG += warn_off
LIBS += -lws2_32

OTHER_FILES += TestData\* TestVectors\*
CONFIG(release, debug|release): DESTDIR = $$OUT_PWD/release
CONFIG(debug, debug|release): DESTDIR = $$OUT_PWD/debug
TestData.path = $${DESTDIR}/TestData
TestData.files = TestData/*
TestVectors.path = $${DESTDIR}/TestVectors
TestVectors.files = TestVectors/*
INSTALLS += TestVectors TestData

# added by QTCreator
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/release/ -lCryptoPPLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/debug/ -lCryptoPPLib
else:unix: LIBS += -L$$PWD/ -lCryptoPPLib
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/

3) remove GNUmakefile (e.g. just rename to GNUmakefile.backup)

Building the Library:

4) open CryptoPPLib.pro in QTCreator
5) in projects-view -> on build tab -> uncheck the box for "Shadow-Build" (no shadow-build)
6) run qmake
7) build (... takes a while)

Building and running the Test-Executable:

8) open CryptoPPTest.pro in QTCreator
9) in projects-view -> on build tab -> uncheck the box for "Shadow-Build" (no shadow-build)
10) in projects-view -> on build tab -> add build step (using Make) -> with argument "install" for make
11) in projects-view -> on run/execution tab -> add argument: "v"
12) run qmake
13) buid & run

At the end you should see that "All test passed!".

(Note: Changes for shadow-build, "install" and "v" may have to be applied for Debug and Release.)

Now you can use the lib in your QT-Widgets-Application:

14) Create new QT-Widgets-Application
15) Add the Cryptopp-Lib to this project: Add library -> external library -> set
- library: the library that was build above ("... some path .... /cryptopp562/debug/libCryptoPPLib.a")
- include-path: folder "crypto562" directly
16) run qmake

Now you can use it, for instance by applying the MD5-Example from the CryptoPP-Wiki:

17) Via Designer add "Text Edit" to MainWindow.
18) in mainwindow.cpp add to the beginning of the file:


#include <md5.h>
#include <hex.h>

19) ... and in the constructor add after ui-setup:


CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "abcdefghijklmnopqrstuvwxyz";

hash.CalculateDigest( digest, (byte*) message.c_str(), message.length() );

CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();

ui->textEdit->append(QString::fromStdString(output));
// std::cout << output << std::endl;

20) build & run ... you should see the application-window displaying the MD5-result.

(Note: you may want to turn of warnings again as done in the project-files provided above.)

Cheers
Stefan

sedi
16th January 2018, 12:29
Hi,

what a very helpful thread! For future users: I have adapted the above for the current CryptoPP V5.6.4, compiled with a stock Qt 5.10 on a Win10 machine, keeping close to the Stephan Fritzsches advice above. Compiles well, all tests pass.

CryptoPPLib.pro:


QT -= core gui

TARGET = CryptoPPLib
TEMPLATE = lib

DEFINES += CRYPTOPPLIB_LIBRARY

SOURCES += \
3way.cpp \
adler32.cpp \
algebra.cpp \
algparam.cpp \
arc4.cpp \
asn.cpp \
authenc.cpp \
base32.cpp \
base64.cpp \
basecode.cpp \
bfinit.cpp \
blowfish.cpp \
blumshub.cpp \
camellia.cpp \
cast.cpp \
casts.cpp \
cbcmac.cpp \
ccm.cpp \
channels.cpp \
cmac.cpp \
cpu.cpp \
crc.cpp \
cryptlib.cpp \
default.cpp \
des.cpp \
dessp.cpp \
dh.cpp \
dh2.cpp \
dll.cpp \
dsa.cpp \
eax.cpp \
ec2n.cpp \
eccrypto.cpp \
ecp.cpp \
elgamal.cpp \
emsa2.cpp \
eprecomp.cpp \
esign.cpp \
files.cpp \
filters.cpp \
fips140.cpp \
gcm.cpp \
gf2_32.cpp \
gf2n.cpp \
gf256.cpp \
gfpcrypt.cpp \
gost.cpp \
gzip.cpp \
hex.cpp \
hmac.cpp \
hrtimer.cpp \
ida.cpp \
idea.cpp \
integer.cpp \
iterhash.cpp \
luc.cpp \
mars.cpp \
marss.cpp \
md2.cpp \
md4.cpp \
md5.cpp \
misc.cpp \
modes.cpp \
mqueue.cpp \
mqv.cpp \
nbtheory.cpp \
network.cpp \
oaep.cpp \
osrng.cpp \
panama.cpp \
pch.cpp \
pkcspad.cpp \
polynomi.cpp \
pssr.cpp \
pubkey.cpp \
queue.cpp \
rabin.cpp \
randpool.cpp \
rc2.cpp \
rc5.cpp \
rc6.cpp \
rdtables.cpp \
rijndael.cpp \
ripemd.cpp \
rng.cpp \
rsa.cpp \
rw.cpp \
safer.cpp \
salsa.cpp \
seal.cpp \
seed.cpp \
serpent.cpp \
sha.cpp \
sha3.cpp \
shacal2.cpp \
shark.cpp \
sharkbox.cpp \
simple.cpp \
skipjack.cpp \
socketft.cpp \
sosemanuk.cpp \
square.cpp \
squaretb.cpp \
strciphr.cpp \
tea.cpp \
tftables.cpp \
tiger.cpp \
tigertab.cpp \
trdlocal.cpp \
ttmac.cpp \
twofish.cpp \
vmac.cpp \
wait.cpp \
wake.cpp \
whrlpool.cpp \
winpipes.cpp \
xtr.cpp \
xtrcrypt.cpp \
zdeflate.cpp \
zinflate.cpp \
zlib.cpp

HEADERS += \
3way.h \
adler32.h \
aes.h \
algebra.h \
algparam.h \
arc4.h \
argnames.h \
asn.h \
authenc.h \
base32.h \
base64.h \
basecode.h \
# bench \
blake2.h \
blowfish.h \
blumshub.h \
camellia.h \
cast.h \
cbcmac.h \
ccm.h \
chacha.h \
channels.h \
cmac.h \
config.h \
cpu.h \
crc.h \
cryptlib.h \
default.h \
des.h \
dh.h \
dh2.h \
dll.h \
dmac.h \
dsa.h \
eax.h \
ec2n.h \
eccrypto.h \
ecp.h \
elgamal.h \
emsa2.h \
eprecomp.h \
esign.h \
factory.h \
fhmqv.h \
files.h \
filters.h \
fips140.h \
fltrimpl.h \
gcm.h \
gf2_32.h \
gf2n.h \
gf256.h \
gfpcrypt.h \
gost.h \
gzip.h \
hex.h \
hkdf.h \
hmac.h \
hmqv.h \
hrtimer.h \
ida.h \
idea.h \
integer.h \
iterhash.h \
keccak.h \
lubyrack.h \
luc.h \
mars.h \
md2.h \
md4.h \
md5.h \
mdc.h \
mersenne.h \
misc.h \
modarith.h \
modes.h \
modexppc.h \
mqueue.h \
mqv.h \
nbtheory.h \
network.h \
nr.h \
oaep.h \
oids.h \
osrng.h \
ossig.h \
panama.h \
pch.h \
pkcspad.h \
polynomi.h \
pssr.h \
pubkey.h \
pwdbased.h \
queue.h \
rabin.h \
randpool.h \
rc2.h \
rc5.h \
rc6.h \
rdrand.h \
resource.h \
rijndael.h \
ripemd.h \
rng.h \
rsa.h \
rw.h \
safer.h \
salsa.h \
seal.h \
secblock.h \
seckey.h \
seed.h \
serpent.h \
serpentp.h \
sha.h \
sha3.h \
shacal2.h \
shark.h \
simple.h \
skipjack.h \
smartptr.h \
socketft.h \
sosemanuk.h \
square.h \
stdcpp.h \
strciphr.h \
tea.h \
tiger.h \
trap.h \
trdlocal.h \
trunhash.h \
ttmac.h \
twofish.h \
# validate.h \
vmac.h \
wait.h \
wake.h \
whrlpool.h \
winpipes.h \
words.h \
xtr.h \
xtrcrypt.h \
zdeflate.h \
zinflate.h \
zlib.h \

unix {
target.path = /usr/lib
INSTALLS += target
}

# added manually
LIBS += -lws2_32
CONFIG += warn_off


CryptoPPTest.pro:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += bench1.cpp bench2.cpp datatest.cpp dlltest.cpp fipsalgt.cpp \
fipstest.cpp regtest.cpp test.cpp validat1.cpp validat2.cpp validat3.cpp \
keccak.cpp blake2.cpp chacha.cpp rdrand.cpp \


HEADERS += bench.h validate.h keccak.h blake2.h chacha.h rdrand.h

#added manually
DEFINES -= UNICODE
CONFIG += warn_off
LIBS += -lws2_32

OTHER_FILES += TestData\* TestVectors\*
CONFIG(release, debug|release): DESTDIR = $$OUT_PWD/release
CONFIG(debug, debug|release): DESTDIR = $$OUT_PWD/debug
TestData.path = $${DESTDIR}/TestData
TestData.files = TestData/*
TestVectors.path = $${DESTDIR}/TestVectors
TestVectors.files = TestVectors/*
INSTALLS += TestVectors TestData

# added by QTCreator
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/release/ -lCryptoPPLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/debug/ -lCryptoPPLib
else:unix: LIBS += -L$$PWD/ -lCryptoPPLib
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/