Skip to main content

gmssl_sys/
evp.rs

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