diff -u crypto/camellia.h crypto_gcc41/camellia.h
--- crypto/camellia.h 2004-07-21 19:09:46.000000000 +0200
+++ crypto_gcc41/camellia.h 2006-04-02 17:43:42.000000000 +0200
@@ -22,7 +22,7 @@
/// Camellia
class Camellia : public Camellia_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir dir, const byte *key, unsigned int keylen);
diff -u crypto/cast.h crypto_gcc41/cast.h
--- crypto/cast.h 2004-07-21 19:09:46.000000000 +0200
+++ crypto_gcc41/cast.h 2006-04-02 17:44:18.000000000 +0200
@@ -24,7 +24,7 @@
/// CAST-128
class CAST128 : public CAST128_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public CAST, public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public CAST, public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
@@ -60,7 +60,7 @@
//! CAST-256
class CAST256 : public CAST256_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public CAST, public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public CAST, public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length = 8);
diff -u crypto/des.h crypto_gcc41/des.h
--- crypto/des.h 2004-07-21 19:09:46.000000000 +0200
+++ crypto_gcc41/des.h 2006-04-02 17:45:11.000000000 +0200
@@ -35,7 +35,7 @@
check or correct the parity bits if you wish. */
class DES : public DES_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public RawDES
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public RawDES, public SimpledKeyed_Helper
{
public:
void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
@@ -60,7 +60,7 @@
/// DES-EDE2
class DES_EDE2 : public DES_EDE2_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
@@ -84,7 +84,7 @@
/// DES-EDE3
class DES_EDE3 : public DES_EDE3_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length);
@@ -108,7 +108,7 @@
/// DES-XEX3, AKA DESX
class DES_XEX3 : public DES_XEX3_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir dir, const byte *key, unsigned int length);
diff -u crypto/dll.cpp crypto_gcc41/dll.cpp
--- crypto/dll.cpp 2004-06-20 11:22:24.000000000 +0200
+++ crypto_gcc41/dll.cpp 2006-04-02 17:42:50.000000000 +0200
@@ -1,6 +1,10 @@
// dll.cpp - written and placed in the public domain by Wei Dai
-#define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
+#if defined( __GNUC__ ) && __GNUC__ > 3
+# undef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
+#else
+# define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
+#endif
#define CRYPTOPP_DEFAULT_NO_DLL
#include "dll.h"
@@ -37,6 +41,79 @@
CRYPTOPP_DLL_TEMPLATE_CLASS AbstractEuclideanDomain;
#endif
+#if defined(__GNUC__) && __GNUC__ > 3
+template class CRYPTOPP_DLL AbstractEuclideanDomain;
+template class CRYPTOPP_DLL AbstractEuclideanDomain;
+template class CRYPTOPP_DLL AbstractGroup;
+template class CRYPTOPP_DLL AbstractGroup;
+template class CRYPTOPP_DLL AbstractGroup;
+template class CRYPTOPP_DLL AbstractGroup;
+template class CRYPTOPP_DLL AbstractPolicyHolder, RandomNumberGenerator> >;
+template class CRYPTOPP_DLL AbstractRing;
+template class CRYPTOPP_DLL AbstractRing;
+template class CRYPTOPP_DLL AdditiveCipherTemplate<>;
+template class CRYPTOPP_DLL AdditiveCipherTemplate >;
+template class CRYPTOPP_DLL AdditiveCipherTemplate >;
+template class CRYPTOPP_DLL AllocatorWithCleanup;
+template class CRYPTOPP_DLL AllocatorWithCleanup;
+template class CRYPTOPP_DLL AllocatorWithCleanup;
+template class CRYPTOPP_DLL AutoSeededX917RNG;
+template class CRYPTOPP_DLL CFB_CipherTemplate >;
+template class CRYPTOPP_DLL CFB_CipherTemplate >;
+template class CRYPTOPP_DLL CFB_DecryptionTemplate<>;
+template class CRYPTOPP_DLL CFB_DecryptionTemplate >;
+template class CRYPTOPP_DLL CFB_EncryptionTemplate<>;
+template class CRYPTOPP_DLL CFB_EncryptionTemplate >;
+template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher;
+template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher;
+template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher;
+template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher;
+template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher;
+template class CRYPTOPP_DLL DH_Domain;
+template class CRYPTOPP_DLL DL_Algorithm_GDSA;
+template class CRYPTOPP_DLL DL_Algorithm_GDSA;
+template class CRYPTOPP_DLL DL_Algorithm_GDSA;
+template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl;
+template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl;
+template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl;
+template class CRYPTOPP_DLL DL_GroupParameters;
+template class CRYPTOPP_DLL DL_GroupParameters_EC;
+template class CRYPTOPP_DLL DL_GroupParameters_EC;
+template class CRYPTOPP_DLL DL_GroupParameters_IntegerBasedImpl;
+template class CRYPTOPP_DLL DL_GroupPrecomputation;
+template class CRYPTOPP_DLL DL_GroupPrecomputation;
+template class CRYPTOPP_DLL DL_PrivateKeyImpl >;
+template class CRYPTOPP_DLL DL_PrivateKeyImpl >;
+template class CRYPTOPP_DLL DL_PrivateKey_EC;
+template class CRYPTOPP_DLL DL_PrivateKey_EC;
+template class CRYPTOPP_DLL DL_PrivateKey_GFP;
+template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest, ECDSA >;
+template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest, ECDSA >;
+template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest, DSA>;
+template class CRYPTOPP_DLL DL_PublicKeyImpl >;
+template class CRYPTOPP_DLL DL_PublicKeyImpl >;
+template class CRYPTOPP_DLL DL_PublicKey_EC;
+template class CRYPTOPP_DLL DL_PublicKey_EC;
+template class CRYPTOPP_DLL DL_PublicKey_GFP;
+template class CRYPTOPP_DLL EuclideanDomainOf;
+template class CRYPTOPP_DLL IteratedHashBase;
+template class CRYPTOPP_DLL IteratedHashBase;
+#ifdef WORD64_AVAILABLE
+template class CRYPTOPP_DLL IteratedHashBase;
+template class CRYPTOPP_DLL IteratedHashBase;
+#endif
+template class CRYPTOPP_DLL OAEP;
+#ifdef CRYPTOPP_IS_DLL
+template class CRYPTOPP_DLL PKCS_DigestDecoration;
+#endif
+template class CRYPTOPP_DLL QuotientRing >;
+template class CRYPTOPP_DLL SimpleKeyedTransformation;
+template class CRYPTOPP_DLL SimpleKeyedTransformation;
+template class CRYPTOPP_DLL SimpleKeyedTransformation;
+template class CRYPTOPP_DLL StringSinkTemplate;
+template class CRYPTOPP_DLL TwoBases;
+#endif // __GNUC__ > 3
+
template<> const byte PKCS_DigestDecoration::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14};
template<> const unsigned int PKCS_DigestDecoration::length = sizeof(PKCS_DigestDecoration::decoration);
diff -u crypto/gost.h crypto_gcc41/gost.h
--- crypto/gost.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/gost.h 2006-04-02 17:45:28.000000000 +0200
@@ -18,7 +18,7 @@
/// GOST
class GOST : public GOST_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
diff -u crypto/hmac.h crypto_gcc41/hmac.h
--- crypto/hmac.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/hmac.h 2006-04-02 17:46:12.000000000 +0200
@@ -9,7 +9,7 @@
NAMESPACE_BEGIN(CryptoPP)
//! _
-class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE HMAC_Base : public VariableKeyLength<16, 0, UINT_MAX>, public MessageAuthenticationCode
+class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE HMAC_Base : public VariableKeyLength<16, 0, UINT_MAX>, public MessageAuthenticationCode, public SimpledKeyed_Helper
{
public:
HMAC_Base() : m_innerHashKeyed(false) {}
diff -u crypto/iterhash.h crypto_gcc41/iterhash.h
--- crypto/iterhash.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/iterhash.h 2006-04-02 17:35:27.000000000 +0200
@@ -75,7 +75,7 @@
class CRYPTOPP_NO_VTABLE IteratedHash : public IteratedHashBase2
{
public:
- enum {BLOCKSIZE = T_BlockSize};
+ enum GCC4FIX2 {BLOCKSIZE = T_BlockSize};
CRYPTOPP_COMPILE_ASSERT((BLOCKSIZE & (BLOCKSIZE - 1)) == 0); // blockSize is a power of 2
protected:
@@ -88,7 +88,7 @@
: public ClonableImpl, T_Transform> >
{
public:
- enum {DIGESTSIZE = T_DigestSize};
+ enum GCC4FIX4 {DIGESTSIZE = T_DigestSize};
unsigned int DigestSize() const {return DIGESTSIZE;};
protected:
diff -u crypto/lubyrack.h crypto_gcc41/lubyrack.h
--- crypto/lubyrack.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/lubyrack.h 2006-04-02 17:46:39.000000000 +0200
@@ -23,7 +23,7 @@
template
class LR : public LR_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl >
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl >, public SimpledKeyed_Helper
{
public:
// VC60 workaround: have to define these functions within class definition
diff -u crypto/mars.h crypto_gcc41/mars.h
--- crypto/mars.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/mars.h 2006-04-02 17:47:09.000000000 +0200
@@ -18,7 +18,7 @@
/// MARS
class MARS : public MARS_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
diff -u crypto/md5mac.h crypto_gcc41/md5mac.h
--- crypto/md5mac.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/md5mac.h 2006-04-02 17:47:30.000000000 +0200
@@ -9,7 +9,7 @@
NAMESPACE_BEGIN(CryptoPP)
-class CRYPTOPP_NO_VTABLE MD5MAC_Base : public FixedKeyLength<16>, public IteratedHash
+class CRYPTOPP_NO_VTABLE MD5MAC_Base : public FixedKeyLength<16>, public IteratedHash, public SimpledKeyed_Helper
{
public:
static std::string StaticAlgorithmName() {return "MD5-MAC";}
diff -u crypto/mdc.h crypto_gcc41/mdc.h
--- crypto/mdc.h 2004-07-21 19:09:48.000000000 +0200
+++ crypto_gcc41/mdc.h 2006-04-02 17:47:53.000000000 +0200
@@ -23,7 +23,7 @@
template
class MDC : public MDC_Info
{
- class CRYPTOPP_NO_VTABLE Enc : public BlockCipherImpl >
+ class CRYPTOPP_NO_VTABLE Enc : public BlockCipherImpl >, public SimpledKeyed_Helper
{
typedef typename T::HashWordType HashWordType;
diff -u crypto/rijndael.h crypto_gcc41/rijndael.h
--- crypto/rijndael.h 2004-07-21 19:09:50.000000000 +0200
+++ crypto_gcc41/rijndael.h 2006-04-02 17:48:11.000000000 +0200
@@ -18,7 +18,7 @@
/// Rijndael
class CRYPTOPP_DLL Rijndael : public Rijndael_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
diff -u crypto/seckey.h crypto_gcc41/seckey.h
--- crypto/seckey.h 2004-07-21 19:09:50.000000000 +0200
+++ crypto_gcc41/seckey.h 2006-04-02 17:50:16.000000000 +0200
@@ -21,7 +21,7 @@
class FixedBlockSize
{
public:
- enum {BLOCKSIZE = N};
+ enum GCC4FIX0 {BLOCKSIZE = N};
};
// ************** rounds ***************
@@ -31,7 +31,7 @@
class FixedRounds
{
public:
- enum {ROUNDS = R};
+ enum GCC4FIX1 {ROUNDS = R};
protected:
template
@@ -50,7 +50,7 @@
class VariableRounds
{
public:
- enum {DEFAULT_ROUNDS = D, MIN_ROUNDS = N, MAX_ROUNDS = M};
+ enum GCC4FIX3 {DEFAULT_ROUNDS = D, MIN_ROUNDS = N, MAX_ROUNDS = M};
static unsigned int StaticGetDefaultRounds(unsigned int keylength) {return DEFAULT_ROUNDS;}
protected:
@@ -123,19 +123,21 @@
// ************** implementation helper for SimpledKeyed ***************
-template
-static inline void CheckedSetKey(T *obj, Empty empty, const byte *key, unsigned int length, const NameValuePairs ¶m)
-{
- obj->ThrowIfInvalidKeyLength(length);
- obj->UncheckedSetKey(key, length);
-}
-
-template
-static inline void CheckedSetKey(T *obj, CipherDir dir, const byte *key, unsigned int length, const NameValuePairs ¶m)
-{
- obj->ThrowIfInvalidKeyLength(length);
- obj->UncheckedSetKey(dir, key, length);
-}
+struct SimpledKeyed_Helper {
+ template
+ static inline void CheckedSetKey(T *obj, Empty empty, const byte *key, unsigned int length, const NameValuePairs ¶m)
+ {
+ obj->ThrowIfInvalidKeyLength(length);
+ obj->UncheckedSetKey(key, length);
+ }
+
+ template
+ static inline void CheckedSetKey(T *obj, CipherDir dir, const byte *key, unsigned int length, const NameValuePairs ¶m)
+ {
+ obj->ThrowIfInvalidKeyLength(length);
+ obj->UncheckedSetKey(dir, key, length);
+ }
+};
//! _
template
@@ -176,7 +178,7 @@
void SetKey(const byte *key, unsigned int length, const NameValuePairs ¶m = g_nullNameValuePairs)
{
- CheckedSetKey(this, DIR, key, length, param);
+ BASE::CheckedSetKey(this, DIR, key, length, param);
}
};
@@ -187,7 +189,7 @@
public:
void SetKey(const byte *key, unsigned int length, const NameValuePairs ¶ms = g_nullNameValuePairs)
{
- CheckedSetKey(this, Empty(), key, length, params);
+ BASE::CheckedSetKey(this, Empty(), key, length, params);
}
};
diff -u crypto/shacal2.h crypto_gcc41/shacal2.h
--- crypto/shacal2.h 2004-07-21 19:09:50.000000000 +0200
+++ crypto_gcc41/shacal2.h 2006-04-02 18:01:39.000000000 +0200
@@ -18,7 +18,7 @@
/// SHACAL-2
class SHACAL2 : public SHACAL2_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
diff -u crypto/skipjack.h crypto_gcc41/skipjack.h
--- crypto/skipjack.h 2004-07-21 19:09:50.000000000 +0200
+++ crypto_gcc41/skipjack.h 2006-04-02 18:01:57.000000000 +0200
@@ -18,7 +18,7 @@
/// SKIPJACK
class SKIPJACK : public SKIPJACK_Info, public BlockCipherDocumentation
{
- class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl
+ class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl, public SimpledKeyed_Helper
{
public:
void UncheckedSetKey(CipherDir direction, const byte *userKey, unsigned int length);
Common subdirectories: crypto/TestVectors and crypto_gcc41/TestVectors
diff -u crypto/ttmac.h crypto_gcc41/ttmac.h
--- crypto/ttmac.h 2004-07-21 19:09:50.000000000 +0200
+++ crypto_gcc41/ttmac.h 2006-04-02 18:02:12.000000000 +0200
@@ -9,7 +9,7 @@
NAMESPACE_BEGIN(CryptoPP)
//! _
-class CRYPTOPP_NO_VTABLE TTMAC_Base : public FixedKeyLength<20>, public IteratedHash
+class CRYPTOPP_NO_VTABLE TTMAC_Base : public FixedKeyLength<20>, public IteratedHash, public SimpledKeyed_Helper
{
public:
static std::string StaticAlgorithmName() {return std::string("Two-Track-MAC");}