summaryrefslogtreecommitdiff
path: root/plugins/CryptoPP/src/cryptopp.h
blob: f3c1cb8aca6b0702c905ec061ba6784c63b20441 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#ifndef __CRYPTOPP_H__
#define __CRYPTOPP_H__

#include <queue>
#include <deque>
#include <list>
#include <map>

#pragma warning(disable: 4231 4250 4251 4275 4660 4661 4700 4706 4786 4355)
#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include "../crypto/src/modes.h"
#include "../crypto/src/osrng.h"
#include "../crypto/src/rsa.h"
#include "../crypto/src/aes.h"
#include "../crypto/src/dh.h"
#include "../crypto/src/crc.h"
#include "../crypto/src/ripemd.h"
#include "../crypto/src/sha.h"
#include "../crypto/src/tiger.h"
#include "../crypto/src/gzip.h"
#include "../crypto/src/zlib.h"
#include "../crypto/src/files.h"

USING_NAMESPACE(CryptoPP);
USING_NAMESPACE(std)

#define KEYSIZE 256
#define DEFMSGS 4096

#define HEADER 0xABCD1234
#define FOOTER 0x9876FEDC
#define EMPTYH 0xF1E2D3C4

typedef struct __CNTX {
	u_int	header;     // HEADER
	short	mode;       // mode of encoding
	short	features;   // features of client
	short	error;      // error code of last operation
	uint8_t*	pdata;   // data block
	PVOID	udata;      // user data
	LPSTR	tmp;        // return string
	u_int	deleted;    // delete time&flag to delete
	u_int	footer;     // FOOTER
} CNTX;
typedef CNTX* pCNTX;


#define FEATURES_UTF8			0x01
#define FEATURES_BASE64			0x02
#define FEATURES_GZIP			0x04
#define FEATURES_CRC32			0x08
#define FEATURES_PSK			0x10
#define FEATURES_NEWPG			0x20
#define FEATURES_RSA			0x40

#define MODE_BASE16			0x0000
#define MODE_BASE64			0x0001
#define MODE_PGP			0x0002
#define MODE_GPG			0x0004
#define MODE_GPG_ANSI			0x0008
#define MODE_PRIV_KEY			0x0010
#define MODE_RSA_2048			0x0020
#define MODE_RSA_4096			0x0040
#define MODE_RSA			MODE_RSA_4096
#define MODE_RSA_ONLY			0x0080
#define MODE_RSA_ZLIB			0x0100
#define MODE_RSA_BER 			0x0200

#define DATA_GZIP			1

typedef struct __SIMDATA {
	DH	*dh;         // diffie-hellman
	uint8_t*	PubA;  // public keyA 2048 bit
	uint8_t*	KeyA;  // private keyA 2048 bit
	uint8_t*	KeyB;  // public keyB 2048 bit
	uint8_t*	KeyX;  // secret keyX 192 bit
	uint8_t*	KeyP;  // pre-shared keyP 192 bit
} SIMDATA;
typedef SIMDATA* pSIMDATA;


typedef struct __PGPDATA {
	uint8_t*	pgpKeyID; // PGP KeyID
	uint8_t*	pgpKey;   // PGP Key
} PGPDATA;
typedef PGPDATA* pPGPDATA;


typedef struct __GPGDATA {
	uint8_t	*gpgKeyID; // GPG KeyID
} GPGDATA;
typedef GPGDATA* pGPGDATA;


#define RSA_KEYSIZE		SHA1::DIGESTSIZE
#define RSA_CalculateDigest	SHA1().CalculateDigest


typedef struct __RSAPRIV {
	string	priv_k;	// private key string
	string	priv_s;	// hash(priv_k)
	RSA::PrivateKey priv; // private key
	string	pub_k;	// public key string
	string	pub_s;	// hash(pub_k)
} RSAPRIV;
typedef RSAPRIV* pRSAPRIV;


typedef deque<string, allocator<string> > STRINGDEQUE;
typedef queue<string, STRINGDEQUE> STRINGQUEUE;


typedef struct __RSADATA {
	short			state;	// 0 - нифига нет, 1..6 - keyexchange, 7 - соединение установлено
	u_int			time;	// для прерывания keyexchange, если долго нет ответа
	string			pub_k;	// public key string
	string			pub_s;	// hash(pub_k)
	RSA::PublicKey		pub;	// public key
	string			aes_k;	// aes key
	string			aes_v;	// aes iv
	HANDLE	 		thread; // thread handle
	BOOL			thread_exit;
	HANDLE			event;	// thread event
	STRINGQUEUE		*queue;  // thread queue
} RSADATA;
typedef RSADATA* pRSADATA;


#define ERROR_NONE			0
#define ERROR_SEH			1
#define ERROR_NO_KEYA			2
#define ERROR_NO_KEYB			3
#define ERROR_NO_KEYX			4
#define ERROR_BAD_LEN			5
#define ERROR_BAD_CRC			6
#define ERROR_NO_PSK			7
#define ERROR_BAD_PSK			8
#define ERROR_BAD_KEYB			9
#define ERROR_NO_PGP_KEY		10
#define ERROR_NO_PGP_PASS		11
#define ERROR_NO_GPG_KEY		12
#define ERROR_NO_GPG_PASS		13

#if defined(_DEBUG)
#define FEATURES (FEATURES_UTF8 | FEATURES_BASE64 | FEATURES_GZIP | FEATURES_CRC32 | FEATURES_NEWPG)
#else
#define FEATURES (FEATURES_UTF8 | FEATURES_BASE64 | FEATURES_GZIP | FEATURES_CRC32 | FEATURES_NEWPG | FEATURES_RSA)
#endif

#define DLLEXPORT __declspec(dllexport)

extern LPCSTR szModuleName;
extern LPCSTR szVersionStr;

pCNTX get_context_on_id(int);
pCNTX get_context_on_id(HANDLE);
void cpp_free_keys(pCNTX);
uint8_t *cpp_gzip(uint8_t*, size_t, size_t&);
uint8_t *cpp_gunzip(uint8_t*, size_t, size_t&);
string cpp_zlibc(string&);
string cpp_zlibd(string&);

typedef struct {
	int(__cdecl *rsa_gen_keypair)(short);				// генерит RSA-ключи для указанной длины (либо тока 2048, либо 2048 и 4096)
	int(__cdecl *rsa_get_keypair)(short, uint8_t*, int*, uint8_t*, int*);	// возвращает пару ключей для указанной длины
	int(__cdecl *rsa_get_keyhash)(short, uint8_t*, int*, uint8_t*, int*);	// возвращает hash пары ключей для указанной длины
	int(__cdecl *rsa_set_keypair)(short, uint8_t*, int);			// устанавливает ключи, указанной длины
	int(__cdecl *rsa_get_pubkey)(HANDLE, uint8_t*, int*);			// возвращает паблик ключ из указанного контекста
	int(__cdecl *rsa_set_pubkey)(HANDLE, uint8_t*, int);			// загружает паблик ключ для указанного контекста
	void(__cdecl *rsa_set_timeout)(int);				// установить таймаут для установки секюрного соединения
	int(__cdecl *rsa_get_state)(HANDLE);				// получить статус указанного контекста
	int(__cdecl *rsa_get_hash)(uint8_t*, int, uint8_t*, int*);			// вычисляет SHA1(key)
	int(__cdecl *rsa_connect)(HANDLE);					// запускает процесс установки содинения с указанным контекстом
	int(__cdecl *rsa_disconnect)(HANDLE);				// разрывает соединение с указанным контекстом
	int(__cdecl *rsa_disabled)(HANDLE);				// разрывает соединение по причине "disabled"
	LPSTR(__cdecl *rsa_recv)(HANDLE, LPCSTR);				// необходимо передавать сюда все входящие протокольные сообщения
	int(__cdecl *rsa_send)(HANDLE, LPCSTR);				// вызываем для отправки сообщения клиенту
	int(__cdecl *rsa_encrypt_file)(HANDLE, LPCSTR, LPCSTR);
	int(__cdecl *rsa_decrypt_file)(HANDLE, LPCSTR, LPCSTR);
	LPSTR(__cdecl *utf8encode)(LPCWSTR);
	LPWSTR(__cdecl *utf8decode)(LPCSTR);
	int(__cdecl *is_7bit_string)(LPCSTR);
	int(__cdecl *is_utf8_string)(LPCSTR);
	int(__cdecl *rsa_export_keypair)(short, LPSTR, LPSTR, LPSTR);		// export private key
	int(__cdecl *rsa_import_keypair)(short, LPSTR, LPSTR);		// import & activate private key
	int(__cdecl *rsa_export_pubkey)(HANDLE, LPSTR);			// export public key from context
	int(__cdecl *rsa_import_pubkey)(HANDLE, LPSTR);			// import public key into context
} RSA_EXPORT;
typedef RSA_EXPORT* pRSA_EXPORT;

typedef struct {
	int(__cdecl *rsa_inject)(HANDLE, LPCSTR);			// вставляет сообщение в очередь на отправку
	int(__cdecl *rsa_check_pub)(HANDLE, uint8_t*, int, uint8_t*, int);	// проверяет интерактивно SHA и сохраняет ключ, если все нормально
	void(__cdecl *rsa_notify)(HANDLE, int);			// нотификация о смене состояния
} RSA_IMPORT;
typedef RSA_IMPORT* pRSA_IMPORT;

NAMESPACE_BEGIN(CryptoPP)
typedef RSASS<PKCS1v15, SHA256>::Signer RSASSA_PKCS1v15_SHA256_Signer;
typedef RSASS<PKCS1v15, SHA256>::Verifier RSASSA_PKCS1v15_SHA256_Verifier;
NAMESPACE_END

#endif