mirror of
https://github.com/shadps4-emu/ext-cryptopp.git
synced 2024-11-23 09:59:42 +00:00
merge in 5.0.4 changes (exclude DES and SHA-2 from DLL),
attempt (failed) to build DLL with GCC
This commit is contained in:
parent
699e6219b5
commit
473e5df89b
36
GNUmakefile
36
GNUmakefile
@ -44,13 +44,19 @@ endif
|
|||||||
|
|
||||||
OBJS = $(SRCS:.cpp=.o)
|
OBJS = $(SRCS:.cpp=.o)
|
||||||
# test.o needs to be after bench.o for cygwin 1.1.4 (possible ld bug?)
|
# test.o needs to be after bench.o for cygwin 1.1.4 (possible ld bug?)
|
||||||
TESTOBJS = bench.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o
|
TESTOBJS = bench.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o
|
||||||
LIBOBJS = $(filter-out $(TESTOBJS),$(OBJS))
|
LIBOBJS = $(filter-out $(TESTOBJS),$(OBJS))
|
||||||
|
|
||||||
|
DLLSRCS = algebra.cpp algparam.cpp asn.cpp basecode.cpp cbcmac.cpp channels.cpp cryptlib.cpp des.cpp dessp.cpp dh.cpp dll.cpp dsa.cpp ec2n.cpp eccrypto.cpp ecp.cpp eprecomp.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp gf2n.cpp gfpcrypt.cpp hex.cpp hmac.cpp integer.cpp iterhash.cpp misc.cpp modes.cpp modexppc.cpp mqueue.cpp nbtheory.cpp oaep.cpp osrng.cpp pch.cpp pkcspad.cpp pubkey.cpp queue.cpp randpool.cpp rdtables.cpp rijndael.cpp rng.cpp rsa.cpp sha.cpp simple.cpp skipjack.cpp strciphr.cpp trdlocal.cpp
|
||||||
|
DLLOBJS = $(DLLSRCS:.cpp=.export.o)
|
||||||
|
LIBIMPORTOBJS = $(LIBOBJS:.o=import.o)
|
||||||
|
TESTIMPORTOBJS = $(TESTOBJS:.o=import.o)
|
||||||
|
DLLTESTOBJS = dlltest.dllonly.o
|
||||||
|
|
||||||
all: cryptest.exe
|
all: cryptest.exe
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS)
|
$(RM) cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTIMPORTOBJS) $(DLLTESTOBJS)
|
||||||
|
|
||||||
libcryptopp.a: $(LIBOBJS)
|
libcryptopp.a: $(LIBOBJS)
|
||||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||||
@ -62,6 +68,21 @@ cryptest.exe: libcryptopp.a $(TESTOBJS)
|
|||||||
nolib: $(OBJS) # makes it faster to test changes
|
nolib: $(OBJS) # makes it faster to test changes
|
||||||
$(CXX) -o ct $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
|
$(CXX) -o ct $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
|
||||||
|
|
||||||
|
dll: cryptest.import.exe dlltest.exe
|
||||||
|
|
||||||
|
cryptopp.dll: $(DLLOBJS)
|
||||||
|
$(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a
|
||||||
|
|
||||||
|
libcryptopp.import.a: $(LIBIMPORTOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
cryptest.import.exe: cryptopp.dll libcryptopp.import.a $(TESTIMPORTOBJS)
|
||||||
|
$(CXX) -o $@ $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS)
|
||||||
|
|
||||||
|
dlltest.exe: cryptopp.dll $(DLLTESTOBJS)
|
||||||
|
$(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS)
|
||||||
|
|
||||||
adhoc.cpp: adhoc.cpp.proto
|
adhoc.cpp: adhoc.cpp.proto
|
||||||
ifeq ($(wildcard adhoc.cpp),)
|
ifeq ($(wildcard adhoc.cpp),)
|
||||||
cp adhoc.cpp.proto adhoc.cpp
|
cp adhoc.cpp.proto adhoc.cpp
|
||||||
@ -69,7 +90,14 @@ else
|
|||||||
touch adhoc.cpp
|
touch adhoc.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.SUFFIXES: .cpp
|
%.dllonly.o : %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -DCRYPTOPP_DLL_ONLY -c $< -o $@
|
||||||
|
|
||||||
.cpp.o:
|
%.import.o : %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -DCRYPTOPP_IMPORTS -c $< -o $@
|
||||||
|
|
||||||
|
%.export.o : %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) -DCRYPTOPP_EXPORTS -c $< -o $@
|
||||||
|
|
||||||
|
%.o : %.cpp
|
||||||
$(CXX) $(CXXFLAGS) -c $<
|
$(CXX) $(CXXFLAGS) -c $<
|
||||||
|
@ -248,6 +248,8 @@ History
|
|||||||
5.03 - created DLL version of Crypto++ for FIPS 140-2 validation
|
5.03 - created DLL version of Crypto++ for FIPS 140-2 validation
|
||||||
- fixed vulnerabilities in GetNextIV for CTR and OFB modes
|
- fixed vulnerabilities in GetNextIV for CTR and OFB modes
|
||||||
|
|
||||||
|
5.0.4 - Removed DES, SHA-256, SHA-384, SHA-512 from DLL
|
||||||
|
|
||||||
5.1 - added PSS padding and changed PSSR to track IEEE P1363a draft standard
|
5.1 - added PSS padding and changed PSSR to track IEEE P1363a draft standard
|
||||||
- added blinding for RSA and Rabin to defend against timing attacks
|
- added blinding for RSA and Rabin to defend against timing attacks
|
||||||
on decryption operations
|
on decryption operations
|
||||||
@ -260,4 +262,4 @@ History
|
|||||||
- fixed a number of compiler warnings, minor bugs, and portability problems
|
- fixed a number of compiler warnings, minor bugs, and portability problems
|
||||||
- removed Sapphire
|
- removed Sapphire
|
||||||
|
|
||||||
5.2 - Merged in changes for 5.01 - 5.03
|
5.2 - Merged in changes for 5.01 - 5.04
|
||||||
|
65
config.h
65
config.h
@ -191,35 +191,6 @@ NAMESPACE_END
|
|||||||
# pragma warning(disable: 4231 4250 4251 4275 4660 4661 4786 4355)
|
# pragma warning(disable: 4231 4250 4251 4275 4660 4661 4786 4355)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
#ifdef CRYPTOPP_EXPORTS
|
|
||||||
#define CRYPTOPP_IS_DLL
|
|
||||||
#define CRYPTOPP_DLL __declspec(dllexport)
|
|
||||||
#elif defined(CRYPTOPP_IMPORTS)
|
|
||||||
#define CRYPTOPP_IS_DLL
|
|
||||||
#define CRYPTOPP_DLL __declspec(dllimport)
|
|
||||||
#else
|
|
||||||
#define CRYPTOPP_DLL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CRYPTOPP_API __stdcall
|
|
||||||
|
|
||||||
#else // _MSC_VER
|
|
||||||
|
|
||||||
#define CRYPTOPP_DLL
|
|
||||||
#define CRYPTOPP_API
|
|
||||||
|
|
||||||
#endif // _MSC_VER
|
|
||||||
|
|
||||||
#ifdef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
|
|
||||||
#define CRYPTOPP_MANUAL_EXTERN
|
|
||||||
#else
|
|
||||||
#define CRYPTOPP_MANUAL_EXTERN extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_MANUAL_EXTERN template class CRYPTOPP_DLL
|
|
||||||
|
|
||||||
// ***************** determine availability of OS features ********************
|
// ***************** determine availability of OS features ********************
|
||||||
|
|
||||||
#ifndef NO_OS_DEPENDENCE
|
#ifndef NO_OS_DEPENDENCE
|
||||||
@ -278,4 +249,40 @@ NAMESPACE_END
|
|||||||
|
|
||||||
#endif // NO_OS_DEPENDENCE
|
#endif // NO_OS_DEPENDENCE
|
||||||
|
|
||||||
|
// ***************** DLL related ********************
|
||||||
|
|
||||||
|
#ifdef CRYPTOPP_WIN32_AVAILABLE
|
||||||
|
|
||||||
|
#ifdef CRYPTOPP_EXPORTS
|
||||||
|
#define CRYPTOPP_IS_DLL
|
||||||
|
#define CRYPTOPP_DLL __declspec(dllexport)
|
||||||
|
#elif defined(CRYPTOPP_IMPORTS)
|
||||||
|
#define CRYPTOPP_IS_DLL
|
||||||
|
#define CRYPTOPP_DLL __declspec(dllimport)
|
||||||
|
#else
|
||||||
|
#define CRYPTOPP_DLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CRYPTOPP_API __stdcall
|
||||||
|
|
||||||
|
#else // CRYPTOPP_WIN32_AVAILABLE
|
||||||
|
|
||||||
|
#define CRYPTOPP_NO_DLL
|
||||||
|
#define CRYPTOPP_DLL
|
||||||
|
#define CRYPTOPP_API
|
||||||
|
|
||||||
|
#endif // CRYPTOPP_WIN32_AVAILABLE
|
||||||
|
|
||||||
|
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
|
||||||
|
#define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
|
||||||
|
#else
|
||||||
|
#define CRYPTOPP_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
|
||||||
|
#define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
|
||||||
|
#else
|
||||||
|
#define CRYPTOPP_STATIC_TEMPLATE_CLASS extern template class
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -81,7 +81,7 @@ SOURCE="$(InputPath)"
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRYPTDLL_EXPORTS" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRYPTDLL_EXPORTS" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /G5 /Gz /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRYPTOPP_EXPORTS" /D CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2=1 /D "USE_PRECOMPILED_HEADERS" /Yu"pch.h" /FD /GZ /Zm200 /c
|
# ADD CPP /nologo /G5 /Gz /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CRYPTOPP_EXPORTS" /D CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2=1 /D "USE_PRECOMPILED_HEADERS" /Yu"pch.h" /FD /GZ /Zm200 /c
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
|
12
cryptest.dsw
12
cryptest.dsw
@ -76,6 +76,18 @@ Package=<4>
|
|||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "dlltest"=.\dlltest.dsp - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
Global:
|
Global:
|
||||||
|
|
||||||
Package=<5>
|
Package=<5>
|
||||||
|
@ -49,15 +49,15 @@
|
|||||||
In the FIPS 140-2 validated DLL version of Crypto++, only the following implementation class are available.
|
In the FIPS 140-2 validated DLL version of Crypto++, only the following implementation class are available.
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Block Ciphers<dd>
|
<dt>Block Ciphers<dd>
|
||||||
AES, DES, DES_EDE2, DES_EDE3, SKIPJACK
|
AES, DES_EDE2, DES_EDE3, SKIPJACK
|
||||||
<dt>Cipher Modes (replace template parameter BC with one of the block ciphers above)<dd>
|
<dt>Cipher Modes (replace template parameter BC with one of the block ciphers above)<dd>
|
||||||
ECB_Mode <BC>, CTR_Mode <BC>, CBC_Mode <BC>, CFB_Mode <BC>, OFB_Mode <BC>
|
ECB_Mode <BC>, CTR_Mode <BC>, CBC_Mode <BC>, CFB_Mode <BC>, OFB_Mode <BC>
|
||||||
<dt>Hash Functions<dd>
|
<dt>Hash Functions<dd>
|
||||||
SHA, SHA256, SHA384, SHA512
|
SHA
|
||||||
<dt>Public Key Signature Schemes<dd>
|
<dt>Public Key Signature Schemes<dd>
|
||||||
RSASSA <PKCS1v15, SHA>, DSA, ECDSA <ECP, SHA>, ECDSA <EC2N, SHA>
|
RSASSA <PKCS1v15, SHA>, DSA, ECDSA <ECP, SHA>, ECDSA <EC2N, SHA>
|
||||||
<dt>Message Authentication Codes<dd>
|
<dt>Message Authentication Codes<dd>
|
||||||
HMAC <SHA>, HMAC <SHA256>, HMAC <SHA384>, HMAC <SHA512>, CBC_MAC <DES>, CBC_MAC <DES_EDE2>, CBC_MAC <DES_EDE3>
|
HMAC <SHA>, CBC_MAC <DES_EDE2>, CBC_MAC <DES_EDE3>
|
||||||
<dt>Random Number Generators<dd>
|
<dt>Random Number Generators<dd>
|
||||||
AutoSeededX917RNG <DES_EDE3>
|
AutoSeededX917RNG <DES_EDE3>
|
||||||
<dt>Key Agreement<dd>
|
<dt>Key Agreement<dd>
|
||||||
|
@ -44,7 +44,7 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "040904b0"
|
BLOCK "040904b0"
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "Comments", "free crypto library, more info at www.cryptopp.com\0"
|
VALUE "Comments", "free crypto library, more information available at www.cryptopp.com\0"
|
||||||
VALUE "CompanyName", "Wei Dai\0"
|
VALUE "CompanyName", "Wei Dai\0"
|
||||||
VALUE "FileDescription", "Crypto++® Library DLL\0"
|
VALUE "FileDescription", "Crypto++® Library DLL\0"
|
||||||
VALUE "FileVersion", "5, 2, 0, 0\0"
|
VALUE "FileVersion", "5, 2, 0, 0\0"
|
||||||
|
291
des.cpp
291
des.cpp
@ -20,29 +20,105 @@
|
|||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
|
typedef BlockGetAndPut<word32, BigEndian> Block;
|
||||||
|
|
||||||
|
// Richard Outerbridge's initial permutation algorithm
|
||||||
|
/*
|
||||||
|
inline void IPERM(word32 &left, word32 &right)
|
||||||
|
{
|
||||||
|
word32 work;
|
||||||
|
|
||||||
|
work = ((left >> 4) ^ right) & 0x0f0f0f0f;
|
||||||
|
right ^= work;
|
||||||
|
left ^= work << 4;
|
||||||
|
work = ((left >> 16) ^ right) & 0xffff;
|
||||||
|
right ^= work;
|
||||||
|
left ^= work << 16;
|
||||||
|
work = ((right >> 2) ^ left) & 0x33333333;
|
||||||
|
left ^= work;
|
||||||
|
right ^= (work << 2);
|
||||||
|
work = ((right >> 8) ^ left) & 0xff00ff;
|
||||||
|
left ^= work;
|
||||||
|
right ^= (work << 8);
|
||||||
|
right = rotl(right, 1);
|
||||||
|
work = (left ^ right) & 0xaaaaaaaa;
|
||||||
|
left ^= work;
|
||||||
|
right ^= work;
|
||||||
|
left = rotl(left, 1);
|
||||||
|
}
|
||||||
|
inline void FPERM(word32 &left, word32 &right)
|
||||||
|
{
|
||||||
|
word32 work;
|
||||||
|
|
||||||
|
right = rotr(right, 1);
|
||||||
|
work = (left ^ right) & 0xaaaaaaaa;
|
||||||
|
left ^= work;
|
||||||
|
right ^= work;
|
||||||
|
left = rotr(left, 1);
|
||||||
|
work = ((left >> 8) ^ right) & 0xff00ff;
|
||||||
|
right ^= work;
|
||||||
|
left ^= work << 8;
|
||||||
|
work = ((left >> 2) ^ right) & 0x33333333;
|
||||||
|
right ^= work;
|
||||||
|
left ^= work << 2;
|
||||||
|
work = ((right >> 16) ^ left) & 0xffff;
|
||||||
|
left ^= work;
|
||||||
|
right ^= work << 16;
|
||||||
|
work = ((right >> 4) ^ left) & 0x0f0f0f0f;
|
||||||
|
left ^= work;
|
||||||
|
right ^= work << 4;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Wei Dai's modification to Richard Outerbridge's initial permutation
|
||||||
|
// algorithm, this one is faster if you have access to rotate instructions
|
||||||
|
// (like in MSVC)
|
||||||
|
static inline void IPERM(word32 &left, word32 &right)
|
||||||
|
{
|
||||||
|
word32 work;
|
||||||
|
|
||||||
|
right = rotlFixed(right, 4U);
|
||||||
|
work = (left ^ right) & 0xf0f0f0f0;
|
||||||
|
left ^= work;
|
||||||
|
right = rotrFixed(right^work, 20U);
|
||||||
|
work = (left ^ right) & 0xffff0000;
|
||||||
|
left ^= work;
|
||||||
|
right = rotrFixed(right^work, 18U);
|
||||||
|
work = (left ^ right) & 0x33333333;
|
||||||
|
left ^= work;
|
||||||
|
right = rotrFixed(right^work, 6U);
|
||||||
|
work = (left ^ right) & 0x00ff00ff;
|
||||||
|
left ^= work;
|
||||||
|
right = rotlFixed(right^work, 9U);
|
||||||
|
work = (left ^ right) & 0xaaaaaaaa;
|
||||||
|
left = rotlFixed(left^work, 1U);
|
||||||
|
right ^= work;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void FPERM(word32 &left, word32 &right)
|
||||||
|
{
|
||||||
|
word32 work;
|
||||||
|
|
||||||
|
right = rotrFixed(right, 1U);
|
||||||
|
work = (left ^ right) & 0xaaaaaaaa;
|
||||||
|
right ^= work;
|
||||||
|
left = rotrFixed(left^work, 9U);
|
||||||
|
work = (left ^ right) & 0x00ff00ff;
|
||||||
|
right ^= work;
|
||||||
|
left = rotlFixed(left^work, 6U);
|
||||||
|
work = (left ^ right) & 0x33333333;
|
||||||
|
right ^= work;
|
||||||
|
left = rotlFixed(left^work, 18U);
|
||||||
|
work = (left ^ right) & 0xffff0000;
|
||||||
|
right ^= work;
|
||||||
|
left = rotlFixed(left^work, 20U);
|
||||||
|
work = (left ^ right) & 0xf0f0f0f0;
|
||||||
|
right ^= work;
|
||||||
|
left = rotrFixed(left^work, 4U);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef CRYPTOPP_IMPORTS
|
#ifndef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
static inline bool CheckParity(byte b)
|
|
||||||
{
|
|
||||||
unsigned int a = b ^ (b >> 4);
|
|
||||||
return ((a ^ (a>>1) ^ (a>>2) ^ (a>>3)) & 1) == 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DES::CheckKeyParityBits(const byte *key)
|
|
||||||
{
|
|
||||||
for (unsigned int i=0; i<8; i++)
|
|
||||||
if (!CheckParity(key[i]))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DES::CorrectKeyParityBits(byte *key)
|
|
||||||
{
|
|
||||||
for (unsigned int i=0; i<8; i++)
|
|
||||||
if (!CheckParity(key[i]))
|
|
||||||
key[i] ^= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tables defined in the Data Encryption Standard documents
|
/* Tables defined in the Data Encryption Standard documents
|
||||||
* Three of these tables, the initial permutation, the final
|
* Three of these tables, the initial permutation, the final
|
||||||
* permutation and the expansion operator, are regular enough that
|
* permutation and the expansion operator, are regular enough that
|
||||||
@ -188,10 +264,8 @@ static const int bytebit[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Set key (initialize key schedule array) */
|
/* Set key (initialize key schedule array) */
|
||||||
void DES::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
void RawDES::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
||||||
{
|
{
|
||||||
AssertValidKeyLength(length);
|
|
||||||
|
|
||||||
SecByteBlock buffer(56+56+8);
|
SecByteBlock buffer(56+56+8);
|
||||||
byte *const pc1m=buffer; /* place to modify pc1 into */
|
byte *const pc1m=buffer; /* place to modify pc1 into */
|
||||||
byte *const pcr=pc1m+56; /* place to rotate pc1 into */
|
byte *const pcr=pc1m+56; /* place to rotate pc1 into */
|
||||||
@ -238,102 +312,7 @@ void DES::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int len
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Richard Outerbridge's initial permutation algorithm
|
void RawDES::RawProcessBlock(word32 &l_, word32 &r_) const
|
||||||
/*
|
|
||||||
inline void IPERM(word32 &left, word32 &right)
|
|
||||||
{
|
|
||||||
word32 work;
|
|
||||||
|
|
||||||
work = ((left >> 4) ^ right) & 0x0f0f0f0f;
|
|
||||||
right ^= work;
|
|
||||||
left ^= work << 4;
|
|
||||||
work = ((left >> 16) ^ right) & 0xffff;
|
|
||||||
right ^= work;
|
|
||||||
left ^= work << 16;
|
|
||||||
work = ((right >> 2) ^ left) & 0x33333333;
|
|
||||||
left ^= work;
|
|
||||||
right ^= (work << 2);
|
|
||||||
work = ((right >> 8) ^ left) & 0xff00ff;
|
|
||||||
left ^= work;
|
|
||||||
right ^= (work << 8);
|
|
||||||
right = rotl(right, 1);
|
|
||||||
work = (left ^ right) & 0xaaaaaaaa;
|
|
||||||
left ^= work;
|
|
||||||
right ^= work;
|
|
||||||
left = rotl(left, 1);
|
|
||||||
}
|
|
||||||
inline void FPERM(word32 &left, word32 &right)
|
|
||||||
{
|
|
||||||
word32 work;
|
|
||||||
|
|
||||||
right = rotr(right, 1);
|
|
||||||
work = (left ^ right) & 0xaaaaaaaa;
|
|
||||||
left ^= work;
|
|
||||||
right ^= work;
|
|
||||||
left = rotr(left, 1);
|
|
||||||
work = ((left >> 8) ^ right) & 0xff00ff;
|
|
||||||
right ^= work;
|
|
||||||
left ^= work << 8;
|
|
||||||
work = ((left >> 2) ^ right) & 0x33333333;
|
|
||||||
right ^= work;
|
|
||||||
left ^= work << 2;
|
|
||||||
work = ((right >> 16) ^ left) & 0xffff;
|
|
||||||
left ^= work;
|
|
||||||
right ^= work << 16;
|
|
||||||
work = ((right >> 4) ^ left) & 0x0f0f0f0f;
|
|
||||||
left ^= work;
|
|
||||||
right ^= work << 4;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Wei Dai's modification to Richard Outerbridge's initial permutation
|
|
||||||
// algorithm, this one is faster if you have access to rotate instructions
|
|
||||||
// (like in MSVC)
|
|
||||||
static inline void IPERM(word32 &left, word32 &right)
|
|
||||||
{
|
|
||||||
word32 work;
|
|
||||||
|
|
||||||
right = rotlFixed(right, 4U);
|
|
||||||
work = (left ^ right) & 0xf0f0f0f0;
|
|
||||||
left ^= work;
|
|
||||||
right = rotrFixed(right^work, 20U);
|
|
||||||
work = (left ^ right) & 0xffff0000;
|
|
||||||
left ^= work;
|
|
||||||
right = rotrFixed(right^work, 18U);
|
|
||||||
work = (left ^ right) & 0x33333333;
|
|
||||||
left ^= work;
|
|
||||||
right = rotrFixed(right^work, 6U);
|
|
||||||
work = (left ^ right) & 0x00ff00ff;
|
|
||||||
left ^= work;
|
|
||||||
right = rotlFixed(right^work, 9U);
|
|
||||||
work = (left ^ right) & 0xaaaaaaaa;
|
|
||||||
left = rotlFixed(left^work, 1U);
|
|
||||||
right ^= work;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void FPERM(word32 &left, word32 &right)
|
|
||||||
{
|
|
||||||
word32 work;
|
|
||||||
|
|
||||||
right = rotrFixed(right, 1U);
|
|
||||||
work = (left ^ right) & 0xaaaaaaaa;
|
|
||||||
right ^= work;
|
|
||||||
left = rotrFixed(left^work, 9U);
|
|
||||||
work = (left ^ right) & 0x00ff00ff;
|
|
||||||
right ^= work;
|
|
||||||
left = rotlFixed(left^work, 6U);
|
|
||||||
work = (left ^ right) & 0x33333333;
|
|
||||||
right ^= work;
|
|
||||||
left = rotlFixed(left^work, 18U);
|
|
||||||
work = (left ^ right) & 0xffff0000;
|
|
||||||
right ^= work;
|
|
||||||
left = rotlFixed(left^work, 20U);
|
|
||||||
work = (left ^ right) & 0xf0f0f0f0;
|
|
||||||
right ^= work;
|
|
||||||
left = rotrFixed(left^work, 4U);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DES::Base::RawProcessBlock(word32 &l_, word32 &r_) const
|
|
||||||
{
|
{
|
||||||
word32 l = l_, r = r_;
|
word32 l = l_, r = r_;
|
||||||
const word32 *kptr=k;
|
const word32 *kptr=k;
|
||||||
@ -366,46 +345,6 @@ void DES::Base::RawProcessBlock(word32 &l_, word32 &r_) const
|
|||||||
l_ = l; r_ = r;
|
l_ = l; r_ = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef BlockGetAndPut<word32, BigEndian> Block;
|
|
||||||
|
|
||||||
// Encrypt or decrypt a block of data in ECB mode
|
|
||||||
void DES::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
|
|
||||||
{
|
|
||||||
word32 l,r;
|
|
||||||
Block::Get(inBlock)(l)(r);
|
|
||||||
IPERM(l,r);
|
|
||||||
|
|
||||||
const word32 *kptr=k;
|
|
||||||
|
|
||||||
for (unsigned i=0; i<8; i++)
|
|
||||||
{
|
|
||||||
word32 work = rotrFixed(r, 4U) ^ kptr[4*i+0];
|
|
||||||
l ^= Spbox[6][(work) & 0x3f]
|
|
||||||
^ Spbox[4][(work >> 8) & 0x3f]
|
|
||||||
^ Spbox[2][(work >> 16) & 0x3f]
|
|
||||||
^ Spbox[0][(work >> 24) & 0x3f];
|
|
||||||
work = r ^ kptr[4*i+1];
|
|
||||||
l ^= Spbox[7][(work) & 0x3f]
|
|
||||||
^ Spbox[5][(work >> 8) & 0x3f]
|
|
||||||
^ Spbox[3][(work >> 16) & 0x3f]
|
|
||||||
^ Spbox[1][(work >> 24) & 0x3f];
|
|
||||||
|
|
||||||
work = rotrFixed(l, 4U) ^ kptr[4*i+2];
|
|
||||||
r ^= Spbox[6][(work) & 0x3f]
|
|
||||||
^ Spbox[4][(work >> 8) & 0x3f]
|
|
||||||
^ Spbox[2][(work >> 16) & 0x3f]
|
|
||||||
^ Spbox[0][(work >> 24) & 0x3f];
|
|
||||||
work = l ^ kptr[4*i+3];
|
|
||||||
r ^= Spbox[7][(work) & 0x3f]
|
|
||||||
^ Spbox[5][(work >> 8) & 0x3f]
|
|
||||||
^ Spbox[3][(work >> 16) & 0x3f]
|
|
||||||
^ Spbox[1][(work >> 24) & 0x3f];
|
|
||||||
}
|
|
||||||
|
|
||||||
FPERM(l,r);
|
|
||||||
Block::Put(xorBlock, outBlock)(r)(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DES_EDE2::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
void DES_EDE2::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
||||||
{
|
{
|
||||||
AssertValidKeyLength(length);
|
AssertValidKeyLength(length);
|
||||||
@ -449,6 +388,38 @@ void DES_EDE3::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBloc
|
|||||||
|
|
||||||
#endif // #ifndef CRYPTOPP_IMPORTS
|
#endif // #ifndef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
|
static inline bool CheckParity(byte b)
|
||||||
|
{
|
||||||
|
unsigned int a = b ^ (b >> 4);
|
||||||
|
return ((a ^ (a>>1) ^ (a>>2) ^ (a>>3)) & 1) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DES::CheckKeyParityBits(const byte *key)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i<8; i++)
|
||||||
|
if (!CheckParity(key[i]))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DES::CorrectKeyParityBits(byte *key)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i<8; i++)
|
||||||
|
if (!CheckParity(key[i]))
|
||||||
|
key[i] ^= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encrypt or decrypt a block of data in ECB mode
|
||||||
|
void DES::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
|
||||||
|
{
|
||||||
|
word32 l,r;
|
||||||
|
Block::Get(inBlock)(l)(r);
|
||||||
|
IPERM(l,r);
|
||||||
|
RawProcessBlock(l, r);
|
||||||
|
FPERM(l,r);
|
||||||
|
Block::Put(xorBlock, outBlock)(r)(l);
|
||||||
|
}
|
||||||
|
|
||||||
void DES_XEX3::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
void DES_XEX3::Base::UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length)
|
||||||
{
|
{
|
||||||
AssertValidKeyLength(length);
|
AssertValidKeyLength(length);
|
||||||
|
30
des.h
30
des.h
@ -9,9 +9,22 @@
|
|||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
|
class CRYPTOPP_DLL RawDES
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length = 8);
|
||||||
|
void RawProcessBlock(word32 &l, word32 &r) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const word32 Spbox[8][64];
|
||||||
|
|
||||||
|
FixedSizeSecBlock<word32, 32> k;
|
||||||
|
};
|
||||||
|
|
||||||
struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
|
struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
|
||||||
{
|
{
|
||||||
CRYPTOPP_DLL static const char * StaticAlgorithmName() {return "DES";}
|
// disable DES in DLL version by not exporting this function
|
||||||
|
static const char * StaticAlgorithmName() {return "DES";}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <a href="http://www.weidai.com/scan-mirror/cs.html#DES">DES</a>
|
/// <a href="http://www.weidai.com/scan-mirror/cs.html#DES">DES</a>
|
||||||
@ -21,19 +34,10 @@ struct DES_Info : public FixedBlockSize<8>, public FixedKeyLength<8>
|
|||||||
check or correct the parity bits if you wish. */
|
check or correct the parity bits if you wish. */
|
||||||
class DES : public DES_Info, public BlockCipherDocumentation
|
class DES : public DES_Info, public BlockCipherDocumentation
|
||||||
{
|
{
|
||||||
class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_Info>
|
class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<DES_Info>, public RawDES
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length = 8);
|
|
||||||
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
||||||
|
|
||||||
// exposed for faster Triple-DES
|
|
||||||
void RawProcessBlock(word32 &l, word32 &r) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static const word32 Spbox[8][64];
|
|
||||||
|
|
||||||
FixedSizeSecBlock<word32, 32> k;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -61,7 +65,7 @@ class DES_EDE2 : public DES_EDE2_Info, public BlockCipherDocumentation
|
|||||||
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DES::Encryption m_des1, m_des2;
|
RawDES m_des1, m_des2;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -84,7 +88,7 @@ class DES_EDE3 : public DES_EDE3_Info, public BlockCipherDocumentation
|
|||||||
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DES::Encryption m_des1, m_des2, m_des3;
|
RawDES m_des1, m_des2, m_des3;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -15,7 +15,7 @@ void DES_VC60Workaround()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const word32 DES::Base::Spbox[8][64] = {
|
const word32 RawDES::Spbox[8][64] = {
|
||||||
{
|
{
|
||||||
0x01010400,0x00000000,0x00010000,0x01010404, 0x01010004,0x00010404,0x00000004,0x00010000,
|
0x01010400,0x00000000,0x00010000,0x01010404, 0x01010004,0x00010404,0x00000004,0x00010000,
|
||||||
0x00000400,0x01010400,0x01010404,0x00000400, 0x01000404,0x01010004,0x01000000,0x00000004,
|
0x00000400,0x01010400,0x01010404,0x00000400, 0x01000404,0x01010004,0x01000000,0x00000004,
|
||||||
|
119
dll.cpp
119
dll.cpp
@ -1,33 +1,32 @@
|
|||||||
// dll.cpp - written and placed in the public domain by Wei Dai
|
// dll.cpp - written and placed in the public domain by Wei Dai
|
||||||
|
|
||||||
#ifndef CRYPTOPP_IMPORTS
|
|
||||||
|
|
||||||
#define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
|
#define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
|
||||||
|
|
||||||
#include "dll.h"
|
#include "dll.h"
|
||||||
#pragma warning(default: 4660)
|
#pragma warning(default: 4660)
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <new.h>
|
|
||||||
|
|
||||||
|
#include "iterhash.cpp"
|
||||||
#include "strciphr.cpp"
|
#include "strciphr.cpp"
|
||||||
#include "algebra.cpp"
|
#include "algebra.cpp"
|
||||||
#include "eprecomp.cpp"
|
#include "eprecomp.cpp"
|
||||||
#include "eccrypto.cpp"
|
#include "eccrypto.cpp"
|
||||||
#include "iterhash.cpp"
|
|
||||||
#include "oaep.cpp"
|
#include "oaep.cpp"
|
||||||
|
|
||||||
static const byte s_moduleMac[CryptoPP::HMAC<CryptoPP::SHA1>::DIGESTSIZE] = "reserved for mac";
|
#ifndef CRYPTOPP_IMPORTS
|
||||||
static HMODULE s_hModule = NULL;
|
|
||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
template<> const byte PKCS_DigestDecoration<SHA>::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14};
|
template<> const byte PKCS_DigestDecoration<SHA>::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14};
|
||||||
template<> const unsigned int PKCS_DigestDecoration<SHA>::length = sizeof(PKCS_DigestDecoration<SHA>::decoration);
|
template<> const unsigned int PKCS_DigestDecoration<SHA>::length = sizeof(PKCS_DigestDecoration<SHA>::decoration);
|
||||||
|
|
||||||
|
static const byte s_moduleMac[CryptoPP::HMAC<CryptoPP::SHA1>::DIGESTSIZE] = "reserved for mac";
|
||||||
|
static HMODULE s_hModule = NULL;
|
||||||
|
|
||||||
void DoDllPowerUpSelfTest()
|
void DoDllPowerUpSelfTest()
|
||||||
{
|
{
|
||||||
char moduleFileName[_MAX_PATH];
|
char moduleFileName[MAX_PATH];
|
||||||
GetModuleFileNameA(s_hModule, moduleFileName, sizeof(moduleFileName));
|
GetModuleFileNameA(s_hModule, moduleFileName, sizeof(moduleFileName));
|
||||||
CryptoPP::DoPowerUpSelfTest(moduleFileName, s_moduleMac);
|
CryptoPP::DoPowerUpSelfTest(moduleFileName, s_moduleMac);
|
||||||
}
|
}
|
||||||
@ -40,43 +39,87 @@ NAMESPACE_END
|
|||||||
|
|
||||||
USING_NAMESPACE(CryptoPP)
|
USING_NAMESPACE(CryptoPP)
|
||||||
|
|
||||||
|
#if !(defined(_MSC_VER) && (_MSC_VER < 1300))
|
||||||
|
using std::set_new_handler;
|
||||||
|
#endif
|
||||||
|
|
||||||
static PNew s_pNew = NULL;
|
static PNew s_pNew = NULL;
|
||||||
static PDelete s_pDelete = NULL;
|
static PDelete s_pDelete = NULL;
|
||||||
|
|
||||||
|
static void * _cdecl New (size_t size)
|
||||||
|
{
|
||||||
|
new_handler newHandler = set_new_handler(NULL);
|
||||||
|
if (newHandler)
|
||||||
|
set_new_handler(newHandler);
|
||||||
|
|
||||||
|
void *p;
|
||||||
|
while (!(p = malloc(size)))
|
||||||
|
{
|
||||||
|
if (newHandler)
|
||||||
|
newHandler();
|
||||||
|
else
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetNewAndDeleteFunctionPointers()
|
||||||
|
{
|
||||||
|
void *p = NULL;
|
||||||
|
HMODULE hModule = NULL;
|
||||||
|
MEMORY_BASIC_INFORMATION mbi;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
VirtualQuery(p, &mbi, sizeof(mbi));
|
||||||
|
|
||||||
|
if (p >= (char *)mbi.BaseAddress + mbi.RegionSize)
|
||||||
|
break;
|
||||||
|
|
||||||
|
p = (char *)mbi.BaseAddress + mbi.RegionSize;
|
||||||
|
|
||||||
|
if (!mbi.AllocationBase || mbi.AllocationBase == hModule)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hModule = HMODULE(mbi.AllocationBase);
|
||||||
|
|
||||||
|
PGetNewAndDelete pGetNewAndDelete = (PGetNewAndDelete)GetProcAddress(hModule, "GetNewAndDeleteForCryptoPP");
|
||||||
|
if (pGetNewAndDelete)
|
||||||
|
{
|
||||||
|
pGetNewAndDelete(s_pNew, s_pDelete);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PSetNewAndDelete pSetNewAndDelete = (PSetNewAndDelete)GetProcAddress(hModule, "SetNewAndDeleteFromCryptoPP");
|
||||||
|
if (pSetNewAndDelete)
|
||||||
|
{
|
||||||
|
s_pNew = &New;
|
||||||
|
s_pDelete = &free;
|
||||||
|
pSetNewAndDelete(s_pNew, s_pDelete, &set_new_handler);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hModule = GetModuleHandle("msvcrtd");
|
||||||
|
if (!hModule)
|
||||||
|
hModule = GetModuleHandle("msvcrt");
|
||||||
|
if (hModule)
|
||||||
|
{
|
||||||
|
s_pNew = (PNew)GetProcAddress(hModule, "??2@YAPAXI@Z"); // operator new
|
||||||
|
s_pDelete = (PDelete)GetProcAddress(hModule, "??3@YAXPAX@Z"); // operator delete
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputDebugString("Crypto++ was not able to obtain new and delete function pointers.\n");
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
|
||||||
void * _cdecl operator new (size_t size)
|
void * _cdecl operator new (size_t size)
|
||||||
{
|
{
|
||||||
if (!s_pNew)
|
if (!s_pNew)
|
||||||
{
|
SetNewAndDeleteFunctionPointers();
|
||||||
HMODULE hExe = GetModuleHandle(NULL);
|
|
||||||
PGetNewAndDelete pGetNewAndDelete = (PGetNewAndDelete)GetProcAddress(hExe, "GetNewAndDeleteForCryptoPP");
|
|
||||||
if (pGetNewAndDelete)
|
|
||||||
pGetNewAndDelete(s_pNew, s_pDelete);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PSetNewAndDelete pSetNewAndDelete = (PSetNewAndDelete)GetProcAddress(hExe, "SetNewAndDeleteFromCryptoPP");
|
|
||||||
if (pSetNewAndDelete)
|
|
||||||
{
|
|
||||||
_set_new_mode(1);
|
|
||||||
s_pNew = &malloc;
|
|
||||||
s_pDelete = &free;
|
|
||||||
pSetNewAndDelete(s_pNew, s_pDelete, &_set_new_handler);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HMODULE hCrt = GetModuleHandle("msvcrtd");
|
|
||||||
if (!hCrt)
|
|
||||||
hCrt = GetModuleHandle("msvcrt");
|
|
||||||
if (hCrt)
|
|
||||||
{
|
|
||||||
s_pNew = (PNew)GetProcAddress(hCrt, "??2@YAPAXI@Z"); // operator new
|
|
||||||
s_pDelete = (PDelete)GetProcAddress(hCrt, "??3@YAXPAX@Z"); // operator delete
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!s_pNew || !s_pDelete)
|
|
||||||
OutputDebugString("Crypto++ was not able to obtain new and delete function pointers.");
|
|
||||||
}
|
|
||||||
return s_pNew(size);
|
return s_pNew(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,4 +140,4 @@ BOOL APIENTRY DllMain(HANDLE hModule,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // #ifdef CRYPTOPP_EXPORTS
|
||||||
|
10
dll.h
10
dll.h
@ -1,7 +1,7 @@
|
|||||||
#ifndef CRYPTOPP_DLL_H
|
#ifndef CRYPTOPP_DLL_H
|
||||||
#define CRYPTOPP_DLL_H
|
#define CRYPTOPP_DLL_H
|
||||||
|
|
||||||
#if !defined(CRYPTOPP_EXPORTS) && !defined(CRYPTOPP_IMPORTS) && !defined(CRYPTOPP_NO_DLL)
|
#if !defined(CRYPTOPP_IMPORTS) && !defined(CRYPTOPP_EXPORTS) && !defined(CRYPTOPP_NO_DLL)
|
||||||
#ifdef CRYPTOPP_CONFIG_H
|
#ifdef CRYPTOPP_CONFIG_H
|
||||||
#error To use the DLL version of Crypto++, this file must be included before any other Crypto++ header files.
|
#error To use the DLL version of Crypto++, this file must be included before any other Crypto++ header files.
|
||||||
#endif
|
#endif
|
||||||
@ -47,14 +47,18 @@
|
|||||||
|
|
||||||
#endif // #ifdef CRYPTOPP_IMPORTS
|
#endif // #ifdef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
#include <new.h> // for _PNH
|
#include <new> // for new_handler
|
||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
|
#if !(defined(_MSC_VER) && (_MSC_VER < 1300))
|
||||||
|
using std::new_handler;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef void * (_cdecl * PNew)(size_t);
|
typedef void * (_cdecl * PNew)(size_t);
|
||||||
typedef void (_cdecl * PDelete)(void *);
|
typedef void (_cdecl * PDelete)(void *);
|
||||||
typedef void (_cdecl * PGetNewAndDelete)(PNew &, PDelete &);
|
typedef void (_cdecl * PGetNewAndDelete)(PNew &, PDelete &);
|
||||||
typedef _PNH (_cdecl * PSetNewHandler)(_PNH);
|
typedef new_handler (_cdecl * PSetNewHandler)(new_handler);
|
||||||
typedef void (_cdecl * PSetNewAndDelete)(PNew, PDelete, PSetNewHandler);
|
typedef void (_cdecl * PSetNewAndDelete)(PNew, PDelete, PSetNewHandler);
|
||||||
|
|
||||||
CRYPTOPP_DLL void DoDllPowerUpSelfTest();
|
CRYPTOPP_DLL void DoDllPowerUpSelfTest();
|
||||||
|
26
dlltest.cpp
26
dlltest.cpp
@ -25,10 +25,10 @@ void FIPS140_SampleApplication()
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// trying to use a crypto algorithm after power-up self test error will result in an exception
|
// trying to use a crypto algorithm after power-up self test error will result in an exception
|
||||||
DES::Encryption des;
|
AES::Encryption aes;
|
||||||
|
|
||||||
// should not be here
|
// should not be here
|
||||||
cerr << "Use of DES failed to cause an exception after power-up self test error.\n";
|
cerr << "Use of AES failed to cause an exception after power-up self test error.\n";
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
catch (SelfTestFailure &e)
|
catch (SelfTestFailure &e)
|
||||||
@ -47,7 +47,7 @@ void FIPS140_SampleApplication()
|
|||||||
cout << "2. Re-do power-up self test passed.\n";
|
cout << "2. Re-do power-up self test passed.\n";
|
||||||
|
|
||||||
// encrypt and decrypt
|
// encrypt and decrypt
|
||||||
const byte key[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
|
const byte key[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
|
||||||
const byte iv[] = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
|
const byte iv[] = {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
|
||||||
const byte plaintext[] = { // "Now is the time for all " without tailing 0
|
const byte plaintext[] = { // "Now is the time for all " without tailing 0
|
||||||
0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,
|
0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74,
|
||||||
@ -56,20 +56,20 @@ void FIPS140_SampleApplication()
|
|||||||
byte ciphertext[24];
|
byte ciphertext[24];
|
||||||
byte decrypted[24];
|
byte decrypted[24];
|
||||||
|
|
||||||
CFB_Mode<DES>::Encryption encryption_DES_CBC;
|
CFB_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CBC;
|
||||||
encryption_DES_CBC.SetKeyWithIV(key, 8, iv);
|
encryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv);
|
||||||
encryption_DES_CBC.ProcessString(ciphertext, plaintext, 24);
|
encryption_DES_EDE3_CBC.ProcessString(ciphertext, plaintext, 24);
|
||||||
|
|
||||||
CFB_Mode<DES>::Decryption decryption_DES_CBC;
|
CFB_Mode<DES_EDE3>::Decryption decryption_DES_EDE3_CBC;
|
||||||
decryption_DES_CBC.SetKeyWithIV(key, 8, iv);
|
decryption_DES_EDE3_CBC.SetKeyWithIV(key, sizeof(key), iv);
|
||||||
decryption_DES_CBC.ProcessString(decrypted, ciphertext, 24);
|
decryption_DES_EDE3_CBC.ProcessString(decrypted, ciphertext, 24);
|
||||||
|
|
||||||
if (memcmp(plaintext, decrypted, 24) != 0)
|
if (memcmp(plaintext, decrypted, 24) != 0)
|
||||||
{
|
{
|
||||||
cerr << "DES-CBC Encryption/decryption failed.\n";
|
cerr << "DES-EDE3-CBC Encryption/decryption failed.\n";
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
cout << "3. DES-CBC Encryption/decryption succeeded.\n";
|
cout << "3. DES-EDE3-CBC Encryption/decryption succeeded.\n";
|
||||||
|
|
||||||
// hash
|
// hash
|
||||||
const byte message[] = {'a', 'b', 'c'};
|
const byte message[] = {'a', 'b', 'c'};
|
||||||
@ -152,10 +152,10 @@ void FIPS140_SampleApplication()
|
|||||||
// try to use an invalid key length
|
// try to use an invalid key length
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
encryption_DES_CBC.SetKey(key, 5);
|
encryption_DES_EDE3_CBC.SetKey(key, 5);
|
||||||
|
|
||||||
// should not be here
|
// should not be here
|
||||||
cerr << "DES implementation did not detect use of invalid key length.\n";
|
cerr << "DES-EDE3 implementation did not detect use of invalid key length.\n";
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
catch (InvalidArgument &e)
|
catch (InvalidArgument &e)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cryptlib.h"
|
#include "cryptlib.h"
|
||||||
|
#include "secblock.h"
|
||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
|
15
fipstest.cpp
15
fipstest.cpp
@ -5,7 +5,10 @@
|
|||||||
#ifndef CRYPTOPP_IMPORTS
|
#ifndef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
#include "dll.h"
|
#include "dll.h"
|
||||||
|
|
||||||
|
#ifdef CRYPTOPP_WIN32_AVAILABLE
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
NAMESPACE_BEGIN(CryptoPP)
|
NAMESPACE_BEGIN(CryptoPP)
|
||||||
|
|
||||||
@ -334,7 +337,7 @@ void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac
|
|||||||
"22B590B08B53363AEB89AD65F81A5B6FB83F326CE06BF35751E6C41B43B729C4", // output
|
"22B590B08B53363AEB89AD65F81A5B6FB83F326CE06BF35751E6C41B43B729C4", // output
|
||||||
1489728269); // time vector
|
1489728269); // time vector
|
||||||
|
|
||||||
SymmetricEncryptionKnownAnswerTest<DES>(
|
/* SymmetricEncryptionKnownAnswerTest<DES>(
|
||||||
"0123456789abcdef", // key
|
"0123456789abcdef", // key
|
||||||
"1234567890abcdef", // IV
|
"1234567890abcdef", // IV
|
||||||
"4e6f77206973207468652074696d6520666f7220616c6c20", // plaintext
|
"4e6f77206973207468652074696d6520666f7220616c6c20", // plaintext
|
||||||
@ -343,7 +346,7 @@ void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac
|
|||||||
"F3096249C7F46E51A69E839B1A92F78403467133898EA622", // cfb
|
"F3096249C7F46E51A69E839B1A92F78403467133898EA622", // cfb
|
||||||
"f3096249c7f46e5135f24a242eeb3d3f3d6d5be3255af8c3", // ofb
|
"f3096249c7f46e5135f24a242eeb3d3f3d6d5be3255af8c3", // ofb
|
||||||
"F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75");// ctr
|
"F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75");// ctr
|
||||||
|
*/
|
||||||
SymmetricEncryptionKnownAnswerTest<DES_EDE3>(
|
SymmetricEncryptionKnownAnswerTest<DES_EDE3>(
|
||||||
"385D7189A5C3D485E1370AA5D408082B5CCCCB5E19F2D90E",
|
"385D7189A5C3D485E1370AA5D408082B5CCCCB5E19F2D90E",
|
||||||
"C141B5FCCD28DC8A",
|
"C141B5FCCD28DC8A",
|
||||||
@ -388,7 +391,7 @@ void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac
|
|||||||
SecureHashKnownAnswerTest<SHA>(
|
SecureHashKnownAnswerTest<SHA>(
|
||||||
"abc",
|
"abc",
|
||||||
"A9993E364706816ABA3E25717850C26C9CD0D89D");
|
"A9993E364706816ABA3E25717850C26C9CD0D89D");
|
||||||
|
/*
|
||||||
SecureHashKnownAnswerTest<SHA256>(
|
SecureHashKnownAnswerTest<SHA256>(
|
||||||
"abc",
|
"abc",
|
||||||
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
|
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
|
||||||
@ -400,12 +403,12 @@ void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac
|
|||||||
SecureHashKnownAnswerTest<SHA512>(
|
SecureHashKnownAnswerTest<SHA512>(
|
||||||
"abc",
|
"abc",
|
||||||
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
|
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
|
||||||
|
*/
|
||||||
MAC_KnownAnswerTest<HMAC<SHA> >(
|
MAC_KnownAnswerTest<HMAC<SHA> >(
|
||||||
"303132333435363738393a3b3c3d3e3f40414243",
|
"303132333435363738393a3b3c3d3e3f40414243",
|
||||||
"Sample #2",
|
"Sample #2",
|
||||||
"0922d3405faa3d194f82a45830737d5cc6c75d24");
|
"0922d3405faa3d194f82a45830737d5cc6c75d24");
|
||||||
|
/*
|
||||||
MAC_KnownAnswerTest<HMAC<SHA256> >(
|
MAC_KnownAnswerTest<HMAC<SHA256> >(
|
||||||
"303132333435363738393a3b3c3d3e3f40414243",
|
"303132333435363738393a3b3c3d3e3f40414243",
|
||||||
"abc",
|
"abc",
|
||||||
@ -420,7 +423,7 @@ void DoPowerUpSelfTest(const char *moduleFilename, const byte *expectedModuleMac
|
|||||||
"303132333435363738393a3b3c3d3e3f40414243",
|
"303132333435363738393a3b3c3d3e3f40414243",
|
||||||
"abc",
|
"abc",
|
||||||
"BF07864E733B995862F3C2D432C7FF2F5EB073FFFC4F880CD94D5D21086476B7428F27BE694A9D9CB3BB500FE1255852BAFCBAF4042390B3706CDF02421B51AC");
|
"BF07864E733B995862F3C2D432C7FF2F5EB073FFFC4F880CD94D5D21086476B7428F27BE694A9D9CB3BB500FE1255852BAFCBAF4042390B3706CDF02421B51AC");
|
||||||
|
*/
|
||||||
SignatureKnownAnswerTest<RSASS<PKCS1v15, SHA> >(
|
SignatureKnownAnswerTest<RSASS<PKCS1v15, SHA> >(
|
||||||
"30820150020100300d06092a864886f70d01010105000482013a3082013602010002400a66791dc6988168de7ab77419bb7fb0"
|
"30820150020100300d06092a864886f70d01010105000482013a3082013602010002400a66791dc6988168de7ab77419bb7fb0"
|
||||||
"c001c62710270075142942e19a8d8c51d053b3e3782a1de5dc5af4ebe99468170114a1dfe67cdc9a9af55d655620bbab0203010001"
|
"c001c62710270075142942e19a8d8c51d053b3e3782a1de5dc5af4ebe99468170114a1dfe67cdc9a9af55d655620bbab0203010001"
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
// iterhash.cpp - written and placed in the public domain by Wei Dai
|
// iterhash.cpp - written and placed in the public domain by Wei Dai
|
||||||
|
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
#ifndef CRYPTOPP_IMPORTS
|
|
||||||
|
|
||||||
#include "iterhash.h"
|
#include "iterhash.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
@ -108,5 +105,3 @@ template <class T, class BASE> void IteratedHashBase<T, BASE>::Restart()
|
|||||||
}
|
}
|
||||||
|
|
||||||
NAMESPACE_END
|
NAMESPACE_END
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -41,12 +41,12 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef WORD64_AVAILABLE
|
#ifdef WORD64_AVAILABLE
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word64, HashTransformation>;
|
CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word64, HashTransformation>;
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word64, MessageAuthenticationCode>;
|
CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word64, MessageAuthenticationCode>;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word32, HashTransformation>;
|
CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word32, HashTransformation>;
|
||||||
CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word32, MessageAuthenticationCode>;
|
CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word32, MessageAuthenticationCode>;
|
||||||
|
|
||||||
//! .
|
//! .
|
||||||
template <class T, class B, class BASE>
|
template <class T, class B, class BASE>
|
||||||
|
9
sha.cpp
9
sha.cpp
@ -4,9 +4,6 @@
|
|||||||
// Both are in the public domain.
|
// Both are in the public domain.
|
||||||
|
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
|
||||||
#ifndef CRYPTOPP_IMPORTS
|
|
||||||
|
|
||||||
#include "sha.h"
|
#include "sha.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
@ -17,6 +14,8 @@ NAMESPACE_BEGIN(CryptoPP)
|
|||||||
#define blk0(i) (W[i] = data[i])
|
#define blk0(i) (W[i] = data[i])
|
||||||
#define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))
|
#define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))
|
||||||
|
|
||||||
|
#ifndef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
void SHA::InitState(HashWordType *state)
|
void SHA::InitState(HashWordType *state)
|
||||||
{
|
{
|
||||||
state[0] = 0x67452301L;
|
state[0] = 0x67452301L;
|
||||||
@ -79,6 +78,8 @@ void SHA::Transform(word32 *state, const word32 *data)
|
|||||||
memset(W, 0, sizeof(W));
|
memset(W, 0, sizeof(W));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // #ifndef CRYPTOPP_IMPORTS
|
||||||
|
|
||||||
// end of Steve Reid's code
|
// end of Steve Reid's code
|
||||||
|
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
@ -278,5 +279,3 @@ void SHA384::InitState(HashWordType *state)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
NAMESPACE_END
|
NAMESPACE_END
|
||||||
|
|
||||||
#endif
|
|
||||||
|
6
sha.h
6
sha.h
@ -17,7 +17,7 @@ public:
|
|||||||
typedef SHA SHA1;
|
typedef SHA SHA1;
|
||||||
|
|
||||||
//! implements the SHA-256 standard
|
//! implements the SHA-256 standard
|
||||||
class CRYPTOPP_DLL SHA256 : public IteratedHashWithStaticTransform<word32, BigEndian, 64, 32, SHA256>
|
class SHA256 : public IteratedHashWithStaticTransform<word32, BigEndian, 64, 32, SHA256>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void InitState(HashWordType *state);
|
static void InitState(HashWordType *state);
|
||||||
@ -31,7 +31,7 @@ protected:
|
|||||||
#ifdef WORD64_AVAILABLE
|
#ifdef WORD64_AVAILABLE
|
||||||
|
|
||||||
//! implements the SHA-512 standard
|
//! implements the SHA-512 standard
|
||||||
class CRYPTOPP_DLL SHA512 : public IteratedHashWithStaticTransform<word64, BigEndian, 128, 64, SHA512>
|
class SHA512 : public IteratedHashWithStaticTransform<word64, BigEndian, 128, 64, SHA512>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void InitState(HashWordType *state);
|
static void InitState(HashWordType *state);
|
||||||
@ -43,7 +43,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
//! implements the SHA-384 standard
|
//! implements the SHA-384 standard
|
||||||
class CRYPTOPP_DLL SHA384 : public IteratedHashWithStaticTransform<word64, BigEndian, 128, 64, SHA384, 48>
|
class SHA384 : public IteratedHashWithStaticTransform<word64, BigEndian, 128, 64, SHA384, 48>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void InitState(HashWordType *state);
|
static void InitState(HashWordType *state);
|
||||||
|
117
test.cpp
117
test.cpp
@ -2,23 +2,15 @@
|
|||||||
|
|
||||||
#include "dll.h"
|
#include "dll.h"
|
||||||
#include "md5.h"
|
#include "md5.h"
|
||||||
#include "sha.h"
|
|
||||||
#include "ripemd.h"
|
#include "ripemd.h"
|
||||||
#include "files.h"
|
|
||||||
#include "rng.h"
|
#include "rng.h"
|
||||||
#include "hex.h"
|
|
||||||
#include "gzip.h"
|
#include "gzip.h"
|
||||||
#include "default.h"
|
#include "default.h"
|
||||||
#include "rsa.h"
|
|
||||||
#include "randpool.h"
|
#include "randpool.h"
|
||||||
#include "ida.h"
|
#include "ida.h"
|
||||||
#include "base64.h"
|
#include "base64.h"
|
||||||
#include "socketft.h"
|
#include "socketft.h"
|
||||||
#include "dsa.h"
|
|
||||||
#include "rsa.h"
|
|
||||||
#include "osrng.h"
|
|
||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "fips140.h"
|
|
||||||
#include "factory.h"
|
#include "factory.h"
|
||||||
|
|
||||||
#include "validate.h"
|
#include "validate.h"
|
||||||
@ -118,9 +110,7 @@ int main(int argc, char *argv[])
|
|||||||
else
|
else
|
||||||
command = argv[1];
|
command = argv[1];
|
||||||
|
|
||||||
switch (command[0])
|
if (command == "g")
|
||||||
{
|
|
||||||
case 'g':
|
|
||||||
{
|
{
|
||||||
char seed[1024], privFilename[128], pubFilename[128];
|
char seed[1024], privFilename[128], pubFilename[128];
|
||||||
unsigned int keyLength;
|
unsigned int keyLength;
|
||||||
@ -139,22 +129,15 @@ int main(int argc, char *argv[])
|
|||||||
cin.getline(seed, 1024);
|
cin.getline(seed, 1024);
|
||||||
|
|
||||||
GenerateRSAKey(keyLength, privFilename, pubFilename, seed);
|
GenerateRSAKey(keyLength, privFilename, pubFilename, seed);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
case 'r':
|
else if (command == "rs")
|
||||||
{
|
|
||||||
switch (argv[1][1])
|
|
||||||
{
|
|
||||||
case 's':
|
|
||||||
RSASignFile(argv[2], argv[3], argv[4]);
|
RSASignFile(argv[2], argv[3], argv[4]);
|
||||||
return 0;
|
else if (command == "rv")
|
||||||
case 'v':
|
|
||||||
{
|
{
|
||||||
bool verified = RSAVerifyFile(argv[2], argv[3], argv[4]);
|
bool verified = RSAVerifyFile(argv[2], argv[3], argv[4]);
|
||||||
cout << (verified ? "valid signature" : "invalid signature") << endl;
|
cout << (verified ? "valid signature" : "invalid signature") << endl;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
default:
|
else if (command == "r")
|
||||||
{
|
{
|
||||||
char privFilename[128], pubFilename[128];
|
char privFilename[128], pubFilename[128];
|
||||||
char seed[1024], message[1024];
|
char seed[1024], message[1024];
|
||||||
@ -177,13 +160,16 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
string decrypted = RSADecryptString(privFilename, ciphertext.c_str());
|
string decrypted = RSADecryptString(privFilename, ciphertext.c_str());
|
||||||
cout << "\nDecrypted: " << decrypted << endl;
|
cout << "\nDecrypted: " << decrypted << endl;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
else if (command == "mt")
|
||||||
|
{
|
||||||
|
MaurerRandomnessTest mt;
|
||||||
|
FileStore fs(argv[2]);
|
||||||
|
fs.TransferAllTo(mt);
|
||||||
|
cout << "Maurer Test Value: " << mt.GetTestValue() << endl;
|
||||||
}
|
}
|
||||||
}
|
#ifdef CRYPTOPP_WIN32_AVAILABLE
|
||||||
case 'm':
|
else if (command == "mac_dll")
|
||||||
if (command == "mac_dll")
|
|
||||||
{
|
{
|
||||||
HMODULE hModule = LoadLibrary(argv[2]);
|
HMODULE hModule = LoadLibrary(argv[2]);
|
||||||
PGetPowerUpSelfTestStatus pGetPowerUpSelfTestStatus = (PGetPowerUpSelfTestStatus)GetProcAddress(hModule, "?GetPowerUpSelfTestStatus@CryptoPP@@YG?AW4PowerUpSelfTestStatus@1@XZ");
|
PGetPowerUpSelfTestStatus pGetPowerUpSelfTestStatus = (PGetPowerUpSelfTestStatus)GetProcAddress(hModule, "?GetPowerUpSelfTestStatus@CryptoPP@@YG?AW4PowerUpSelfTestStatus@1@XZ");
|
||||||
@ -217,25 +203,15 @@ int main(int argc, char *argv[])
|
|||||||
cerr << "Error writing file.\n";
|
cerr << "Error writing file.\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (command == "mt")
|
#endif
|
||||||
{
|
else if (command == "m")
|
||||||
MaurerRandomnessTest mt;
|
|
||||||
FileStore fs(argv[2]);
|
|
||||||
fs.TransferAllTo(mt);
|
|
||||||
cout << "Maurer Test Value: " << mt.GetTestValue() << endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DigestFile(argv[2]);
|
DigestFile(argv[2]);
|
||||||
return 0;
|
else if (command == "tv")
|
||||||
case 't':
|
|
||||||
{
|
|
||||||
if (command == "tv")
|
|
||||||
{
|
|
||||||
return !RunTestDataFile(argv[2]);
|
return !RunTestDataFile(argv[2]);
|
||||||
}
|
else if (command == "t")
|
||||||
|
{
|
||||||
// VC60 workaround: use char array instead of std::string to workaround MSVC's getline bug
|
// VC60 workaround: use char array instead of std::string to workaround MSVC's getline bug
|
||||||
char passPhrase[MAX_PHRASE_LENGTH], plaintext[1024];
|
char passPhrase[MAX_PHRASE_LENGTH], plaintext[1024];
|
||||||
|
|
||||||
@ -253,9 +229,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case 'e':
|
else if (command == "e64")
|
||||||
case 'd':
|
|
||||||
if (command == "e64")
|
|
||||||
Base64Encode(argv[2], argv[3]);
|
Base64Encode(argv[2], argv[3]);
|
||||||
else if (command == "d64")
|
else if (command == "d64")
|
||||||
Base64Decode(argv[2], argv[3]);
|
Base64Decode(argv[2], argv[3]);
|
||||||
@ -263,7 +237,7 @@ int main(int argc, char *argv[])
|
|||||||
HexEncode(argv[2], argv[3]);
|
HexEncode(argv[2], argv[3]);
|
||||||
else if (command == "d16")
|
else if (command == "d16")
|
||||||
HexDecode(argv[2], argv[3]);
|
HexDecode(argv[2], argv[3]);
|
||||||
else
|
else if (command == "e" || command == "d")
|
||||||
{
|
{
|
||||||
char passPhrase[MAX_PHRASE_LENGTH];
|
char passPhrase[MAX_PHRASE_LENGTH];
|
||||||
cout << "Passphrase: ";
|
cout << "Passphrase: ";
|
||||||
@ -273,9 +247,7 @@ int main(int argc, char *argv[])
|
|||||||
else
|
else
|
||||||
DecryptFile(argv[2], argv[3], passPhrase);
|
DecryptFile(argv[2], argv[3], passPhrase);
|
||||||
}
|
}
|
||||||
return 0;
|
else if (command == "ss")
|
||||||
case 's':
|
|
||||||
if (argv[1][1] == 's')
|
|
||||||
{
|
{
|
||||||
char seed[1024];
|
char seed[1024];
|
||||||
cout << "\nRandom Seed: ";
|
cout << "\nRandom Seed: ";
|
||||||
@ -283,53 +255,54 @@ int main(int argc, char *argv[])
|
|||||||
cin.getline(seed, 1024);
|
cin.getline(seed, 1024);
|
||||||
SecretShareFile(atoi(argv[2]), atoi(argv[3]), argv[4], seed);
|
SecretShareFile(atoi(argv[2]), atoi(argv[3]), argv[4], seed);
|
||||||
}
|
}
|
||||||
else
|
else if (command == "sr")
|
||||||
SecretRecoverFile(argc-3, argv[2], argv+3);
|
SecretRecoverFile(argc-3, argv[2], argv+3);
|
||||||
return 0;
|
else if (command == "id")
|
||||||
case 'i':
|
|
||||||
if (argv[1][1] == 'd')
|
|
||||||
InformationDisperseFile(atoi(argv[2]), atoi(argv[3]), argv[4]);
|
InformationDisperseFile(atoi(argv[2]), atoi(argv[3]), argv[4]);
|
||||||
else
|
else if (command == "ir")
|
||||||
InformationRecoverFile(argc-3, argv[2], argv+3);
|
InformationRecoverFile(argc-3, argv[2], argv+3);
|
||||||
return 0;
|
else if (command == "v")
|
||||||
case 'v':
|
|
||||||
return !Validate(argc>2 ? atoi(argv[2]) : 0, argv[1][1] == 'v', argc>3 ? argv[3] : NULL);
|
return !Validate(argc>2 ? atoi(argv[2]) : 0, argv[1][1] == 'v', argc>3 ? argv[3] : NULL);
|
||||||
case 'b':
|
else if (command == "b")
|
||||||
|
{
|
||||||
if (argc<3)
|
if (argc<3)
|
||||||
BenchMarkAll();
|
BenchMarkAll();
|
||||||
else
|
else
|
||||||
BenchMarkAll((float)atof(argv[2]));
|
BenchMarkAll((float)atof(argv[2]));
|
||||||
return 0;
|
}
|
||||||
case 'z':
|
else if (command == "z")
|
||||||
GzipFile(argv[3], argv[4], argv[2][0]-'0');
|
GzipFile(argv[3], argv[4], argv[2][0]-'0');
|
||||||
return 0;
|
else if (command == "u")
|
||||||
case 'u':
|
|
||||||
GunzipFile(argv[2], argv[3]);
|
GunzipFile(argv[2], argv[3]);
|
||||||
return 0;
|
else if (command == "fips")
|
||||||
case 'f':
|
|
||||||
if (command == "fips")
|
|
||||||
FIPS140_SampleApplication();
|
FIPS140_SampleApplication();
|
||||||
else if (command == "fips-rand")
|
else if (command == "fips-rand")
|
||||||
FIPS140_GenerateRandomFiles();
|
FIPS140_GenerateRandomFiles();
|
||||||
else if (command == "ft")
|
else if (command == "ft")
|
||||||
ForwardTcpPort(argv[2], argv[3], argv[4]);
|
ForwardTcpPort(argv[2], argv[3], argv[4]);
|
||||||
return 0;
|
else if (command == "a")
|
||||||
case 'a':
|
{
|
||||||
if (AdhocTest)
|
if (AdhocTest)
|
||||||
return (*AdhocTest)(argc, argv);
|
return (*AdhocTest)(argc, argv);
|
||||||
else
|
else
|
||||||
return 0;
|
|
||||||
case 'h':
|
|
||||||
if (command == "hmac")
|
|
||||||
{
|
{
|
||||||
HmacFile(argv[2], argv[3]);
|
cerr << "AdhocTest not defined.\n";
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
// fall through
|
}
|
||||||
default:
|
else if (command == "hmac")
|
||||||
|
HmacFile(argv[2], argv[3]);
|
||||||
|
else if (command == "h")
|
||||||
|
{
|
||||||
FileSource usage("usage.dat", true, new FileSink(cout));
|
FileSource usage("usage.dat", true, new FileSink(cout));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "Unrecognized command.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
catch(CryptoPP::Exception &e)
|
catch(CryptoPP::Exception &e)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user