1use crate::ffi_types::*;
2
3use crate::mp::botan_mp_t;
4use crate::rng::botan_rng_t;
5
6#[cfg(botan_ffi_20250506)]
7use crate::{botan_asn1_oid_t, botan_ec_group_t};
8
9#[cfg(botan_ffi_20260506)]
10use crate::botan_ec_scalar_t;
11
12pub enum botan_pubkey_struct {}
13pub type botan_pubkey_t = *mut botan_pubkey_struct;
14
15pub enum botan_privkey_struct {}
16pub type botan_privkey_t = *mut botan_privkey_struct;
17
18unsafe extern "C" {
19 pub fn botan_privkey_create(
20 key: *mut botan_privkey_t,
21 algo_name: *const c_char,
22 algo_params: *const c_char,
23 rng: botan_rng_t,
24 ) -> c_int;
25 pub fn botan_privkey_check_key(key: botan_privkey_t, rng: botan_rng_t, flags: u32) -> c_int;
26 pub fn botan_privkey_create_rsa(
27 key: *mut botan_privkey_t,
28 rng: botan_rng_t,
29 n_bits: usize,
30 ) -> c_int;
31 pub fn botan_privkey_create_ecdsa(
32 key: *mut botan_privkey_t,
33 rng: botan_rng_t,
34 params: *const c_char,
35 ) -> c_int;
36 pub fn botan_privkey_create_ecdh(
37 key: *mut botan_privkey_t,
38 rng: botan_rng_t,
39 params: *const c_char,
40 ) -> c_int;
41 pub fn botan_privkey_create_dh(
42 key: *mut botan_privkey_t,
43 rng: botan_rng_t,
44 param: *const c_char,
45 ) -> c_int;
46 pub fn botan_privkey_create_dsa(
47 key: *mut botan_privkey_t,
48 rng: botan_rng_t,
49 pbits: usize,
50 qbits: usize,
51 ) -> c_int;
52 pub fn botan_privkey_create_elgamal(
53 key: *mut botan_privkey_t,
54 rng: botan_rng_t,
55 pbits: usize,
56 qbits: usize,
57 ) -> c_int;
58 pub fn botan_privkey_load(
59 key: *mut botan_privkey_t,
60 rng: botan_rng_t,
61 bits: *const u8,
62 len: usize,
63 password: *const c_char,
64 ) -> c_int;
65 pub fn botan_privkey_destroy(key: botan_privkey_t) -> c_int;
66 pub fn botan_privkey_export(
67 key: botan_privkey_t,
68 out: *mut u8,
69 out_len: *mut usize,
70 flags: u32,
71 ) -> c_int;
72 pub fn botan_privkey_export_encrypted(
73 key: botan_privkey_t,
74 out: *mut u8,
75 out_len: *mut usize,
76 rng: botan_rng_t,
77 passphrase: *const c_char,
78 encryption_algo: *const c_char,
79 flags: u32,
80 ) -> c_int;
81 pub fn botan_privkey_export_encrypted_pbkdf_msec(
82 key: botan_privkey_t,
83 out: *mut u8,
84 out_len: *mut usize,
85 rng: botan_rng_t,
86 passphrase: *const c_char,
87 pbkdf_msec_runtime: u32,
88 pbkdf_iterations_out: *mut usize,
89 cipher_algo: *const c_char,
90 pbkdf_algo: *const c_char,
91 flags: u32,
92 ) -> c_int;
93 pub fn botan_privkey_export_encrypted_pbkdf_iter(
94 key: botan_privkey_t,
95 out: *mut u8,
96 out_len: *mut usize,
97 rng: botan_rng_t,
98 passphrase: *const c_char,
99 pbkdf_iterations: usize,
100 cipher_algo: *const c_char,
101 pbkdf_algo: *const c_char,
102 flags: u32,
103 ) -> c_int;
104
105 pub fn botan_pubkey_load(key: *mut botan_pubkey_t, bits: *const u8, len: usize) -> c_int;
106 pub fn botan_privkey_export_pubkey(out: *mut botan_pubkey_t, in_: botan_privkey_t) -> c_int;
107 pub fn botan_pubkey_export(
108 key: botan_pubkey_t,
109 out: *mut u8,
110 out_len: *mut usize,
111 flags: u32,
112 ) -> c_int;
113 pub fn botan_privkey_algo_name(
114 key: botan_privkey_t,
115 out: *mut c_char,
116 out_len: *mut usize,
117 ) -> c_int;
118 pub fn botan_pubkey_algo_name(
119 key: botan_pubkey_t,
120 out: *mut c_char,
121 out_len: *mut usize,
122 ) -> c_int;
123 pub fn botan_pubkey_check_key(key: botan_pubkey_t, rng: botan_rng_t, flags: u32) -> c_int;
124 pub fn botan_pubkey_estimated_strength(key: botan_pubkey_t, estimate: *mut usize) -> c_int;
125 pub fn botan_pubkey_fingerprint(
126 key: botan_pubkey_t,
127 hash: *const c_char,
128 out: *mut u8,
129 out_len: *mut usize,
130 ) -> c_int;
131 pub fn botan_pubkey_destroy(key: botan_pubkey_t) -> c_int;
132 pub fn botan_pubkey_get_field(
133 output: botan_mp_t,
134 key: botan_pubkey_t,
135 field_name: *const c_char,
136 ) -> c_int;
137 pub fn botan_privkey_get_field(
138 output: botan_mp_t,
139 key: botan_privkey_t,
140 field_name: *const c_char,
141 ) -> c_int;
142 pub fn botan_privkey_load_rsa(
143 key: *mut botan_privkey_t,
144 p: botan_mp_t,
145 q: botan_mp_t,
146 e: botan_mp_t,
147 ) -> c_int;
148 pub fn botan_privkey_load_rsa_pkcs1(
149 key: *mut botan_privkey_t,
150 bits: *const u8,
151 len: usize,
152 ) -> c_int;
153 pub fn botan_privkey_rsa_get_p(p: botan_mp_t, rsa_key: botan_privkey_t) -> c_int;
154 pub fn botan_privkey_rsa_get_q(q: botan_mp_t, rsa_key: botan_privkey_t) -> c_int;
155 pub fn botan_privkey_rsa_get_d(d: botan_mp_t, rsa_key: botan_privkey_t) -> c_int;
156 pub fn botan_privkey_rsa_get_n(n: botan_mp_t, rsa_key: botan_privkey_t) -> c_int;
157 pub fn botan_privkey_rsa_get_e(e: botan_mp_t, rsa_key: botan_privkey_t) -> c_int;
158 pub fn botan_pubkey_load_rsa(key: *mut botan_pubkey_t, n: botan_mp_t, e: botan_mp_t) -> c_int;
159 #[cfg(botan_ffi_20260303)]
160 pub fn botan_pubkey_load_rsa_pkcs1(
161 key: *mut botan_pubkey_t,
162 bits: *const u8,
163 len: usize,
164 ) -> c_int;
165 pub fn botan_privkey_rsa_get_privkey(
166 rsa_key: botan_privkey_t,
167 out: *mut u8,
168 out_len: *mut usize,
169 flags: u32,
170 ) -> c_int;
171
172 pub fn botan_pubkey_rsa_get_e(e: botan_mp_t, rsa_key: botan_pubkey_t) -> c_int;
173 pub fn botan_pubkey_rsa_get_n(n: botan_mp_t, rsa_key: botan_pubkey_t) -> c_int;
174 pub fn botan_privkey_load_dsa(
175 key: *mut botan_privkey_t,
176 p: botan_mp_t,
177 q: botan_mp_t,
178 g: botan_mp_t,
179 x: botan_mp_t,
180 ) -> c_int;
181 pub fn botan_pubkey_load_dsa(
182 key: *mut botan_pubkey_t,
183 p: botan_mp_t,
184 q: botan_mp_t,
185 g: botan_mp_t,
186 y: botan_mp_t,
187 ) -> c_int;
188 pub fn botan_privkey_dsa_get_x(n: botan_mp_t, key: botan_privkey_t) -> c_int;
189 pub fn botan_pubkey_dsa_get_p(p: botan_mp_t, key: botan_pubkey_t) -> c_int;
190 pub fn botan_pubkey_dsa_get_q(q: botan_mp_t, key: botan_pubkey_t) -> c_int;
191 pub fn botan_pubkey_dsa_get_g(d: botan_mp_t, key: botan_pubkey_t) -> c_int;
192 pub fn botan_pubkey_dsa_get_y(y: botan_mp_t, key: botan_pubkey_t) -> c_int;
193 pub fn botan_privkey_load_dh(
194 key: *mut botan_privkey_t,
195 p: botan_mp_t,
196 g: botan_mp_t,
197 x: botan_mp_t,
198 ) -> c_int;
199 pub fn botan_pubkey_load_dh(
200 key: *mut botan_pubkey_t,
201 p: botan_mp_t,
202 g: botan_mp_t,
203 y: botan_mp_t,
204 ) -> c_int;
205 pub fn botan_pubkey_load_elgamal(
206 key: *mut botan_pubkey_t,
207 p: botan_mp_t,
208 g: botan_mp_t,
209 y: botan_mp_t,
210 ) -> c_int;
211 pub fn botan_privkey_load_elgamal(
212 key: *mut botan_privkey_t,
213 p: botan_mp_t,
214 g: botan_mp_t,
215 x: botan_mp_t,
216 ) -> c_int;
217 pub fn botan_privkey_load_ed25519(key: *mut botan_privkey_t, privkey: *const u8) -> c_int;
218 pub fn botan_pubkey_load_ed25519(key: *mut botan_pubkey_t, pubkey: *const u8) -> c_int;
219 pub fn botan_privkey_ed25519_get_privkey(key: botan_privkey_t, output: *mut u8) -> c_int;
220 pub fn botan_pubkey_ed25519_get_pubkey(key: botan_pubkey_t, pubkey: *mut u8) -> c_int;
221
222 #[cfg(botan_ffi_20240408)]
223 pub fn botan_privkey_ed448_get_privkey(key: botan_privkey_t, output: *mut u8) -> c_int;
224
225 #[cfg(botan_ffi_20240408)]
226 pub fn botan_pubkey_ed448_get_pubkey(key: botan_pubkey_t, pubkey: *mut u8) -> c_int;
227
228 pub fn botan_privkey_load_x25519(key: *mut botan_privkey_t, privkey: *const u8) -> c_int;
229 pub fn botan_pubkey_load_x25519(key: *mut botan_pubkey_t, pubkey: *const u8) -> c_int;
230 pub fn botan_privkey_x25519_get_privkey(key: botan_privkey_t, output: *mut u8) -> c_int;
231 pub fn botan_pubkey_x25519_get_pubkey(key: botan_pubkey_t, pubkey: *mut u8) -> c_int;
232
233 #[cfg(botan_ffi_20240408)]
234 pub fn botan_privkey_load_x448(key: *mut botan_privkey_t, privkey: *const u8) -> c_int;
235
236 #[cfg(botan_ffi_20240408)]
237 pub fn botan_pubkey_load_x448(key: *mut botan_pubkey_t, pubkey: *const u8) -> c_int;
238
239 #[cfg(botan_ffi_20240408)]
240 pub fn botan_privkey_x448_get_privkey(key: botan_privkey_t, output: *mut u8) -> c_int;
241
242 #[cfg(botan_ffi_20240408)]
243 pub fn botan_pubkey_x448_get_pubkey(key: botan_pubkey_t, pubkey: *mut u8) -> c_int;
244
245 #[cfg(botan_ffi_20240408)]
246 pub fn botan_privkey_load_ed448(key: *mut botan_privkey_t, privkey: *const u8) -> c_int;
247
248 #[cfg(botan_ffi_20240408)]
249 pub fn botan_pubkey_load_ed448(key: *mut botan_pubkey_t, pubkey: *const u8) -> c_int;
250
251 pub fn botan_privkey_load_ecdsa(
252 key: *mut botan_privkey_t,
253 scalar: botan_mp_t,
254 curve_name: *const c_char,
255 ) -> c_int;
256 pub fn botan_pubkey_load_ecdsa(
257 key: *mut botan_pubkey_t,
258 public_x: botan_mp_t,
259 public_y: botan_mp_t,
260 curve_name: *const c_char,
261 ) -> c_int;
262 pub fn botan_pubkey_load_ecdh(
263 key: *mut botan_pubkey_t,
264 public_x: botan_mp_t,
265 public_y: botan_mp_t,
266 curve_name: *const c_char,
267 ) -> c_int;
268 pub fn botan_privkey_load_ecdh(
269 key: *mut botan_privkey_t,
270 scalar: botan_mp_t,
271 curve_name: *const c_char,
272 ) -> c_int;
273 pub fn botan_pubkey_load_sm2(
274 key: *mut botan_pubkey_t,
275 public_x: botan_mp_t,
276 public_y: botan_mp_t,
277 curve_name: *const c_char,
278 ) -> c_int;
279 pub fn botan_privkey_load_sm2(
280 key: *mut botan_privkey_t,
281 scalar: botan_mp_t,
282 curve_name: *const c_char,
283 ) -> c_int;
284 pub fn botan_pubkey_load_sm2_enc(
285 key: *mut botan_pubkey_t,
286 public_x: botan_mp_t,
287 public_y: botan_mp_t,
288 curve_name: *const c_char,
289 ) -> c_int;
290 pub fn botan_privkey_load_sm2_enc(
291 key: *mut botan_privkey_t,
292 scalar: botan_mp_t,
293 curve_name: *const c_char,
294 ) -> c_int;
295 pub fn botan_pubkey_sm2_compute_za(
296 out: *mut u8,
297 out_len: *mut usize,
298 ident: *const c_char,
299 hash_algo: *const c_char,
300 key: botan_pubkey_t,
301 ) -> c_int;
302
303 #[cfg(botan_ffi_20250506)]
304 pub fn botan_pubkey_load_ecdsa_sec1(
305 key: *mut botan_pubkey_t,
306 sec1: *const u8,
307 sec1_len: usize,
308 curve_name: *const c_char,
309 ) -> c_int;
310
311 #[cfg(botan_ffi_20250506)]
312 pub fn botan_pubkey_load_ecdh_sec1(
313 key: *mut botan_pubkey_t,
314 sec1: *const u8,
315 sec1_len: usize,
316 curve_name: *const c_char,
317 ) -> c_int;
318
319 #[cfg(botan_ffi_20250506)]
320 pub fn botan_pubkey_load_sm2_sec1(
321 key: *mut botan_pubkey_t,
322 sec1: *const u8,
323 sec1_len: usize,
324 curve_name: *const c_char,
325 ) -> c_int;
326
327 #[cfg(botan_ffi_20230403)]
330 pub fn botan_pubkey_ecc_key_used_explicit_encoding(key: botan_pubkey_t) -> c_int;
331
332 pub fn botan_privkey_load_kyber(
333 key: *mut botan_privkey_t,
334 privkey: *const u8,
335 key_len: usize,
336 ) -> c_int;
337
338 pub fn botan_pubkey_load_kyber(
339 key: *mut botan_pubkey_t,
340 pubkey: *const u8,
341 key_len: usize,
342 ) -> c_int;
343
344 #[cfg(botan_ffi_20230403)]
345 pub fn botan_pubkey_view_raw(
346 key: botan_pubkey_t,
347 view_ctx: botan_view_ctx,
348 view_fn: botan_view_bin_fn,
349 ) -> c_int;
350
351 #[cfg(botan_ffi_20230403)]
352 pub fn botan_pubkey_view_der(
353 key: botan_pubkey_t,
354 view_ctx: botan_view_ctx,
355 view_fn: botan_view_bin_fn,
356 ) -> c_int;
357
358 #[cfg(botan_ffi_20230403)]
359 pub fn botan_pubkey_view_pem(
360 key: botan_pubkey_t,
361 view_ctx: botan_view_ctx,
362 view_fn: botan_view_str_fn,
363 ) -> c_int;
364
365 #[cfg(botan_ffi_20230403)]
366 pub fn botan_privkey_view_raw(
367 key: botan_privkey_t,
368 view_ctx: botan_view_ctx,
369 view_fn: botan_view_bin_fn,
370 ) -> c_int;
371
372 #[cfg(botan_ffi_20230403)]
373 pub fn botan_privkey_view_der(
374 key: botan_privkey_t,
375 view_ctx: botan_view_ctx,
376 view_fn: botan_view_bin_fn,
377 ) -> c_int;
378
379 #[cfg(botan_ffi_20230403)]
380 pub fn botan_privkey_view_pem(
381 key: botan_privkey_t,
382 view_ctx: botan_view_ctx,
383 view_fn: botan_view_str_fn,
384 ) -> c_int;
385
386 #[cfg(botan_ffi_20230403)]
387 pub fn botan_pubkey_view_ec_public_point(
388 key: botan_pubkey_t,
389 view_ctx: botan_view_ctx,
390 view_fn: botan_view_bin_fn,
391 ) -> c_int;
392
393 #[cfg(botan_ffi_20230403)]
394 pub fn botan_privkey_view_encrypted_der(
395 key: botan_privkey_t,
396 rng: botan_rng_t,
397 passphrase: *const c_char,
398 cipher_algo: *const c_char,
399 pbkdf_algo: *const c_char,
400 pbkdf_iterations: usize,
401 view_ctx: botan_view_ctx,
402 view_fn: botan_view_bin_fn,
403 ) -> c_int;
404
405 #[cfg(botan_ffi_20230403)]
406 pub fn botan_privkey_view_encrypted_pem(
407 key: botan_privkey_t,
408 rng: botan_rng_t,
409 passphrase: *const c_char,
410 cipher_algo: *const c_char,
411 pbkdf_algo: *const c_char,
412 pbkdf_iterations: usize,
413 view_ctx: botan_view_ctx,
414 view_fn: botan_view_str_fn,
415 ) -> c_int;
416
417 #[cfg(botan_ffi_20230403)]
418 pub fn botan_privkey_view_encrypted_der_timed(
419 key: botan_privkey_t,
420 rng: botan_rng_t,
421 passphrase: *const c_char,
422 cipher_algo: *const c_char,
423 pbkdf_algo: *const c_char,
424 pbkdf_runtime_msec: usize,
425 view_ctx: botan_view_ctx,
426 view_fn: botan_view_bin_fn,
427 ) -> c_int;
428
429 #[cfg(botan_ffi_20230403)]
430 pub fn botan_privkey_view_encrypted_pem_timed(
431 key: botan_privkey_t,
432 rng: botan_rng_t,
433 passphrase: *const c_char,
434 cipher_algo: *const c_char,
435 pbkdf_algo: *const c_char,
436 pbkdf_runtime_msec: usize,
437 view_ctx: botan_view_ctx,
438 view_fn: botan_view_str_fn,
439 ) -> c_int;
440
441 #[cfg(botan_ffi_20250506)]
442 pub fn botan_ec_privkey_create(
443 key: *mut botan_privkey_t,
444 algo: *const c_char,
445 group: botan_ec_group_t,
446 rng: botan_rng_t,
447 ) -> c_int;
448
449 #[cfg(botan_ffi_20250506)]
450 pub fn botan_pubkey_oid(oid: *mut botan_asn1_oid_t, key: botan_pubkey_t) -> c_int;
451
452 #[cfg(botan_ffi_20250506)]
453 pub fn botan_privkey_oid(oid: *mut botan_asn1_oid_t, key: botan_privkey_t) -> c_int;
454
455 #[cfg(botan_ffi_20250506)]
456 pub fn botan_privkey_stateful_operation(key: botan_privkey_t, stateful: *mut c_int) -> c_int;
457
458 #[cfg(botan_ffi_20250506)]
459 pub fn botan_privkey_remaining_operations(
460 key: botan_privkey_t,
461 remaining_ops: *mut u64,
462 ) -> c_int;
463
464 #[cfg(botan_ffi_20250506)]
465 pub fn botan_pubkey_load_frodokem(
466 key: *mut botan_pubkey_t,
467 bytes: *const u8,
468 len: usize,
469 mode: *const c_char,
470 ) -> c_int;
471
472 #[cfg(botan_ffi_20250506)]
473 pub fn botan_privkey_load_frodokem(
474 key: *mut botan_privkey_t,
475 bytes: *const u8,
476 len: usize,
477 mode: *const c_char,
478 ) -> c_int;
479
480 #[cfg(botan_ffi_20250506)]
481 pub fn botan_pubkey_load_classic_mceliece(
482 key: *mut botan_pubkey_t,
483 bytes: *const u8,
484 len: usize,
485 mode: *const c_char,
486 ) -> c_int;
487
488 #[cfg(botan_ffi_20250506)]
489 pub fn botan_privkey_load_classic_mceliece(
490 key: *mut botan_privkey_t,
491 bytes: *const u8,
492 len: usize,
493 mode: *const c_char,
494 ) -> c_int;
495
496 #[cfg(botan_ffi_20250506)]
497 pub fn botan_pubkey_load_ml_kem(
498 key: *mut botan_pubkey_t,
499 bytes: *const u8,
500 len: usize,
501 mode: *const c_char,
502 ) -> c_int;
503
504 #[cfg(botan_ffi_20250506)]
505 pub fn botan_privkey_load_ml_kem(
506 key: *mut botan_privkey_t,
507 bytes: *const u8,
508 len: usize,
509 mode: *const c_char,
510 ) -> c_int;
511
512 #[cfg(botan_ffi_20250506)]
513 pub fn botan_pubkey_load_slh_dsa(
514 key: *mut botan_pubkey_t,
515 bytes: *const u8,
516 len: usize,
517 mode: *const c_char,
518 ) -> c_int;
519
520 #[cfg(botan_ffi_20250506)]
521 pub fn botan_privkey_load_slh_dsa(
522 key: *mut botan_privkey_t,
523 bytes: *const u8,
524 len: usize,
525 mode: *const c_char,
526 ) -> c_int;
527
528 #[cfg(botan_ffi_20250506)]
529 pub fn botan_pubkey_load_ml_dsa(
530 key: *mut botan_pubkey_t,
531 bytes: *const u8,
532 len: usize,
533 mode: *const c_char,
534 ) -> c_int;
535
536 #[cfg(botan_ffi_20250506)]
537 pub fn botan_privkey_load_ml_dsa(
538 key: *mut botan_privkey_t,
539 bytes: *const u8,
540 len: usize,
541 mode: *const c_char,
542 ) -> c_int;
543
544 #[cfg(botan_ffi_20260506)]
545 pub fn botan_ec_privkey_get_private_key(
546 key: botan_privkey_t,
547 value: *mut botan_ec_scalar_t,
548 ) -> c_int;
549
550 #[cfg(botan_ffi_20260506)]
551 pub fn botan_ec_privkey_get_group(
552 key: botan_privkey_t,
553 ec_group: *mut botan_ec_group_t,
554 ) -> c_int;
555
556 #[cfg(botan_ffi_20260506)]
557 pub fn botan_ec_pubkey_get_group(key: botan_pubkey_t, ec_group: *mut botan_ec_group_t)
558 -> c_int;
559}