8#include <botan/internal/ffi_util.h>
9#include <botan/internal/ffi_pkey.h>
10#include <botan/internal/ffi_rng.h>
11#include <botan/data_src.h>
12#include <botan/hash.h>
13#include <botan/pkcs8.h>
14#include <botan/pk_keys.h>
15#include <botan/x509_key.h>
16#include <botan/pk_algs.h>
18#if defined(BOTAN_HAS_HASH_ID)
19 #include <botan/hash_id.h>
27 const char* algo_name,
28 const char* algo_params,
32 if(key_obj ==
nullptr)
36 if(rng_obj ==
nullptr)
40 std::unique_ptr<Botan::Private_Key> key(
43 algo_params ? algo_params :
""));
47 *key_obj =
new botan_privkey_struct(key.release());
58 const uint8_t bits[],
size_t len,
68 std::unique_ptr<Botan::Private_Key> pkcs8;
70 if(password ==
nullptr)
81 *key =
new botan_privkey_struct(pkcs8.release());
94 const uint8_t bits[],
size_t bits_len)
102 if(pubkey ==
nullptr)
105 *key =
new botan_pubkey_struct(pubkey.release());
118 std::unique_ptr<Botan::Public_Key>
121 *pubout =
new botan_pubkey_struct(pubkey.release());
178 uint8_t out[],
size_t* out_len,
188 uint8_t out[],
size_t* out_len,
192 size_t* pbkdf_iters_out,
193 const char* maybe_cipher,
194 const char* maybe_pbkdf_hash,
198 const std::chrono::milliseconds pbkdf_time(pbkdf_msec);
201 const std::string cipher = (maybe_cipher ? maybe_cipher :
"");
202 const std::string pbkdf_hash = (maybe_pbkdf_hash ? maybe_pbkdf_hash :
"");
222 uint8_t out[],
size_t* out_len,
226 const char* maybe_cipher,
227 const char* maybe_pbkdf_hash,
233 const std::string cipher = (maybe_cipher ? maybe_cipher :
"");
234 const std::string pbkdf_hash = (maybe_pbkdf_hash ? maybe_pbkdf_hash :
"");
259 uint8_t out[],
size_t* out_len)
269#if defined(BOTAN_HAS_HASH_ID)
272 return write_output(pkcs_id, pkcs_id_len, hash_id.data(), hash_id.size());
#define BOTAN_UNUSED(...)
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")
virtual size_t estimated_strength() const =0
struct botan_pubkey_struct * botan_pubkey_t
struct botan_privkey_struct * botan_privkey_t
#define BOTAN_PRIVKEY_EXPORT_FLAG_PEM
#define BOTAN_CHECK_KEY_EXPENSIVE_TESTS
struct botan_rng_struct * botan_rng_t
#define BOTAN_PRIVKEY_EXPORT_FLAG_DER
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
@ BOTAN_FFI_ERROR_BAD_FLAG
@ BOTAN_FFI_ERROR_INVALID_INPUT
@ BOTAN_FFI_ERROR_NULL_POINTER
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)
int botan_privkey_check_key(botan_privkey_t key, botan_rng_t rng, uint32_t flags)
int botan_pubkey_fingerprint(botan_pubkey_t key, const char *hash_fn, uint8_t out[], size_t *out_len)
int botan_privkey_export_encrypted_pbkdf_iter(botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng_obj, const char *pass, size_t pbkdf_iter, const char *maybe_cipher, const char *maybe_pbkdf_hash, uint32_t flags)
int botan_privkey_load(botan_privkey_t *key, botan_rng_t rng_obj, const uint8_t bits[], size_t len, const char *password)
int botan_pubkey_estimated_strength(botan_pubkey_t key, size_t *estimate)
int botan_pkcs_hash_id(const char *hash_name, uint8_t pkcs_id[], size_t *pkcs_id_len)
int botan_privkey_export_encrypted_pbkdf_msec(botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng_obj, const char *pass, uint32_t pbkdf_msec, size_t *pbkdf_iters_out, const char *maybe_cipher, const char *maybe_pbkdf_hash, uint32_t flags)
int botan_pubkey_load(botan_pubkey_t *key, const uint8_t bits[], size_t bits_len)
int botan_privkey_export(botan_privkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
int botan_privkey_destroy(botan_privkey_t key)
int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t *out_len)
int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
int botan_pubkey_destroy(botan_pubkey_t key)
int botan_privkey_algo_name(botan_privkey_t key, char out[], size_t *out_len)
int botan_privkey_create(botan_privkey_t *key_obj, const char *algo_name, const char *algo_params, botan_rng_t rng_obj)
int botan_privkey_export_pubkey(botan_pubkey_t *pubout, botan_privkey_t key_obj)
int botan_pubkey_check_key(botan_pubkey_t key, botan_rng_t rng, uint32_t flags)
#define BOTAN_FFI_DO(T, obj, param, block)
#define BOTAN_FFI_CHECKED_DELETE(o)
#define BOTAN_FFI_RETURNING(T, obj, param, block)
std::vector< uint8_t > BER_encode_encrypted_pbkdf_iter(const Private_Key &key, RandomNumberGenerator &rng, const std::string &pass, size_t pbkdf_iterations, const std::string &cipher, const std::string &pbkdf_hash)
std::string PEM_encode(const Private_Key &key)
std::string PEM_encode_encrypted_pbkdf_msec(const Private_Key &key, RandomNumberGenerator &rng, const std::string &pass, std::chrono::milliseconds pbkdf_msec, size_t *pbkdf_iterations, const std::string &cipher, const std::string &pbkdf_hash)
std::unique_ptr< Private_Key > load_key(DataSource &source, std::function< std::string()> get_pass)
secure_vector< uint8_t > BER_encode(const Private_Key &key)
std::vector< uint8_t > BER_encode_encrypted_pbkdf_msec(const Private_Key &key, RandomNumberGenerator &rng, const std::string &pass, std::chrono::milliseconds pbkdf_msec, size_t *pbkdf_iterations, const std::string &cipher, const std::string &pbkdf_hash)
std::string PEM_encode_encrypted_pbkdf_iter(const Private_Key &key, RandomNumberGenerator &rng, const std::string &pass, size_t pbkdf_iterations, const std::string &cipher, const std::string &pbkdf_hash)
std::vector< uint8_t > BER_encode(const Public_Key &key)
Public_Key * load_key(DataSource &source)
std::string PEM_encode(const Public_Key &key)
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
T & safe_get(botan_struct< T, M > *p)
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
int write_output(uint8_t out[], size_t *out_len, const uint8_t buf[], size_t buf_len)
std::unique_ptr< Private_Key > create_private_key(const std::string &alg_name, RandomNumberGenerator &rng, const std::string ¶ms, const std::string &provider)
std::vector< uint8_t > pkcs_hash_id(const std::string &name)