1 /**
2  * Bindings for `<openssl/evp.h>`
3  *
4  * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
5  *
6  * Licensed under the Apache License 2.0 (the "License").  You may not use
7  * this file except in compliance with the License.  You can obtain a copy
8  * in the file LICENSE in the source distribution or at
9  * https://www.openssl.org/source/license.html
10  */
11 module deimos.openssl.evp;
12 
13 import deimos.openssl._d_util;
14 
15 import deimos.openssl.x509; // Needed for X509_ATTRIBUTE.
16 
17 //#ifdef OPENSSL_ALGORITHM_DEFINES
18 public import deimos.openssl.opensslconf;
19 //#else
20 //# define OPENSSL_ALGORITHM_DEFINES
21 //public import deimos.openssl.opensslconf;
22 //# undef OPENSSL_ALGORITHM_DEFINES
23 //#endif
24 
25 public import deimos.openssl.types;
26 
27 public import deimos.openssl.symhacks;
28 
29 version(OPENSSL_NO_BIO) {} else {
30 public import deimos.openssl.bio;
31 }
32 
33 /*
34 enum EVP_RC2_KEY_SIZE = 16;
35 enum EVP_RC4_KEY_SIZE = 16;
36 enum EVP_BLOWFISH_KEY_SIZE = 16;
37 enum EVP_CAST5_KEY_SIZE = 16;
38 enum EVP_RC5_32_12_16_KEY_SIZE = 16;
39 */
40 enum EVP_MAX_MD_SIZE = 64;	/* longest known is SHA512 */
41 enum EVP_MAX_KEY_LENGTH = 64;
42 enum EVP_MAX_IV_LENGTH = 16;
43 enum EVP_MAX_BLOCK_LENGTH = 32;
44 
45 enum PKCS5_SALT_LEN = 8;
46 /* Default PKCS#5 iteration count */
47 enum PKCS5_DEFAULT_ITER = 2048;
48 
49 public import deimos.openssl.objects;
50 
51 enum EVP_PK_RSA = 0x0001;
52 enum EVP_PK_DSA = 0x0002;
53 enum EVP_PK_DH = 0x0004;
54 enum EVP_PK_EC = 0x0008;
55 enum EVP_PKT_SIGN = 0x0010;
56 enum EVP_PKT_ENC = 0x0020;
57 enum EVP_PKT_EXCH = 0x0040;
58 enum EVP_PKS_RSA = 0x0100;
59 enum EVP_PKS_DSA = 0x0200;
60 enum EVP_PKS_EC = 0x0400;
61 enum EVP_PKT_EXP = 0x1000; /* <= 512 bit key */
62 
63 alias EVP_PKEY_NONE = NID_undef;
64 alias EVP_PKEY_RSA  = NID_rsaEncryption;
65 alias EVP_PKEY_RSA2 = NID_rsa;
66 alias EVP_PKEY_DSA  = NID_dsa;
67 alias EVP_PKEY_DSA1 = NID_dsa_2;
68 alias EVP_PKEY_DSA2 = NID_dsaWithSHA;
69 alias EVP_PKEY_DSA3 = NID_dsaWithSHA1;
70 alias EVP_PKEY_DSA4 = NID_dsaWithSHA1_2;
71 alias EVP_PKEY_DH   = NID_dhKeyAgreement;
72 alias EVP_PKEY_EC   = NID_X9_62_id_ecPublicKey;
73 alias EVP_PKEY_HMAC = NID_hmac;
74 alias EVP_PKEY_CMAC = NID_cmac;
75 alias EVP_PKEY_TLS1_PRF = NID_tls1_prf;
76 alias EVP_PKEY_HKDF     = NID_hkdf;
77 
78 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 1))
79 {
80     alias EVP_PKEY_SCRYPT   = NID_id_scrypt;
81     alias EVP_PKEY_POLY1305 = NID_poly1305;
82     alias EVP_PKEY_SIPHASH  = NID_siphash;
83     alias EVP_PKEY_X25519   = NID_X25519;
84     alias EVP_PKEY_ED25519  = NID_ED25519;
85     alias EVP_PKEY_X448     = NID_X448;
86     alias EVP_PKEY_ED448    = NID_ED448;
87 }
88 
89 extern (C):
90 nothrow:
91 
92 enum EVP_PKEY_MO_SIGN = 0x0001;
93 enum EVP_PKEY_MO_VERIFY = 0x0002;
94 enum EVP_PKEY_MO_ENCRYPT = 0x0004;
95 enum EVP_PKEY_MO_DECRYPT = 0x0008;
96 
97 EVP_MD* EVP_MD_meth_new(int md_type, int pkey_type);
98 EVP_MD* EVP_MD_meth_dup(const(EVP_MD)* md);
99 void EVP_MD_meth_free(EVP_MD* md);
100 
101 int EVP_MD_meth_set_input_blocksize(EVP_MD* md, int blocksize);
102 int EVP_MD_meth_set_result_size(EVP_MD* md, int resultsize);
103 int EVP_MD_meth_set_app_datasize(EVP_MD* md, int datasize);
104 int EVP_MD_meth_set_flags(EVP_MD* md, c_ulong flags);
105 
106 int EVP_MD_meth_get_input_blocksize(const(EVP_MD)* md);
107 int EVP_MD_meth_get_result_size(const(EVP_MD)* md);
108 int EVP_MD_meth_get_app_datasize(const(EVP_MD)* md);
109 c_ulong EVP_MD_meth_get_flags(const(EVP_MD)* md);
110 
111 // Internal types to help define the bindings
112 private alias EVP_MD_lifetime_fn = int function(EVP_MD_CTX* ctx);
113 private alias EVP_MD_update_fn   = int function(EVP_MD_CTX* ctx,
114 	const(void)* data, size_t count);
115 private alias EVP_MD_final_fn    = int function(EVP_MD_CTX* ctx, ubyte* md);
116 private alias EVP_MD_copy_fn     = int function(EVP_MD_CTX* ctx, const(EVP_MD_CTX)* from);
117 private alias EVP_MD_cleanup_fn  = int function(EVP_MD_CTX* ctx,
118 	const(void)* data, size_t count);
119 private alias EVP_MD_ctrl_fn     = int function(EVP_MD_CTX* ctx,
120 	int cmd, int p1, void* p2);
121 
122 int EVP_MD_meth_set_init(EVP_MD* md, EVP_MD_lifetime_fn init);
123 int EVP_MD_meth_set_update(EVP_MD* md, EVP_MD_update_fn update);
124 int EVP_MD_meth_set_final(EVP_MD* md, EVP_MD_final_fn final_);
125 int EVP_MD_meth_set_copy(EVP_MD* md, EVP_MD_copy_fn copy);
126 int EVP_MD_meth_set_cleanup(EVP_MD* md, EVP_MD_lifetime_fn cleanup);
127 int EVP_MD_meth_set_ctrl(EVP_MD* md, EVP_MD_ctrl_fn ctrl);
128 
129 EVP_MD_lifetime_fn EVP_MD_meth_get_init(const(EVP_MD)* md);
130 EVP_MD_update_fn EVP_MD_meth_get_update(const(EVP_MD)* md);
131 EVP_MD_final_fn EVP_MD_meth_get_final(const(EVP_MD)* md);
132 EVP_MD_copy_fn EVP_MD_meth_get_copy(const(EVP_MD)* md);
133 EVP_MD_lifetime_fn EVP_MD_meth_get_cleanup(const(EVP_MD)* md);
134 EVP_MD_ctrl_fn EVP_MD_meth_get_ctrl(const(EVP_MD)* md);
135 
136 alias evp_sign_method = typeof(*(ExternC!(int function(int type,const(ubyte)* m,
137 			    uint m_length,ubyte* sigret,
138 			    uint* siglen, void* key))).init);
139 alias evp_verify_method = typeof(*(ExternC!(int function(int type,const(ubyte)* m,
140 			    uint m_length,const(ubyte)* sigbuf,
141 			    uint siglen, void* key))).init);
142 
143 enum EVP_MD_FLAG_ONESHOT = 0x0001; /* digest can only handle a single
144 					* block */
145 
146 enum EVP_MD_FLAG_PKEY_DIGEST = 0x0002; /* digest is a "clone" digest used
147 					* which is a copy of an existing
148 					* one for a specific public key type.
149 					* EVP_dss1() etc */
150 
151 /* Digest uses EVP_PKEY_METHOD for signing instead of MD specific signing */
152 
153 enum EVP_MD_FLAG_PKEY_METHOD_SIGNATURE = 0x0004;
154 
155 /* DigestAlgorithmIdentifier flags... */
156 
157 enum EVP_MD_FLAG_DIGALGID_MASK = 0x0018;
158 
159 /* NULL or absent parameter accepted. Use NULL */
160 
161 enum EVP_MD_FLAG_DIGALGID_NULL = 0x0000;
162 
163 /* NULL or absent parameter accepted. Use NULL for PKCS#1 otherwise absent */
164 
165 enum EVP_MD_FLAG_DIGALGID_ABSENT = 0x0008;
166 
167 /* Custom handling via ctrl */
168 
169 enum EVP_MD_FLAG_DIGALGID_CUSTOM = 0x0018;
170 
171 enum EVP_MD_FLAG_FIPS = 0x0400; /* Note if suitable for use in FIPS mode */
172 
173 /* Digest ctrls */
174 
175 enum EVP_MD_CTRL_DIGALGID = 0x1;
176 enum EVP_MD_CTRL_MICALG = 0x2;
177 
178 /* Minimum Algorithm specific ctrl value */
179 
180 enum EVP_MD_CTRL_ALG_CTRL = 0x1000;
181 
182 enum EVP_PKEY_NULL_method = "null,null,{0,0,0,0}";
183 
184 version (OPENSSL_NO_DSA) {
185 	alias EVP_PKEY_DSA_method = EVP_PKEY_NULL_method;
186 } else {
187 	enum EVP_PKEY_DSA_method = "cast(evp_sign_method*)&DSA_sign," ~
188 		"cast(evp_verify_method*)&DSA_verify,{EVP_PKEY_DSA,EVP_PKEY_DSA2," ~
189 		"EVP_PKEY_DSA3, EVP_PKEY_DSA4,0}";
190 }
191 
192 version(OPENSSL_NO_ECDSA) {
193 	alias EVP_PKEY_ECDSA_method = EVP_PKEY_NULL_method;
194 } else {
195 	enum EVP_PKEY_ECDSA_method = "cast(evp_sign_method*)&ECDSA_sign," ~
196 		"cast(evp_verify_method*)&ECDSA_verify,{EVP_PKEY_EC,0,0,0}";
197 }
198 
199 version (OPENSSL_NO_RSA) {
200 	alias EVP_PKEY_RSA_method = EVP_PKEY_NULL_method;
201 	alias EVP_PKEY_RSA_ASN1_OCTET_STRING_method = EVP_PKEY_NULL_method;
202 } else {
203 	enum EVP_PKEY_RSA_method = "cast(evp_sign_method*)&RSA_sign," ~
204 		"cast(evp_verify_method*)RSA_verify,{EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0}";
205  	enum EVP_PKEY_RSA_ASN1_OCTET_STRING_method =
206 		"cast(evp_sign_method*)&RSA_sign_ASN1_OCTET_STRING," ~
207 		"cast(evp_verify_method*)RSA_verify_ASN1_OCTET_STRING," ~
208 		"{EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0}";
209 }
210 
211 // #endif /* !EVP_MD */
212 
213 /* values for EVP_MD_CTX flags */
214 
215 enum EVP_MD_CTX_FLAG_ONESHOT = 0x0001; /* digest update will be called
216 						* once only */
217 enum EVP_MD_CTX_FLAG_CLEANED = 0x0002; /* context has already been
218 						* cleaned */
219 enum EVP_MD_CTX_FLAG_REUSE = 0x0004; /* Don't free up ctx->md_data
220 						* in EVP_MD_CTX_reset */
221 /* FIPS and pad options are ignored in 1.0.0, definitions are here
222  * so we don't accidentally reuse the values for other purposes.
223  */
224 
225 enum EVP_MD_CTX_FLAG_NON_FIPS_ALLOW = 0x0008;	/* Allow use of non FIPS digest
226 						 * in FIPS mode */
227 
228 /* The following PAD options are also currently ignored in 1.0.0, digest
229  * parameters are handled through EVP_DigestSign*() and EVP_DigestVerify*()
230  * instead.
231  */
232 enum EVP_MD_CTX_FLAG_PAD_MASK = 0xF0;	/* RSA mode to use */
233 enum EVP_MD_CTX_FLAG_PAD_PKCS1 = 0x00;	/* PKCS#1 v1.5 mode */
234 enum EVP_MD_CTX_FLAG_PAD_X931 = 0x10;	/* X9.31 mode */
235 enum EVP_MD_CTX_FLAG_PAD_PSS = 0x20;	/* PSS mode */
236 
237 enum EVP_MD_CTX_FLAG_NO_INIT = 0x0100; /* Don't initialize md_data */
238 
239 EVP_CIPHER* EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len);
240 EVP_CIPHER* EVP_CIPHER_meth_dup(const(EVP_CIPHER)* cipher);
241 void EVP_CIPHER_meth_free(EVP_CIPHER* cipher);
242 
243 int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER* cipher, int iv_len);
244 int EVP_CIPHER_meth_set_flags(EVP_CIPHER* cipher, c_ulong flags);
245 int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER* cipher, int ctx_size);
246 
247 private alias EVP_CIPHER_init_fn = int function(EVP_CIPHER_CTX* ctx,
248 	const(ubyte)* key, const(ubyte)* iv, int enc);
249 private alias EVP_CIPHER_do_fn = int function(EVP_CIPHER_CTX* ctx,
250 	ubyte* out_, const(ubyte)* in_, size_t inl);
251 private alias EVP_CIPHER_cleanup_fn = int function(EVP_CIPHER_CTX* ctx);
252 private alias EVP_CIPHER_asn1_parameters_fn = int function(EVP_CIPHER_CTX* ctx, ASN1_TYPE* params);
253 private alias EVP_CIPHER_ctrl_fn = int function(EVP_CIPHER_CTX* ctx,
254 	int type, int arg, void* ptr);
255 
256 int EVP_CIPHER_meth_set_init(EVP_CIPHER* cipher, EVP_CIPHER_init_fn init);
257 int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER* cipher, EVP_CIPHER_do_fn do_cipher);
258 int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER* cipher, EVP_CIPHER_cleanup_fn cleanup);
259 int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER* cipher, EVP_CIPHER_asn1_parameters_fn set);
260 int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER* cipher, EVP_CIPHER_asn1_parameters_fn get);
261 int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER* cipher, EVP_CIPHER_ctrl_fn ctrl);
262 
263 EVP_CIPHER_init_fn EVP_CIPHER_meth_get_init(const(EVP_CIPHER)* cipher);
264 EVP_CIPHER_do_fn EVP_CIPHER_meth_get_do_cipher(const(EVP_CIPHER)* cipher);
265 EVP_CIPHER_cleanup_fn EVP_CIPHER_meth_get_cleanup(const(EVP_CIPHER)* cipher);
266 EVP_CIPHER_asn1_parameters_fn EVP_CIPHER_meth_get_set_asn1_params(const(EVP_CIPHER)* cipher);
267 EVP_CIPHER_asn1_parameters_fn EVP_CIPHER_meth_get_get_asn1_params(const(EVP_CIPHER)* cipher);
268 EVP_CIPHER_ctrl_fn EVP_CIPHER_meth_get_ctrl(const(EVP_CIPHER)* cipher);
269 
270 /* Values for cipher flags */
271 
272 /* Modes for ciphers */
273 
274 enum EVP_CIPH_STREAM_CIPHER = 0x0;
275 enum EVP_CIPH_ECB_MODE = 0x1;
276 enum EVP_CIPH_CBC_MODE = 0x2;
277 enum EVP_CIPH_CFB_MODE = 0x3;
278 enum EVP_CIPH_OFB_MODE = 0x4;
279 enum EVP_CIPH_CTR_MODE = 0x5;
280 enum EVP_CIPH_GCM_MODE = 0x6;
281 enum EVP_CIPH_CCM_MODE = 0x7;
282 enum EVP_CIPH_XTS_MODE  = 0x10001;
283 enum EVP_CIPH_WRAP_MODE = 0x10002;
284 enum EVP_CIPH_OCB_MODE  = 0x10003;
285 enum EVP_CIPH_MODE      = 0xF0007;
286 /* Set if variable length cipher */
287 enum EVP_CIPH_VARIABLE_LENGTH = 0x8;
288 /* Set if the iv handling should be done by the cipher itself */
289 enum EVP_CIPH_CUSTOM_IV = 0x10;
290 /* Set if the cipher's init() function should be called if key is NULL */
291 enum EVP_CIPH_ALWAYS_CALL_INIT = 0x20;
292 /* Call ctrl() to init cipher parameters */
293 enum EVP_CIPH_CTRL_INIT = 0x40;
294 /* Don't use standard key length function */
295 enum EVP_CIPH_CUSTOM_KEY_LENGTH = 0x80;
296 /* Don't use standard block padding */
297 enum EVP_CIPH_NO_PADDING = 0x100;
298 /* cipher handles random key generation */
299 enum EVP_CIPH_RAND_KEY = 0x200;
300 /* cipher has its own additional copying logic */
301 enum EVP_CIPH_CUSTOM_COPY = 0x400;
302 /* Allow use default ASN1 get/set iv */
303 enum EVP_CIPH_FLAG_DEFAULT_ASN1 = 0x1000;
304 /* Buffer length in bits not bytes: CFB1 mode only */
305 enum EVP_CIPH_FLAG_LENGTH_BITS = 0x2000;
306 /* Note if suitable for use in FIPS mode */
307 enum EVP_CIPH_FLAG_FIPS = 0x4000;
308 /* Allow non FIPS cipher in FIPS mode */
309 enum EVP_CIPH_FLAG_NON_FIPS_ALLOW = 0x8000;
310 /* Cipher handles any and all padding logic as well
311  * as finalisation.
312  */
313 enum EVP_CIPH_FLAG_CUSTOM_CIPHER = 0x100000;
314 enum EVP_CIPH_FLAG_AEAD_CIPHER = 0x200000;
315 
316 /* ctrl() values */
317 
318 enum EVP_CTRL_INIT = 0x0;
319 enum EVP_CTRL_SET_KEY_LENGTH = 0x1;
320 enum EVP_CTRL_GET_RC2_KEY_BITS = 0x2;
321 enum EVP_CTRL_SET_RC2_KEY_BITS = 0x3;
322 enum EVP_CTRL_GET_RC5_ROUNDS = 0x4;
323 enum EVP_CTRL_SET_RC5_ROUNDS = 0x5;
324 enum EVP_CTRL_RAND_KEY = 0x6;
325 enum EVP_CTRL_PBE_PRF_NID = 0x7;
326 enum EVP_CTRL_COPY = 0x8;
327 enum EVP_CTRL_GCM_SET_IVLEN = 0x9;
328 enum EVP_CTRL_GCM_GET_TAG = 0x10;
329 enum EVP_CTRL_GCM_SET_TAG = 0x11;
330 enum EVP_CTRL_GCM_SET_IV_FIXED = 0x12;
331 enum EVP_CTRL_GCM_IV_GEN = 0x13;
332 alias EVP_CTRL_CCM_SET_IVLEN = EVP_CTRL_GCM_SET_IVLEN;
333 alias EVP_CTRL_CCM_GET_TAG = EVP_CTRL_GCM_GET_TAG;
334 alias EVP_CTRL_CCM_SET_TAG = EVP_CTRL_GCM_SET_TAG;
335 enum EVP_CTRL_CCM_SET_L = 0x14;
336 enum EVP_CTRL_CCM_SET_MSGLEN = 0x15;
337 /* AEAD cipher deduces payload length and returns number of bytes
338  * required to store MAC and eventual padding. Subsequent call to
339  * EVP_Cipher even appends/verifies MAC.
340  */
341 enum EVP_CTRL_AEAD_TLS1_AAD = 0x16;
342 /* Used by composite AEAD ciphers, no-op in GCM, CCM... */
343 enum EVP_CTRL_AEAD_SET_MAC_KEY = 0x17;
344 /* Set the GCM invocation field, decrypt only */
345 enum EVP_CTRL_GCM_SET_IV_INV = 0x18;
346 enum EVP_CTRL_TLS1_1_MULTIBLOCK_AAD         = 0x19;
347 enum EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT     = 0x1a;
348 enum EVP_CTRL_TLS1_1_MULTIBLOCK_DECRYPT     = 0x1b;
349 enum EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE = 0x1c;
350 
351 enum EVP_CTRL_SSL3_MASTER_SECRET            = 0x1d;
352 
353 /* EVP_CTRL_SET_SBOX takes the char * specifying S-boxes */
354 enum EVP_CTRL_SET_SBOX                      = 0x1e;
355 /*
356  * EVP_CTRL_SBOX_USED takes a 'size_t' and 'char *', pointing at a
357  * pre-allocated buffer with specified size
358  */
359 enum EVP_CTRL_SBOX_USED                     = 0x1f;
360 /* EVP_CTRL_KEY_MESH takes 'size_t' number of bytes to mesh the key after,
361  * 0 switches meshing off
362  */
363 enum EVP_CTRL_KEY_MESH                      = 0x20;
364 /* EVP_CTRL_BLOCK_PADDING_MODE takes the padding mode */
365 enum EVP_CTRL_BLOCK_PADDING_MODE            = 0x21;
366 
367 /* Set the output buffers to use for a pipelined operation */
368 enum EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS      = 0x22;
369 /* Set the input buffers to use for a pipelined operation */
370 enum EVP_CTRL_SET_PIPELINE_INPUT_BUFS       = 0x23;
371 /* Set the input buffer lengths to use for a pipelined operation */
372 enum EVP_CTRL_SET_PIPELINE_INPUT_LENS       = 0x24;
373 
374 /* Padding modes */
375 enum EVP_PADDING_PKCS7      = 1;
376 enum EVP_PADDING_ISO7816_4  = 2;
377 enum EVP_PADDING_ANSI923    = 3;
378 enum EVP_PADDING_ISO10126   = 4;
379 enum EVP_PADDING_ZERO       = 5;
380 
381 /* RFC 5246 defines additional data to be 13 bytes in length */
382 enum EVP_AEAD_TLS1_AAD_LEN  = 13;
383 
384 /* GCM TLS constants */
385 /* Length of fixed part of IV derived from PRF */
386 enum EVP_GCM_TLS_FIXED_IV_LEN = 4;
387 /* Length of explicit part of IV part of TLS records */
388 enum EVP_GCM_TLS_EXPLICIT_IV_LEN = 8;
389 /* Length of tag for TLS */
390 enum EVP_GCM_TLS_TAG_LEN = 16;
391 
392 /* Length of fixed part of IV derived from PRF */
393 enum EVP_CCM_TLS_FIXED_IV_LEN    = 4;
394 /* Length of explicit part of IV part of TLS records */
395 enum EVP_CCM_TLS_EXPLICIT_IV_LEN = 8;
396 
397 struct evp_cipher_info_st {
398 	const(EVP_CIPHER)* cipher;
399 	ubyte[EVP_MAX_IV_LENGTH] iv;
400 	}
401 alias EVP_CIPHER_INFO = evp_cipher_info_st;
402 
403 struct evp_cipher_ctx_st
404 	{
405 	const(EVP_CIPHER)* cipher;
406 	ENGINE* engine;	/* functional reference if 'cipher' is ENGINE-provided */
407 	int encrypt;		/* encrypt or decrypt */
408 	int buf_len;		/* number we have left */
409 
410 	ubyte[EVP_MAX_IV_LENGTH]  oiv;	/* original iv */
411 	ubyte[EVP_MAX_IV_LENGTH]  iv;	/* working iv */
412 	ubyte[EVP_MAX_BLOCK_LENGTH] buf;/* saved partial block */
413 	int num;				/* used by cfb/ofb mode */
414 
415 	void* app_data;		/* application stuff */
416 	int key_len;		/* May change for variable length cipher */
417 	c_ulong flags;	/* Various flags */
418 	void* cipher_data; /* per EVP data */
419 	int final_used;
420 	int block_mask;
421 	ubyte[EVP_MAX_BLOCK_LENGTH] final_;/* possible final block */
422 	} /* EVP_CIPHER_CTX */;
423 
424 struct evp_Encode_Ctx_st {
425 	int num;	/* number saved in a partial encode/decode */
426 	int length;	/* The length is either the output line length
427 			 * (in input bytes) or the shortest input line
428 			 * length that is ok.  Once decoding begins,
429 			 * the length is adjusted up each time a longer
430 			 * line is decoded */
431 	ubyte[80] enc_data;	/* data to encode */
432 	int line_num;	/* number read on current line */
433 	int expect_nl;
434 	}
435 alias EVP_ENCODE_CTX = evp_Encode_Ctx_st;
436 
437 /* Password based encryption function */
438 alias typeof(*(ExternC!(int function(EVP_CIPHER_CTX* ctx, const(char)* pass, int passlen,
439 		ASN1_TYPE* param, const(EVP_CIPHER)* cipher,
440                 const(EVP_MD)* md, int en_de))).init) EVP_PBE_KEYGEN;
441 
442 version(OPENSSL_NO_RSA) {} else {
443 	auto EVP_PKEY_assign_RSA()(EVP_PKEY* pkey, RSA* key) {
444 		return EVP_PKEY_assign(pkey,EVP_PKEY_RSA,cast(void*)key);
445 	}
446 }
447 
448 version(OPENSSL_NO_DSA) {} else {
449 	auto EVP_PKEY_assign_RSA()(EVP_PKEY* pkey, DSA* key) {
450 		return EVP_PKEY_assign(pkey,EVP_PKEY_DSA,cast(void*)key);
451 	}
452 }
453 
454 version(OPENSSL_NO_DH) {} else {
455 	auto EVP_PKEY_assign_DH()(EVP_PKEY* pkey, DH* key) {
456 		return EVP_PKEY_assign(pkey,EVP_PKEY_DH,cast(void*)key);
457 	}
458 }
459 
460 version(OPENSSL_NO_EC) {} else {
461 	auto EVP_PKEY_assign_EC_KEY()(EVP_PKEY* pkey, EC_KEY* key) {
462 		return EVP_PKEY_assign(pkey,EVP_PKEY_EC,cast(void*)key);
463 	}
464 }
465 
466 /* Add some extra combinations */
467 auto EVP_get_digestbynid()(int a) { return EVP_get_digestbyname(OBJ_nid2sn(a)); }
468 auto EVP_get_digestbyobj()(const(ASN1_OBJECT)* a) { return EVP_get_digestbynid(OBJ_obj2nid(a)); }
469 auto EVP_get_cipherbynid()(int a) { return EVP_get_cipherbyname(OBJ_nid2sn(a)); }
470 auto EVP_get_cipherbyobj()(const(ASN1_OBJECT)* a) { return EVP_get_cipherbynid(OBJ_obj2nid(a)); }
471 
472 int EVP_MD_type(const(EVP_MD)* md);
473 alias EVP_MD_nid = EVP_MD_type;
474 auto EVP_MD_name()(const(EVP_MD)* e) { return OBJ_nid2sn(EVP_MD_nid(e)); }
475 int EVP_MD_pkey_type(const(EVP_MD)* md);
476 int EVP_MD_size(const(EVP_MD)* md);
477 int EVP_MD_block_size(const(EVP_MD)* md);
478 c_ulong EVP_MD_flags(const(EVP_MD)* md);
479 
480 const(EVP_MD)* EVP_MD_CTX_md(const(EVP_MD_CTX)* ctx);
481 auto EVP_MD_CTX_size()(const(EVP_MD_CTX)* e) { return EVP_MD_size(EVP_MD_CTX_md(e)); }
482 auto EVP_MD_CTX_block_size()(const(EVP_MD_CTX)* e) { return EVP_MD_block_size(EVP_MD_CTX_md(e)); }
483 auto EVP_MD_CTX_type()(const(EVP_MD_CTX)* e) { return EVP_MD_type(EVP_MD_CTX_md(e)); }
484 EVP_PKEY_CTX* EVP_MD_CTX_pkey_ctx(const(EVP_MD_CTX)* ctx);
485 void* EVP_MD_CTX_md_data(const(EVP_MD_CTX)* ctx);
486 
487 int EVP_CIPHER_nid(const(EVP_CIPHER)* cipher);
488 auto EVP_CIPHER_name()(const(EVP_CIPHER)* e){ return OBJ_nid2sn(EVP_CIPHER_nid(e)); }
489 int EVP_CIPHER_block_size(const(EVP_CIPHER)* cipher);
490 int EVP_CIPHER_impl_ctx_size(const(EVP_CIPHER)* cipher);
491 int EVP_CIPHER_key_length(const(EVP_CIPHER)* cipher);
492 int EVP_CIPHER_iv_length(const(EVP_CIPHER)* cipher);
493 c_ulong EVP_CIPHER_flags(const(EVP_CIPHER)* cipher);
494 auto EVP_CIPHER_mode()(const(EVP_CIPHER)* e) { return (EVP_CIPHER_flags(e) & EVP_CIPH_MODE); }
495 
496 const(EVP_CIPHER)* EVP_CIPHER_CTX_cipher(const(EVP_CIPHER_CTX)* ctx);
497 int EVP_CIPHER_CTX_encrypting(const(EVP_CIPHER_CTX)* ctx);
498 int EVP_CIPHER_CTX_nid(const(EVP_CIPHER_CTX)* ctx);
499 int EVP_CIPHER_CTX_block_size(const(EVP_CIPHER_CTX)* ctx);
500 int EVP_CIPHER_CTX_key_length(const(EVP_CIPHER_CTX)* ctx);
501 int EVP_CIPHER_CTX_iv_length(const(EVP_CIPHER_CTX)* ctx);
502 const(ubyte)* EVP_CIPHER_CTX_iv(const(EVP_CIPHER_CTX)* ctx);
503 const(ubyte)* EVP_CIPHER_CTX_original_iv(const(EVP_CIPHER_CTX)* ctx);
504 ubyte* EVP_CIPHER_CTX_iv_noconst(EVP_CIPHER_CTX* ctx);
505 ubyte* EVP_CIPHER_CTX_buf_noconst(EVP_CIPHER_CTX* ctx);
506 int EVP_CIPHER_CTX_num(const(EVP_CIPHER_CTX)* ctx);
507 void EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX* ctx, int num);
508 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX* out_, const(EVP_CIPHER_CTX)* in_);
509 void* EVP_CIPHER_CTX_get_app_data(const(EVP_CIPHER_CTX)* ctx);
510 void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX* ctx, void* data);
511 auto EVP_CIPHER_CTX_type()(const(EVP_CIPHER_CTX)* c) { return EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)); }
512 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
513 {
514 	c_ulong EVP_CIPHER_CTX_flags(const(EVP_CIPHER_CTX)* ctx);
515 	auto EVP_CIPHER_CTX_mode()(const(EVP_CIPHER_CTX)* e) { return (EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE); }
516 }
517 else
518 {
519 	auto EVP_CIPHER_CTX_flags()(const(EVP_CIPHER_CTX)* e) { return EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(c)); }
520     auto EVP_CIPHER_CTX_mode()(const(EVP_CIPHER_CTX)* e) { return EVP_CIPHER_mode(EVP_CIPHER_CTX_cipher(c)); }
521 }
522 
523 auto EVP_ENCODE_LENGTH(T)(T l) { return (((l+2)/3*4)+(l/48+1)*2+80); }
524 auto EVP_DECODE_LENGTH(T)(T l) { return ((l+3)/4*3+80); }
525 
526 alias EVP_SignInit_ex   = EVP_DigestInit_ex;
527 alias EVP_SignInit      = EVP_DigestInit;
528 alias EVP_SignUpdate    = EVP_DigestUpdate;
529 alias EVP_VerifyInit_ex = EVP_DigestInit_ex;
530 alias EVP_VerifyInit    = EVP_DigestInit;
531 alias EVP_VerifyUpdate  = EVP_DigestUpdate;
532 alias EVP_OpenUpdate    = EVP_DecryptUpdate;
533 alias EVP_SealUpdate    = EVP_EncryptUpdate;
534 alias EVP_DigestSignUpdate   = EVP_DigestUpdate;
535 alias EVP_DigestVerifyUpdate = EVP_DigestUpdate;
536 
537 void BIO_set_md()(BIO* b,const(EVP_MD)* md) { return BIO_ctrl(b,BIO_C_SET_MD,0,md); }
538 auto BIO_get_md()(BIO* b,EVP_MD** mdp) { return BIO_ctrl(b,BIO_C_GET_MD,0,mdp); }
539 auto BIO_get_md_ctx()(BIO* b,EVP_MD_CTX** mdcp) { return BIO_ctrl(b,BIO_C_GET_MD_CTX,0,mdcp); }
540 auto BIO_set_md_ctx()(BIO* b,EVP_MD_CTX** mdcp) { return BIO_ctrl(b,BIO_C_SET_MD_CTX,0,mdcp); }
541 auto BIO_get_cipher_status()(BIO* b) { return BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,null); }
542 auto BIO_get_cipher_ctx()(BIO* b,EVP_CIPHER_CTX** c_pp) { return BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,c_pp); }
543 
544 int EVP_Cipher(EVP_CIPHER_CTX* c,
545 		ubyte* out_,
546 		const(ubyte)* in_,
547 		uint inl);
548 
549 auto EVP_add_cipher_alias()(const(char)* n,const(char)* alias_) {
550 	return OBJ_NAME_add(alias_,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n));
551 }
552 auto EVP_add_digest_alias()(const(char)* n,const(char)* alias_) {
553 	return OBJ_NAME_add(alias_,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n));
554 }
555 auto EVP_delete_cipher_alias()(const(char)* alias_) {
556 	return OBJ_NAME_remove(alias_,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS);
557 }
558 auto EVP_delete_digest_alias()(const(char)* alias_) {
559 	return OBJ_NAME_remove(alias_,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS);
560 }
561 
562 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
563 {
564 	EVP_MD_CTX* EVP_MD_CTX_create();
565 	void EVP_MD_CTX_init(EVP_MD_CTX* ctx);
566 	void EVP_MD_CTX_destroy(EVP_MD_CTX* ctx);
567 }
568 else
569 {
570     // https://github.com/openssl/openssl/commit/959ed5316c84d0e12ad18acfd40cefe15603ddfb
571     // https://github.com/openssl/openssl/commit/f8137a62d94c0a5809a4363b7b4aab3adcb8201c
572     EVP_MD_CTX* EVP_MD_CTX_new();
573     int EVP_MD_CTX_reset(EVP_MD_CTX* ctx);
574     void EVP_MD_CTX_free(EVP_MD_CTX* ctx);
575 	alias EVP_MD_CTX_create  = EVP_MD_CTX_new;
576 	alias EVP_MD_CTX_init    = EVP_MD_CTX_reset;
577 	alias EVP_MD_CTX_destroy = EVP_MD_CTX_free;
578 }
579 
580 // https://github.com/openssl/openssl/commit/74cabf3fef77ab73c45e27cf6ed90f6db020e7c7
581 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
582 	int	EVP_MD_CTX_cleanup(EVP_MD_CTX* ctx);
583 
584 int EVP_MD_CTX_ctrl(EVP_MD_CTX* ctx, int cmd, int p1, void* p2);
585 int     EVP_MD_CTX_copy_ex(EVP_MD_CTX* out_,const(EVP_MD_CTX)* in_);
586 void	EVP_MD_CTX_set_flags(EVP_MD_CTX* ctx, int flags);
587 void	EVP_MD_CTX_clear_flags(EVP_MD_CTX* ctx, int flags);
588 int 	EVP_MD_CTX_test_flags(const(EVP_MD_CTX)* ctx,int flags);
589 int	EVP_DigestInit_ex(EVP_MD_CTX* ctx, const(EVP_MD)* type, ENGINE* impl);
590 int	EVP_DigestUpdate(EVP_MD_CTX* ctx,const(void)* d,
591 			 size_t cnt);
592 int	EVP_DigestFinal_ex(EVP_MD_CTX* ctx,ubyte* md,uint* s);
593 int	EVP_Digest(const(void)* data, size_t count,
594 		ubyte* md, uint* size, const(EVP_MD)* type, ENGINE* impl);
595 
596 int     EVP_MD_CTX_copy(EVP_MD_CTX* out_,const(EVP_MD_CTX)* in_);
597 int	EVP_DigestInit(EVP_MD_CTX* ctx, const(EVP_MD)* type);
598 int	EVP_DigestFinal(EVP_MD_CTX* ctx,ubyte* md,uint* s);
599 
600 int	EVP_read_pw_string(char* buf,int length,const(char)* prompt,int verify);
601 int	EVP_read_pw_string_min(char* buf,int minlen,int maxlen,const(char)* prompt,int verify);
602 void	EVP_set_pw_prompt(const(char)* prompt);
603 char* 	EVP_get_pw_prompt();
604 
605 int	EVP_BytesToKey(const(EVP_CIPHER)* type,const(EVP_MD)* md,
606 		const(ubyte)* salt, const(ubyte)* data,
607 		int datal, int count, ubyte* key,ubyte* iv);
608 
609 void	EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX* ctx, int flags);
610 void	EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX* ctx, int flags);
611 int 	EVP_CIPHER_CTX_test_flags(const(EVP_CIPHER_CTX)* ctx,int flags);
612 
613 int	EVP_EncryptInit(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher,
614 		const(ubyte)* key, const(ubyte)* iv);
615 int	EVP_EncryptInit_ex(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher, ENGINE* impl,
616 		const(ubyte)* key, const(ubyte)* iv);
617 int	EVP_EncryptUpdate(EVP_CIPHER_CTX* ctx, ubyte* out_,
618 		int* outl, const(ubyte)* in_, int inl);
619 int	EVP_EncryptFinal_ex(EVP_CIPHER_CTX* ctx, ubyte* out_, int* outl);
620 int	EVP_EncryptFinal(EVP_CIPHER_CTX* ctx, ubyte* out_, int* outl);
621 
622 int	EVP_DecryptInit(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher,
623 		const(ubyte)* key, const(ubyte)* iv);
624 int	EVP_DecryptInit_ex(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher, ENGINE* impl,
625 		const(ubyte)* key, const(ubyte)* iv);
626 int	EVP_DecryptUpdate(EVP_CIPHER_CTX* ctx, ubyte* out_,
627 		int* outl, const(ubyte)* in_, int inl);
628 int	EVP_DecryptFinal(EVP_CIPHER_CTX* ctx, ubyte* outm, int* outl);
629 int	EVP_DecryptFinal_ex(EVP_CIPHER_CTX* ctx, ubyte* outm, int* outl);
630 
631 int	EVP_CipherInit(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher,
632 		       const(ubyte)* key,const(ubyte)* iv,
633 		       int enc);
634 int	EVP_CipherInit_ex(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* cipher, ENGINE* impl,
635 		       const(ubyte)* key,const(ubyte)* iv,
636 		       int enc);
637 int	EVP_CipherUpdate(EVP_CIPHER_CTX* ctx, ubyte* out_,
638 		int* outl, const(ubyte)* in_, int inl);
639 int	EVP_CipherFinal(EVP_CIPHER_CTX* ctx, ubyte* outm, int* outl);
640 int	EVP_CipherFinal_ex(EVP_CIPHER_CTX* ctx, ubyte* outm, int* outl);
641 
642 int	EVP_SignFinal(EVP_MD_CTX* ctx,ubyte* md,uint* s,
643 		EVP_PKEY* pkey);
644 
645 int	EVP_VerifyFinal(EVP_MD_CTX* ctx,const(ubyte)* sigbuf,
646 		uint siglen,EVP_PKEY* pkey);
647 
648 int	EVP_DigestSignInit(EVP_MD_CTX* ctx, EVP_PKEY_CTX** pctx,
649 			const(EVP_MD)* type, ENGINE* e, EVP_PKEY* pkey);
650 int	EVP_DigestSignFinal(EVP_MD_CTX* ctx,
651 			ubyte* sigret, size_t* siglen);
652 
653 int	EVP_DigestVerifyInit(EVP_MD_CTX* ctx, EVP_PKEY_CTX** pctx,
654 			const(EVP_MD)* type, ENGINE* e, EVP_PKEY* pkey);
655 int	EVP_DigestVerifyFinal(EVP_MD_CTX* ctx,
656 			ubyte* sig, size_t siglen);
657 
658 int	EVP_OpenInit(EVP_CIPHER_CTX* ctx,const(EVP_CIPHER)* type,
659 		const(ubyte)* ek, int ekl, const(ubyte)* iv,
660 		EVP_PKEY* priv);
661 int	EVP_OpenFinal(EVP_CIPHER_CTX* ctx, ubyte* out_, int* outl);
662 
663 int	EVP_SealInit(EVP_CIPHER_CTX* ctx, const(EVP_CIPHER)* type,
664 		 ubyte** ek, int* ekl, ubyte* iv,
665 		EVP_PKEY** pubk, int npubk);
666 int	EVP_SealFinal(EVP_CIPHER_CTX* ctx,ubyte* out_,int* outl);
667 
668 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 0))
669 {
670 	EVP_ENCODE_CTX* EVP_ENCODE_CTX_new();
671 	void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX* ctx);
672 	int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX* ctx);
673     int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX* dctx, EVP_ENCODE_CTX* sctx);
674     int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX* ctx);
675 }
676 
677 void	EVP_EncodeInit(EVP_ENCODE_CTX* ctx);
678 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 0))
679     alias EVP_EncodeUpdateRT = int;
680 else
681     alias EVP_EncodeUpdateRT = void;
682 EVP_EncodeUpdateRT	EVP_EncodeUpdate(EVP_ENCODE_CTX* ctx,ubyte* out_,int* outl,
683 		const(ubyte)* in_,int inl);
684 void	EVP_EncodeFinal(EVP_ENCODE_CTX* ctx,ubyte* out_,int* outl);
685 int	EVP_EncodeBlock(ubyte* t, const(ubyte)* f, int n);
686 
687 void	EVP_DecodeInit(EVP_ENCODE_CTX* ctx);
688 int	EVP_DecodeUpdate(EVP_ENCODE_CTX* ctx,ubyte* out_,int* outl,
689 		const(ubyte)* in_, int inl);
690 int	EVP_DecodeFinal(EVP_ENCODE_CTX* ctx, ubyte* out_, int* outl);
691 int	EVP_DecodeBlock(ubyte* t, const(ubyte)* f, int n);
692 
693 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
694 {
695 	void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX* a);
696 	int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX* a);
697 }
698 else
699 {
700     int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX* c);
701 
702     alias EVP_CIPHER_CTX_init = EVP_CIPHER_CTX_reset;
703     alias EVP_CIPHER_CTX_cleanup = EVP_CIPHER_CTX_reset;
704 }
705 EVP_CIPHER_CTX* EVP_CIPHER_CTX_new();
706 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX* a);
707 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX* x, int keylen);
708 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX* c, int pad);
709 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX* ctx, int type, int arg, void* ptr);
710 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX* ctx, ubyte* key);
711 
712 version(OPENSSL_NO_BIO) {} else {
713 BIO_METHOD* BIO_f_md();
714 BIO_METHOD* BIO_f_base64();
715 BIO_METHOD* BIO_f_cipher();
716 BIO_METHOD* BIO_f_reliable();
717 void BIO_set_cipher(BIO* b,const(EVP_CIPHER)* c,const(ubyte)* k,
718 		const(ubyte)* i, int enc);
719 }
720 
721 const(EVP_MD)* EVP_md_null();
722 version(OPENSSL_NO_MD2) {} else {
723 const(EVP_MD)* EVP_md2();
724 }
725 version(OPENSSL_NO_MD4) {} else {
726 const(EVP_MD)* EVP_md4();
727 }
728 version(OPENSSL_NO_MD5) {} else {
729 const(EVP_MD)* EVP_md5();
730 }
731 const(EVP_MD)* EVP_blake2b512();
732 const(EVP_MD)* EVP_blake2s256();
733 version(OPENSSL_NO_SHA) {} else {
734 const(EVP_MD)* EVP_sha();
735 const(EVP_MD)* EVP_sha1();
736 const(EVP_MD)* EVP_dss();
737 const(EVP_MD)* EVP_dss1();
738 const(EVP_MD)* EVP_ecdsa();
739 }
740 version(OPENSSL_NO_SHA256) {} else {
741 const(EVP_MD)* EVP_sha224();
742 const(EVP_MD)* EVP_sha256();
743 }
744 version(OPENSSL_NO_SHA512) {} else {
745 const(EVP_MD)* EVP_sha384();
746 const(EVP_MD)* EVP_sha512();
747 }
748 version(OPENSSL_NO_MDC2) {} else {
749 const(EVP_MD)* EVP_mdc2();
750 }
751 version(OPENSSL_NO_RIPEMD) {} else {
752 const(EVP_MD)* EVP_ripemd160();
753 }
754 version(OPENSSL_NO_WHIRLPOOL) {} else {
755 const(EVP_MD)* EVP_whirlpool();
756 }
757 const(EVP_CIPHER)* EVP_enc_null();		/* does nothing :-) */
758 version (OPENSSL_NO_DES) {} else {
759 const(EVP_CIPHER)* EVP_des_ecb();
760 const(EVP_CIPHER)* EVP_des_ede();
761 const(EVP_CIPHER)* EVP_des_ede3();
762 const(EVP_CIPHER)* EVP_des_ede_ecb();
763 const(EVP_CIPHER)* EVP_des_ede3_ecb();
764 const(EVP_CIPHER)* EVP_des_cfb64();
765 alias EVP_des_cfb = EVP_des_cfb64;
766 const(EVP_CIPHER)* EVP_des_cfb1();
767 const(EVP_CIPHER)* EVP_des_cfb8();
768 const(EVP_CIPHER)* EVP_des_ede_cfb64();
769 alias EVP_des_ede_cfb = EVP_des_ede_cfb64;
770 version (none) {
771 const(EVP_CIPHER)* EVP_des_ede_cfb1();
772 const(EVP_CIPHER)* EVP_des_ede_cfb8();
773 }
774 const(EVP_CIPHER)* EVP_des_ede3_cfb64();
775 alias EVP_des_ede3_cfb = EVP_des_ede3_cfb64;
776 const(EVP_CIPHER)* EVP_des_ede3_cfb1();
777 const(EVP_CIPHER)* EVP_des_ede3_cfb8();
778 const(EVP_CIPHER)* EVP_des_ofb();
779 const(EVP_CIPHER)* EVP_des_ede_ofb();
780 const(EVP_CIPHER)* EVP_des_ede3_ofb();
781 const(EVP_CIPHER)* EVP_des_cbc();
782 const(EVP_CIPHER)* EVP_des_ede_cbc();
783 const(EVP_CIPHER)* EVP_des_ede3_cbc();
784 const(EVP_CIPHER)* EVP_desx_cbc();
785 /* This should now be supported through the dev_crypto ENGINE. But also, why are
786  * rc4 and md5 declarations made here inside a "NO_DES" precompiler branch? */
787 //#if 0
788 //# ifdef OPENSSL_OPENBSD_DEV_CRYPTO
789 //const(EVP_CIPHER)* EVP_dev_crypto_des_ede3_cbc();
790 //const(EVP_CIPHER)* EVP_dev_crypto_rc4();
791 //const(EVP_MD)* EVP_dev_crypto_md5();
792 //# endif
793 //#endif
794 }
795 version(OPENSSL_NO_RC4) {} else {
796 const(EVP_CIPHER)* EVP_rc4();
797 const(EVP_CIPHER)* EVP_rc4_40();
798 version(OPENSSL_NO_MD5) {} else {
799 const(EVP_CIPHER)* EVP_rc4_hmac_md5();
800 }
801 }
802 version(OPENSSL_NO_IDEA) {} else {
803 const(EVP_CIPHER)* EVP_idea_ecb();
804 const(EVP_CIPHER)* EVP_idea_cfb64();
805 alias EVP_idea_cfb = EVP_idea_cfb64;
806 const(EVP_CIPHER)* EVP_idea_ofb();
807 const(EVP_CIPHER)* EVP_idea_cbc();
808 }
809 version(OPENSSL_NO_RC2) {} else {
810 const(EVP_CIPHER)* EVP_rc2_ecb();
811 const(EVP_CIPHER)* EVP_rc2_cbc();
812 const(EVP_CIPHER)* EVP_rc2_40_cbc();
813 const(EVP_CIPHER)* EVP_rc2_64_cbc();
814 const(EVP_CIPHER)* EVP_rc2_cfb64();
815 alias EVP_rc2_cfb = EVP_rc2_cfb64;
816 const(EVP_CIPHER)* EVP_rc2_ofb();
817 }
818 version(OPENSSL_NO_BF) {} else {
819 const(EVP_CIPHER)* EVP_bf_ecb();
820 const(EVP_CIPHER)* EVP_bf_cbc();
821 const(EVP_CIPHER)* EVP_bf_cfb64();
822 alias EVP_bf_cfb = EVP_bf_cfb64;
823 const(EVP_CIPHER)* EVP_bf_ofb();
824 }
825 version(OPENSSL_NO_CAST) {} else {
826 const(EVP_CIPHER)* EVP_cast5_ecb();
827 const(EVP_CIPHER)* EVP_cast5_cbc();
828 const(EVP_CIPHER)* EVP_cast5_cfb64();
829 alias EVP_cast5_cfb = EVP_cast5_cfb64;
830 const(EVP_CIPHER)* EVP_cast5_ofb();
831 }
832 version(OPENSSL_NO_RC5) {} else {
833 const(EVP_CIPHER)* EVP_rc5_32_12_16_cbc();
834 const(EVP_CIPHER)* EVP_rc5_32_12_16_ecb();
835 const(EVP_CIPHER)* EVP_rc5_32_12_16_cfb64();
836 alias EVP_rc5_32_12_16_cfb = EVP_rc5_32_12_16_cfb64;
837 const(EVP_CIPHER)* EVP_rc5_32_12_16_ofb();
838 }
839 version(OPENSSL_NO_AES) {} else {
840 const(EVP_CIPHER)* EVP_aes_128_ecb();
841 const(EVP_CIPHER)* EVP_aes_128_cbc();
842 const(EVP_CIPHER)* EVP_aes_128_cfb1();
843 const(EVP_CIPHER)* EVP_aes_128_cfb8();
844 const(EVP_CIPHER)* EVP_aes_128_cfb128();
845 alias EVP_aes_128_cfb = EVP_aes_128_cfb128;
846 const(EVP_CIPHER)* EVP_aes_128_ofb();
847 const(EVP_CIPHER)* EVP_aes_128_ctr();
848 const(EVP_CIPHER)* EVP_aes_128_ccm();
849 const(EVP_CIPHER)* EVP_aes_128_gcm();
850 const(EVP_CIPHER)* EVP_aes_128_xts();
851 const(EVP_CIPHER)* EVP_aes_192_ecb();
852 const(EVP_CIPHER)* EVP_aes_192_cbc();
853 const(EVP_CIPHER)* EVP_aes_192_cfb1();
854 const(EVP_CIPHER)* EVP_aes_192_cfb8();
855 const(EVP_CIPHER)* EVP_aes_192_cfb128();
856 alias EVP_aes_192_cfb = EVP_aes_192_cfb128;
857 const(EVP_CIPHER)* EVP_aes_192_ofb();
858 const(EVP_CIPHER)* EVP_aes_192_ctr();
859 const(EVP_CIPHER)* EVP_aes_192_ccm();
860 const(EVP_CIPHER)* EVP_aes_192_gcm();
861 const(EVP_CIPHER)* EVP_aes_256_ecb();
862 const(EVP_CIPHER)* EVP_aes_256_cbc();
863 const(EVP_CIPHER)* EVP_aes_256_cfb1();
864 const(EVP_CIPHER)* EVP_aes_256_cfb8();
865 const(EVP_CIPHER)* EVP_aes_256_cfb128();
866 alias EVP_aes_256_cfb = EVP_aes_256_cfb128;
867 const(EVP_CIPHER)* EVP_aes_256_ofb();
868 const(EVP_CIPHER)* EVP_aes_256_ctr();
869 const(EVP_CIPHER)* EVP_aes_256_ccm();
870 const(EVP_CIPHER)* EVP_aes_256_gcm();
871 const(EVP_CIPHER)* EVP_aes_256_xts();
872 version(OPENSSL_NO_SHA) {} else version(OPENSSL_NO_SHA1) {} else {
873 const(EVP_CIPHER)* EVP_aes_128_cbc_hmac_sha1();
874 const(EVP_CIPHER)* EVP_aes_256_cbc_hmac_sha1();
875 }
876 }
877 version(OPENSSL_NO_CAMELLIA) {} else {
878 const(EVP_CIPHER)* EVP_camellia_128_ecb();
879 const(EVP_CIPHER)* EVP_camellia_128_cbc();
880 const(EVP_CIPHER)* EVP_camellia_128_cfb1();
881 const(EVP_CIPHER)* EVP_camellia_128_cfb8();
882 const(EVP_CIPHER)* EVP_camellia_128_cfb128();
883 alias EVP_camellia_128_cfb = EVP_camellia_128_cfb128;
884 const(EVP_CIPHER)* EVP_camellia_128_ofb();
885 const(EVP_CIPHER)* EVP_camellia_128_ctr();
886 const(EVP_CIPHER)* EVP_camellia_192_ecb();
887 const(EVP_CIPHER)* EVP_camellia_192_cbc();
888 const(EVP_CIPHER)* EVP_camellia_192_cfb1();
889 const(EVP_CIPHER)* EVP_camellia_192_cfb8();
890 const(EVP_CIPHER)* EVP_camellia_192_cfb128();
891 alias EVP_camellia_192_cfb = EVP_camellia_192_cfb128;
892 const(EVP_CIPHER)* EVP_camellia_192_ofb();
893 const(EVP_CIPHER)* EVP_camellia_192_ctr();
894 const(EVP_CIPHER)* EVP_camellia_256_ecb();
895 const(EVP_CIPHER)* EVP_camellia_256_cbc();
896 const(EVP_CIPHER)* EVP_camellia_256_cfb1();
897 const(EVP_CIPHER)* EVP_camellia_256_cfb8();
898 const(EVP_CIPHER)* EVP_camellia_256_cfb128();
899 alias EVP_camellia_256_cfb = EVP_camellia_256_cfb128;
900 const(EVP_CIPHER)* EVP_camellia_256_ofb();
901 const(EVP_CIPHER)* EVP_camellia_256_ctr();
902 }
903 
904 const(EVP_CIPHER)* EVP_chacha20();
905 const(EVP_CIPHER)* EVP_chacha20_poly1305();
906 
907 version(OPENSSL_NO_SEED) {} else {
908 const(EVP_CIPHER)* EVP_seed_ecb();
909 const(EVP_CIPHER)* EVP_seed_cbc();
910 const(EVP_CIPHER)* EVP_seed_cfb128();
911 alias EVP_seed_cfb = EVP_seed_cfb128;
912 const(EVP_CIPHER)* EVP_seed_ofb();
913 }
914 
915 void OPENSSL_add_all_algorithms_noconf();
916 void OPENSSL_add_all_algorithms_conf();
917 
918 version (OPENSSL_LOAD_CONF) {
919 alias OpenSSL_add_all_algorithms = OPENSSL_add_all_algorithms_conf;
920 } else {
921 alias OpenSSL_add_all_algorithms = OPENSSL_add_all_algorithms_noconf;
922 }
923 
924 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
925 {
926     void OpenSSL_add_all_ciphers();
927     void OpenSSL_add_all_digests();
928 }
929 else
930 {
931     auto OpenSSL_add_all_ciphers() ()
932     {
933         return OPENSSL_INIT_crypto_library_start(OPENSSL_INIT_ADD_ALL_CIPHERS, null);
934     }
935     auto OpenSSL_add_all_digests() ()
936     {
937         return OPENSSL_INIT_crypto_library_start(OPENSSL_INIT_ADD_ALL_DIGESTS, null);
938     }
939 }
940 
941 int EVP_add_cipher(const(EVP_CIPHER)* cipher);
942 int EVP_add_digest(const(EVP_MD)* digest);
943 
944 const(EVP_CIPHER)* EVP_get_cipherbyname(const(char)* name);
945 const(EVP_MD)* EVP_get_digestbyname(const(char)* name);
946 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
947     void EVP_cleanup();
948 else
949     void EVP_cleanup()() {}
950 
951 void EVP_CIPHER_do_all(ExternC!(void function(const(EVP_CIPHER)* ciph,
952 		const(char)* from, const(char)* to, void* x)) fn, void* arg);
953 void EVP_CIPHER_do_all_sorted(ExternC!(void function(const(EVP_CIPHER)* ciph,
954 		const(char)* from, const(char)* to, void* x)) fn, void* arg);
955 
956 void EVP_MD_do_all(ExternC!(void function(const(EVP_MD)* ciph,
957 		const(char)* from, const(char)* to, void* x)) fn, void* arg);
958 void EVP_MD_do_all_sorted(ExternC!(void function(const(EVP_MD)* ciph,
959 		const(char)* from, const(char)* to, void* x)) fn, void* arg);
960 
961 int		EVP_PKEY_decrypt_old(ubyte* dec_key,
962 			const(ubyte)* enc_key,int enc_key_len,
963 			EVP_PKEY* private_key);
964 int		EVP_PKEY_encrypt_old(ubyte* enc_key,
965 			const(ubyte)* key,int key_len,
966 			EVP_PKEY* pub_key);
967 int		EVP_PKEY_type(int type);
968 int		EVP_PKEY_id(const(EVP_PKEY)* pkey);
969 int		EVP_PKEY_base_id(const(EVP_PKEY)* pkey);
970 int		EVP_PKEY_bits(EVP_PKEY* pkey);
971 int		EVP_PKEY_size(EVP_PKEY* pkey);
972 int 		EVP_PKEY_set_type(EVP_PKEY* pkey,int type);
973 int		EVP_PKEY_set_type_str(EVP_PKEY* pkey, const(char)* str, int len);
974 int 		EVP_PKEY_assign(EVP_PKEY* pkey,int type,void* key);
975 void* 		EVP_PKEY_get0(EVP_PKEY* pkey);
976 const(ubyte)* EVP_PKEY_get0_hmac(const(EVP_PKEY)* pkey, size_t* len);
977 
978 version(OPENSSL_NO_RSA) {} else {
979 import deimos.openssl.rsa;
980 int EVP_PKEY_set1_RSA(EVP_PKEY* pkey, RSA* key);
981 RSA* EVP_PKEY_get1_RSA(EVP_PKEY* pkey);
982 }
983 version(OPENSSL_NO_DSA) {} else {
984 import deimos.openssl.dsa; /*struct dsa_st;*/
985 int EVP_PKEY_set1_DSA(EVP_PKEY* pkey,dsa_st* key);
986 dsa_st* EVP_PKEY_get1_DSA(EVP_PKEY* pkey);
987 }
988 version(OPENSSL_NO_DH) {} else {
989 import deimos.openssl.dh; /*struct dh_st;*/
990 int EVP_PKEY_set1_DH(EVP_PKEY* pkey,dh_st* key);
991 dh_st* EVP_PKEY_get1_DH(EVP_PKEY* pkey);
992 }
993 version(OPENSSL_NO_EC) {} else {
994 struct ec_key_st;
995 int EVP_PKEY_set1_EC_KEY(EVP_PKEY* pkey,ec_key_st* key);
996 ec_key_st* EVP_PKEY_get1_EC_KEY(EVP_PKEY* pkey);
997 }
998 
999 EVP_PKEY* 	EVP_PKEY_new();
1000 int EVP_PKEY_up_ref(EVP_PKEY* pkey);
1001 void		EVP_PKEY_free(EVP_PKEY* pkey);
1002 
1003 EVP_PKEY* 	d2i_PublicKey(int type,EVP_PKEY** a, const(ubyte)** pp,
1004 			c_long length);
1005 int		i2d_PublicKey(EVP_PKEY* a, ubyte** pp);
1006 
1007 EVP_PKEY* 	d2i_PrivateKey(int type,EVP_PKEY** a, const(ubyte)** pp,
1008 			c_long length);
1009 EVP_PKEY* 	d2i_AutoPrivateKey(EVP_PKEY** a, const(ubyte)** pp,
1010 			c_long length);
1011 int		i2d_PrivateKey(EVP_PKEY* a, ubyte** pp);
1012 
1013 int EVP_PKEY_copy_parameters(EVP_PKEY* to, const(EVP_PKEY)* from);
1014 int EVP_PKEY_missing_parameters(const(EVP_PKEY)* pkey);
1015 int EVP_PKEY_save_parameters(EVP_PKEY* pkey,int mode);
1016 int EVP_PKEY_cmp_parameters(const(EVP_PKEY)* a, const(EVP_PKEY)* b);
1017 
1018 int EVP_PKEY_cmp(const(EVP_PKEY)* a, const(EVP_PKEY)* b);
1019 
1020 int EVP_PKEY_print_public(BIO* out_, const(EVP_PKEY)* pkey,
1021 				int indent, ASN1_PCTX* pctx);
1022 int EVP_PKEY_print_private(BIO* out_, const(EVP_PKEY)* pkey,
1023 				int indent, ASN1_PCTX* pctx);
1024 int EVP_PKEY_print_params(BIO* out_, const(EVP_PKEY)* pkey,
1025 				int indent, ASN1_PCTX* pctx);
1026 
1027 int EVP_PKEY_get_default_digest_nid(EVP_PKEY* pkey, int* pnid);
1028 
1029 int EVP_PKEY_set1_tls_encodedpoint(EVP_PKEY* pkey,
1030 	const(ubyte)* pt, size_t ptlen);
1031 size_t EVP_PKEY_get1_tls_encodedpoint(EVP_PKEY* pkey, ubyte** ppt);
1032 
1033 int EVP_CIPHER_type(const(EVP_CIPHER)* ctx);
1034 
1035 /* calls methods */
1036 int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX* c, ASN1_TYPE* type);
1037 int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX* c, ASN1_TYPE* type);
1038 
1039 /* These are used by EVP_CIPHER methods */
1040 int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX* c,ASN1_TYPE* type);
1041 int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX* c,ASN1_TYPE* type);
1042 
1043 /* PKCS5 password based encryption */
1044 int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX* ctx, const(char)* pass, int passlen,
1045 			 ASN1_TYPE* param, const(EVP_CIPHER)* cipher, const(EVP_MD)* md,
1046 			 int en_de);
1047 int PKCS5_PBKDF2_HMAC_SHA1(const(char)* pass, int passlen,
1048 			   const(ubyte)* salt, int saltlen, int iter,
1049 			   int keylen, ubyte* out_);
1050 int PKCS5_PBKDF2_HMAC(const(char)* pass, int passlen,
1051 			   const(ubyte)* salt, int saltlen, int iter,
1052 			   const(EVP_MD)* digest,
1053 		      int keylen, ubyte* out_);
1054 int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX* ctx, const(char)* pass, int passlen,
1055 			 ASN1_TYPE* param, const(EVP_CIPHER)* cipher, const(EVP_MD)* md,
1056 			 int en_de);
1057 
1058 int EVP_PBE_scrypt(const(char)* pass, size_t passlen,
1059                    const(ubyte)* salt, size_t saltlen,
1060                    ulong N, ulong r, ulong p, ulong maxmem,
1061                    ubyte* key, size_t keylen);
1062 
1063 int PKCS5_v2_scrypt_keyivgen(EVP_CIPHER_CTX* ctx, const(char)* pass,
1064                              int passlen, ASN1_TYPE* param,
1065                              const(EVP_CIPHER)* c, const(EVP_MD)* md, int en_de);
1066 
1067 void PKCS5_PBE_add();
1068 
1069 int EVP_PBE_CipherInit (ASN1_OBJECT* pbe_obj, const(char)* pass, int passlen,
1070 	     ASN1_TYPE* param, EVP_CIPHER_CTX* ctx, int en_de);
1071 
1072 /* PBE type */
1073 
1074 /* Can appear as the outermost AlgorithmIdentifier */
1075 enum EVP_PBE_TYPE_OUTER = 0x0;
1076 /* Is an PRF type OID */
1077 enum EVP_PBE_TYPE_PRF = 0x1;
1078 /* Is a PKCS#5 v2.0 KDF */
1079 enum EVP_PBE_TYPE_KDF = 0x2;
1080 
1081 int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid,
1082 	     EVP_PBE_KEYGEN* keygen);
1083 int EVP_PBE_alg_add(int nid, const(EVP_CIPHER)* cipher, const(EVP_MD)* md,
1084 		    EVP_PBE_KEYGEN* keygen);
1085 int EVP_PBE_find(int type, int pbe_nid,
1086 			int* pcnid, int* pmnid, EVP_PBE_KEYGEN** pkeygen);
1087 void EVP_PBE_cleanup();
1088 int EVP_PBE_get(int* ptype, int* ppbe_nid, size_t num);
1089 
1090 enum ASN1_PKEY_ALIAS = 0x1;
1091 enum ASN1_PKEY_DYNAMIC = 0x2;
1092 enum ASN1_PKEY_SIGPARAM_NULL = 0x4;
1093 
1094 enum ASN1_PKEY_CTRL_PKCS7_SIGN = 0x1;
1095 enum ASN1_PKEY_CTRL_PKCS7_ENCRYPT = 0x2;
1096 enum ASN1_PKEY_CTRL_DEFAULT_MD_NID = 0x3;
1097 enum ASN1_PKEY_CTRL_CMS_SIGN = 0x5;
1098 enum ASN1_PKEY_CTRL_CMS_ENVELOPE = 0x7;
1099 enum ASN1_PKEY_CTRL_CMS_RI_TYPE = 0x8;
1100 
1101 enum ASN1_PKEY_CTRL_SET1_TLS_ENCPT = 0x9;
1102 enum ASN1_PKEY_CTRL_GET1_TLS_ENCPT = 0xa;
1103 
1104 int EVP_PKEY_asn1_get_count();
1105 const(EVP_PKEY_ASN1_METHOD)* EVP_PKEY_asn1_get0(int idx);
1106 const(EVP_PKEY_ASN1_METHOD)* EVP_PKEY_asn1_find(ENGINE** pe, int type);
1107 const(EVP_PKEY_ASN1_METHOD)* EVP_PKEY_asn1_find_str(ENGINE** pe,
1108 					const(char)* str, int len);
1109 int EVP_PKEY_asn1_add0(const(EVP_PKEY_ASN1_METHOD)* ameth);
1110 int EVP_PKEY_asn1_add_alias(int to, int from);
1111 int EVP_PKEY_asn1_get0_info(int* ppkey_id, int* pkey_base_id, int* ppkey_flags,
1112 				const(char)** pinfo, const(char)** ppem_str,
1113 					const(EVP_PKEY_ASN1_METHOD)* ameth);
1114 
1115 const(EVP_PKEY_ASN1_METHOD)* EVP_PKEY_get0_asn1(const(EVP_PKEY)* pkey);
1116 EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id, int flags,
1117 					const(char)* pem_str, const(char)* info);
1118 void EVP_PKEY_asn1_copy(EVP_PKEY_ASN1_METHOD* dst,
1119 			const(EVP_PKEY_ASN1_METHOD)* src);
1120 void EVP_PKEY_asn1_free(EVP_PKEY_ASN1_METHOD* ameth);
1121 void EVP_PKEY_asn1_set_public(EVP_PKEY_ASN1_METHOD* ameth,
1122 		ExternC!(int function(EVP_PKEY* pk, X509_PUBKEY* pub)) pub_decode,
1123 		ExternC!(int function(X509_PUBKEY* pub, const(EVP_PKEY)* pk)) pub_encode,
1124 		ExternC!(int function(const(EVP_PKEY)* a, const(EVP_PKEY)* b)) pub_cmp,
1125 		ExternC!(int function(BIO* out_, const(EVP_PKEY)* pkey, int indent,
1126 							ASN1_PCTX* pctx)) pub_print,
1127 		ExternC!(int function(const(EVP_PKEY)* pk)) pkey_size,
1128 		ExternC!(int function(const(EVP_PKEY)* pk)) pkey_bits);
1129 void EVP_PKEY_asn1_set_private(EVP_PKEY_ASN1_METHOD* ameth,
1130 		ExternC!(int function(EVP_PKEY* pk, const(PKCS8_PRIV_KEY_INFO)* p8inf)) priv_decode,
1131 		ExternC!(int function(PKCS8_PRIV_KEY_INFO* p8, const(EVP_PKEY)* pk)) priv_encode,
1132 		ExternC!(int function(BIO* out_, const(EVP_PKEY)* pkey, int indent,
1133 							ASN1_PCTX* pctx)) priv_print);
1134 void EVP_PKEY_asn1_set_param(EVP_PKEY_ASN1_METHOD* ameth,
1135 		ExternC!(int function(EVP_PKEY* pkey,
1136 				const(ubyte)** pder, int derlen)) param_decode,
1137 		ExternC!(int function(const(EVP_PKEY)* pkey, ubyte** pder)) param_encode,
1138 		ExternC!(int function(const(EVP_PKEY)* pk)) param_missing,
1139 		ExternC!(int function(EVP_PKEY* to, const(EVP_PKEY)* from)) param_copy,
1140 		ExternC!(int function(const(EVP_PKEY)* a, const(EVP_PKEY)* b)) param_cmp,
1141 		ExternC!(int function(BIO* out_, const(EVP_PKEY)* pkey, int indent,
1142 							ASN1_PCTX* pctx)) param_print);
1143 
1144 void EVP_PKEY_asn1_set_free(EVP_PKEY_ASN1_METHOD* ameth,
1145 		ExternC!(void function(EVP_PKEY* pkey)) pkey_free);
1146 void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD* ameth,
1147 		ExternC!(int function(EVP_PKEY* pkey, int op,
1148 							c_long arg1, void* arg2)) pkey_ctrl);
1149 
1150 private alias EVP_PKEY_asn1_item_verify_fn = int function(EVP_MD_CTX* ctx,
1151 	const(ASN1_ITEM)* it, void* asn, X509_ALGOR* a, ASN1_BIT_STRING* sig, EVP_PKEY* pkey);
1152 private alias EVP_PKEY_asn1_item_sign_fn = int function(EVP_MD_CTX* ctx,
1153 	const(ASN1_ITEM)* it, void* asn, X509_ALGOR* alg1, X509_ALGOR* alg2, ASN1_BIT_STRING* sig);
1154 void EVP_PKEY_asn1_set_item(EVP_PKEY_ASN1_METHOD* ameth,
1155 	EVP_PKEY_asn1_item_verify_fn item_verify, EVP_PKEY_asn1_item_sign_fn item_sign);
1156 
1157 private alias EVP_PKEY_asn1_security_bit_fn = int function(const(EVP_PKEY)* pk);
1158 void EVP_PKEY_asn1_set_security_bits(EVP_PKEY_ASN1_METHOD* ameth,
1159 	EVP_PKEY_asn1_security_bit_fn pkey_security_bits);
1160 
1161 enum EVP_PKEY_OP_UNDEFINED = 0;
1162 enum EVP_PKEY_OP_PARAMGEN = (1<<1);
1163 enum EVP_PKEY_OP_KEYGEN = (1<<2);
1164 enum EVP_PKEY_OP_SIGN = (1<<3);
1165 enum EVP_PKEY_OP_VERIFY = (1<<4);
1166 enum EVP_PKEY_OP_VERIFYRECOVER = (1<<5);
1167 enum EVP_PKEY_OP_SIGNCTX = (1<<6);
1168 enum EVP_PKEY_OP_VERIFYCTX = (1<<7);
1169 enum EVP_PKEY_OP_ENCRYPT = (1<<8);
1170 enum EVP_PKEY_OP_DECRYPT = (1<<9);
1171 enum EVP_PKEY_OP_DERIVE = (1<<10);
1172 
1173 enum EVP_PKEY_OP_TYPE_SIG =
1174 	(EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER
1175 		| EVP_PKEY_OP_SIGNCTX | EVP_PKEY_OP_VERIFYCTX);
1176 
1177 enum EVP_PKEY_OP_TYPE_CRYPT =
1178 	(EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT);
1179 
1180 /+ BUG in original headers: EVP_PKEY_OP_SIG, EVP_PKEY_OP_CRYPT are not defined.
1181 enum EVP_PKEY_OP_TYPE_NOGEN =
1182 	(EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE);
1183 +/
1184 
1185 enum EVP_PKEY_OP_TYPE_GEN =
1186 		(EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN);
1187 
1188 auto EVP_PKEY_CTX_set_signature_md()(EVP_PKEY_CTX* ctx, void* md) {
1189 	return EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_TYPE_SIG,
1190 				EVP_PKEY_CTRL_MD, 0, md);
1191 }
1192 
1193 auto EVP_PKEY_CTX_set_mac_key()(EVP_PKEY_CTX* ctx, ubyte* key, int len) {
1194 	return EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_KEYGEN,
1195 		EVP_PKEY_CTRL_SET_MAC_KEY, len, key);
1196 }
1197 
1198 enum EVP_PKEY_CTRL_MD = 1;
1199 enum EVP_PKEY_CTRL_PEER_KEY = 2;
1200 
1201 enum EVP_PKEY_CTRL_PKCS7_ENCRYPT = 3;
1202 enum EVP_PKEY_CTRL_PKCS7_DECRYPT = 4;
1203 
1204 enum EVP_PKEY_CTRL_PKCS7_SIGN = 5;
1205 
1206 enum EVP_PKEY_CTRL_SET_MAC_KEY = 6;
1207 
1208 enum EVP_PKEY_CTRL_DIGESTINIT = 7;
1209 
1210 /* Used by GOST key encryption in TLS */
1211 enum EVP_PKEY_CTRL_SET_IV = 8;
1212 
1213 enum EVP_PKEY_CTRL_CMS_ENCRYPT = 9;
1214 enum EVP_PKEY_CTRL_CMS_DECRYPT = 10;
1215 enum EVP_PKEY_CTRL_CMS_SIGN = 11;
1216 
1217 enum EVP_PKEY_CTRL_CIPHER = 12;
1218 
1219 enum EVP_PKEY_ALG_CTRL = 0x1000;
1220 
1221 
1222 enum EVP_PKEY_FLAG_AUTOARGLEN = 2;
1223 /* Method handles all operations: don't assume any digest related
1224  * defaults.
1225  */
1226 enum EVP_PKEY_FLAG_SIGCTX_CUSTOM = 4;
1227 
1228 const(EVP_PKEY_METHOD)* EVP_PKEY_meth_find(int type);
1229 EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags);
1230 void EVP_PKEY_meth_get0_info(int* ppkey_id, int* pflags,
1231 				const(EVP_PKEY_METHOD)* meth);
1232 void EVP_PKEY_meth_copy(EVP_PKEY_METHOD* dst, const(EVP_PKEY_METHOD)* src);
1233 void EVP_PKEY_meth_free(EVP_PKEY_METHOD* pmeth);
1234 int EVP_PKEY_meth_add0(const(EVP_PKEY_METHOD)* pmeth);
1235 
1236 EVP_PKEY_CTX* EVP_PKEY_CTX_new(EVP_PKEY* pkey, ENGINE* e);
1237 EVP_PKEY_CTX* EVP_PKEY_CTX_new_id(int id, ENGINE* e);
1238 EVP_PKEY_CTX* EVP_PKEY_CTX_dup(EVP_PKEY_CTX* ctx);
1239 void EVP_PKEY_CTX_free(EVP_PKEY_CTX* ctx);
1240 
1241 int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX* ctx, int keytype, int optype,
1242 				int cmd, int p1, void* p2);
1243 int EVP_PKEY_CTX_ctrl_str(EVP_PKEY_CTX* ctx, const(char)* type,
1244 						const(char)* value);
1245 int EVP_PKEY_CTX_ctrl_uint64(EVP_PKEY_CTX* ctx, int keytype, int optype,
1246                              int cmd, ulong value);
1247 
1248 int EVP_PKEY_CTX_get_operation(EVP_PKEY_CTX* ctx);
1249 void EVP_PKEY_CTX_set0_keygen_info(EVP_PKEY_CTX* ctx, int* dat, int datlen);
1250 
1251 EVP_PKEY* EVP_PKEY_new_mac_key(int type, ENGINE* e,
1252 				const(ubyte)* key, int keylen);
1253 
1254 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 1))
1255 {
1256     EVP_PKEY* EVP_PKEY_new_raw_private_key(
1257         int type, ENGINE* e, const(ubyte)* priv, size_t len);
1258     EVP_PKEY* EVP_PKEY_new_raw_public_key(
1259         int type, ENGINE* e, const(ubyte)* pub, size_t len);
1260 }
1261 
1262 void EVP_PKEY_CTX_set_data(EVP_PKEY_CTX* ctx, void* data);
1263 void* EVP_PKEY_CTX_get_data(EVP_PKEY_CTX* ctx);
1264 EVP_PKEY* EVP_PKEY_CTX_get0_pkey(EVP_PKEY_CTX* ctx);
1265 
1266 EVP_PKEY* EVP_PKEY_CTX_get0_peerkey(EVP_PKEY_CTX* ctx);
1267 
1268 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX* ctx, void* data);
1269 void* EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX* ctx);
1270 
1271 int EVP_PKEY_sign_init(EVP_PKEY_CTX* ctx);
1272 int EVP_PKEY_sign(EVP_PKEY_CTX* ctx,
1273 			ubyte* sig, size_t* siglen,
1274 			const(ubyte)* tbs, size_t tbslen);
1275 int EVP_PKEY_verify_init(EVP_PKEY_CTX* ctx);
1276 int EVP_PKEY_verify(EVP_PKEY_CTX* ctx,
1277 			const(ubyte)* sig, size_t siglen,
1278 			const(ubyte)* tbs, size_t tbslen);
1279 int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX* ctx);
1280 int EVP_PKEY_verify_recover(EVP_PKEY_CTX* ctx,
1281 			ubyte* rout, size_t* routlen,
1282 			const(ubyte)* sig, size_t siglen);
1283 int EVP_PKEY_encrypt_init(EVP_PKEY_CTX* ctx);
1284 int EVP_PKEY_encrypt(EVP_PKEY_CTX* ctx,
1285 			ubyte* out_, size_t* outlen,
1286 			const(ubyte)* in_, size_t inlen);
1287 int EVP_PKEY_decrypt_init(EVP_PKEY_CTX* ctx);
1288 int EVP_PKEY_decrypt(EVP_PKEY_CTX* ctx,
1289 			ubyte* out_, size_t* outlen,
1290 			const(ubyte)* in_, size_t inlen);
1291 
1292 static if (OPENSSL_VERSION_AT_LEAST(3, 0, 0))
1293     int EVP_PKEY_derive_init_ex(EVP_PKEY_CTX* ctx, EVP_KEYEXCH* exchange);
1294 int EVP_PKEY_derive_init(EVP_PKEY_CTX* ctx);
1295 int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX* ctx, EVP_PKEY* peer);
1296 int EVP_PKEY_derive(EVP_PKEY_CTX* ctx, ubyte* key, size_t* keylen);
1297 
1298 alias EVP_PKEY_gen_cb = typeof(*(ExternC!(int function(EVP_PKEY_CTX* ctx))).init);
1299 
1300 int EVP_PKEY_paramgen_init(EVP_PKEY_CTX* ctx);
1301 int EVP_PKEY_paramgen(EVP_PKEY_CTX* ctx, EVP_PKEY** ppkey);
1302 int EVP_PKEY_keygen_init(EVP_PKEY_CTX* ctx);
1303 int EVP_PKEY_keygen(EVP_PKEY_CTX* ctx, EVP_PKEY** ppkey);
1304 
1305 void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX* ctx, EVP_PKEY_gen_cb* cb);
1306 EVP_PKEY_gen_cb* EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX* ctx);
1307 
1308 int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX* ctx, int idx);
1309 
1310 void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD* pmeth,
1311 	ExternC!(int function(EVP_PKEY_CTX* ctx)) init);
1312 
1313 void EVP_PKEY_meth_set_copy(EVP_PKEY_METHOD* pmeth,
1314 	ExternC!(int function(EVP_PKEY_CTX* dst, EVP_PKEY_CTX* src)) copy);
1315 
1316 void EVP_PKEY_meth_set_cleanup(EVP_PKEY_METHOD* pmeth,
1317 	ExternC!(void function(EVP_PKEY_CTX* ctx)) cleanup);
1318 
1319 void EVP_PKEY_meth_set_paramgen(EVP_PKEY_METHOD* pmeth,
1320 	ExternC!(int function(EVP_PKEY_CTX* ctx)) paramgen_init,
1321 	ExternC!(int function(EVP_PKEY_CTX* ctx, EVP_PKEY* pkey)) paramgen);
1322 
1323 void EVP_PKEY_meth_set_keygen(EVP_PKEY_METHOD* pmeth,
1324 	ExternC!(int function(EVP_PKEY_CTX* ctx)) keygen_init,
1325 	ExternC!(int function(EVP_PKEY_CTX* ctx, EVP_PKEY* pkey)) keygen);
1326 
1327 void EVP_PKEY_meth_set_sign(EVP_PKEY_METHOD* pmeth,
1328 	ExternC!(int function(EVP_PKEY_CTX* ctx)) sign_init,
1329 	ExternC!(int function(EVP_PKEY_CTX* ctx, ubyte* sig, size_t* siglen,
1330 					const(ubyte)* tbs, size_t tbslen)) sign);
1331 
1332 void EVP_PKEY_meth_set_verify(EVP_PKEY_METHOD* pmeth,
1333 	ExternC!(int function(EVP_PKEY_CTX* ctx)) verify_init,
1334 	ExternC!(int function(EVP_PKEY_CTX* ctx, const(ubyte)* sig, size_t siglen,
1335 					const(ubyte)* tbs, size_t tbslen)) verify);
1336 
1337 void EVP_PKEY_meth_set_verify_recover(EVP_PKEY_METHOD* pmeth,
1338 	ExternC!(int function(EVP_PKEY_CTX* ctx)) verify_recover_init,
1339 	ExternC!(int function(EVP_PKEY_CTX* ctx,
1340 					ubyte* sig, size_t* siglen,
1341 					const(ubyte)* tbs, size_t tbslen)) verify_recover);
1342 
1343 void EVP_PKEY_meth_set_signctx(EVP_PKEY_METHOD* pmeth,
1344 	ExternC!(int function(EVP_PKEY_CTX* ctx, EVP_MD_CTX* mctx)) signctx_init,
1345 	ExternC!(int function(EVP_PKEY_CTX* ctx, ubyte* sig, size_t* siglen,
1346 					EVP_MD_CTX* mctx)) signctx);
1347 
1348 void EVP_PKEY_meth_set_verifyctx(EVP_PKEY_METHOD* pmeth,
1349 	ExternC!(int function(EVP_PKEY_CTX* ctx, EVP_MD_CTX* mctx)) verifyctx_init,
1350 	ExternC!(int function(EVP_PKEY_CTX* ctx, const(ubyte)* sig,int siglen,
1351 					EVP_MD_CTX* mctx)) verifyctx);
1352 
1353 void EVP_PKEY_meth_set_encrypt(EVP_PKEY_METHOD* pmeth,
1354 	ExternC!(int function(EVP_PKEY_CTX* ctx)) encrypt_init,
1355 	ExternC!(int function(EVP_PKEY_CTX* ctx, ubyte* out_, size_t* outlen,
1356 					const(ubyte)* in_, size_t inlen)) encryptfn);
1357 
1358 void EVP_PKEY_meth_set_decrypt(EVP_PKEY_METHOD* pmeth,
1359 	ExternC!(int function(EVP_PKEY_CTX* ctx)) decrypt_init,
1360 	ExternC!(int function(EVP_PKEY_CTX* ctx, ubyte* out_, size_t* outlen,
1361 					const(ubyte)* in_, size_t inlen)) decrypt);
1362 
1363 void EVP_PKEY_meth_set_derive(EVP_PKEY_METHOD* pmeth,
1364 	ExternC!(int function(EVP_PKEY_CTX* ctx)) derive_init,
1365 	ExternC!(int function(EVP_PKEY_CTX* ctx, ubyte* key, size_t* keylen)) derive);
1366 
1367 void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD* pmeth,
1368 	ExternC!(int function(EVP_PKEY_CTX* ctx, int type, int p1, void* p2)) ctrl,
1369 	ExternC!(int function(EVP_PKEY_CTX* ctx,
1370 					const(char)* type, const(char)* value)) ctrl_str);
1371 
1372 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 1))
1373 {
1374     private alias EVP_PKEY_meth_digestsign_fn = int function(
1375         EVP_MD_CTX* ctx, ubyte* sig, size_t* siglen, const(ubyte)* tbs, size_t tbslen);
1376     private alias EVP_PKEY_meth_digestverify_fn = int function(
1377         EVP_MD_CTX*ctx, const(ubyte)* sig, size_t siglen, const(ubyte)* tbs, size_t tbslen);
1378 
1379     void EVP_PKEY_meth_set_digestsign(
1380         EVP_PKEY_METHOD* pmeth, EVP_PKEY_meth_digestsign_fn digestsign);
1381     void EVP_PKEY_meth_set_digestverify(
1382         EVP_PKEY_METHOD* pmeth, EVP_PKEY_meth_digestverify_fn digestverify);
1383     void EVP_PKEY_meth_get_digestsign(
1384         EVP_PKEY_METHOD *pmeth, EVP_PKEY_meth_digestsign_fn* digestsign);
1385     void EVP_PKEY_meth_get_digestverify(
1386         EVP_PKEY_METHOD *pmeth, EVP_PKEY_meth_digestverify_fn* digestverify);
1387 }
1388 
1389 static if (OPENSSL_VERSION_AT_LEAST(1, 1, 0))
1390 {
1391     private alias EVP_PKEY_meth_lifetime_fn = int function(EVP_PKEY_CTX* ctx);
1392     private alias EVP_PKEY_meth_lifetime2_fn = int function(EVP_PKEY_CTX* ctx, EVP_MD_CTX* mctx);
1393 
1394     private alias EVP_PKEY_meth_copy_fn = int function (EVP_PKEY_CTX* dst, EVP_PKEY_CTX* src);
1395     private alias EVP_PKEY_meth_gen_fn = int function(EVP_PKEY_CTX* ctx, EVP_PKEY* pkey);
1396     private alias EVP_PKEY_meth_sign_fn = int function(
1397         EVP_PKEY_CTX* ctx, ubyte* sig, size_t* siglen, const(ubyte)* tbs, size_t tbslen);
1398     private alias EVP_PKEY_meth_verify_fn = int function(
1399         EVP_PKEY_CTX* ctx, const(ubyte)* sig, size_t siglen, const(ubyte)* tbs, size_t tbslen);
1400     private alias EVP_PKEY_meth_verify_recover_fn = int function(
1401         EVP_PKEY_CTX* ctx, ubyte* sig, size_t* siglen, const(ubyte)* tbs, size_t tbslen);
1402     private alias EVP_PKEY_meth_signctx_fn = int function(
1403         EVP_PKEY_CTX* ctx, ubyte* sig, size_t* siglen, EVP_MD_CTX* mctx);
1404     private alias EVP_PKEY_meth_verifyctx_fn = int function(
1405         EVP_PKEY_CTX* ctx, const(ubyte)* sig, int siglen, EVP_MD_CTX* mctx);
1406     private alias EVP_PKEY_meth_encrypt_fn = int function(
1407         EVP_PKEY_CTX *ctx, ubyte* out_, size_t* outlen, const(ubyte)* in_, size_t inlen);
1408     private alias EVP_PKEY_meth_decrypt_fn = int function(
1409         EVP_PKEY_CTX* ctx, ubyte* out_, size_t* outlen, const(ubyte)* in_, size_t inlen);
1410     private alias EVP_PKEY_meth_derive_fn = int function(
1411         EVP_PKEY_CTX* ctx, ubyte* key, size_t* keylen);
1412     private alias EVP_PKEY_meth_ctrl_fn = int function(
1413         EVP_PKEY_CTX* ctx, int type, int p1, void* p2);
1414     private alias EVP_PKEY_meth_ctrl_str_fn = int function(
1415         EVP_PKEY_CTX* ctx, const(char)* type, const(char)* value);
1416 
1417     void EVP_PKEY_meth_get_init(
1418         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pinit);
1419 
1420     void EVP_PKEY_meth_get_copy(
1421         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_copy_fn* pcopy);
1422 
1423     void EVP_PKEY_meth_get_cleanup(
1424         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pcleanup);
1425 
1426     void EVP_PKEY_meth_get_paramgen(
1427         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pparamgen_init,
1428         EVP_PKEY_meth_gen_fn* pparamgen);
1429 
1430     void EVP_PKEY_meth_get_keygen(
1431         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pkeygen_init,
1432         EVP_PKEY_meth_gen_fn* pkeygen);
1433 
1434     void EVP_PKEY_meth_get_sign(
1435         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* psign_init,
1436         EVP_PKEY_meth_sign_fn* psign);
1437 
1438     void EVP_PKEY_meth_get_verify(
1439         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pverify_init,
1440         EVP_PKEY_meth_verify_fn* pverify);
1441 
1442     void EVP_PKEY_meth_get_verify_recover(
1443         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pverify_recover_init,
1444         EVP_PKEY_meth_verify_recover_fn* pverify_recover);
1445 
1446     void EVP_PKEY_meth_get_signctx(
1447         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime2_fn* psignctx_init,
1448         EVP_PKEY_meth_signctx_fn* psignctx);
1449 
1450     void EVP_PKEY_meth_get_verifyctx(
1451         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime2_fn* pverifyctx_init,
1452         EVP_PKEY_meth_verifyctx_fn* pverifyctx);
1453 
1454     void EVP_PKEY_meth_get_encrypt(
1455         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pencrypt_init,
1456         EVP_PKEY_meth_encrypt_fn* pencryptfn);
1457 
1458     void EVP_PKEY_meth_get_decrypt(
1459         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pdecrypt_init,
1460         EVP_PKEY_meth_decrypt_fn* pdecrypt);
1461 
1462     void EVP_PKEY_meth_get_derive(
1463         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_lifetime_fn* pderive_init,
1464         EVP_PKEY_meth_derive_fn* pderive);
1465 
1466     void EVP_PKEY_meth_get_ctrl(
1467         const(EVP_PKEY_METHOD)* pmeth, EVP_PKEY_meth_ctrl_fn* pctrl,
1468         EVP_PKEY_meth_ctrl_str_fn* pctrl_str);
1469 }
1470 
1471 static if (OPENSSL_VERSION_AT_LEAST(3, 0, 0))
1472 {
1473 	void EVP_KEYEXCH_free(EVP_KEYEXCH* exchange);
1474 	int EVP_KEYEXCH_up_ref(EVP_KEYEXCH* exchange);
1475 	EVP_KEYEXCH* EVP_KEYEXCH_fetch(OSSL_LIB_CTX* ctx, const(char)* algorithm,
1476 		const(char)* properties);
1477 	OSSL_PROVIDER* EVP_KEYEXCH_get0_provider(const(EVP_KEYEXCH)* exchange);
1478 	int EVP_KEYEXCH_is_a(const(EVP_KEYEXCH)* keyexch, const(char)* name);
1479 	const(char)* EVP_KEYEXCH_get0_name(const(EVP_KEYEXCH)* keyexch);
1480 	const(char)* EVP_KEYEXCH_get0_description(const(EVP_KEYEXCH)* keyexch);
1481 
1482 	private alias EVP_KEYEXCH_apply_fn = void function(EVP_KEYEXCH* keyexch, void* data);
1483 	private alias EVP_KEYEXCH_apply_names_fn = void function(const(char)* keyexch, void* data);
1484 	void EVP_KEYEXCH_do_all_provided(
1485 		OSSL_LIB_CTX* libctx, EVP_KEYEXCH_apply_fn fn, void* data);
1486 	int EVP_KEYEXCH_names_do_all(
1487 		const(EVP_KEYEXCH)* keyexch, EVP_KEYEXCH_apply_names_fn fn, void *data);
1488 	const(OSSL_PARAM)* EVP_KEYEXCH_gettable_ctx_params(const(EVP_KEYEXCH)* keyexch);
1489 	const(OSSL_PARAM)* EVP_KEYEXCH_settable_ctx_params(const(EVP_KEYEXCH)* keyexch);
1490 
1491 	int EVP_PKEY_CTX_set_group_name(EVP_PKEY_CTX* ctx, const(char)* name);
1492 	int EVP_PKEY_CTX_get_group_name(EVP_PKEY_CTX* ctx, char* name, size_t namelen);
1493 	int EVP_PKEY_get_group_name(const(EVP_PKEY)* pkey, char* name, size_t name_sz,
1494 		size_t* gname_len);
1495 
1496 	OSSL_LIB_CTX* EVP_PKEY_CTX_get0_libctx(EVP_PKEY_CTX* ctx);
1497 	const(char)* EVP_PKEY_CTX_get0_propq(const(EVP_PKEY_CTX)* ctx);
1498 	const(OSSL_PROVIDER)* EVP_PKEY_CTX_get0_provider(const(EVP_PKEY_CTX)* ctx);
1499 }
1500 
1501 void EVP_add_alg_module();
1502 
1503 /* BEGIN ERROR CODES */
1504 /* The following lines are auto generated by the script mkerr.pl. Any changes
1505  * made after this point may be overwritten when the script is next run.
1506  */
1507 static if (OPENSSL_VERSION_BEFORE(1, 1, 0))
1508     void ERR_load_EVP_strings();
1509 else
1510     int ERR_load_EVP_strings();
1511 
1512 /* Error codes for the EVP functions. */
1513 
1514 /* Function codes. */
1515 enum EVP_F_AESNI_INIT_KEY = 165;
1516 enum EVP_F_AESNI_XTS_CIPHER = 176;
1517 enum EVP_F_AES_INIT_KEY = 133;
1518 enum EVP_F_AES_XTS = 172;
1519 enum EVP_F_AES_XTS_CIPHER = 175;
1520 enum EVP_F_ALG_MODULE_INIT = 177;
1521 enum EVP_F_CAMELLIA_INIT_KEY = 159;
1522 enum EVP_F_CMAC_INIT = 173;
1523 enum EVP_F_D2I_PKEY = 100;
1524 enum EVP_F_DO_SIGVER_INIT = 161;
1525 enum EVP_F_DSAPKEY2PKCS8 = 134;
1526 enum EVP_F_DSA_PKEY2PKCS8 = 135;
1527 enum EVP_F_ECDSA_PKEY2PKCS8 = 129;
1528 enum EVP_F_ECKEY_PKEY2PKCS8 = 132;
1529 enum EVP_F_EVP_CIPHERINIT_EX = 123;
1530 enum EVP_F_EVP_CIPHER_CTX_COPY = 163;
1531 enum EVP_F_EVP_CIPHER_CTX_CTRL = 124;
1532 enum EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH = 122;
1533 enum EVP_F_EVP_DECRYPTFINAL_EX = 101;
1534 enum EVP_F_EVP_DIGESTINIT_EX = 128;
1535 enum EVP_F_EVP_ENCRYPTFINAL_EX = 127;
1536 enum EVP_F_EVP_MD_CTX_COPY_EX = 110;
1537 enum EVP_F_EVP_MD_SIZE = 162;
1538 enum EVP_F_EVP_OPENINIT = 102;
1539 enum EVP_F_EVP_PBE_ALG_ADD = 115;
1540 enum EVP_F_EVP_PBE_ALG_ADD_TYPE = 160;
1541 enum EVP_F_EVP_PBE_CIPHERINIT = 116;
1542 enum EVP_F_EVP_PKCS82PKEY = 111;
1543 enum EVP_F_EVP_PKCS82PKEY_BROKEN = 136;
1544 enum EVP_F_EVP_PKEY2PKCS8_BROKEN = 113;
1545 enum EVP_F_EVP_PKEY_COPY_PARAMETERS = 103;
1546 enum EVP_F_EVP_PKEY_CTX_CTRL = 137;
1547 enum EVP_F_EVP_PKEY_CTX_CTRL_STR = 150;
1548 enum EVP_F_EVP_PKEY_CTX_DUP = 156;
1549 enum EVP_F_EVP_PKEY_DECRYPT = 104;
1550 enum EVP_F_EVP_PKEY_DECRYPT_INIT = 138;
1551 enum EVP_F_EVP_PKEY_DECRYPT_OLD = 151;
1552 enum EVP_F_EVP_PKEY_DERIVE = 153;
1553 enum EVP_F_EVP_PKEY_DERIVE_INIT = 154;
1554 enum EVP_F_EVP_PKEY_DERIVE_SET_PEER = 155;
1555 enum EVP_F_EVP_PKEY_ENCRYPT = 105;
1556 enum EVP_F_EVP_PKEY_ENCRYPT_INIT = 139;
1557 enum EVP_F_EVP_PKEY_ENCRYPT_OLD = 152;
1558 enum EVP_F_EVP_PKEY_GET1_DH = 119;
1559 enum EVP_F_EVP_PKEY_GET1_DSA = 120;
1560 enum EVP_F_EVP_PKEY_GET1_ECDSA = 130;
1561 enum EVP_F_EVP_PKEY_GET1_EC_KEY = 131;
1562 enum EVP_F_EVP_PKEY_GET1_RSA = 121;
1563 enum EVP_F_EVP_PKEY_KEYGEN = 146;
1564 enum EVP_F_EVP_PKEY_KEYGEN_INIT = 147;
1565 enum EVP_F_EVP_PKEY_NEW = 106;
1566 enum EVP_F_EVP_PKEY_PARAMGEN = 148;
1567 enum EVP_F_EVP_PKEY_PARAMGEN_INIT = 149;
1568 enum EVP_F_EVP_PKEY_SIGN = 140;
1569 enum EVP_F_EVP_PKEY_SIGN_INIT = 141;
1570 enum EVP_F_EVP_PKEY_VERIFY = 142;
1571 enum EVP_F_EVP_PKEY_VERIFY_INIT = 143;
1572 enum EVP_F_EVP_PKEY_VERIFY_RECOVER = 144;
1573 enum EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT = 145;
1574 enum EVP_F_EVP_RIJNDAEL = 126;
1575 enum EVP_F_EVP_SIGNFINAL = 107;
1576 enum EVP_F_EVP_VERIFYFINAL = 108;
1577 enum EVP_F_FIPS_CIPHERINIT = 166;
1578 enum EVP_F_FIPS_CIPHER_CTX_COPY = 170;
1579 enum EVP_F_FIPS_CIPHER_CTX_CTRL = 167;
1580 enum EVP_F_FIPS_CIPHER_CTX_SET_KEY_LENGTH = 171;
1581 enum EVP_F_FIPS_DIGESTINIT = 168;
1582 enum EVP_F_FIPS_MD_CTX_COPY = 169;
1583 enum EVP_F_HMAC_INIT_EX = 174;
1584 enum EVP_F_INT_CTX_NEW = 157;
1585 enum EVP_F_PKCS5_PBE_KEYIVGEN = 117;
1586 enum EVP_F_PKCS5_V2_PBE_KEYIVGEN = 118;
1587 enum EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN = 164;
1588 enum EVP_F_PKCS8_SET_BROKEN = 112;
1589 enum EVP_F_PKEY_SET_TYPE = 158;
1590 enum EVP_F_RC2_MAGIC_TO_METH = 109;
1591 enum EVP_F_RC5_CTRL = 125;
1592 
1593 /* Reason codes. */
1594 enum EVP_R_AES_IV_SETUP_FAILED = 162;
1595 enum EVP_R_AES_KEY_SETUP_FAILED = 143;
1596 enum EVP_R_ASN1_LIB = 140;
1597 enum EVP_R_BAD_BLOCK_LENGTH = 136;
1598 enum EVP_R_BAD_DECRYPT = 100;
1599 enum EVP_R_BAD_KEY_LENGTH = 137;
1600 enum EVP_R_BN_DECODE_ERROR = 112;
1601 enum EVP_R_BN_PUBKEY_ERROR = 113;
1602 enum EVP_R_BUFFER_TOO_SMALL = 155;
1603 enum EVP_R_CAMELLIA_KEY_SETUP_FAILED = 157;
1604 enum EVP_R_CIPHER_PARAMETER_ERROR = 122;
1605 enum EVP_R_COMMAND_NOT_SUPPORTED = 147;
1606 enum EVP_R_CTRL_NOT_IMPLEMENTED = 132;
1607 enum EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED = 133;
1608 enum EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH = 138;
1609 enum EVP_R_DECODE_ERROR = 114;
1610 enum EVP_R_DIFFERENT_KEY_TYPES = 101;
1611 enum EVP_R_DIFFERENT_PARAMETERS = 153;
1612 enum EVP_R_DISABLED_FOR_FIPS = 163;
1613 enum EVP_R_ENCODE_ERROR = 115;
1614 enum EVP_R_ERROR_LOADING_SECTION = 165;
1615 enum EVP_R_ERROR_SETTING_FIPS_MODE = 166;
1616 enum EVP_R_EVP_PBE_CIPHERINIT_ERROR = 119;
1617 enum EVP_R_EXPECTING_AN_RSA_KEY = 127;
1618 enum EVP_R_EXPECTING_A_DH_KEY = 128;
1619 enum EVP_R_EXPECTING_A_DSA_KEY = 129;
1620 enum EVP_R_EXPECTING_A_ECDSA_KEY = 141;
1621 enum EVP_R_EXPECTING_A_EC_KEY = 142;
1622 enum EVP_R_FIPS_MODE_NOT_SUPPORTED = 167;
1623 enum EVP_R_INITIALIZATION_ERROR = 134;
1624 enum EVP_R_INPUT_NOT_INITIALIZED = 111;
1625 enum EVP_R_INVALID_DIGEST = 152;
1626 enum EVP_R_INVALID_FIPS_MODE = 168;
1627 enum EVP_R_INVALID_KEY_LENGTH = 130;
1628 enum EVP_R_INVALID_OPERATION = 148;
1629 enum EVP_R_IV_TOO_LARGE = 102;
1630 enum EVP_R_KEYGEN_FAILURE = 120;
1631 enum EVP_R_MESSAGE_DIGEST_IS_NULL = 159;
1632 enum EVP_R_METHOD_NOT_SUPPORTED = 144;
1633 enum EVP_R_MISSING_PARAMETERS = 103;
1634 enum EVP_R_NO_CIPHER_SET = 131;
1635 enum EVP_R_NO_DEFAULT_DIGEST = 158;
1636 enum EVP_R_NO_DIGEST_SET = 139;
1637 enum EVP_R_NO_DSA_PARAMETERS = 116;
1638 enum EVP_R_NO_KEY_SET = 154;
1639 enum EVP_R_NO_OPERATION_SET = 149;
1640 enum EVP_R_NO_SIGN_FUNCTION_CONFIGURED = 104;
1641 enum EVP_R_NO_VERIFY_FUNCTION_CONFIGURED = 105;
1642 enum EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE = 150;
1643 enum EVP_R_OPERATON_NOT_INITIALIZED = 151;
1644 enum EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE = 117;
1645 enum EVP_R_PRIVATE_KEY_DECODE_ERROR = 145;
1646 enum EVP_R_PRIVATE_KEY_ENCODE_ERROR = 146;
1647 enum EVP_R_PUBLIC_KEY_NOT_RSA = 106;
1648 enum EVP_R_TOO_LARGE = 164;
1649 enum EVP_R_UNKNOWN_CIPHER = 160;
1650 enum EVP_R_UNKNOWN_DIGEST = 161;
1651 enum EVP_R_UNKNOWN_OPTION = 169;
1652 enum EVP_R_UNKNOWN_PBE_ALGORITHM = 121;
1653 enum EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS = 135;
1654 enum EVP_R_UNSUPPORTED_ALGORITHM = 156;
1655 enum EVP_R_UNSUPPORTED_CIPHER = 107;
1656 enum EVP_R_UNSUPPORTED_KEYLENGTH = 123;
1657 enum EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION = 124;
1658 enum EVP_R_UNSUPPORTED_KEY_SIZE = 108;
1659 enum EVP_R_UNSUPPORTED_PRF = 125;
1660 enum EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM = 118;
1661 enum EVP_R_UNSUPPORTED_SALT_TYPE = 126;
1662 enum EVP_R_WRONG_FINAL_BLOCK_LENGTH = 109;
1663 enum EVP_R_WRONG_PUBLIC_KEY_TYPE = 110;