FreeRDP
Loading...
Searching...
No Matches
custom-crypto.h
1
20#ifndef WINPR_CUSTOM_CRYPTO_H
21#define WINPR_CUSTOM_CRYPTO_H
22
23#include <winpr/config.h>
24#include <winpr/winpr.h>
25#include <winpr/wtypes.h>
26
27#include <winpr/error.h>
28
33#define WINPR_MD4_DIGEST_LENGTH 16
34#define WINPR_MD5_DIGEST_LENGTH 16
35#define WINPR_SHA1_DIGEST_LENGTH 20
36#define WINPR_SHA224_DIGEST_LENGTH 28
37#define WINPR_SHA256_DIGEST_LENGTH 32
38#define WINPR_SHA384_DIGEST_LENGTH 48
39#define WINPR_SHA512_DIGEST_LENGTH 64
40#define WINPR_RIPEMD160_DIGEST_LENGTH 20
41#define WINPR_SHA3_224_DIGEST_LENGTH 28
42#define WINPR_SHA3_256_DIGEST_LENGTH 32
43#define WINPR_SHA3_384_DIGEST_LENGTH 48
44#define WINPR_SHA3_512_DIGEST_LENGTH 64
45#define WINPR_SHAKE128_DIGEST_LENGTH 16
46#define WINPR_SHAKE256_DIGEST_LENGTH 32
47
51typedef enum
52{
53 WINPR_MD_NONE = 0,
54 WINPR_MD_MD2 = 1,
55 WINPR_MD_MD4 = 2,
56 WINPR_MD_MD5 = 3,
57 WINPR_MD_SHA1 = 4,
58 WINPR_MD_SHA224 = 5,
59 WINPR_MD_SHA256 = 6,
60 WINPR_MD_SHA384 = 7,
61 WINPR_MD_SHA512 = 8,
62 WINPR_MD_RIPEMD160 = 9,
63 WINPR_MD_SHA3_224 = 10,
64 WINPR_MD_SHA3_256 = 11,
65 WINPR_MD_SHA3_384 = 12,
66 WINPR_MD_SHA3_512 = 13,
67 WINPR_MD_SHAKE128 = 14,
68 WINPR_MD_SHAKE256 = 15
69} WINPR_MD_TYPE;
70
71typedef struct winpr_hmac_ctx_private_st WINPR_HMAC_CTX;
72
73#ifdef __cplusplus
74extern "C"
75{
76#endif
77
78 WINPR_ATTR_NODISCARD
79 WINPR_API WINPR_MD_TYPE winpr_md_type_from_string(const char* name);
80
81 WINPR_ATTR_NODISCARD
82 WINPR_API const char* winpr_md_type_to_string(WINPR_MD_TYPE md);
83
84 WINPR_API void winpr_HMAC_Free(WINPR_HMAC_CTX* ctx);
85
86 WINPR_ATTR_MALLOC(winpr_HMAC_Free, 1)
87 WINPR_API WINPR_HMAC_CTX* winpr_HMAC_New(void);
88
89 WINPR_ATTR_NODISCARD
90 WINPR_API BOOL winpr_HMAC_Init(WINPR_HMAC_CTX* ctx, WINPR_MD_TYPE md, const void* key,
91 size_t keylen);
92 WINPR_ATTR_NODISCARD
93 WINPR_API BOOL winpr_HMAC_Update(WINPR_HMAC_CTX* ctx, const void* input, size_t ilen);
94
95 WINPR_ATTR_NODISCARD
96 WINPR_API BOOL winpr_HMAC_Final(WINPR_HMAC_CTX* ctx, void* output, size_t olen);
97
98 WINPR_ATTR_NODISCARD
99 WINPR_API BOOL winpr_HMAC(WINPR_MD_TYPE md, const void* key, size_t keylen, const void* input,
100 size_t ilen, void* output, size_t olen);
101
102#ifdef __cplusplus
103}
104#endif
105
110typedef struct winpr_digest_ctx_private_st WINPR_DIGEST_CTX;
111
112#ifdef __cplusplus
113extern "C"
114{
115#endif
116
117 WINPR_API void winpr_Digest_Free(WINPR_DIGEST_CTX* ctx);
118
119 WINPR_ATTR_MALLOC(winpr_Digest_Free, 1)
120 WINPR_API WINPR_DIGEST_CTX* winpr_Digest_New(void);
121
122 WINPR_ATTR_NODISCARD
123 WINPR_API BOOL winpr_Digest_Init_Allow_FIPS(WINPR_DIGEST_CTX* ctx, WINPR_MD_TYPE md);
124
125 WINPR_ATTR_NODISCARD
126 WINPR_API BOOL winpr_Digest_Init(WINPR_DIGEST_CTX* ctx, WINPR_MD_TYPE md);
127
128 WINPR_ATTR_NODISCARD
129 WINPR_API BOOL winpr_Digest_Update(WINPR_DIGEST_CTX* ctx, const void* input, size_t ilen);
130
131 WINPR_ATTR_NODISCARD
132 WINPR_API BOOL winpr_Digest_Final(WINPR_DIGEST_CTX* ctx, void* output, size_t olen);
133
134 WINPR_ATTR_NODISCARD
135 WINPR_API BOOL winpr_Digest_Allow_FIPS(WINPR_MD_TYPE md, const void* input, size_t ilen,
136 void* output, size_t olen);
137
138 WINPR_ATTR_NODISCARD
139 WINPR_API BOOL winpr_Digest(WINPR_MD_TYPE md, const void* input, size_t ilen, void* output,
140 size_t olen);
141
142 WINPR_ATTR_NODISCARD
143 WINPR_API BOOL winpr_DigestSign_Init(WINPR_DIGEST_CTX* ctx, WINPR_MD_TYPE md, void* key);
144
145 WINPR_ATTR_NODISCARD
146 WINPR_API BOOL winpr_DigestSign_Update(WINPR_DIGEST_CTX* ctx, const void* input, size_t ilen);
147
148 WINPR_ATTR_NODISCARD
149 WINPR_API BOOL winpr_DigestSign_Final(WINPR_DIGEST_CTX* ctx, void* output, size_t* piolen);
150
151#ifdef __cplusplus
152}
153#endif
154
159#ifdef __cplusplus
160extern "C"
161{
162#endif
163
164 WINPR_ATTR_NODISCARD
165 WINPR_API int winpr_RAND(void* output, size_t len);
166
167 WINPR_ATTR_NODISCARD
168 WINPR_API int winpr_RAND_pseudo(void* output, size_t len);
169
170#ifdef __cplusplus
171}
172#endif
173
178typedef struct winpr_rc4_ctx_private_st WINPR_RC4_CTX;
179
180#ifdef __cplusplus
181extern "C"
182{
183#endif
184
185 WINPR_API void winpr_RC4_Free(WINPR_RC4_CTX* ctx);
186
187 WINPR_ATTR_MALLOC(winpr_RC4_Free, 1)
188 WINPR_API WINPR_RC4_CTX* winpr_RC4_New_Allow_FIPS(const void* key, size_t keylen);
189
190 WINPR_ATTR_MALLOC(winpr_RC4_Free, 1)
191 WINPR_API WINPR_RC4_CTX* winpr_RC4_New(const void* key, size_t keylen);
192
193 WINPR_ATTR_NODISCARD
194 WINPR_API BOOL winpr_RC4_Update(WINPR_RC4_CTX* ctx, size_t length, const void* input,
195 void* output);
196
197#ifdef __cplusplus
198}
199#endif
200
205#define WINPR_AES_BLOCK_SIZE 16
206
207/* cipher operation types */
208#define WINPR_CIPHER_MAX_IV_LENGTH 16u
209#define WINPR_CIPHER_MAX_KEY_LENGTH 64u
210
211typedef enum
212{
213 WINPR_ENCRYPT = 0,
214 WINPR_DECRYPT = 1
215} WINPR_CRYPTO_OPERATION;
216
217/* cipher types */
218typedef enum
219{
220 WINPR_CIPHER_NONE = 0,
221 WINPR_CIPHER_NULL = 1,
222 WINPR_CIPHER_AES_128_ECB = 2,
223 WINPR_CIPHER_AES_192_ECB = 3,
224 WINPR_CIPHER_AES_256_ECB = 4,
225 WINPR_CIPHER_AES_128_CBC = 5,
226 WINPR_CIPHER_AES_192_CBC = 6,
227 WINPR_CIPHER_AES_256_CBC = 7,
228 WINPR_CIPHER_AES_128_CFB128 = 8,
229 WINPR_CIPHER_AES_192_CFB128 = 9,
230 WINPR_CIPHER_AES_256_CFB128 = 10,
231 WINPR_CIPHER_AES_128_CTR = 11,
232 WINPR_CIPHER_AES_192_CTR = 12,
233 WINPR_CIPHER_AES_256_CTR = 13,
234 WINPR_CIPHER_AES_128_GCM = 14,
235 WINPR_CIPHER_AES_192_GCM = 15,
236 WINPR_CIPHER_AES_256_GCM = 16,
237 WINPR_CIPHER_CAMELLIA_128_ECB = 17,
238 WINPR_CIPHER_CAMELLIA_192_ECB = 18,
239 WINPR_CIPHER_CAMELLIA_256_ECB = 19,
240 WINPR_CIPHER_CAMELLIA_128_CBC = 20,
241 WINPR_CIPHER_CAMELLIA_192_CBC = 21,
242 WINPR_CIPHER_CAMELLIA_256_CBC = 22,
243 WINPR_CIPHER_CAMELLIA_128_CFB128 = 23,
244 WINPR_CIPHER_CAMELLIA_192_CFB128 = 24,
245 WINPR_CIPHER_CAMELLIA_256_CFB128 = 25,
246 WINPR_CIPHER_CAMELLIA_128_CTR = 26,
247 WINPR_CIPHER_CAMELLIA_192_CTR = 27,
248 WINPR_CIPHER_CAMELLIA_256_CTR = 28,
249 WINPR_CIPHER_CAMELLIA_128_GCM = 29,
250 WINPR_CIPHER_CAMELLIA_192_GCM = 30,
251 WINPR_CIPHER_CAMELLIA_256_GCM = 31,
252 WINPR_CIPHER_DES_ECB = 32,
253 WINPR_CIPHER_DES_CBC = 33,
254 WINPR_CIPHER_DES_EDE_ECB = 34,
255 WINPR_CIPHER_DES_EDE_CBC = 35,
256 WINPR_CIPHER_DES_EDE3_ECB = 36,
257 WINPR_CIPHER_DES_EDE3_CBC = 37,
258 WINPR_CIPHER_BLOWFISH_ECB = 38,
259 WINPR_CIPHER_BLOWFISH_CBC = 39,
260 WINPR_CIPHER_BLOWFISH_CFB64 = 40,
261 WINPR_CIPHER_BLOWFISH_CTR = 41,
262 WINPR_CIPHER_ARC4_128 = 42,
263 WINPR_CIPHER_AES_128_CCM = 43,
264 WINPR_CIPHER_AES_192_CCM = 44,
265 WINPR_CIPHER_AES_256_CCM = 45,
266 WINPR_CIPHER_CAMELLIA_128_CCM = 46,
267 WINPR_CIPHER_CAMELLIA_192_CCM = 47,
268 WINPR_CIPHER_CAMELLIA_256_CCM = 48,
269} WINPR_CIPHER_TYPE;
270
271typedef struct winpr_cipher_ctx_private_st WINPR_CIPHER_CTX;
272
273#ifdef __cplusplus
274extern "C"
275{
276#endif
277
285 WINPR_ATTR_NODISCARD
286 WINPR_API WINPR_CIPHER_TYPE winpr_cipher_type_from_string(const char* name);
287
295 WINPR_ATTR_NODISCARD
296 WINPR_API const char* winpr_cipher_type_to_string(WINPR_CIPHER_TYPE md);
297
298 WINPR_API void winpr_Cipher_Free(WINPR_CIPHER_CTX* ctx);
299
300#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
301 WINPR_DEPRECATED_VAR("[since 3.10.0] use winpr_Cipher_NewEx",
302 WINPR_ATTR_MALLOC(winpr_Cipher_Free, 1)
303 WINPR_API WINPR_CIPHER_CTX* winpr_Cipher_New(WINPR_CIPHER_TYPE cipher,
304 WINPR_CRYPTO_OPERATION op,
305 const void* key,
306 const void* iv));
307#endif /* WITHOUT_WINPR_3x_DEPRECATED */
308
325 WINPR_ATTR_MALLOC(winpr_Cipher_Free, 1)
326 WINPR_API WINPR_CIPHER_CTX* winpr_Cipher_NewEx(WINPR_CIPHER_TYPE cipher,
327 WINPR_CRYPTO_OPERATION op, const void* key,
328 size_t keylen, const void* iv, size_t ivlen);
329
330 WINPR_ATTR_NODISCARD
331 WINPR_API BOOL winpr_Cipher_SetPadding(WINPR_CIPHER_CTX* ctx, BOOL enabled);
332
333 WINPR_ATTR_NODISCARD
334 WINPR_API BOOL winpr_Cipher_Update(WINPR_CIPHER_CTX* ctx, const void* input, size_t ilen,
335 void* output, size_t* olen);
336
337 WINPR_ATTR_NODISCARD
338 WINPR_API BOOL winpr_Cipher_Final(WINPR_CIPHER_CTX* ctx, void* output, size_t* olen);
339
340#ifdef __cplusplus
341}
342#endif
343
348#ifdef __cplusplus
349extern "C"
350{
351#endif
352
353 WINPR_ATTR_NODISCARD
354 WINPR_API int winpr_Cipher_BytesToKey(int cipher, WINPR_MD_TYPE md, const void* salt,
355 const void* data, size_t datal, size_t count, void* key,
356 void* iv);
357
358#ifdef __cplusplus
359}
360#endif
361
362#endif /* WINPR_CUSTOM_CRYPTO_H */