- redefine typeid()
In cryptlib.h
, I added directly after the initial
#include "config.h" #include "stdcpp.h"
the following template and define to revert typeid() to my own implementation:
template<typename T> const std::type_info& HajoTypeID(void);
#define typeid(a) HajoTypeID<a>()
- compile to get list of undefined symbols
I then compiled Crypto++ and was greeted with a huge list of undefined symbols, which were references to my HajoTypeID<>()
template function. The errors looked like:
"__Z10HajoTypeIDIN8CryptoPP21InvertibleLUCFunctionEERKSt9type_infov", referenced from:
__ZNK8CryptoPP14NameValuePairs13GetThisObjectINS_21InvertibleLUCFunctionEEEbRT_ in libCryptoPP.a(luc.o)
__ZNK8CryptoPP14NameValuePairs8GetValueINS_21InvertibleLUCFunctionEEEbPKcRT_ in libCryptoPP.a(luc.o)
I copied all of those into undefined.txt
and ran
cat undefined.txt | grep "\", referenced" | sed 's/"_//' | sed 's/",.*//' | mate
to get a list of the raw, mangled symbols that were missing. The output looked like this:
_Z10HajoTypeIDIPKhERKSt9type_infov
_Z10HajoTypeIDIPhERKSt9type_infov
_Z10HajoTypeIDIPSsERKSt9type_infov
- demangle symbols to get needed template classes
I then piped the result through the Javascript from
http://slush.warosu.org/c++filtjs/
to get a list of the needed, unmangled symbols like this:
std::type_info const& HajoTypeID<int>()
std::type_info const& HajoTypeID<char const*>()
std::type_info const& HajoTypeID<std::ostream*>()
I stored this list into defineme.txt
and ran
cat defineme.txt | sed 's/std::type_info const& HajoTypeID<//' | sed 's/>()//' | sed 's/^.*$/template <> const std::type_info\& HajoTypeID< & >(void) { static HajoMkType type("&"); return type; }/' | mate
to get the needed C++ source to fake typeid(..) for those classes. The output looks like this:
template <> const std::type_info& HajoTypeID< int >(void) { static HajoMkType type("int"); return type; }
template <> const std::type_info& HajoTypeID< char const* >(void) { static HajoMkType type("char const*"); return type; }
template <> const std::type_info& HajoTypeID< std::ostream* >(void) { static HajoMkType type("std::ostream*"); return type; }
and together with this class:
class HajoMkType : public std::type_info {
public:
inline HajoMkType(const char* name) : std::type_info(name) {}
inline virtual ~HajoMkType() {}
};
can fake RTTI good enough such that the compiled Crypto++ library passes all validations with RTTI disabled.
in cryptlib.h
template<typename T> const std::type_info& HajoTypeID(void);
#define typeid(a) HajoTypeID<a>()
in a C++ file of your choice
#include "eccrypto.h"
#include "ec2n.h"
#include "luc.h"
#include "esign.h"
#include "rabin.h"
#include "gfpcrypt.h"
#include "modexppc.h"
#include "xtrcrypt.h"
class HajoMkType : public std::type_info {
public:
inline HajoMkType(const char* name) : std::type_info(name) {}
inline virtual ~HajoMkType() {}
};
template <> const std::type_info& HajoTypeID< int >(void) { static HajoMkType type("int"); return type; }
template <> const std::type_info& HajoTypeID< char const* >(void) { static HajoMkType type("char const*"); return type; }
template <> const std::type_info& HajoTypeID< std::ostream* >(void) { static HajoMkType type("std::ostream*"); return type; }
template <> const std::type_info& HajoTypeID< int const* >(void) { static HajoMkType type("int const*"); return type; }
template <> const std::type_info& HajoTypeID< unsigned char >(void) { static HajoMkType type("unsigned char"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ConstByteArrayParameter >(void) { static HajoMkType type("CryptoPP::ConstByteArrayParameter"); return type; }
template <> const std::type_info& HajoTypeID< unsigned char const* >(void) { static HajoMkType type("unsigned char const*"); return type; }
template <> const std::type_info& HajoTypeID< unsigned char* >(void) { static HajoMkType type("unsigned char*"); return type; }
template <> const std::type_info& HajoTypeID< std::string* >(void) { static HajoMkType type("std::string*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::ModExpPrecomputation, CryptoPP::DL_FixedBasePrecomputationImpl<CryptoPP::Integer> > >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::ModExpPrecomputation, CryptoPP::DL_FixedBasePrecomputationImpl<CryptoPP::Integer> > "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_DSA> >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_DSA> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::Integer> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::Integer> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::Integer>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::Integer>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::Integer> >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::Integer> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::Integer >(void) { static HajoMkType type("CryptoPP::Integer"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_DSA> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_DSA> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_DSA >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_DSA"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::OID >(void) { static HajoMkType type("CryptoPP::OID"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ECP >(void) { static HajoMkType type("CryptoPP::ECP"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ECPPoint >(void) { static HajoMkType type("CryptoPP::ECPPoint"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::EC2N >(void) { static HajoMkType type("CryptoPP::EC2N"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::EC2NPoint >(void) { static HajoMkType type("CryptoPP::EC2NPoint"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> > >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> > "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::ECPPoint> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::ECPPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::ECPPoint>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::ECPPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::ECPPoint> >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::ECPPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> > >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> > "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::EC2NPoint> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::EC2NPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKey<CryptoPP::EC2NPoint>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKey<CryptoPP::EC2NPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::EC2NPoint> >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::EC2NPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> > >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> > "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> > >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> > "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> "); return type; }
template <> const std::type_info& HajoTypeID< std::string >(void) { static HajoMkType type("std::string"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_GFP >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_GFP"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBased >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBased"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_GFP* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_GFP*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::Integer> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::Integer> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::Integer>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::Integer>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::ModExpPrecomputation, CryptoPP::DL_FixedBasePrecomputationImpl<CryptoPP::Integer> >* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::ModExpPrecomputation, CryptoPP::DL_FixedBasePrecomputationImpl<CryptoPP::Integer> >*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_DSA>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_DSA>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::Integer>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::Integer>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_DSA>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_DSA>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::ECPPoint> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::ECPPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::ECPPoint>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::ECPPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::EC2NPoint> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::EC2NPoint> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters<CryptoPP::EC2NPoint>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters<CryptoPP::EC2NPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> >* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> >*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::ECPPoint>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::ECPPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> >* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> >*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKey<CryptoPP::EC2NPoint>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKey<CryptoPP::EC2NPoint>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> >* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> >*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> >* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_EC<CryptoPP::EC2N> >*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ESIGNFunction >(void) { static HajoMkType type("CryptoPP::ESIGNFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleESIGNFunction >(void) { static HajoMkType type("CryptoPP::InvertibleESIGNFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ESIGNFunction* >(void) { static HajoMkType type("CryptoPP::ESIGNFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleESIGNFunction* >(void) { static HajoMkType type("CryptoPP::InvertibleESIGNFunction*"); return type; }
template <> const std::type_info& HajoTypeID< wchar_t const* >(void) { static HajoMkType type("wchar_t const*"); return type; }
template <> const std::type_info& HajoTypeID< std::istream* >(void) { static HajoMkType type("std::istream*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::ByteArrayParameter >(void) { static HajoMkType type("CryptoPP::ByteArrayParameter"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::BufferedTransformation* >(void) { static HajoMkType type("CryptoPP::BufferedTransformation*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RandomNumberGenerator* >(void) { static HajoMkType type("CryptoPP::RandomNumberGenerator*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme >(void) { static HajoMkType type("CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme"); return type; }
template <> const std::type_info& HajoTypeID< bool >(void) { static HajoMkType type("bool"); return type; }
template <> const std::type_info& HajoTypeID< unsigned int >(void) { static HajoMkType type("unsigned int"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBased* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBased*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::Integer::RandomNumberType >(void) { static HajoMkType type("CryptoPP::Integer::RandomNumberType"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::PrimeSelector const* >(void) { static HajoMkType type("CryptoPP::PrimeSelector const*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::LUCFunction >(void) { static HajoMkType type("CryptoPP::LUCFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleLUCFunction >(void) { static HajoMkType type("CryptoPP::InvertibleLUCFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::LUCFunction* >(void) { static HajoMkType type("CryptoPP::LUCFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleLUCFunction* >(void) { static HajoMkType type("CryptoPP::InvertibleLUCFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RabinFunction >(void) { static HajoMkType type("CryptoPP::RabinFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRabinFunction >(void) { static HajoMkType type("CryptoPP::InvertibleRabinFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RabinFunction* >(void) { static HajoMkType type("CryptoPP::RabinFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRabinFunction* >(void) { static HajoMkType type("CryptoPP::InvertibleRabinFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime> >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP> >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP_DefaultSafePrime>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_GFP>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_GFP>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RSAFunction >(void) { static HajoMkType type("CryptoPP::RSAFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRSAFunction >(void) { static HajoMkType type("CryptoPP::InvertibleRSAFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RSAFunction* >(void) { static HajoMkType type("CryptoPP::RSAFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRSAFunction* >(void) { static HajoMkType type("CryptoPP::InvertibleRSAFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RWFunction >(void) { static HajoMkType type("CryptoPP::RWFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRWFunction >(void) { static HajoMkType type("CryptoPP::InvertibleRWFunction"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::RWFunction* >(void) { static HajoMkType type("CryptoPP::RWFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::InvertibleRWFunction* >(void) { static HajoMkType type("CryptoPP::InvertibleRWFunction*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::DL_GroupPrecomputation_LUC, CryptoPP::DL_BasePrecomputation_LUC> >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::DL_GroupPrecomputation_LUC, CryptoPP::DL_BasePrecomputation_LUC> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC> >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_LUC >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_LUC"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime> >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime> >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime> "); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_LUC* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_LUC*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::DL_GroupPrecomputation_LUC, CryptoPP::DL_BasePrecomputation_LUC>* >(void) { static HajoMkType type("CryptoPP::DL_GroupParameters_IntegerBasedImpl<CryptoPP::DL_GroupPrecomputation_LUC, CryptoPP::DL_BasePrecomputation_LUC>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime>* >(void) { static HajoMkType type("CryptoPP::DL_PublicKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime>* >(void) { static HajoMkType type("CryptoPP::DL_PrivateKeyImpl<CryptoPP::DL_GroupParameters_LUC_DefaultSafePrime>*"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::XTR_DH >(void) { static HajoMkType type("CryptoPP::XTR_DH"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::GFP2Element >(void) { static HajoMkType type("CryptoPP::GFP2Element"); return type; }
template <> const std::type_info& HajoTypeID< CryptoPP::XTR_DH* >(void) { static HajoMkType type("CryptoPP::XTR_DH*"); return type; }