00001
00005 #ifndef _CIPHER_H_
00006 #define _CIPHER_H_
00007
00008 #define CYFER_CIPHER_NONE 0
00009 #define CYFER_CIPHER_BLOWFISH 1
00010 #define CYFER_CIPHER_DES 2
00011 #define CYFER_CIPHER_DESX 3
00012 #define CYFER_CIPHER_TRIPLEDES 4
00013 #define CYFER_CIPHER_RC2 5
00014 #define CYFER_CIPHER_RC4 6
00015 #define CYFER_CIPHER_RC5 7
00016 #define CYFER_CIPHER_RC6 8
00017 #define CYFER_CIPHER_IDEA 9
00018 #define CYFER_CIPHER_AES 10
00019 #define CYFER_CIPHER_DEAL 11
00020 #define CYFER_CIPHER_THREEWAY 12
00021
00022 #define CYFER_MODE_NONE 0
00023 #define CYFER_MODE_ECB 1
00024 #define CYFER_MODE_CBC 2
00025 #define CYFER_MODE_CFB 3
00026 #define CYFER_MODE_OFB 4
00027
00028
00029 #ifdef CYFER_INTERNAL
00030 #include <util.h>
00031 #include <blowfish.h>
00032 #include <des.h>
00033 #include <desx.h>
00034 #include <tripledes.h>
00035 #include <rc2.h>
00036 #include <rc4.h>
00037 #include <rc5.h>
00038 #include <rc6.h>
00039 #include <idea.h>
00040 #include <aes.h>
00041 #include <deal.h>
00042 #include <threeway.h>
00043
00044 typedef struct {
00045 int mode;
00046 void *context;
00047 cyfer_crypt_handler_t encrypt;
00048 cyfer_crypt_handler_t decrypt;
00049 size_t length;
00050 unsigned char *chain;
00051 unsigned char *outbuf;
00052 } CYFER_BLOCK_MODE_CTX;
00053
00054 typedef struct {
00055 int type;
00056 union {
00057 BLOWFISH_CTX blowfish;
00058 DES_CTX des;
00059 DESX_CTX desx;
00060 TRIPLEDES_CTX tripledes;
00061 RC2_CTX rc2;
00062 RC5_CTX rc5;
00063 RC6_CTX rc6;
00064 IDEA_CTX idea;
00065 AES_CTX aes;
00066 DEAL_CTX deal;
00067 THREEWAY_CTX threeway;
00068 } u;
00069 CYFER_BLOCK_MODE_CTX mctx;
00070 } CYFER_BLOCK_CIPHER_CTX;
00071
00072 typedef struct {
00073 int type;
00074 union {
00075 RC4_CTX rc4;
00076 } u;
00077 } CYFER_STREAM_CIPHER_CTX;
00078
00079 #else
00080 #include <cyfer/cyfer.h>
00082 typedef void CYFER_BLOCK_CIPHER_CTX;
00084 typedef void CYFER_STREAM_CIPHER_CTX;
00085 #endif
00086
00088 typedef struct {
00090 int type;
00092 char *name;
00094 size_t keylen;
00096 size_t minkey;
00098 size_t length;
00099 } CYFER_BlockCipher_t;
00100
00102 typedef struct {
00104 int type;
00106 char *name;
00108 size_t keylen;
00110 size_t minkey;
00111 } CYFER_StreamCipher_t;
00112
00114 typedef struct {
00116 int type;
00118 char *name;
00120 size_t length;
00121 } CYFER_BlockMode_t;
00122
00123
00124 #ifdef __cplusplus
00125 extern "C" {
00126 #endif
00127
00129 CYFER_API CYFER_BlockMode_t *CYFER_BlockCipher_Get_SupportedModes(void);
00130
00132 CYFER_API CYFER_BlockCipher_t *CYFER_BlockCipher_Get_Supported(void);
00133
00141 CYFER_API int CYFER_BlockCipher_Select(const char *name, size_t *keylen, size_t *minkey, size_t *length);
00142
00149 CYFER_API int CYFER_BlockCipher_SelectMode(const char *name, size_t *length);
00150
00160 CYFER_API CYFER_BLOCK_CIPHER_CTX *CYFER_BlockCipher_Init(int type, const unsigned char *key, size_t keylen, int mode, const unsigned char *ivec);
00161
00166 CYFER_API void CYFER_BlockCipher_Encrypt(CYFER_BLOCK_CIPHER_CTX *ctx, const unsigned char *input, unsigned char *output);
00167
00172 CYFER_API void CYFER_BlockCipher_Decrypt(CYFER_BLOCK_CIPHER_CTX *ctx, const unsigned char *input, unsigned char *output);
00173
00176 CYFER_API void CYFER_BlockCipher_Finish(CYFER_BLOCK_CIPHER_CTX *ctx);
00177
00179 CYFER_API CYFER_StreamCipher_t *CYFER_StreamCipher_Get_Supported(void);
00180
00187 CYFER_API int CYFER_StreamCipher_Select(const char *name, size_t *keylen, size_t *minkey);
00188
00194 CYFER_API CYFER_STREAM_CIPHER_CTX *CYFER_StreamCipher_Init(int type, const unsigned char *key, size_t keylen);
00195
00201 CYFER_API void CYFER_StreamCipher_Encrypt(CYFER_STREAM_CIPHER_CTX *ctx, const unsigned char *input, unsigned char *output, size_t length);
00202
00208 CYFER_API void CYFER_StreamCipher_Decrypt(CYFER_STREAM_CIPHER_CTX *ctx, const unsigned char *input, unsigned char *output, size_t length);
00209
00212 CYFER_API void CYFER_StreamCipher_Finish(CYFER_STREAM_CIPHER_CTX *ctx);
00213
00214 #ifdef __cplusplus
00215 };
00216 #endif
00217
00218 #endif
00219