panthema / 2009 / cryptote / cryptote-0.5.390 / libenctain / botan-1.6 / src / def_alg.cpp (Download File)
/*************************************************
* Default Engine Algorithms Source File          *
* (C) 1999-2007 The Botan Project                *
*************************************************/

#include "botan-1.6/include/eng_def.h"
#include "botan-1.6/include/lookup.h"
#include "botan-1.6/include/parsing.h"

#include "botan-1.6/include/aes.h"
// #include "botan-1.6/include/blowfish.h"
// #include "botan-1.6/include/cast128.h"
// #include "botan-1.6/include/cast256.h"
#include "botan-1.6/include/des.h"
// #include "botan-1.6/include/gost.h"
// #include "botan-1.6/include/idea.h"
// #include "botan-1.6/include/kasumi.h"
// #include "botan-1.6/include/lion.h"
// #include "botan-1.6/include/lubyrack.h"
// #include "botan-1.6/include/mars.h"
// #include "botan-1.6/include/misty1.h"
// #include "botan-1.6/include/rc2.h"
// #include "botan-1.6/include/rc5.h"
// #include "botan-1.6/include/rc6.h"
// #include "botan-1.6/include/safer_sk.h"
// #include "botan-1.6/include/seed.h"
#include "botan-1.6/include/serpent.h"
// #include "botan-1.6/include/skipjack.h"
// #include "botan-1.6/include/square.h"
// #include "botan-1.6/include/tea.h"
// #include "botan-1.6/include/twofish.h"
// #include "botan-1.6/include/xtea.h"

// #include "botan-1.6/include/arc4.h"
// #include "botan-1.6/include/turing.h"
// #include "botan-1.6/include/wid_wake.h"

// #include "botan-1.6/include/adler32.h"
// #include "botan-1.6/include/crc24.h"
#include "botan-1.6/include/crc32.h"
// #include "botan-1.6/include/fork256.h"
// #include "botan-1.6/include/has160.h"
// #include "botan-1.6/include/md2.h"
// #include "botan-1.6/include/md4.h"
#include "botan-1.6/include/md5.h"
// #include "botan-1.6/include/rmd128.h"
// #include "botan-1.6/include/rmd160.h"
#include "botan-1.6/include/sha160.h"
#include "botan-1.6/include/sha256.h"
// #include "botan-1.6/include/sha_64.h"
// #include "botan-1.6/include/tiger.h"
// #include "botan-1.6/include/whrlpool.h"
// #include "botan-1.6/include/par_hash.h"

// #include "botan-1.6/include/cmac.h"
#include "botan-1.6/include/hmac.h"
// #include "botan-1.6/include/x919_mac.h"

#include "botan-1.6/include/mode_pad.h"
// #include "botan-1.6/include/pgp_s2k.h"
#include "botan-1.6/include/pkcs5.h"

namespace Enctain {
namespace Botan {

/*************************************************
* Some macros to simplify control flow           *
*************************************************/
#define HANDLE_TYPE_NO_ARGS(NAME, TYPE)        \
   if(algo_name == NAME)                       \
      {                                        \
      if(name.size() == 1)                     \
         return new TYPE;                      \
      throw Invalid_Algorithm_Name(algo_spec); \
      }

#define HANDLE_TYPE_ONE_U32BIT(NAME, TYPE, DEFAULT) \
   if(algo_name == NAME)                            \
      {                                             \
      if(name.size() == 1)                          \
         return new TYPE(DEFAULT);                  \
      if(name.size() == 2)                          \
         return new TYPE(to_u32bit(name[1]));       \
      throw Invalid_Algorithm_Name(algo_spec);      \
      }

#define HANDLE_TYPE_TWO_U32BIT(NAME, TYPE, DEFAULT)               \
   if(algo_name == NAME)                                          \
      {                                                           \
      if(name.size() == 1)                                        \
         return new TYPE(DEFAULT);                                \
      if(name.size() == 2)                                        \
         return new TYPE(to_u32bit(name[1]));                     \
      if(name.size() == 3)                                        \
         return new TYPE(to_u32bit(name[1]), to_u32bit(name[2])); \
      throw Invalid_Algorithm_Name(algo_spec);                    \
      }

#define HANDLE_TYPE_ONE_STRING(NAME, TYPE)     \
   if(algo_name == NAME)                       \
      {                                        \
      if(name.size() == 2)                     \
         return new TYPE(name[1]);             \
      throw Invalid_Algorithm_Name(algo_spec); \
      }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
BlockCipher*
Default_Engine::find_block_cipher(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;
   const std::string algo_name = deref_alias(name[0]);

   HANDLE_TYPE_NO_ARGS("AES", AES);
   HANDLE_TYPE_NO_ARGS("AES-128", AES_128);
   HANDLE_TYPE_NO_ARGS("AES-192", AES_192);
   HANDLE_TYPE_NO_ARGS("AES-256", AES_256);
   // HANDLE_TYPE_NO_ARGS("Blowfish", Blowfish);
   // HANDLE_TYPE_NO_ARGS("CAST-128", CAST_128);
   // HANDLE_TYPE_NO_ARGS("CAST-256", CAST_256);
   HANDLE_TYPE_NO_ARGS("DES", DES);
   HANDLE_TYPE_NO_ARGS("DESX", DESX);
   HANDLE_TYPE_NO_ARGS("TripleDES", TripleDES);
   // HANDLE_TYPE_NO_ARGS("GOST", GOST);
   // HANDLE_TYPE_NO_ARGS("IDEA", IDEA);
   // HANDLE_TYPE_NO_ARGS("KASUMI", KASUMI);
   // HANDLE_TYPE_ONE_STRING("Luby-Rackoff", LubyRackoff);
   // HANDLE_TYPE_NO_ARGS("MARS", MARS);
   // HANDLE_TYPE_ONE_U32BIT("MISTY1", MISTY1, 8);
   // HANDLE_TYPE_NO_ARGS("RC2", RC2);
   // HANDLE_TYPE_ONE_U32BIT("RC5", RC5, 12);
   // HANDLE_TYPE_NO_ARGS("RC6", RC6);
   // HANDLE_TYPE_ONE_U32BIT("SAFER-SK", SAFER_SK, 10);
   // HANDLE_TYPE_NO_ARGS("SEED", SEED);
   HANDLE_TYPE_NO_ARGS("Serpent", Serpent);
   // HANDLE_TYPE_NO_ARGS("Skipjack", Skipjack);
   // HANDLE_TYPE_NO_ARGS("Square", Square);
   // HANDLE_TYPE_NO_ARGS("TEA", TEA);
   // HANDLE_TYPE_NO_ARGS("Twofish", Twofish);
   // HANDLE_TYPE_NO_ARGS("XTEA", XTEA);

   // if(algo_name == "Lion")
   //    {
   //    if(name.size() != 4)
   //       throw Invalid_Algorithm_Name(algo_spec);
   //    return new Lion(name[1], name[2], to_u32bit(name[3]));
   //    }
   return 0;
   }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
StreamCipher*
Default_Engine::find_stream_cipher(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;
   const std::string algo_name = deref_alias(name[0]);

   // HANDLE_TYPE_ONE_U32BIT("ARC4", ARC4, 0);
   // HANDLE_TYPE_ONE_U32BIT("RC4_drop", ARC4, 768);
   // HANDLE_TYPE_NO_ARGS("Turing", Turing);
   // HANDLE_TYPE_NO_ARGS("WiderWake4+1-BE", WiderWake_41_BE);

   return 0;
   }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
HashFunction*
Default_Engine::find_hash(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;
   const std::string algo_name = deref_alias(name[0]);

   // HANDLE_TYPE_NO_ARGS("Adler32", Adler32);
   // HANDLE_TYPE_NO_ARGS("CRC24", CRC24);
   HANDLE_TYPE_NO_ARGS("CRC32", CRC32);
   // HANDLE_TYPE_NO_ARGS("FORK-256", FORK_256);
   // HANDLE_TYPE_NO_ARGS("HAS-160", HAS_160);
   // HANDLE_TYPE_NO_ARGS("MD2", MD2);
   // HANDLE_TYPE_NO_ARGS("MD4", MD4);
   HANDLE_TYPE_NO_ARGS("MD5", MD5);
   // HANDLE_TYPE_NO_ARGS("RIPEMD-128", RIPEMD_128);
   // HANDLE_TYPE_NO_ARGS("RIPEMD-160", RIPEMD_160);
   HANDLE_TYPE_NO_ARGS("SHA-160", SHA_160);
   HANDLE_TYPE_NO_ARGS("SHA-256", SHA_256);
   // HANDLE_TYPE_NO_ARGS("SHA-384", SHA_384);
   // HANDLE_TYPE_NO_ARGS("SHA-512", SHA_512);
   // HANDLE_TYPE_TWO_U32BIT("Tiger", Tiger, 24);
   // HANDLE_TYPE_NO_ARGS("Whirlpool", Whirlpool);

   // if(algo_name == "Parallel")
   //    {
   //    if(name.size() < 2)
   //       throw Invalid_Algorithm_Name(algo_spec);
   //    name.erase(name.begin());
   //    return new Parallel(name);
   //    }
   return 0;
   }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
MessageAuthenticationCode*
Default_Engine::find_mac(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;
   const std::string algo_name = deref_alias(name[0]);

   // HANDLE_TYPE_ONE_STRING("CMAC", CMAC);
   HANDLE_TYPE_ONE_STRING("HMAC", HMAC);
   // HANDLE_TYPE_NO_ARGS("X9.19-MAC", ANSI_X919_MAC);

   return 0;
   }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
S2K* Default_Engine::find_s2k(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;

   const std::string algo_name = deref_alias(name[0]);

   HANDLE_TYPE_ONE_STRING("PBKDF1", PKCS5_PBKDF1);
   HANDLE_TYPE_ONE_STRING("PBKDF2", PKCS5_PBKDF2);
   // HANDLE_TYPE_ONE_STRING("OpenPGP-S2K", OpenPGP_S2K);

   return 0;
   }

/*************************************************
* Look for an algorithm with this name           *
*************************************************/
BlockCipherModePaddingMethod*
Default_Engine::find_bc_pad(const std::string& algo_spec) const
   {
   std::vector<std::string> name = parse_algorithm_name(algo_spec);
   if(name.empty())
      return 0;

   const std::string algo_name = deref_alias(name[0]);

   HANDLE_TYPE_NO_ARGS("PKCS7",       PKCS7_Padding);
   HANDLE_TYPE_NO_ARGS("OneAndZeros", OneAndZeros_Padding);
   HANDLE_TYPE_NO_ARGS("X9.23",       ANSI_X923_Padding);
   HANDLE_TYPE_NO_ARGS("NoPadding",   Null_Padding);

   return 0;
   }

}
}