Botan 3.12.0
Crypto and TLS for C&
ffi_pkey.cpp
Go to the documentation of this file.
1/*
2* (C) 2015,2017 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/ffi.h>
8
9#include <botan/assert.h>
10#include <botan/data_src.h>
11#include <botan/hash.h>
12#include <botan/pk_algs.h>
13#include <botan/pk_keys.h>
14#include <botan/pkcs8.h>
15#include <botan/x509_key.h>
16#include <botan/internal/ffi_ec.h>
17#include <botan/internal/ffi_oid.h>
18#include <botan/internal/ffi_pkey.h>
19#include <botan/internal/ffi_rng.h>
20#include <botan/internal/ffi_util.h>
21
22#if defined(BOTAN_HAS_HASH_ID)
23 #include <botan/internal/hash_id.h>
24#endif
25
26extern "C" {
27
28using namespace Botan_FFI;
29
31 const char* algo_name,
32 const char* algo_params,
33 botan_rng_t rng_obj) {
34 // TODO(Botan4) remove this implicit algorithm choice and reject nullptr algo_name
35 if(algo_name == nullptr) {
36 return botan_privkey_create(key_obj, "RSA", algo_params, rng_obj);
37 }
38
39 return ffi_guard_thunk(__func__, [=]() -> int {
40 if(key_obj == nullptr) {
42 }
43
44 *key_obj = nullptr;
45 if(rng_obj == nullptr) {
47 }
48
49 const std::string params(algo_params != nullptr ? algo_params : "");
50
52
53 if(auto key = Botan::create_private_key(algo_name, rng, params)) {
54 return ffi_new_object(key_obj, std::move(key));
55 } else {
57 }
58 });
59}
60
62 const char* algo_name,
63 botan_ec_group_t ec_group_obj,
64 botan_rng_t rng_obj) {
65 // TODO(Botan4) remove this implicit algorithm choice and reject nullptr algo_name
66 if(algo_name == nullptr) {
67 return botan_ec_privkey_create(key_obj, "ECDSA", ec_group_obj, rng_obj);
68 }
69
70 return ffi_guard_thunk(__func__, [=]() -> int {
71 if(key_obj == nullptr) {
73 }
74 *key_obj = nullptr;
75
76 const Botan::EC_Group ec_group = safe_get(ec_group_obj);
78
79 if(auto key = Botan::create_ec_private_key(algo_name, ec_group, rng)) {
80 return ffi_new_object(key_obj, std::move(key));
81 } else {
83 }
84 });
85}
86
88 botan_privkey_t* key, botan_rng_t rng_obj, const uint8_t bits[], size_t len, const char* password) {
89 BOTAN_UNUSED(rng_obj);
90
91 if(key == nullptr) {
93 }
94
95 *key = nullptr;
96
97 if(bits == nullptr && len > 0) {
99 }
100
101 return ffi_guard_thunk(__func__, [=]() -> int {
102 Botan::DataSource_Memory src(bits, len);
103
104 std::unique_ptr<Botan::Private_Key> pkcs8;
105
106 if(password == nullptr) {
107 pkcs8 = Botan::PKCS8::load_key(src);
108 } else {
109 pkcs8 = Botan::PKCS8::load_key(src, std::string(password));
110 }
111
112 if(pkcs8) {
113 ffi_new_object(key, std::move(pkcs8));
114 return BOTAN_FFI_SUCCESS;
115 }
117 });
118}
119
123
124int botan_pubkey_load(botan_pubkey_t* key, const uint8_t bits[], size_t bits_len) {
125 if(key == nullptr) {
127 }
128
129 *key = nullptr;
130
131 if(bits == nullptr && bits_len > 0) {
133 }
134
135 return ffi_guard_thunk(__func__, [=]() -> int {
136 Botan::DataSource_Memory src(bits, bits_len);
137 std::unique_ptr<Botan::Public_Key> pubkey(Botan::X509::load_key(src));
138
139 if(pubkey == nullptr) {
141 }
142
143 ffi_new_object(key, std::move(pubkey));
144 return BOTAN_FFI_SUCCESS;
145 });
146}
147
151
153 if(pubout == nullptr) {
155 }
156 return ffi_guard_thunk(__func__, [=]() -> int {
157 auto public_key = safe_get(key_obj).public_key();
158 return ffi_new_object(pubout, std::move(public_key));
159 });
160}
161
162int botan_privkey_algo_name(botan_privkey_t key, char out[], size_t* out_len) {
163 return BOTAN_FFI_VISIT(key, [=](const auto& k) { return write_str_output(out, out_len, k.algo_name()); });
164}
165
166int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t* out_len) {
167 return BOTAN_FFI_VISIT(key, [=](const auto& k) { return write_str_output(out, out_len, k.algo_name()); });
168}
169
170int botan_pubkey_check_key(botan_pubkey_t key, botan_rng_t rng, uint32_t flags) {
171 const bool strong = (flags & BOTAN_CHECK_KEY_EXPENSIVE_TESTS) != 0;
172
173 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
174 return (k.check_key(safe_get(rng), strong) == true) ? 0 : BOTAN_FFI_ERROR_INVALID_INPUT;
175 });
176}
177
179 const bool strong = (flags & BOTAN_CHECK_KEY_EXPENSIVE_TESTS) != 0;
180 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
181 return (k.check_key(safe_get(rng), strong) == true) ? 0 : BOTAN_FFI_ERROR_INVALID_INPUT;
182 });
183}
184
185int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t* out_len, uint32_t flags) {
186 if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) {
187 return copy_view_bin(out, out_len, botan_pubkey_view_der, key);
188 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) {
189 return copy_view_str(out, out_len, botan_pubkey_view_pem, key);
190 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_RAW) {
191 return copy_view_bin(out, out_len, botan_pubkey_view_raw, key);
192 } else {
194 }
195}
196
198 return BOTAN_FFI_VISIT(
199 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.subject_public_key()); });
200}
201
203 return BOTAN_FFI_VISIT(
204 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, Botan::X509::PEM_encode(k)); });
205}
206
208 return BOTAN_FFI_VISIT(
209 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.raw_public_key_bits()); });
210}
211
212int botan_privkey_export(botan_privkey_t key, uint8_t out[], size_t* out_len, uint32_t flags) {
213 if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) {
214 return copy_view_bin(out, out_len, botan_privkey_view_der, key);
215 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) {
216 return copy_view_str(out, out_len, botan_privkey_view_pem, key);
217 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_RAW) {
218 return copy_view_bin(out, out_len, botan_privkey_view_raw, key);
219 } else {
221 }
222}
223
225 return BOTAN_FFI_VISIT(key,
226 [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.private_key_info()); });
227}
228
230 return BOTAN_FFI_VISIT(
231 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, Botan::PKCS8::PEM_encode(k)); });
232}
233
235 return BOTAN_FFI_VISIT(
236 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.raw_private_key_bits()); });
237}
238
240 uint8_t out[],
241 size_t* out_len,
242 botan_rng_t rng_obj,
243 const char* pass,
244 const char* /*ignored - pbe*/,
245 uint32_t flags) {
246 return botan_privkey_export_encrypted_pbkdf_iter(key, out, out_len, rng_obj, pass, 100000, nullptr, nullptr, flags);
247}
248
250 uint8_t out[],
251 size_t* out_len,
252 botan_rng_t rng,
253 const char* passphrase,
254 uint32_t pbkdf_msec,
255 size_t* pbkdf_iters_out,
256 const char* cipher,
257 const char* pbkdf_hash,
258 uint32_t flags) {
259 if(pbkdf_iters_out != nullptr) {
260 *pbkdf_iters_out = 0;
261 }
262
263 if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) {
264 return copy_view_bin(
265 out, out_len, botan_privkey_view_encrypted_der_timed, key, rng, passphrase, cipher, pbkdf_hash, pbkdf_msec);
266 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) {
267 return copy_view_str(
268 out, out_len, botan_privkey_view_encrypted_pem_timed, key, rng, passphrase, cipher, pbkdf_hash, pbkdf_msec);
269 } else {
271 }
272}
273
275 botan_rng_t rng_obj,
276 const char* passphrase,
277 const char* maybe_cipher,
278 const char* maybe_pbkdf_algo,
279 size_t pbkdf_runtime_msec,
280 botan_view_ctx ctx,
281 botan_view_bin_fn view) {
282 if(passphrase == nullptr) {
284 }
285
286 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
287 const std::chrono::milliseconds pbkdf_time(pbkdf_runtime_msec);
289
290 const std::string cipher = (maybe_cipher ? maybe_cipher : "");
291 const std::string pbkdf_algo = (maybe_pbkdf_algo ? maybe_pbkdf_algo : "");
292
293 auto pkcs8 =
294 Botan::PKCS8::BER_encode_encrypted_pbkdf_msec(k, rng, passphrase, pbkdf_time, nullptr, cipher, pbkdf_algo);
295
296 return invoke_view_callback(view, ctx, pkcs8);
297 });
298}
299
301 botan_rng_t rng_obj,
302 const char* passphrase,
303 const char* maybe_cipher,
304 const char* maybe_pbkdf_algo,
305 size_t pbkdf_runtime_msec,
306 botan_view_ctx ctx,
307 botan_view_str_fn view) {
308 if(passphrase == nullptr) {
310 }
311
312 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
313 const std::chrono::milliseconds pbkdf_time(pbkdf_runtime_msec);
315
316 const std::string cipher = (maybe_cipher ? maybe_cipher : "");
317 const std::string pbkdf_algo = (maybe_pbkdf_algo ? maybe_pbkdf_algo : "");
318
319 auto pkcs8 =
320 Botan::PKCS8::PEM_encode_encrypted_pbkdf_msec(k, rng, passphrase, pbkdf_time, nullptr, cipher, pbkdf_algo);
321
322 return invoke_view_callback(view, ctx, pkcs8);
323 });
324}
325
327 uint8_t out[],
328 size_t* out_len,
329 botan_rng_t rng,
330 const char* passphrase,
331 size_t pbkdf_iter,
332 const char* cipher,
333 const char* pbkdf_algo,
334 uint32_t flags) {
335 if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) {
336 return copy_view_bin(
337 out, out_len, botan_privkey_view_encrypted_der, key, rng, passphrase, cipher, pbkdf_algo, pbkdf_iter);
338 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) {
339 return copy_view_str(
340 out, out_len, botan_privkey_view_encrypted_pem, key, rng, passphrase, cipher, pbkdf_algo, pbkdf_iter);
341 } else {
343 }
344}
345
347 botan_rng_t rng_obj,
348 const char* passphrase,
349 const char* maybe_cipher,
350 const char* maybe_pbkdf_algo,
351 size_t maybe_pbkdf_iterations,
352 botan_view_ctx ctx,
353 botan_view_bin_fn view) {
354 if(passphrase == nullptr) {
356 }
357
358 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
360
361 const std::string cipher = (maybe_cipher ? maybe_cipher : "");
362 const std::string pbkdf_algo = (maybe_pbkdf_algo ? maybe_pbkdf_algo : "");
363 const size_t pbkdf_iter = (maybe_pbkdf_iterations ? maybe_pbkdf_iterations : 100000);
364
365 auto pkcs8 = Botan::PKCS8::BER_encode_encrypted_pbkdf_iter(k, rng, passphrase, pbkdf_iter, cipher, pbkdf_algo);
366
367 return invoke_view_callback(view, ctx, pkcs8);
368 });
369}
370
372 botan_rng_t rng_obj,
373 const char* passphrase,
374 const char* maybe_cipher,
375 const char* maybe_pbkdf_algo,
376 size_t maybe_pbkdf_iterations,
377 botan_view_ctx ctx,
378 botan_view_str_fn view) {
379 if(passphrase == nullptr) {
381 }
382
383 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
385
386 const std::string cipher = (maybe_cipher ? maybe_cipher : "");
387 const std::string pbkdf_algo = (maybe_pbkdf_algo ? maybe_pbkdf_algo : "");
388 const size_t pbkdf_iter = (maybe_pbkdf_iterations ? maybe_pbkdf_iterations : 100000);
389
390 auto pkcs8 = Botan::PKCS8::PEM_encode_encrypted_pbkdf_iter(k, rng, passphrase, pbkdf_iter, cipher, pbkdf_algo);
391
392 return invoke_view_callback(view, ctx, pkcs8);
393 });
394}
395
397 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
398 if(oid == nullptr) {
400 }
401
402 auto oid_ptr = std::make_unique<Botan::OID>(k.object_identifier());
403 ffi_new_object(oid, std::move(oid_ptr));
404
405 return BOTAN_FFI_SUCCESS;
406 });
407}
408
410 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
411 if(oid == nullptr) {
413 }
414
415 auto oid_ptr = std::make_unique<Botan::OID>(k.object_identifier());
416 ffi_new_object(oid, std::move(oid_ptr));
417
418 return BOTAN_FFI_SUCCESS;
419 });
420}
421
423 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
424 if(out == nullptr) {
426 }
427
428 if(k.stateful_operation()) {
429 *out = 1;
430 } else {
431 *out = 0;
432 }
433 return BOTAN_FFI_SUCCESS;
434 });
435}
436
438 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
439 if(out == nullptr) {
441 }
442
443 if(auto remaining = k.remaining_operations()) {
444 *out = remaining.value();
445 return BOTAN_FFI_SUCCESS;
446 } else {
448 }
449 });
450}
451
453 if(estimate == nullptr) {
455 }
456 return BOTAN_FFI_VISIT(key, [=](const auto& k) { *estimate = k.estimated_strength(); });
457}
458
459int botan_pubkey_fingerprint(botan_pubkey_t key, const char* hash_fn, uint8_t out[], size_t* out_len) {
460 if(hash_fn == nullptr) {
462 }
463 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
464 auto h = Botan::HashFunction::create_or_throw(hash_fn);
465 return write_vec_output(out, out_len, h->process(k.public_key_bits()));
466 });
467}
468
469int botan_pkcs_hash_id(const char* hash_name, uint8_t pkcs_id[], size_t* pkcs_id_len) {
470 if(hash_name == nullptr) {
472 }
473#if defined(BOTAN_HAS_HASH_ID)
474 return ffi_guard_thunk(__func__, [=]() -> int {
475 const std::vector<uint8_t> hash_id = Botan::pkcs_hash_id(hash_name);
476 return write_output(pkcs_id, pkcs_id_len, hash_id.data(), hash_id.size());
477 });
478#else
479 BOTAN_UNUSED(hash_name, pkcs_id, pkcs_id_len);
481#endif
482}
483}
#define BOTAN_UNUSED
Definition assert.h:144
static std::unique_ptr< HashFunction > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:308
struct botan_pubkey_struct * botan_pubkey_t
Definition ffi.h:1797
int botan_privkey_view_encrypted_pem_timed(botan_privkey_t key, botan_rng_t rng, const char *passphrase, const char *cipher_algo, const char *pbkdf_algo, size_t pbkdf_runtime_msec, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:300
struct botan_asn1_oid_struct * botan_asn1_oid_t
Definition ffi.h:1253
struct botan_privkey_struct * botan_privkey_t
Definition ffi.h:1564
int botan_privkey_view_encrypted_der(botan_privkey_t key, botan_rng_t rng, const char *passphrase, const char *cipher_algo, const char *pbkdf_algo, size_t pbkdf_iterations, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:346
#define BOTAN_PRIVKEY_EXPORT_FLAG_RAW
Definition ffi.h:1659
int botan_pubkey_view_pem(botan_pubkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:202
int botan_privkey_view_der(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:224
int botan_privkey_view_raw(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:234
int botan_privkey_view_encrypted_der_timed(botan_privkey_t key, botan_rng_t rng, const char *passphrase, const char *cipher_algo, const char *pbkdf_algo, size_t pbkdf_runtime_msec, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:274
int botan_pubkey_view_der(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:197
struct botan_ec_group_struct * botan_ec_group_t
Definition ffi.h:1302
int botan_privkey_view_encrypted_pem(botan_privkey_t key, botan_rng_t rng, const char *passphrase, const char *cipher_algo, const char *pbkdf_algo, size_t pbkdf_iterations, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:371
int(* botan_view_bin_fn)(botan_view_ctx view_ctx, const uint8_t *data, size_t len)
Definition ffi.h:163
#define BOTAN_PRIVKEY_EXPORT_FLAG_PEM
Definition ffi.h:1658
int botan_pubkey_view_raw(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:207
#define BOTAN_CHECK_KEY_EXPENSIVE_TESTS
Definition ffi.h:1587
void * botan_view_ctx
Definition ffi.h:154
struct botan_rng_struct * botan_rng_t
Definition ffi.h:291
#define BOTAN_PRIVKEY_EXPORT_FLAG_DER
Definition ffi.h:1657
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:140
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
Definition ffi.h:148
@ BOTAN_FFI_ERROR_BAD_FLAG
Definition ffi.h:132
@ BOTAN_FFI_ERROR_INVALID_INPUT
Definition ffi.h:120
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition ffi.h:133
@ BOTAN_FFI_SUCCESS
Definition ffi.h:116
@ BOTAN_FFI_ERROR_NO_VALUE
Definition ffi.h:122
int(* botan_view_str_fn)(botan_view_ctx view_ctx, const char *str, size_t len)
Definition ffi.h:172
int botan_privkey_view_pem(botan_privkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:229
int botan_privkey_export_encrypted(botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng_obj, const char *pass, const char *, uint32_t flags)
Definition ffi_pkey.cpp:239
int botan_privkey_check_key(botan_privkey_t key, botan_rng_t rng, uint32_t flags)
Definition ffi_pkey.cpp:178
int botan_pubkey_fingerprint(botan_pubkey_t key, const char *hash_fn, uint8_t out[], size_t *out_len)
Definition ffi_pkey.cpp:459
int botan_privkey_load(botan_privkey_t *key, botan_rng_t rng_obj, const uint8_t bits[], size_t len, const char *password)
Definition ffi_pkey.cpp:87
int botan_pubkey_estimated_strength(botan_pubkey_t key, size_t *estimate)
Definition ffi_pkey.cpp:452
int botan_pkcs_hash_id(const char *hash_name, uint8_t pkcs_id[], size_t *pkcs_id_len)
Definition ffi_pkey.cpp:469
int botan_privkey_view_encrypted_der_timed(botan_privkey_t key, botan_rng_t rng_obj, const char *passphrase, const char *maybe_cipher, const char *maybe_pbkdf_algo, size_t pbkdf_runtime_msec, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:274
int botan_pubkey_load(botan_pubkey_t *key, const uint8_t bits[], size_t bits_len)
Definition ffi_pkey.cpp:124
int botan_privkey_export(botan_privkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
Definition ffi_pkey.cpp:212
int botan_privkey_view_encrypted_pem_timed(botan_privkey_t key, botan_rng_t rng_obj, const char *passphrase, const char *maybe_cipher, const char *maybe_pbkdf_algo, size_t pbkdf_runtime_msec, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:300
int botan_privkey_export_encrypted_pbkdf_msec(botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng, const char *passphrase, uint32_t pbkdf_msec, size_t *pbkdf_iters_out, const char *cipher, const char *pbkdf_hash, uint32_t flags)
Definition ffi_pkey.cpp:249
int botan_pubkey_oid(botan_asn1_oid_t *oid, botan_pubkey_t key)
Definition ffi_pkey.cpp:396
int botan_privkey_view_encrypted_der(botan_privkey_t key, botan_rng_t rng_obj, const char *passphrase, const char *maybe_cipher, const char *maybe_pbkdf_algo, size_t maybe_pbkdf_iterations, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:346
int botan_privkey_destroy(botan_privkey_t key)
Definition ffi_pkey.cpp:120
int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t *out_len)
Definition ffi_pkey.cpp:166
int botan_pubkey_view_pem(botan_pubkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:202
int botan_privkey_view_der(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:224
int botan_privkey_stateful_operation(botan_privkey_t key, int *out)
Definition ffi_pkey.cpp:422
int botan_privkey_view_raw(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:234
int botan_ec_privkey_create(botan_privkey_t *key_obj, const char *algo_name, botan_ec_group_t ec_group_obj, botan_rng_t rng_obj)
Definition ffi_pkey.cpp:61
int botan_pubkey_view_der(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:197
int botan_privkey_remaining_operations(botan_privkey_t key, uint64_t *out)
Definition ffi_pkey.cpp:437
int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
Definition ffi_pkey.cpp:185
int botan_privkey_oid(botan_asn1_oid_t *oid, botan_privkey_t key)
Definition ffi_pkey.cpp:409
int botan_pubkey_destroy(botan_pubkey_t key)
Definition ffi_pkey.cpp:148
int botan_privkey_algo_name(botan_privkey_t key, char out[], size_t *out_len)
Definition ffi_pkey.cpp:162
int botan_pubkey_view_raw(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:207
int botan_privkey_create(botan_privkey_t *key_obj, const char *algo_name, const char *algo_params, botan_rng_t rng_obj)
Definition ffi_pkey.cpp:30
int botan_privkey_export_pubkey(botan_pubkey_t *pubout, botan_privkey_t key_obj)
Definition ffi_pkey.cpp:152
int botan_pubkey_check_key(botan_pubkey_t key, botan_rng_t rng, uint32_t flags)
Definition ffi_pkey.cpp:170
int botan_privkey_export_encrypted_pbkdf_iter(botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng, const char *passphrase, size_t pbkdf_iter, const char *cipher, const char *pbkdf_algo, uint32_t flags)
Definition ffi_pkey.cpp:326
int botan_privkey_view_pem(botan_privkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:229
int botan_privkey_view_encrypted_pem(botan_privkey_t key, botan_rng_t rng_obj, const char *passphrase, const char *maybe_cipher, const char *maybe_pbkdf_algo, size_t maybe_pbkdf_iterations, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:371
#define BOTAN_FFI_VISIT(obj, lambda)
Definition ffi_util.h:158
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition ffi_util.h:188
std::string PEM_encode_encrypted_pbkdf_iter(const Private_Key &key, RandomNumberGenerator &rng, std::string_view pass, size_t pbkdf_iterations, std::string_view cipher, std::string_view pbkdf_hash)
Definition pkcs8.cpp:236
std::string PEM_encode(const Private_Key &key)
Definition pkcs8.cpp:121
std::string PEM_encode_encrypted_pbkdf_msec(const Private_Key &key, RandomNumberGenerator &rng, std::string_view pass, std::chrono::milliseconds pbkdf_msec, size_t *pbkdf_iterations, std::string_view cipher, std::string_view pbkdf_hash)
Definition pkcs8.cpp:283
std::vector< uint8_t > BER_encode_encrypted_pbkdf_iter(const Private_Key &key, RandomNumberGenerator &rng, std::string_view pass, size_t pbkdf_iterations, std::string_view cipher, std::string_view pbkdf_hash)
Definition pkcs8.cpp:206
std::vector< uint8_t > BER_encode_encrypted_pbkdf_msec(const Private_Key &key, RandomNumberGenerator &rng, std::string_view pass, std::chrono::milliseconds pbkdf_msec, size_t *pbkdf_iterations, std::string_view cipher, std::string_view pbkdf_hash)
Definition pkcs8.cpp:249
std::unique_ptr< Private_Key > load_key(DataSource &source, const std::function< std::string()> &get_pass)
Definition pkcs8.cpp:319
std::unique_ptr< Public_Key > load_key(DataSource &source)
Definition x509_key.cpp:28
std::string PEM_encode(const Public_Key &key)
Definition x509_key.cpp:21
int invoke_view_callback(botan_view_bin_fn view, botan_view_ctx ctx, std::span< const uint8_t > buf)
Definition ffi_util.h:190
int copy_view_bin(uint8_t out[], size_t *out_len, Fn fn, Args... args)
Definition ffi_util.h:214
T & safe_get(botan_struct< T, M > *p)
Definition ffi_util.h:79
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
Definition ffi_util.h:178
int copy_view_str(uint8_t out[], size_t *out_len, Fn fn, Args... args)
Definition ffi_util.h:220
int write_output(T out[], size_t *out_len, const T buf[], size_t buf_len)
Definition ffi_util.h:249
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95
int write_vec_output(uint8_t out[], size_t *out_len, std::span< const uint8_t > buf)
Definition ffi_util.h:264
int write_str_output(char out[], size_t *out_len, const std::string &str)
Definition ffi_util.h:268
std::unique_ptr< Private_Key > create_private_key(std::string_view alg_name, RandomNumberGenerator &rng, std::string_view params, std::string_view provider)
Definition pk_algs.cpp:493
std::vector< uint8_t > pkcs_hash_id(std::string_view name)
Definition hash_id.cpp:78
std::unique_ptr< Private_Key > create_ec_private_key(std::string_view alg_name, const EC_Group &ec_group, RandomNumberGenerator &rng)
Definition pk_algs.cpp:448