WinRFCOMM_client/twofish.h
2024-02-15 12:00:37 +08:00

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