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