87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
|
|
#ifndef __TWOFISH__H
|
|
#define __TWOFISH__H
|
|
#include "StdAfx.h"
|
|
#include <memory>
|
|
#include <string>
|
|
#define uint8_t unsigned char
|
|
#define uint32_t unsigned int
|
|
#define uint16_t unsigned short
|
|
|
|
|
|
#define TWOFISH
|
|
#define TWOFISH_BLOCKSIZE 16
|
|
enum TWOFISH_KEY
|
|
{
|
|
TWOFISH_KEY_128 = 128,
|
|
TWOFISH_KEY_192 = 192,
|
|
TWOFISH_KEY_256 = 256
|
|
};
|
|
|
|
enum TWOFISH_MODE
|
|
{
|
|
TWOFISH_ENCRYPT,
|
|
TWOFISH_DECRYPT
|
|
};
|
|
|
|
#ifdef TWOFISH
|
|
typedef struct twofish_t
|
|
{
|
|
uint8_t len;
|
|
uint32_t k[40];
|
|
uint32_t s[4][256];
|
|
} twofish_t;
|
|
|
|
typedef struct key_t
|
|
{
|
|
uint8_t len;
|
|
uint8_t* k;
|
|
} key_t;
|
|
typedef struct subkey_t
|
|
{
|
|
uint8_t len;
|
|
uint8_t s[4][4];
|
|
uint8_t me[4][4];
|
|
uint8_t mo[4][4];
|
|
} subkey_t;
|
|
#endif
|
|
|
|
|
|
class CTwoFish
|
|
{
|
|
|
|
public:
|
|
CTwoFish() {};
|
|
~CTwoFish() {};
|
|
public:
|
|
bool Twofish_ecb (uint8_t* in, uint8_t* out, uint32_t length, uint8_t* key, TWOFISH_KEY keylen = TWOFISH_KEY_256, TWOFISH_MODE mode = TWOFISH_ENCRYPT);
|
|
bool Twofish_cbc (uint8_t* in, uint8_t* out, uint32_t length, uint8_t* iv, uint8_t* key, TWOFISH_KEY keylen = TWOFISH_KEY_256, TWOFISH_MODE mode = TWOFISH_ENCRYPT);
|
|
|
|
public:
|
|
void Twofish_encryt (twofish_t* tf_twofish, uint8_t* data, uint8_t* cypher);
|
|
void Twofish_decryt (twofish_t* tf_twofish, uint8_t* cypher, uint8_t* data);
|
|
twofish_t* Twofish_setup (uint8_t* s, uint32_t len);
|
|
public:
|
|
std::string toHex(char* in, int len);
|
|
void fromHex(std::string str, char* out, int& len);
|
|
private:
|
|
void XOR(uint8_t* in, uint8_t* iv);
|
|
key_t* expand_key (uint8_t* s, uint32_t len);
|
|
uint8_t gf (uint8_t x, uint8_t y, uint16_t m);
|
|
subkey_t* Twofish_generate_subkey (key_t* tf_key);
|
|
void Twofish_h (uint8_t x[], uint8_t y[], uint8_t s[][4], int stage);
|
|
void Twofish_mds_mul (uint8_t y[], uint8_t out[]);
|
|
twofish_t* Twofish_generate_ext_k_keys (twofish_t* tf_twofish,
|
|
subkey_t* tf_subkey, uint32_t p, uint8_t k);
|
|
twofish_t* Twofish_generate_ext_s_keys (twofish_t* tf_twofish,
|
|
subkey_t* tf_subkey, uint8_t k);
|
|
void Twofish_f (twofish_t* tf_twofish, uint8_t r, uint32_t r0, uint32_t r1,
|
|
uint32_t* f0, uint32_t* f1);
|
|
uint32_t Twofish_g (twofish_t* tf_twofish, uint32_t x);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|