00001 #ifndef CRYPTOPP_SHARK_H
00002 #define CRYPTOPP_SHARK_H
00003
00004
00005
00006
00007 #include "config.h"
00008
00009 #ifdef WORD64_AVAILABLE
00010
00011 #include "seckey.h"
00012 #include "secblock.h"
00013
00014 NAMESPACE_BEGIN(CryptoPP)
00015
00016
00017 struct SHARK_Info : public FixedBlockSize<8>, public VariableKeyLength<16, 1, 16>, public VariableRounds<6, 2>
00018 {
00019 static const char *StaticAlgorithmName() {return "SHARK-E";}
00020 };
00021
00022
00023 class SHARK : public SHARK_Info, public BlockCipherDocumentation
00024 {
00025 class CRYPTOPP_NO_VTABLE Base : public BlockCipherImpl<SHARK_Info>
00026 {
00027 public:
00028 void UncheckedSetKey(const byte *key, unsigned int length, const NameValuePairs ¶m);
00029
00030 protected:
00031 unsigned int m_rounds;
00032 SecBlock<word64> m_roundKeys;
00033 };
00034
00035 class CRYPTOPP_NO_VTABLE Enc : public Base
00036 {
00037 public:
00038 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00039
00040
00041 void InitForKeySetup();
00042
00043 private:
00044 static const byte sbox[256];
00045 static const word64 cbox[8][256];
00046 };
00047
00048 class CRYPTOPP_NO_VTABLE Dec : public Base
00049 {
00050 public:
00051 void ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const;
00052
00053 private:
00054 static const byte sbox[256];
00055 static const word64 cbox[8][256];
00056 };
00057
00058 public:
00059 typedef BlockCipherFinal<ENCRYPTION, Enc> Encryption;
00060 typedef BlockCipherFinal<DECRYPTION, Dec> Decryption;
00061 };
00062
00063 typedef SHARK::Encryption SHARKEncryption;
00064 typedef SHARK::Decryption SHARKDecryption;
00065
00066 NAMESPACE_END
00067
00068 #endif
00069 #endif