Skip to main content

botan_sys/
pubkey.rs

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    // botan_privkey_create_mceliece intentionally omitted
328
329    #[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}