1use super::*;
2use libc::*;
3
4pub const EVP_MAX_MD_SIZE: c_uint = 64;
5
6pub const PKCS5_SALT_LEN: c_int = 8;
7pub const PKCS12_DEFAULT_ITER: c_int = 2048;
8
9pub const EVP_PKEY_RSA: c_int = NID_rsaEncryption;
10pub const EVP_PKEY_DSA: c_int = NID_dsa;
11pub const EVP_PKEY_DH: c_int = NID_dhKeyAgreement;
12pub const EVP_PKEY_EC: c_int = NID_X9_62_id_ecPublicKey;
13#[cfg(ossl111)]
14pub const EVP_PKEY_SM2: c_int = NID_sm2;
15#[cfg(any(ossl111, libressl370))]
16pub const EVP_PKEY_X25519: c_int = NID_X25519;
17#[cfg(any(ossl111, libressl370))]
18pub const EVP_PKEY_ED25519: c_int = NID_ED25519;
19#[cfg(ossl111)]
20pub const EVP_PKEY_X448: c_int = NID_X448;
21#[cfg(ossl111)]
22pub const EVP_PKEY_ED448: c_int = NID_ED448;
23pub const EVP_PKEY_HMAC: c_int = NID_hmac;
24pub const EVP_PKEY_CMAC: c_int = NID_cmac;
25#[cfg(ossl111)]
26pub const EVP_PKEY_POLY1305: c_int = NID_poly1305;
27#[cfg(ossl110)]
28pub const EVP_PKEY_HKDF: c_int = NID_hkdf;
29
30#[cfg(ossl102)]
31pub const EVP_CIPHER_CTX_FLAG_WRAP_ALLOW: c_int = 0x1;
32
33pub const EVP_CTRL_GCM_SET_IVLEN: c_int = 0x9;
34pub const EVP_CTRL_GCM_GET_TAG: c_int = 0x10;
35pub const EVP_CTRL_GCM_SET_TAG: c_int = 0x11;
36
37pub unsafe fn EVP_get_digestbynid(type_: c_int) -> *const EVP_MD {
38    EVP_get_digestbyname(OBJ_nid2sn(type_))
39}
40
41cfg_if! {
42    if #[cfg(ossl300)] {
43        #[inline]
44        pub unsafe fn EVP_MD_CTX_md(ctx: *const EVP_MD_CTX) -> *const EVP_MD {
45            EVP_MD_CTX_get0_md(ctx)
46        }
47
48        #[inline]
49        pub unsafe fn EVP_MD_CTX_get_size(ctx: *const EVP_MD_CTX) -> c_int {
50            EVP_MD_get_size(EVP_MD_CTX_get0_md(ctx))
51        }
52
53        #[inline]
54        pub unsafe fn EVP_MD_CTX_size(ctx: *const EVP_MD_CTX) -> c_int {
55            EVP_MD_CTX_get_size(ctx)
56        }
57
58        #[inline]
59        pub unsafe fn EVP_MD_block_size(md: *const EVP_MD) -> c_int {
60            EVP_MD_get_block_size(md)
61        }
62
63        #[inline]
64        pub unsafe fn EVP_MD_size(md: *const EVP_MD) -> c_int {
65            EVP_MD_get_size(md)
66        }
67
68        #[inline]
69        pub unsafe fn EVP_MD_type(md: *const EVP_MD) -> c_int {
70            EVP_MD_get_type(md)
71        }
72
73        #[inline]
74        pub unsafe fn EVP_CIPHER_key_length(cipher: *const EVP_CIPHER) -> c_int {
75            EVP_CIPHER_get_key_length(cipher)
76        }
77
78        #[inline]
79        pub unsafe fn EVP_CIPHER_block_size(cipher: *const EVP_CIPHER) -> c_int {
80            EVP_CIPHER_get_block_size(cipher)
81        }
82
83        #[inline]
84        pub unsafe fn EVP_CIPHER_iv_length(cipher: *const EVP_CIPHER) -> c_int {
85            EVP_CIPHER_get_iv_length(cipher)
86        }
87
88        #[inline]
89        pub unsafe fn EVP_CIPHER_nid(cipher: *const EVP_CIPHER) -> c_int {
90            EVP_CIPHER_get_nid(cipher)
91        }
92
93        #[inline]
94        pub unsafe fn EVP_CIPHER_CTX_block_size(ctx: *const EVP_CIPHER_CTX) -> c_int {
95            EVP_CIPHER_CTX_get_block_size(ctx)
96        }
97
98        #[inline]
99        pub unsafe fn EVP_CIPHER_CTX_key_length(ctx: *const EVP_CIPHER_CTX) -> c_int {
100            EVP_CIPHER_CTX_get_key_length(ctx)
101        }
102
103        #[inline]
104        pub unsafe fn EVP_CIPHER_CTX_iv_length(ctx: *const EVP_CIPHER_CTX) -> c_int {
105            EVP_CIPHER_CTX_get_iv_length(ctx)
106        }
107
108        #[inline]
109        pub unsafe fn EVP_CIPHER_CTX_num(ctx: *const EVP_CIPHER_CTX) -> c_int {
110            EVP_CIPHER_CTX_get_num(ctx)
111        }
112    } else {
113        pub unsafe fn EVP_MD_CTX_size(ctx: *const EVP_MD_CTX) -> c_int {
114            EVP_MD_size(EVP_MD_CTX_md(ctx))
115        }
116    }
117}
118#[cfg(not(ossl300))]
119#[inline]
120pub unsafe fn EVP_DigestSignUpdate(
121    ctx: *mut EVP_MD_CTX,
122    data: *const c_void,
123    dsize: size_t,
124) -> c_int {
125    EVP_DigestUpdate(ctx, data, dsize)
126}
127#[cfg(not(ossl300))]
128#[inline]
129pub unsafe fn EVP_DigestVerifyUpdate(
130    ctx: *mut EVP_MD_CTX,
131    data: *const c_void,
132    dsize: size_t,
133) -> c_int {
134    EVP_DigestUpdate(ctx, data, dsize)
135}
136#[cfg(ossl300)]
137#[inline]
138pub unsafe fn EVP_PKEY_size(pkey: *const EVP_PKEY) -> c_int {
139    EVP_PKEY_get_size(pkey)
140}
141
142cfg_if! {
143    if #[cfg(ossl300)] {
144        #[inline]
145        pub unsafe fn EVP_PKEY_id(pkey: *const EVP_PKEY) -> c_int {
146            EVP_PKEY_get_id(pkey)
147        }
148
149        #[inline]
150        pub unsafe fn EVP_PKEY_bits(pkey: *const EVP_PKEY) -> c_int {
151            EVP_PKEY_get_bits(pkey)
152        }
153
154        #[inline]
155        pub unsafe fn EVP_PKEY_security_bits(pkey: *const EVP_PKEY) -> c_int {
156            EVP_PKEY_get_security_bits(pkey)
157        }
158    }
159}
160
161pub const EVP_PKEY_OP_KEYGEN: c_int = 1 << 2;
162cfg_if! {
163    if #[cfg(ossl300)] {
164        pub const EVP_PKEY_OP_SIGN: c_int = 1 << 4;
165        pub const EVP_PKEY_OP_VERIFY: c_int = 1 << 5;
166        pub const EVP_PKEY_OP_VERIFYRECOVER: c_int = 1 << 6;
167        pub const EVP_PKEY_OP_SIGNCTX: c_int = 1 << 7;
168        pub const EVP_PKEY_OP_VERIFYCTX: c_int = 1 << 8;
169        pub const EVP_PKEY_OP_ENCRYPT: c_int = 1 << 9;
170        pub const EVP_PKEY_OP_DECRYPT: c_int = 1 << 10;
171        pub const EVP_PKEY_OP_DERIVE: c_int = 1 << 11;
172    } else {
173        pub const EVP_PKEY_OP_SIGN: c_int = 1 << 3;
174        pub const EVP_PKEY_OP_VERIFY: c_int = 1 << 4;
175        pub const EVP_PKEY_OP_VERIFYRECOVER: c_int = 1 << 5;
176        pub const EVP_PKEY_OP_SIGNCTX: c_int = 1 << 6;
177        pub const EVP_PKEY_OP_VERIFYCTX: c_int = 1 << 7;
178        pub const EVP_PKEY_OP_ENCRYPT: c_int = 1 << 8;
179        pub const EVP_PKEY_OP_DECRYPT: c_int = 1 << 9;
180        pub const EVP_PKEY_OP_DERIVE: c_int = 1 << 10;
181    }
182}
183
184pub const EVP_PKEY_OP_TYPE_SIG: c_int = EVP_PKEY_OP_SIGN
185    | EVP_PKEY_OP_VERIFY
186    | EVP_PKEY_OP_VERIFYRECOVER
187    | EVP_PKEY_OP_SIGNCTX
188    | EVP_PKEY_OP_VERIFYCTX;
189
190pub const EVP_PKEY_OP_TYPE_CRYPT: c_int = EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT;
191
192pub const EVP_PKEY_CTRL_MD: c_int = 1;
193
194pub const EVP_PKEY_CTRL_SET_MAC_KEY: c_int = 6;
195
196pub const EVP_PKEY_CTRL_CIPHER: c_int = 12;
197
198pub const EVP_PKEY_ALG_CTRL: c_int = 0x1000;
199
200#[cfg(ossl111)]
201pub const EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND: c_int = 0;
202
203#[cfg(ossl111)]
204pub const EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY: c_int = 1;
205
206#[cfg(ossl111)]
207pub const EVP_PKEY_HKDEF_MODE_EXPAND_ONLY: c_int = 2;
208
209#[cfg(ossl110)]
210pub const EVP_PKEY_CTRL_HKDF_MD: c_int = EVP_PKEY_ALG_CTRL + 3;
211
212#[cfg(ossl110)]
213pub const EVP_PKEY_CTRL_HKDF_SALT: c_int = EVP_PKEY_ALG_CTRL + 4;
214
215#[cfg(ossl110)]
216pub const EVP_PKEY_CTRL_HKDF_KEY: c_int = EVP_PKEY_ALG_CTRL + 5;
217
218#[cfg(ossl110)]
219pub const EVP_PKEY_CTRL_HKDF_INFO: c_int = EVP_PKEY_ALG_CTRL + 6;
220
221#[cfg(ossl111)]
222pub const EVP_PKEY_CTRL_HKDF_MODE: c_int = EVP_PKEY_ALG_CTRL + 7;
223
224#[cfg(all(ossl111, not(ossl300)))]
225pub unsafe fn EVP_PKEY_CTX_set_hkdf_mode(ctx: *mut EVP_PKEY_CTX, mode: c_int) -> c_int {
226    EVP_PKEY_CTX_ctrl(
227        ctx,
228        -1,
229        EVP_PKEY_OP_DERIVE,
230        EVP_PKEY_CTRL_HKDF_MODE,
231        mode,
232        std::ptr::null_mut(),
233    )
234}
235
236#[cfg(all(ossl110, not(ossl300)))]
237pub unsafe fn EVP_PKEY_CTX_set_hkdf_md(ctx: *mut EVP_PKEY_CTX, md: *const EVP_MD) -> c_int {
238    EVP_PKEY_CTX_ctrl(
239        ctx,
240        -1,
241        EVP_PKEY_OP_DERIVE,
242        EVP_PKEY_CTRL_HKDF_MD,
243        0,
244        md as *mut c_void,
245    )
246}
247
248#[cfg(all(ossl110, not(ossl300)))]
249pub unsafe fn EVP_PKEY_CTX_set1_hkdf_salt(
250    ctx: *mut EVP_PKEY_CTX,
251    salt: *const u8,
252    saltlen: c_int,
253) -> c_int {
254    EVP_PKEY_CTX_ctrl(
255        ctx,
256        -1,
257        EVP_PKEY_OP_DERIVE,
258        EVP_PKEY_CTRL_HKDF_SALT,
259        saltlen,
260        salt as *mut c_void,
261    )
262}
263
264#[cfg(all(ossl110, not(ossl300)))]
265pub unsafe fn EVP_PKEY_CTX_set1_hkdf_key(
266    ctx: *mut EVP_PKEY_CTX,
267    key: *const u8,
268    keylen: c_int,
269) -> c_int {
270    EVP_PKEY_CTX_ctrl(
271        ctx,
272        -1,
273        EVP_PKEY_OP_DERIVE,
274        EVP_PKEY_CTRL_HKDF_KEY,
275        keylen,
276        key as *mut c_void,
277    )
278}
279
280#[cfg(all(ossl110, not(ossl300)))]
281pub unsafe fn EVP_PKEY_CTX_add1_hkdf_info(
282    ctx: *mut EVP_PKEY_CTX,
283    info: *const u8,
284    infolen: c_int,
285) -> c_int {
286    EVP_PKEY_CTX_ctrl(
287        ctx,
288        -1,
289        EVP_PKEY_OP_DERIVE,
290        EVP_PKEY_CTRL_HKDF_INFO,
291        infolen,
292        info as *mut c_void,
293    )
294}
295
296#[cfg(all(not(ossl300), not(boringssl)))]
297pub unsafe fn EVP_PKEY_CTX_set_signature_md(cxt: *mut EVP_PKEY_CTX, md: *mut EVP_MD) -> c_int {
298    EVP_PKEY_CTX_ctrl(
299        cxt,
300        -1,
301        EVP_PKEY_OP_TYPE_SIG,
302        EVP_PKEY_CTRL_MD,
303        0,
304        md as *mut c_void,
305    )
306}
307
308pub unsafe fn EVP_PKEY_assign_RSA(pkey: *mut EVP_PKEY, rsa: *mut RSA) -> c_int {
309    EVP_PKEY_assign(pkey, EVP_PKEY_RSA, rsa as *mut c_void)
310}
311
312pub unsafe fn EVP_PKEY_assign_DSA(pkey: *mut EVP_PKEY, dsa: *mut DSA) -> c_int {
313    EVP_PKEY_assign(pkey, EVP_PKEY_DSA, dsa as *mut c_void)
314}
315
316pub unsafe fn EVP_PKEY_assign_DH(pkey: *mut EVP_PKEY, dh: *mut DH) -> c_int {
317    EVP_PKEY_assign(pkey, EVP_PKEY_DH, dh as *mut c_void)
318}
319
320pub unsafe fn EVP_PKEY_assign_EC_KEY(pkey: *mut EVP_PKEY, ec_key: *mut EC_KEY) -> c_int {
321    EVP_PKEY_assign(pkey, EVP_PKEY_EC, ec_key as *mut c_void)
322}
323