Botan 3.12.0
Crypto and TLS for C&
ffi.h File Reference

Public Header. More...

#include <stddef.h>
#include <stdint.h>

Go to the source code of this file.

Macros

#define BOTAN_CHECK_KEY_EXPENSIVE_TESTS   1
#define BOTAN_CIPHER_INIT_FLAG_DECRYPT   1
#define BOTAN_CIPHER_INIT_FLAG_ENCRYPT   0
#define BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION   1
#define BOTAN_CIPHER_UPDATE_FLAG_FINAL   (1U << 0)
#define BOTAN_FFI_API_VERSION   20260506
#define BOTAN_FFI_DEPRECATED(msg)
#define BOTAN_FFI_EXPORT(maj, min)
#define BOTAN_FFI_HEX_LOWER_CASE   1
#define BOTAN_FPE_FLAG_FE1_COMPAT_MODE   1
#define BOTAN_PRIVKEY_EXPORT_FLAG_DER   0
#define BOTAN_PRIVKEY_EXPORT_FLAG_PEM   1
#define BOTAN_PRIVKEY_EXPORT_FLAG_RAW   2
#define BOTAN_PUBKEY_DER_FORMAT_SIGNATURE   1

Typedefs

typedef struct botan_asn1_oid_struct * botan_asn1_oid_t
typedef struct botan_block_cipher_struct * botan_block_cipher_t
typedef struct botan_cipher_struct * botan_cipher_t
typedef struct botan_ec_group_struct * botan_ec_group_t
typedef struct botan_ec_point_struct * botan_ec_point_t
typedef struct botan_ec_scalar_struct * botan_ec_scalar_t
typedef struct botan_fpe_struct * botan_fpe_t
typedef struct botan_hash_struct * botan_hash_t
typedef struct botan_hotp_struct * botan_hotp_t
typedef struct botan_mac_struct * botan_mac_t
typedef struct botan_mp_struct * botan_mp_t
typedef struct botan_pk_op_decrypt_struct * botan_pk_op_decrypt_t
typedef struct botan_pk_op_encrypt_struct * botan_pk_op_encrypt_t
typedef struct botan_pk_op_ka_struct * botan_pk_op_ka_t
typedef struct botan_pk_op_kem_decrypt_struct * botan_pk_op_kem_decrypt_t
typedef struct botan_pk_op_kem_encrypt_struct * botan_pk_op_kem_encrypt_t
typedef struct botan_pk_op_sign_struct * botan_pk_op_sign_t
typedef struct botan_pk_op_verify_struct * botan_pk_op_verify_t
typedef struct botan_privkey_struct * botan_privkey_t
typedef struct botan_pubkey_struct * botan_pubkey_t
typedef struct botan_rng_struct * botan_rng_t
typedef struct botan_srp6_server_session_struct * botan_srp6_server_session_t
typedef struct botan_totp_struct * botan_totp_t
typedef struct botan_tpm2_crypto_backend_state_struct * botan_tpm2_crypto_backend_state_t
typedef struct botan_tpm2_ctx_struct * botan_tpm2_ctx_t
typedef struct botan_tpm2_session_struct * botan_tpm2_session_t
typedef int(* botan_view_bin_fn) (botan_view_ctx view_ctx, const uint8_t *data, size_t len)
typedef void * botan_view_ctx
typedef int(* botan_view_str_fn) (botan_view_ctx view_ctx, const char *str, size_t len)
typedef struct botan_x509_cert_struct * botan_x509_cert_t
typedef struct botan_x509_crl_entry_struct * botan_x509_crl_entry_t
typedef struct botan_x509_crl_struct * botan_x509_crl_t
typedef struct botan_x509_general_name_struct * botan_x509_general_name_t
typedef struct botan_xof_struct * botan_xof_t

Enumerations

enum  BOTAN_FFI_ERROR {
  BOTAN_FFI_SUCCESS = 0 , BOTAN_FFI_INVALID_VERIFIER = 1 , BOTAN_FFI_ERROR_INVALID_INPUT = -1 , BOTAN_FFI_ERROR_BAD_MAC = -2 ,
  BOTAN_FFI_ERROR_NO_VALUE = -3 , BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE = -10 , BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR = -11 , BOTAN_FFI_ERROR_EXCEPTION_THROWN = -20 ,
  BOTAN_FFI_ERROR_OUT_OF_MEMORY = -21 , BOTAN_FFI_ERROR_SYSTEM_ERROR = -22 , BOTAN_FFI_ERROR_INTERNAL_ERROR = -23 , BOTAN_FFI_ERROR_BAD_FLAG = -30 ,
  BOTAN_FFI_ERROR_NULL_POINTER = -31 , BOTAN_FFI_ERROR_BAD_PARAMETER = -32 , BOTAN_FFI_ERROR_KEY_NOT_SET = -33 , BOTAN_FFI_ERROR_INVALID_KEY_LENGTH = -34 ,
  BOTAN_FFI_ERROR_INVALID_OBJECT_STATE = -35 , BOTAN_FFI_ERROR_OUT_OF_RANGE = -36 , BOTAN_FFI_ERROR_NOT_IMPLEMENTED = -40 , BOTAN_FFI_ERROR_INVALID_OBJECT = -50 ,
  BOTAN_FFI_ERROR_TLS_ERROR = -75 , BOTAN_FFI_ERROR_HTTP_ERROR = -76 , BOTAN_FFI_ERROR_ROUGHTIME_ERROR = -77 , BOTAN_FFI_ERROR_TPM_ERROR = -78 ,
  BOTAN_FFI_ERROR_UNKNOWN_ERROR = -100
}
enum  botan_x509_cert_key_constraints {
  NO_CONSTRAINTS = 0 , DIGITAL_SIGNATURE = 32768 , NON_REPUDIATION = 16384 , KEY_ENCIPHERMENT = 8192 ,
  DATA_ENCIPHERMENT = 4096 , KEY_AGREEMENT = 2048 , KEY_CERT_SIGN = 1024 , CRL_SIGN = 512 ,
  ENCIPHER_ONLY = 256 , DECIPHER_ONLY = 128
}
enum  botan_x509_crl_reason_code {
  BOTAN_CRL_ENTRY_UNSPECIFIED = 0 , BOTAN_CRL_ENTRY_KEY_COMPROMISE = 1 , BOTAN_CRL_ENTRY_CA_COMPROMISE = 2 , BOTAN_CRL_ENTRY_AFFILIATION_CHANGED = 3 ,
  BOTAN_CRL_ENTRY_SUPERSEDED = 4 , BOTAN_CRL_ENTRY_CESSATION_OF_OPERATION = 5 , BOTAN_CRL_ENTRY_CERTIFICATE_HOLD = 6 , BOTAN_CRL_ENTRY_REMOVE_FROM_CRL = 8 ,
  BOTAN_CRL_ENTRY_PRIVILEGE_WITHDRAWN = 9 , BOTAN_CRL_ENTRY_AA_COMPROMISE = 10
}
enum  botan_x509_general_name_types {
  BOTAN_X509_OTHER_NAME = 0 , BOTAN_X509_EMAIL_ADDRESS = 1 , BOTAN_X509_DNS_NAME = 2 , BOTAN_X509_DIRECTORY_NAME = 4 ,
  BOTAN_X509_URI = 6 , BOTAN_X509_IP_ADDRESS = 7
}
enum  botan_x509_value_type {
  BOTAN_X509_SERIAL_NUMBER = 0 , BOTAN_X509_SUBJECT_DN_BITS = 1 , BOTAN_X509_ISSUER_DN_BITS = 2 , BOTAN_X509_SUBJECT_KEY_IDENTIFIER = 3 ,
  BOTAN_X509_AUTHORITY_KEY_IDENTIFIER = 4 , BOTAN_X509_PUBLIC_KEY_PKCS8_BITS = 200 , BOTAN_X509_TBS_DATA_BITS = 201 , BOTAN_X509_SIGNATURE_SCHEME_BITS = 202 ,
  BOTAN_X509_SIGNATURE_BITS = 203 , BOTAN_X509_DER_ENCODING = 300 , BOTAN_X509_PEM_ENCODING = 301 , BOTAN_X509_CRL_DISTRIBUTION_URLS = 400 ,
  BOTAN_X509_OCSP_RESPONDER_URLS = 401 , BOTAN_X509_CA_ISSUERS_URLS = 402
}

Functions

int botan_base64_decode (const char *base64_str, size_t in_len, uint8_t *out, size_t *out_len)
int botan_base64_encode (const uint8_t *x, size_t len, char *out, size_t *out_len)
int botan_bcrypt_generate (uint8_t *out, size_t *out_len, const char *password, botan_rng_t rng, size_t work_factor, uint32_t flags)
int botan_bcrypt_is_valid (const char *pass, const char *hash)
int botan_block_cipher_block_size (botan_block_cipher_t bc)
int botan_block_cipher_clear (botan_block_cipher_t bc)
int botan_block_cipher_decrypt_blocks (botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks)
int botan_block_cipher_destroy (botan_block_cipher_t bc)
int botan_block_cipher_encrypt_blocks (botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks)
int botan_block_cipher_get_keyspec (botan_block_cipher_t cipher, size_t *out_minimum_keylength, size_t *out_maximum_keylength, size_t *out_keylength_modulo)
int botan_block_cipher_init (botan_block_cipher_t *bc, const char *cipher_name)
int botan_block_cipher_name (botan_block_cipher_t cipher, char *name, size_t *name_len)
int botan_block_cipher_set_key (botan_block_cipher_t bc, const uint8_t key[], size_t len)
int botan_cipher_clear (botan_cipher_t hash)
int botan_cipher_destroy (botan_cipher_t cipher)
int botan_cipher_get_default_nonce_length (botan_cipher_t cipher, size_t *nl)
int botan_cipher_get_ideal_update_granularity (botan_cipher_t cipher, size_t *ug)
int botan_cipher_get_keyspec (botan_cipher_t cipher, size_t *min_keylen, size_t *max_keylen, size_t *mod_keylen)
int botan_cipher_get_tag_length (botan_cipher_t cipher, size_t *tag_size)
int botan_cipher_get_update_granularity (botan_cipher_t cipher, size_t *ug)
int botan_cipher_init (botan_cipher_t *cipher, const char *name, uint32_t flags)
int botan_cipher_is_authenticated (botan_cipher_t cipher)
int botan_cipher_name (botan_cipher_t cipher, char *name, size_t *name_len)
int botan_cipher_output_length (botan_cipher_t cipher, size_t in_len, size_t *out_len)
int botan_cipher_query_keylen (botan_cipher_t cipher, size_t *out_minimum_keylength, size_t *out_maximum_keylength)
int botan_cipher_requires_entire_message (botan_cipher_t cipher)
int botan_cipher_reset (botan_cipher_t cipher)
int botan_cipher_set_associated_data (botan_cipher_t cipher, const uint8_t *ad, size_t ad_len)
int botan_cipher_set_key (botan_cipher_t cipher, const uint8_t *key, size_t key_len)
int botan_cipher_start (botan_cipher_t cipher, const uint8_t *nonce, size_t nonce_len)
int botan_cipher_update (botan_cipher_t cipher, uint32_t flags, uint8_t output[], size_t output_size, size_t *output_written, const uint8_t input_bytes[], size_t input_size, size_t *input_consumed)
 Encrypt/Decrypt some data and/or finalize the encryption/decryption.
int botan_cipher_valid_nonce_length (botan_cipher_t cipher, size_t nl)
int botan_constant_time_compare (const uint8_t *x, const uint8_t *y, size_t len)
int botan_ec_group_destroy (botan_ec_group_t ec_group)
int botan_ec_group_equal (botan_ec_group_t curve1, botan_ec_group_t curve2)
int botan_ec_group_from_ber (botan_ec_group_t *ec_group, const uint8_t *ber, size_t ber_len)
int botan_ec_group_from_name (botan_ec_group_t *ec_group, const char *name)
int botan_ec_group_from_oid (botan_ec_group_t *ec_group, botan_asn1_oid_t oid)
int botan_ec_group_from_params (botan_ec_group_t *ec_group, botan_asn1_oid_t oid, botan_mp_t p, botan_mp_t a, botan_mp_t b, botan_mp_t base_x, botan_mp_t base_y, botan_mp_t order)
int botan_ec_group_from_pem (botan_ec_group_t *ec_group, const char *pem)
int botan_ec_group_get_a (botan_mp_t *a, botan_ec_group_t ec_group)
int botan_ec_group_get_b (botan_mp_t *b, botan_ec_group_t ec_group)
int botan_ec_group_get_curve_oid (botan_asn1_oid_t *oid, botan_ec_group_t ec_group)
int botan_ec_group_get_g_x (botan_mp_t *g_x, botan_ec_group_t ec_group)
int botan_ec_group_get_g_y (botan_mp_t *g_y, botan_ec_group_t ec_group)
int botan_ec_group_get_order (botan_mp_t *order, botan_ec_group_t ec_group)
int botan_ec_group_get_p (botan_mp_t *p, botan_ec_group_t ec_group)
int botan_ec_group_supports_application_specific_group (int *out)
int botan_ec_group_supports_named_group (const char *name, int *out)
int botan_ec_group_unregister (botan_asn1_oid_t oid)
int botan_ec_group_view_der (botan_ec_group_t ec_group, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_group_view_pem (botan_ec_group_t ec_group, botan_view_ctx ctx, botan_view_str_fn view)
int botan_ec_point_add (botan_ec_point_t *result, botan_ec_point_t x, botan_ec_point_t y)
int botan_ec_point_destroy (botan_ec_point_t ec_point)
int botan_ec_point_equal (botan_ec_point_t x, botan_ec_point_t y)
int botan_ec_point_from_bytes (botan_ec_point_t *ec_point, botan_ec_group_t ec_group, const uint8_t *bytes, size_t bytes_len)
int botan_ec_point_from_xy (botan_ec_point_t *ec_point, botan_ec_group_t ec_group, botan_mp_t x, botan_mp_t y)
int botan_ec_point_generator (botan_ec_point_t *ec_point, botan_ec_group_t ec_group)
int botan_ec_point_identity (botan_ec_point_t *ec_point, botan_ec_group_t ec_group)
int botan_ec_point_is_identity (botan_ec_point_t ec_point)
int botan_ec_point_mul (botan_ec_point_t *result, botan_ec_point_t ec_point, botan_ec_scalar_t ec_scalar, botan_rng_t rng)
int botan_ec_point_negate (botan_ec_point_t *result, botan_ec_point_t ec_point)
int botan_ec_point_view_compressed (botan_ec_point_t ec_point, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_point_view_uncompressed (botan_ec_point_t ec_point, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_point_view_x_bytes (botan_ec_point_t ec_point, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_point_view_xy_bytes (botan_ec_point_t ec_point, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_point_view_y_bytes (botan_ec_point_t ec_point, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_ec_privkey_create (botan_privkey_t *key, const char *algo_name, botan_ec_group_t ec_group, botan_rng_t rng)
int botan_ec_privkey_get_group (botan_privkey_t key, botan_ec_group_t *ec_group)
int botan_ec_privkey_get_private_key (botan_privkey_t key, botan_ec_scalar_t *value)
int botan_ec_pubkey_get_group (botan_pubkey_t key, botan_ec_group_t *ec_group)
int botan_ec_scalar_destroy (botan_ec_scalar_t ec_scalar)
int botan_ec_scalar_from_mp (botan_ec_scalar_t *ec_scalar, botan_ec_group_t ec_group, botan_mp_t mp)
int botan_ec_scalar_random (botan_ec_scalar_t *ec_scalar, botan_ec_group_t ec_group, botan_rng_t rng)
int botan_ec_scalar_to_mp (botan_ec_scalar_t ec_scalar, botan_mp_t *mp)
const char * botan_error_description (int err)
const char * botan_error_last_exception_message (void)
uint32_t botan_ffi_api_version (void)
int botan_ffi_supports_api (uint32_t api_version)
int botan_fpe_decrypt (botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
int botan_fpe_destroy (botan_fpe_t fpe)
int botan_fpe_encrypt (botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
int botan_fpe_fe1_init (botan_fpe_t *fpe, botan_mp_t n, const uint8_t key[], size_t key_len, size_t rounds, uint32_t flags)
int botan_hash_block_size (botan_hash_t hash, size_t *block_size)
int botan_hash_clear (botan_hash_t hash)
int botan_hash_copy_state (botan_hash_t *dest, botan_hash_t source)
int botan_hash_destroy (botan_hash_t hash)
int botan_hash_final (botan_hash_t hash, uint8_t out[])
int botan_hash_init (botan_hash_t *hash, const char *hash_name, uint32_t flags)
int botan_hash_name (botan_hash_t hash, char *name, size_t *name_len)
int botan_hash_output_length (botan_hash_t hash, size_t *output_length)
int botan_hash_update (botan_hash_t hash, const uint8_t *in, size_t in_len)
int botan_hex_decode (const char *hex_str, size_t in_len, uint8_t *out, size_t *out_len)
int botan_hex_encode (const uint8_t *x, size_t len, char *out, uint32_t flags)
int botan_hotp_check (botan_hotp_t hotp, uint64_t *next_hotp_counter, uint32_t hotp_code, uint64_t hotp_counter, size_t resync_range)
int botan_hotp_destroy (botan_hotp_t hotp)
int botan_hotp_generate (botan_hotp_t hotp, uint32_t *hotp_code, uint64_t hotp_counter)
int botan_hotp_init (botan_hotp_t *hotp, const uint8_t key[], size_t key_len, const char *hash_algo, size_t digits)
int botan_kdf (const char *kdf_algo, uint8_t out[], size_t out_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len)
int botan_key_unwrap3394 (const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len)
int botan_key_wrap3394 (const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len)
int botan_mac_clear (botan_mac_t mac)
int botan_mac_destroy (botan_mac_t mac)
int botan_mac_final (botan_mac_t mac, uint8_t out[])
int botan_mac_get_keyspec (botan_mac_t mac, size_t *out_minimum_keylength, size_t *out_maximum_keylength, size_t *out_keylength_modulo)
int botan_mac_init (botan_mac_t *mac, const char *mac_name, uint32_t flags)
int botan_mac_name (botan_mac_t mac, char *name, size_t *name_len)
int botan_mac_output_length (botan_mac_t mac, size_t *output_length)
int botan_mac_set_key (botan_mac_t mac, const uint8_t *key, size_t key_len)
int botan_mac_set_nonce (botan_mac_t mac, const uint8_t *nonce, size_t nonce_len)
int botan_mac_update (botan_mac_t mac, const uint8_t *buf, size_t len)
int botan_mceies_decrypt (botan_privkey_t mce_key, const char *aead, const uint8_t ct[], size_t ct_len, const uint8_t ad[], size_t ad_len, uint8_t pt[], size_t *pt_len)
int botan_mceies_encrypt (botan_pubkey_t mce_key, botan_rng_t rng, const char *aead, const uint8_t pt[], size_t pt_len, const uint8_t ad[], size_t ad_len, uint8_t ct[], size_t *ct_len)
int botan_mp_add (botan_mp_t result, botan_mp_t x, botan_mp_t y)
int botan_mp_add_u32 (botan_mp_t result, botan_mp_t x, uint32_t y)
int botan_mp_clear (botan_mp_t mp)
int botan_mp_clear_bit (botan_mp_t n, size_t bit)
int botan_mp_cmp (int *result, botan_mp_t x, botan_mp_t y)
int botan_mp_destroy (botan_mp_t mp)
int botan_mp_div (botan_mp_t quotient, botan_mp_t remainder, botan_mp_t x, botan_mp_t y)
int botan_mp_equal (botan_mp_t x, botan_mp_t y)
int botan_mp_flip_sign (botan_mp_t mp)
int botan_mp_from_bin (botan_mp_t mp, const uint8_t vec[], size_t vec_len)
int botan_mp_gcd (botan_mp_t out, botan_mp_t x, botan_mp_t y)
int botan_mp_get_bit (botan_mp_t n, size_t bit)
int botan_mp_init (botan_mp_t *mp)
int botan_mp_is_even (botan_mp_t mp)
int botan_mp_is_negative (botan_mp_t mp)
int botan_mp_is_odd (botan_mp_t mp)
int botan_mp_is_positive (botan_mp_t mp)
int botan_mp_is_prime (botan_mp_t n, botan_rng_t rng, size_t test_prob)
int botan_mp_is_zero (botan_mp_t mp)
int botan_mp_lshift (botan_mp_t out, botan_mp_t in, size_t shift)
int botan_mp_mod_inverse (botan_mp_t out, botan_mp_t in, botan_mp_t modulus)
int botan_mp_mod_mul (botan_mp_t result, botan_mp_t x, botan_mp_t y, botan_mp_t mod)
int botan_mp_mul (botan_mp_t result, botan_mp_t x, botan_mp_t y)
int botan_mp_num_bits (botan_mp_t n, size_t *bits)
int botan_mp_num_bytes (botan_mp_t n, size_t *bytes)
int botan_mp_powmod (botan_mp_t out, botan_mp_t base, botan_mp_t exponent, botan_mp_t modulus)
int botan_mp_rand_bits (botan_mp_t rand_out, botan_rng_t rng, size_t bits)
int botan_mp_rand_range (botan_mp_t rand_out, botan_rng_t rng, botan_mp_t lower_bound, botan_mp_t upper_bound)
int botan_mp_rshift (botan_mp_t out, botan_mp_t in, size_t shift)
int botan_mp_set_bit (botan_mp_t n, size_t bit)
int botan_mp_set_from_int (botan_mp_t mp, int initial_value)
int botan_mp_set_from_mp (botan_mp_t dest, botan_mp_t source)
int botan_mp_set_from_radix_str (botan_mp_t dest, const char *str, size_t radix)
int botan_mp_set_from_str (botan_mp_t dest, const char *str)
int botan_mp_sub (botan_mp_t result, botan_mp_t x, botan_mp_t y)
int botan_mp_sub_u32 (botan_mp_t result, botan_mp_t x, uint32_t y)
int botan_mp_swap (botan_mp_t x, botan_mp_t y)
int botan_mp_to_bin (botan_mp_t mp, uint8_t vec[])
int botan_mp_to_hex (botan_mp_t mp, char *out)
int botan_mp_to_str (botan_mp_t mp, uint8_t radix, char *out, size_t *out_len)
int botan_mp_to_uint32 (botan_mp_t mp, uint32_t *val)
int botan_mp_view_bin (botan_mp_t mp, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_mp_view_hex (botan_mp_t mp, botan_view_ctx ctx, botan_view_str_fn view)
int botan_mp_view_str (botan_mp_t mp, uint8_t radix, botan_view_ctx ctx, botan_view_str_fn view)
int botan_nist_kw_dec (const char *cipher_algo, int padded, const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len)
int botan_nist_kw_enc (const char *cipher_algo, int padded, const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len)
int botan_oid_cmp (int *result, botan_asn1_oid_t a, botan_asn1_oid_t b)
int botan_oid_destroy (botan_asn1_oid_t oid)
int botan_oid_equal (botan_asn1_oid_t a, botan_asn1_oid_t b)
int botan_oid_from_string (botan_asn1_oid_t *oid, const char *oid_str)
int botan_oid_register (botan_asn1_oid_t oid, const char *name)
int botan_oid_view_name (botan_asn1_oid_t oid, botan_view_ctx ctx, botan_view_str_fn view)
int botan_oid_view_string (botan_asn1_oid_t oid, botan_view_ctx ctx, botan_view_str_fn view)
int botan_pbkdf (const char *pbkdf_algo, uint8_t out[], size_t out_len, const char *passphrase, const uint8_t salt[], size_t salt_len, size_t iterations)
int botan_pbkdf_timed (const char *pbkdf_algo, uint8_t out[], size_t out_len, const char *passphrase, const uint8_t salt[], size_t salt_len, size_t milliseconds_to_run, size_t *out_iterations_used)
int botan_pk_op_decrypt (botan_pk_op_decrypt_t op, uint8_t out[], size_t *out_len, const uint8_t ciphertext[], size_t ciphertext_len)
int botan_pk_op_decrypt_create (botan_pk_op_decrypt_t *op, botan_privkey_t key, const char *padding, uint32_t flags)
int botan_pk_op_decrypt_destroy (botan_pk_op_decrypt_t op)
int botan_pk_op_decrypt_output_length (botan_pk_op_decrypt_t op, size_t ctext_len, size_t *ptext_len)
int botan_pk_op_encrypt (botan_pk_op_encrypt_t op, botan_rng_t rng, uint8_t out[], size_t *out_len, const uint8_t plaintext[], size_t plaintext_len)
int botan_pk_op_encrypt_create (botan_pk_op_encrypt_t *op, botan_pubkey_t key, const char *padding, uint32_t flags)
int botan_pk_op_encrypt_destroy (botan_pk_op_encrypt_t op)
int botan_pk_op_encrypt_output_length (botan_pk_op_encrypt_t op, size_t ptext_len, size_t *ctext_len)
int botan_pk_op_kem_decrypt_create (botan_pk_op_kem_decrypt_t *op, botan_privkey_t key, const char *kdf)
int botan_pk_op_kem_decrypt_destroy (botan_pk_op_kem_decrypt_t op)
int botan_pk_op_kem_decrypt_shared_key (botan_pk_op_kem_decrypt_t op, const uint8_t salt[], size_t salt_len, const uint8_t encapsulated_key[], size_t encapsulated_key_len, size_t desired_shared_key_len, uint8_t shared_key[], size_t *shared_key_len)
int botan_pk_op_kem_decrypt_shared_key_length (botan_pk_op_kem_decrypt_t op, size_t desired_shared_key_length, size_t *output_shared_key_length)
int botan_pk_op_kem_encrypt_create (botan_pk_op_kem_encrypt_t *op, botan_pubkey_t key, const char *kdf)
int botan_pk_op_kem_encrypt_create_shared_key (botan_pk_op_kem_encrypt_t op, botan_rng_t rng, const uint8_t salt[], size_t salt_len, size_t desired_shared_key_len, uint8_t shared_key[], size_t *shared_key_len, uint8_t encapsulated_key[], size_t *encapsulated_key_len)
int botan_pk_op_kem_encrypt_destroy (botan_pk_op_kem_encrypt_t op)
int botan_pk_op_kem_encrypt_encapsulated_key_length (botan_pk_op_kem_encrypt_t op, size_t *output_encapsulated_key_length)
int botan_pk_op_kem_encrypt_shared_key_length (botan_pk_op_kem_encrypt_t op, size_t desired_shared_key_length, size_t *output_shared_key_length)
int botan_pk_op_key_agreement (botan_pk_op_ka_t op, uint8_t out[], size_t *out_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len)
int botan_pk_op_key_agreement_create (botan_pk_op_ka_t *op, botan_privkey_t key, const char *kdf, uint32_t flags)
int botan_pk_op_key_agreement_destroy (botan_pk_op_ka_t op)
int botan_pk_op_key_agreement_export_public (botan_privkey_t key, uint8_t out[], size_t *out_len)
int botan_pk_op_key_agreement_size (botan_pk_op_ka_t op, size_t *out_len)
int botan_pk_op_key_agreement_view_public (botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_pk_op_sign_create (botan_pk_op_sign_t *op, botan_privkey_t key, const char *hash_and_padding, uint32_t flags)
int botan_pk_op_sign_destroy (botan_pk_op_sign_t op)
int botan_pk_op_sign_finish (botan_pk_op_sign_t op, botan_rng_t rng, uint8_t sig[], size_t *sig_len)
int botan_pk_op_sign_output_length (botan_pk_op_sign_t op, size_t *olen)
int botan_pk_op_sign_update (botan_pk_op_sign_t op, const uint8_t in[], size_t in_len)
int botan_pk_op_verify_create (botan_pk_op_verify_t *op, botan_pubkey_t key, const char *hash_and_padding, uint32_t flags)
int botan_pk_op_verify_destroy (botan_pk_op_verify_t op)
int botan_pk_op_verify_finish (botan_pk_op_verify_t op, const uint8_t sig[], size_t sig_len)
int botan_pk_op_verify_update (botan_pk_op_verify_t op, const uint8_t in[], size_t in_len)
int botan_pkcs_hash_id (const char *hash_name, uint8_t pkcs_id[], size_t *pkcs_id_len)
int botan_privkey_algo_name (botan_privkey_t key, char out[], size_t *out_len)
int botan_privkey_check_key (botan_privkey_t key, botan_rng_t rng, uint32_t flags)
int botan_privkey_create (botan_privkey_t *key, const char *algo_name, const char *algo_params, botan_rng_t rng)
int botan_privkey_create_dh (botan_privkey_t *key, botan_rng_t rng, const char *param)
int botan_privkey_create_ecdh (botan_privkey_t *key, botan_rng_t rng, const char *params)
int botan_privkey_create_ecdsa (botan_privkey_t *key, botan_rng_t rng, const char *params)
int botan_privkey_create_mceliece (botan_privkey_t *key, botan_rng_t rng, size_t n, size_t t)
int botan_privkey_create_rsa (botan_privkey_t *key, botan_rng_t rng, size_t n_bits)
int botan_privkey_destroy (botan_privkey_t key)
int botan_privkey_dsa_get_x (botan_mp_t n, botan_privkey_t key)
int botan_privkey_ed25519_get_privkey (botan_privkey_t key, uint8_t output[64])
int botan_privkey_ed448_get_privkey (botan_privkey_t key, uint8_t output[57])
int botan_privkey_export (botan_privkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
int botan_privkey_export_encrypted (botan_privkey_t key, uint8_t out[], size_t *out_len, botan_rng_t rng, const char *passphrase, const char *encryption_algo, uint32_t flags)
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_iterations, const char *cipher_algo, const char *pbkdf_algo, uint32_t flags)
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_runtime, size_t *pbkdf_iterations_out, const char *cipher_algo, const char *pbkdf_algo, uint32_t flags)
int botan_privkey_export_pubkey (botan_pubkey_t *out, botan_privkey_t in)
int botan_privkey_get_field (botan_mp_t output, botan_privkey_t key, const char *field_name)
int botan_privkey_load (botan_privkey_t *key, botan_rng_t rng, const uint8_t bits[], size_t len, const char *password)
int botan_privkey_load_classic_mceliece (botan_privkey_t *key, const uint8_t privkey[], size_t key_len, const char *cmce_mode)
int botan_privkey_load_dh (botan_privkey_t *key, botan_mp_t p, botan_mp_t g, botan_mp_t x)
int botan_privkey_load_dsa (botan_privkey_t *key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t x)
int botan_privkey_load_ecdh (botan_privkey_t *key, botan_mp_t scalar, const char *curve_name)
int botan_privkey_load_ecdsa (botan_privkey_t *key, botan_mp_t scalar, const char *curve_name)
int botan_privkey_load_ed25519 (botan_privkey_t *key, const uint8_t privkey[32])
int botan_privkey_load_ed448 (botan_privkey_t *key, const uint8_t privkey[57])
int botan_privkey_load_frodokem (botan_privkey_t *key, const uint8_t privkey[], size_t key_len, const char *frodo_mode)
int botan_privkey_load_kyber (botan_privkey_t *key, const uint8_t privkey[], size_t key_len)
int botan_privkey_load_ml_dsa (botan_privkey_t *key, const uint8_t privkey[], size_t key_len, const char *mldsa_mode)
int botan_privkey_load_ml_kem (botan_privkey_t *key, const uint8_t privkey[], size_t key_len, const char *mlkem_mode)
int botan_privkey_load_rsa (botan_privkey_t *key, botan_mp_t p, botan_mp_t q, botan_mp_t e)
int botan_privkey_load_rsa_pkcs1 (botan_privkey_t *key, const uint8_t bits[], size_t len)
int botan_privkey_load_slh_dsa (botan_privkey_t *key, const uint8_t privkey[], size_t key_len, const char *slhdsa_mode)
int botan_privkey_load_sm2 (botan_privkey_t *key, botan_mp_t scalar, const char *curve_name)
int botan_privkey_load_sm2_enc (botan_privkey_t *key, botan_mp_t scalar, const char *curve_name)
int botan_privkey_load_x25519 (botan_privkey_t *key, const uint8_t privkey[32])
int botan_privkey_load_x448 (botan_privkey_t *key, const uint8_t privkey[56])
int botan_privkey_oid (botan_asn1_oid_t *oid, botan_privkey_t key)
int botan_privkey_remaining_operations (botan_privkey_t key, uint64_t *out)
int botan_privkey_rsa_get_d (botan_mp_t d, botan_privkey_t rsa_key)
int botan_privkey_rsa_get_e (botan_mp_t e, botan_privkey_t rsa_key)
int botan_privkey_rsa_get_n (botan_mp_t n, botan_privkey_t rsa_key)
int botan_privkey_rsa_get_p (botan_mp_t p, botan_privkey_t rsa_key)
int botan_privkey_rsa_get_privkey (botan_privkey_t rsa_key, uint8_t out[], size_t *out_len, uint32_t flags)
int botan_privkey_rsa_get_q (botan_mp_t q, botan_privkey_t rsa_key)
int botan_privkey_stateful_operation (botan_privkey_t key, int *out)
int botan_privkey_view_der (botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
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)
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)
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)
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)
int botan_privkey_view_kyber_raw_key (botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_privkey_view_pem (botan_privkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
int botan_privkey_view_raw (botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_privkey_x25519_get_privkey (botan_privkey_t key, uint8_t output[32])
int botan_privkey_x448_get_privkey (botan_privkey_t key, uint8_t output[56])
int botan_pubkey_algo_name (botan_pubkey_t key, char out[], size_t *out_len)
int botan_pubkey_check_key (botan_pubkey_t key, botan_rng_t rng, uint32_t flags)
int botan_pubkey_destroy (botan_pubkey_t key)
int botan_pubkey_dsa_get_g (botan_mp_t d, botan_pubkey_t key)
int botan_pubkey_dsa_get_p (botan_mp_t p, botan_pubkey_t key)
int botan_pubkey_dsa_get_q (botan_mp_t q, botan_pubkey_t key)
int botan_pubkey_dsa_get_y (botan_mp_t y, botan_pubkey_t key)
int botan_pubkey_ecc_key_used_explicit_encoding (botan_pubkey_t key)
int botan_pubkey_ed25519_get_pubkey (botan_pubkey_t key, uint8_t pubkey[32])
int botan_pubkey_ed448_get_pubkey (botan_pubkey_t key, uint8_t pubkey[57])
int botan_pubkey_estimated_strength (botan_pubkey_t key, size_t *estimate)
int botan_pubkey_export (botan_pubkey_t key, uint8_t out[], size_t *out_len, uint32_t flags)
int botan_pubkey_fingerprint (botan_pubkey_t key, const char *hash, uint8_t out[], size_t *out_len)
int botan_pubkey_get_field (botan_mp_t output, botan_pubkey_t key, const char *field_name)
int botan_pubkey_load (botan_pubkey_t *key, const uint8_t bits[], size_t len)
int botan_pubkey_load_classic_mceliece (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len, const char *cmce_mode)
int botan_pubkey_load_dsa (botan_pubkey_t *key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t y)
int botan_pubkey_load_ecdh (botan_pubkey_t *key, botan_mp_t public_x, botan_mp_t public_y, const char *curve_name)
int botan_pubkey_load_ecdh_sec1 (botan_pubkey_t *key, const uint8_t sec1[], size_t sec1_len, const char *curve_name)
int botan_pubkey_load_ecdsa (botan_pubkey_t *key, botan_mp_t public_x, botan_mp_t public_y, const char *curve_name)
int botan_pubkey_load_ecdsa_sec1 (botan_pubkey_t *key, const uint8_t sec1[], size_t sec1_len, const char *curve_name)
int botan_pubkey_load_ed25519 (botan_pubkey_t *key, const uint8_t pubkey[32])
int botan_pubkey_load_ed448 (botan_pubkey_t *key, const uint8_t pubkey[57])
int botan_pubkey_load_frodokem (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len, const char *frodo_mode)
int botan_pubkey_load_kyber (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len)
int botan_pubkey_load_ml_dsa (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len, const char *mldsa_mode)
int botan_pubkey_load_ml_kem (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len, const char *mlkem_mode)
int botan_pubkey_load_rsa (botan_pubkey_t *key, botan_mp_t n, botan_mp_t e)
int botan_pubkey_load_rsa_pkcs1 (botan_pubkey_t *key, const uint8_t bits[], size_t len)
int botan_pubkey_load_slh_dsa (botan_pubkey_t *key, const uint8_t pubkey[], size_t key_len, const char *slhdsa_mode)
int botan_pubkey_load_sm2 (botan_pubkey_t *key, botan_mp_t public_x, botan_mp_t public_y, const char *curve_name)
int botan_pubkey_load_sm2_enc (botan_pubkey_t *key, botan_mp_t public_x, botan_mp_t public_y, const char *curve_name)
int botan_pubkey_load_sm2_sec1 (botan_pubkey_t *key, const uint8_t sec1[], size_t sec1_len, const char *curve_name)
int botan_pubkey_load_x25519 (botan_pubkey_t *key, const uint8_t pubkey[32])
int botan_pubkey_load_x448 (botan_pubkey_t *key, const uint8_t pubkey[56])
int botan_pubkey_oid (botan_asn1_oid_t *oid, botan_pubkey_t key)
int botan_pubkey_rsa_get_e (botan_mp_t e, botan_pubkey_t rsa_key)
int botan_pubkey_rsa_get_n (botan_mp_t n, botan_pubkey_t rsa_key)
int botan_pubkey_sm2_compute_za (uint8_t out[], size_t *out_len, const char *ident, const char *hash_algo, botan_pubkey_t key)
int botan_pubkey_view_der (botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_pubkey_view_ec_public_point (botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_pubkey_view_kyber_raw_key (botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_pubkey_view_pem (botan_pubkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
int botan_pubkey_view_raw (botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_pubkey_x25519_get_pubkey (botan_pubkey_t key, uint8_t pubkey[32])
int botan_pubkey_x448_get_pubkey (botan_pubkey_t key, uint8_t pubkey[56])
int botan_pwdhash (const char *algo, size_t param1, size_t param2, size_t param3, uint8_t out[], size_t out_len, const char *passphrase, size_t passphrase_len, const uint8_t salt[], size_t salt_len)
int botan_pwdhash_timed (const char *algo, uint32_t msec, size_t *param1, size_t *param2, size_t *param3, uint8_t out[], size_t out_len, const char *passphrase, size_t passphrase_len, const uint8_t salt[], size_t salt_len)
int botan_rng_add_entropy (botan_rng_t rng, const uint8_t *entropy, size_t entropy_len)
int botan_rng_destroy (botan_rng_t rng)
int botan_rng_generate_with_input (botan_rng_t rng, uint8_t *out, size_t out_len, const uint8_t *addl_input, size_t addl_len)
int botan_rng_get (botan_rng_t rng, uint8_t *out, size_t out_len)
int botan_rng_init (botan_rng_t *rng, const char *rng_type)
int botan_rng_init_custom (botan_rng_t *rng_out, const char *rng_name, void *context, int(*get_cb)(void *context, uint8_t *out, size_t out_len), int(*add_entropy_cb)(void *context, const uint8_t input[], size_t length), void(*destroy_cb)(void *context))
int botan_rng_init_drbg (botan_rng_t *rng_out, const char *drbg_name, const uint8_t *seed, size_t seed_len)
int botan_rng_reseed (botan_rng_t rng, size_t bits)
int botan_rng_reseed_from_rng (botan_rng_t rng, botan_rng_t source_rng, size_t bits)
int botan_same_mem (const uint8_t *x, const uint8_t *y, size_t len)
int botan_scrub_mem (void *mem, size_t bytes)
int botan_scrypt (uint8_t out[], size_t out_len, const char *passphrase, const uint8_t salt[], size_t salt_len, size_t N, size_t r, size_t p)
int botan_srp6_client_agree (const char *username, const char *password, const char *group_id, const char *hash_id, const uint8_t salt[], size_t salt_len, const uint8_t B[], size_t B_len, botan_rng_t rng_obj, uint8_t A[], size_t *A_len, uint8_t K[], size_t *K_len)
int botan_srp6_generate_verifier (const char *identifier, const char *password, const uint8_t salt[], size_t salt_len, const char *group_id, const char *hash_id, uint8_t verifier[], size_t *verifier_len)
int botan_srp6_group_size (const char *group_id, size_t *group_p_bytes)
int botan_srp6_server_session_destroy (botan_srp6_server_session_t srp6)
int botan_srp6_server_session_init (botan_srp6_server_session_t *srp6)
int botan_srp6_server_session_step1 (botan_srp6_server_session_t srp6, const uint8_t verifier[], size_t verifier_len, const char *group_id, const char *hash_id, botan_rng_t rng_obj, uint8_t B_pub[], size_t *B_pub_len)
int botan_srp6_server_session_step2 (botan_srp6_server_session_t srp6, const uint8_t A[], size_t A_len, uint8_t key[], size_t *key_len)
int botan_system_rng_get (uint8_t *out, size_t out_len)
int botan_totp_check (botan_totp_t totp, uint32_t totp_code, uint64_t timestamp, size_t acceptable_clock_drift)
int botan_totp_destroy (botan_totp_t totp)
int botan_totp_generate (botan_totp_t totp, uint32_t *totp_code, uint64_t timestamp)
int botan_totp_init (botan_totp_t *totp, const uint8_t key[], size_t key_len, const char *hash_algo, size_t digits, size_t time_step)
int botan_tpm2_crypto_backend_state_destroy (botan_tpm2_crypto_backend_state_t cbs)
int botan_tpm2_ctx_destroy (botan_tpm2_ctx_t ctx)
int botan_tpm2_ctx_enable_crypto_backend (botan_tpm2_ctx_t ctx, botan_rng_t rng)
int botan_tpm2_ctx_from_esys (botan_tpm2_ctx_t *ctx_out, struct ESYS_CONTEXT *esys_ctx)
int botan_tpm2_ctx_init (botan_tpm2_ctx_t *ctx_out, const char *tcti_nameconf)
int botan_tpm2_ctx_init_ex (botan_tpm2_ctx_t *ctx_out, const char *tcti_name, const char *tcti_conf)
int botan_tpm2_enable_crypto_backend (botan_tpm2_crypto_backend_state_t *cbs_out, struct ESYS_CONTEXT *esys_ctx, botan_rng_t rng)
int botan_tpm2_rng_init (botan_rng_t *rng_out, botan_tpm2_ctx_t ctx, botan_tpm2_session_t s1, botan_tpm2_session_t s2, botan_tpm2_session_t s3)
int botan_tpm2_session_destroy (botan_tpm2_session_t session)
int botan_tpm2_supports_crypto_backend (void)
int botan_tpm2_unauthenticated_session_init (botan_tpm2_session_t *session_out, botan_tpm2_ctx_t ctx)
uint32_t botan_version_datestamp (void)
uint32_t botan_version_major (void)
uint32_t botan_version_minor (void)
uint32_t botan_version_patch (void)
const char * botan_version_string (void)
int botan_x509_cert_allowed_extended_usage_oid (botan_x509_cert_t cert, botan_asn1_oid_t oid)
int botan_x509_cert_allowed_extended_usage_str (botan_x509_cert_t cert, const char *oid)
int botan_x509_cert_allowed_usage (botan_x509_cert_t cert, unsigned int key_usage)
int botan_x509_cert_destroy (botan_x509_cert_t cert)
int botan_x509_cert_dup (botan_x509_cert_t *new_cert, botan_x509_cert_t cert)
int botan_x509_cert_excluded_name_constraints (botan_x509_cert_t cert, size_t index, botan_x509_general_name_t *constraint)
int botan_x509_cert_excluded_name_constraints_count (botan_x509_cert_t cert, size_t *count)
int botan_x509_cert_get_authority_key_id (botan_x509_cert_t cert, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_fingerprint (botan_x509_cert_t cert, const char *hash, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_issuer_dn (botan_x509_cert_t cert, const char *key, size_t index, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_issuer_dn_count (botan_x509_cert_t cert, const char *key, size_t *count)
int botan_x509_cert_get_path_length_constraint (botan_x509_cert_t cert, size_t *path_limit)
int botan_x509_cert_get_public_key (botan_x509_cert_t cert, botan_pubkey_t *key)
int botan_x509_cert_get_public_key_bits (botan_x509_cert_t cert, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_serial_number (botan_x509_cert_t cert, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_subject_dn (botan_x509_cert_t cert, const char *key, size_t index, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_subject_dn_count (botan_x509_cert_t cert, const char *key, size_t *count)
int botan_x509_cert_get_subject_key_id (botan_x509_cert_t cert, uint8_t out[], size_t *out_len)
int botan_x509_cert_get_time_expires (botan_x509_cert_t cert, char out[], size_t *out_len)
int botan_x509_cert_get_time_starts (botan_x509_cert_t cert, char out[], size_t *out_len)
int botan_x509_cert_hostname_match (botan_x509_cert_t cert, const char *hostname)
int botan_x509_cert_is_ca (botan_x509_cert_t cert)
int botan_x509_cert_issuer_alternative_names (botan_x509_cert_t cert, size_t index, botan_x509_general_name_t *alt_name)
int botan_x509_cert_issuer_alternative_names_count (botan_x509_cert_t cert, size_t *count)
int botan_x509_cert_load (botan_x509_cert_t *cert_obj, const uint8_t cert[], size_t cert_len)
int botan_x509_cert_load_file (botan_x509_cert_t *cert_obj, const char *filename)
int botan_x509_cert_not_after (botan_x509_cert_t cert, uint64_t *time_since_epoch)
int botan_x509_cert_not_before (botan_x509_cert_t cert, uint64_t *time_since_epoch)
int botan_x509_cert_permitted_name_constraints (botan_x509_cert_t cert, size_t index, botan_x509_general_name_t *constraint)
int botan_x509_cert_permitted_name_constraints_count (botan_x509_cert_t cert, size_t *count)
int botan_x509_cert_serial_number (botan_x509_cert_t cert, botan_mp_t *serial_number)
int botan_x509_cert_subject_alternative_names (botan_x509_cert_t cert, size_t index, botan_x509_general_name_t *alt_name)
int botan_x509_cert_subject_alternative_names_count (botan_x509_cert_t cert, size_t *count)
int botan_x509_cert_to_string (botan_x509_cert_t cert, char out[], size_t *out_len)
const char * botan_x509_cert_validation_status (int code)
int botan_x509_cert_verify (int *validation_result, botan_x509_cert_t cert, const botan_x509_cert_t *intermediates, size_t intermediates_len, const botan_x509_cert_t *trusted, size_t trusted_len, const char *trusted_path, size_t required_strength, const char *hostname, uint64_t reference_time)
int botan_x509_cert_verify_with_crl (int *validation_result, botan_x509_cert_t cert, const botan_x509_cert_t *intermediates, size_t intermediates_len, const botan_x509_cert_t *trusted, size_t trusted_len, const botan_x509_crl_t *crls, size_t crls_len, const char *trusted_path, size_t required_strength, const char *hostname, uint64_t reference_time)
int botan_x509_cert_view_as_string (botan_x509_cert_t cert, botan_view_ctx ctx, botan_view_str_fn view)
int botan_x509_cert_view_binary_values (botan_x509_cert_t cert, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_x509_cert_view_binary_values_count (botan_x509_cert_t cert, botan_x509_value_type value_type, size_t *count)
int botan_x509_cert_view_public_key_bits (botan_x509_cert_t cert, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_x509_cert_view_string_values (botan_x509_cert_t cert, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_str_fn view)
int botan_x509_cert_view_string_values_count (botan_x509_cert_t cert, botan_x509_value_type value_type, size_t *count)
int botan_x509_crl_create (botan_x509_crl_t *crl_obj, botan_rng_t rng, botan_x509_cert_t ca_cert, botan_privkey_t ca_key, uint64_t issue_time, uint32_t next_update, const char *hash_fn, const char *padding)
int botan_x509_crl_destroy (botan_x509_crl_t crl)
int botan_x509_crl_entries (botan_x509_crl_t crl, size_t index, botan_x509_crl_entry_t *entry)
int botan_x509_crl_entries_count (botan_x509_crl_t crl, size_t *count)
int botan_x509_crl_entry_create (botan_x509_crl_entry_t *entry, botan_x509_cert_t cert, int reason_code)
int botan_x509_crl_entry_destroy (botan_x509_crl_entry_t entry)
int botan_x509_crl_entry_reason (botan_x509_crl_entry_t entry, int *reason_code)
int botan_x509_crl_entry_revocation_date (botan_x509_crl_entry_t entry, uint64_t *time_since_epoch)
int botan_x509_crl_entry_serial_number (botan_x509_crl_entry_t entry, botan_mp_t *serial_number)
int botan_x509_crl_entry_view_serial_number (botan_x509_crl_entry_t entry, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_x509_crl_load (botan_x509_crl_t *crl_obj, const uint8_t crl_bits[], size_t crl_bits_len)
int botan_x509_crl_load_file (botan_x509_crl_t *crl_obj, const char *crl_path)
int botan_x509_crl_next_update (botan_x509_crl_t crl, uint64_t *time_since_epoch)
int botan_x509_crl_this_update (botan_x509_crl_t crl, uint64_t *time_since_epoch)
int botan_x509_crl_update (botan_x509_crl_t *crl_obj, botan_x509_crl_t last_crl, botan_rng_t rng, botan_x509_cert_t ca_cert, botan_privkey_t ca_key, uint64_t issue_time, uint32_t next_update, const botan_x509_crl_entry_t *new_entries, size_t new_entries_len, const char *hash_fn, const char *padding)
int botan_x509_crl_verify_signature (botan_x509_crl_t crl, botan_pubkey_t key)
int botan_x509_crl_view_binary_values (botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_x509_crl_view_binary_values_count (botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t *count)
int botan_x509_crl_view_string_values (botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_str_fn view)
int botan_x509_crl_view_string_values_count (botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t *count)
int botan_x509_general_name_destroy (botan_x509_general_name_t alt_names)
int botan_x509_general_name_get_type (botan_x509_general_name_t name, unsigned int *type)
int botan_x509_general_name_view_binary_value (botan_x509_general_name_t name, botan_view_ctx ctx, botan_view_bin_fn view)
int botan_x509_general_name_view_string_value (botan_x509_general_name_t name, botan_view_ctx ctx, botan_view_str_fn view)
int botan_x509_is_revoked (botan_x509_crl_t crl, botan_x509_cert_t cert)
int botan_xof_accepts_input (botan_xof_t xof)
int botan_xof_block_size (botan_xof_t xof, size_t *block_size)
int botan_xof_clear (botan_xof_t xof)
int botan_xof_copy_state (botan_xof_t *dest, botan_xof_t source)
int botan_xof_destroy (botan_xof_t xof)
int botan_xof_init (botan_xof_t *xof, const char *xof_name, uint32_t flags)
int botan_xof_name (botan_xof_t xof, char *name, size_t *name_len)
int botan_xof_output (botan_xof_t xof, uint8_t *out, size_t out_len)
int botan_xof_update (botan_xof_t xof, const uint8_t *in, size_t in_len)
int botan_zfec_decode (size_t K, size_t N, const size_t *indexes, uint8_t *const *inputs, size_t shareSize, uint8_t **outputs)
int botan_zfec_encode (size_t K, size_t N, const uint8_t *input, size_t size, uint8_t **outputs)

Detailed Description

Public Header.

Definition in file ffi.h.

Macro Definition Documentation

◆ BOTAN_CHECK_KEY_EXPENSIVE_TESTS

#define BOTAN_CHECK_KEY_EXPENSIVE_TESTS   1

Definition at line 1587 of file ffi.h.

Referenced by botan_privkey_check_key(), and botan_pubkey_check_key().

◆ BOTAN_CIPHER_INIT_FLAG_DECRYPT

#define BOTAN_CIPHER_INIT_FLAG_DECRYPT   1

Definition at line 670 of file ffi.h.

◆ BOTAN_CIPHER_INIT_FLAG_ENCRYPT

#define BOTAN_CIPHER_INIT_FLAG_ENCRYPT   0

Definition at line 669 of file ffi.h.

Referenced by botan_cipher_init().

◆ BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION

#define BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION   1

Definition at line 668 of file ffi.h.

Referenced by botan_cipher_init().

◆ BOTAN_CIPHER_UPDATE_FLAG_FINAL

#define BOTAN_CIPHER_UPDATE_FLAG_FINAL   (1U << 0)

Definition at line 763 of file ffi.h.

Referenced by botan_cipher_update().

◆ BOTAN_FFI_API_VERSION

#define BOTAN_FFI_API_VERSION   20260506

The compile time API version. This matches the value of botan_ffi_api_version. This can be used for compile-time checking if a particular feature is available.

Note this same value is also reflected in BOTAN_HAS_FFI in build.h, however that declaration is not visible here since this header is intentionally free-standing, depending only on a few C standard library headers.

Definition at line 73 of file ffi.h.

◆ BOTAN_FFI_DEPRECATED

#define BOTAN_FFI_DEPRECATED ( msg)

Definition at line 106 of file ffi.h.

◆ BOTAN_FFI_EXPORT

#define BOTAN_FFI_EXPORT ( maj,
min )

BOTAN_FFI_EXPORT indicates public FFI functions.

The arguments to the macro are to indicate the version that that particular FFI function was first available

Definition at line 91 of file ffi.h.

Referenced by botan_srp6_server_session_step1().

◆ BOTAN_FFI_HEX_LOWER_CASE

#define BOTAN_FFI_HEX_LOWER_CASE   1

Flag that can be provided to botan_hex_encode to request lower case hex

Definition at line 249 of file ffi.h.

Referenced by botan_hex_encode().

◆ BOTAN_FPE_FLAG_FE1_COMPAT_MODE

#define BOTAN_FPE_FLAG_FE1_COMPAT_MODE   1

Definition at line 3008 of file ffi.h.

Referenced by botan_fpe_fe1_init().

◆ BOTAN_PRIVKEY_EXPORT_FLAG_DER

◆ BOTAN_PRIVKEY_EXPORT_FLAG_PEM

◆ BOTAN_PRIVKEY_EXPORT_FLAG_RAW

#define BOTAN_PRIVKEY_EXPORT_FLAG_RAW   2

Definition at line 1659 of file ffi.h.

Referenced by botan_privkey_export(), and botan_pubkey_export().

◆ BOTAN_PUBKEY_DER_FORMAT_SIGNATURE

#define BOTAN_PUBKEY_DER_FORMAT_SIGNATURE   1

Typedef Documentation

◆ botan_asn1_oid_t

typedef struct botan_asn1_oid_struct* botan_asn1_oid_t

Definition at line 1253 of file ffi.h.

◆ botan_block_cipher_t

typedef struct botan_block_cipher_struct* botan_block_cipher_t

Definition at line 966 of file ffi.h.

◆ botan_cipher_t

typedef struct botan_cipher_struct* botan_cipher_t

Definition at line 666 of file ffi.h.

◆ botan_ec_group_t

typedef struct botan_ec_group_struct* botan_ec_group_t

Definition at line 1302 of file ffi.h.

◆ botan_ec_point_t

typedef struct botan_ec_point_struct* botan_ec_point_t

Definition at line 1447 of file ffi.h.

◆ botan_ec_scalar_t

typedef struct botan_ec_scalar_struct* botan_ec_scalar_t

Definition at line 1446 of file ffi.h.

◆ botan_fpe_t

typedef struct botan_fpe_struct* botan_fpe_t

Format Preserving Encryption

Definition at line 3006 of file ffi.h.

◆ botan_hash_t

typedef struct botan_hash_struct* botan_hash_t

Definition at line 490 of file ffi.h.

◆ botan_hotp_t

typedef struct botan_hotp_struct* botan_hotp_t

HOTP

Definition at line 2934 of file ffi.h.

◆ botan_mac_t

typedef struct botan_mac_struct* botan_mac_t

Definition at line 570 of file ffi.h.

◆ botan_mp_t

typedef struct botan_mp_struct* botan_mp_t

Definition at line 1032 of file ffi.h.

◆ botan_pk_op_decrypt_t

typedef struct botan_pk_op_decrypt_struct* botan_pk_op_decrypt_t

Definition at line 2202 of file ffi.h.

◆ botan_pk_op_encrypt_t

typedef struct botan_pk_op_encrypt_struct* botan_pk_op_encrypt_t

Definition at line 2178 of file ffi.h.

◆ botan_pk_op_ka_t

typedef struct botan_pk_op_ka_struct* botan_pk_op_ka_t

Definition at line 2264 of file ffi.h.

◆ botan_pk_op_kem_decrypt_t

typedef struct botan_pk_op_kem_decrypt_struct* botan_pk_op_kem_decrypt_t

Definition at line 2323 of file ffi.h.

◆ botan_pk_op_kem_encrypt_t

typedef struct botan_pk_op_kem_encrypt_struct* botan_pk_op_kem_encrypt_t

Definition at line 2293 of file ffi.h.

◆ botan_pk_op_sign_t

typedef struct botan_pk_op_sign_struct* botan_pk_op_sign_t

Definition at line 2225 of file ffi.h.

◆ botan_pk_op_verify_t

typedef struct botan_pk_op_verify_struct* botan_pk_op_verify_t

Definition at line 2245 of file ffi.h.

◆ botan_privkey_t

typedef struct botan_privkey_struct* botan_privkey_t

Definition at line 1564 of file ffi.h.

◆ botan_pubkey_t

typedef struct botan_pubkey_struct* botan_pubkey_t

Definition at line 1797 of file ffi.h.

◆ botan_rng_t

typedef struct botan_rng_struct* botan_rng_t

RNG type

Definition at line 291 of file ffi.h.

◆ botan_srp6_server_session_t

typedef struct botan_srp6_server_session_struct* botan_srp6_server_session_t

SRP-6 Server Session type

Definition at line 3029 of file ffi.h.

◆ botan_totp_t

typedef struct botan_totp_struct* botan_totp_t

TOTP

Definition at line 2966 of file ffi.h.

◆ botan_tpm2_crypto_backend_state_t

typedef struct botan_tpm2_crypto_backend_state_struct* botan_tpm2_crypto_backend_state_t

TPM2 crypto backend state object

Definition at line 3197 of file ffi.h.

◆ botan_tpm2_ctx_t

typedef struct botan_tpm2_ctx_struct* botan_tpm2_ctx_t

TPM2 context

Definition at line 3187 of file ffi.h.

◆ botan_tpm2_session_t

typedef struct botan_tpm2_session_struct* botan_tpm2_session_t

TPM2 session

Definition at line 3192 of file ffi.h.

◆ botan_view_bin_fn

typedef int(* botan_view_bin_fn) (botan_view_ctx view_ctx, const uint8_t *data, size_t len)

Viewer function for binary data

Parameters
view_ctxsome application context
datathe binary data
lenthe length of data in bytes

Definition at line 163 of file ffi.h.

◆ botan_view_ctx

typedef void* botan_view_ctx

The application provided context for a view function

Definition at line 154 of file ffi.h.

◆ botan_view_str_fn

typedef int(* botan_view_str_fn) (botan_view_ctx view_ctx, const char *str, size_t len)

Viewer function for string data

Parameters
view_ctxsome application context
strthe null terminated string
lenthe length of string including the null terminator

Definition at line 172 of file ffi.h.

◆ botan_x509_cert_t

typedef struct botan_x509_cert_struct* botan_x509_cert_t

Definition at line 2387 of file ffi.h.

◆ botan_x509_crl_entry_t

typedef struct botan_x509_crl_entry_struct* botan_x509_crl_entry_t

Definition at line 2702 of file ffi.h.

◆ botan_x509_crl_t

typedef struct botan_x509_crl_struct* botan_x509_crl_t

Definition at line 2701 of file ffi.h.

◆ botan_x509_general_name_t

typedef struct botan_x509_general_name_struct* botan_x509_general_name_t

Definition at line 2570 of file ffi.h.

◆ botan_xof_t

typedef struct botan_xof_struct* botan_xof_t

Definition at line 412 of file ffi.h.

Enumeration Type Documentation

◆ BOTAN_FFI_ERROR

Error codes

If you add a new value here be sure to also add it in botan_error_description

Enumerator
BOTAN_FFI_SUCCESS 
BOTAN_FFI_INVALID_VERIFIER 
BOTAN_FFI_ERROR_INVALID_INPUT 
BOTAN_FFI_ERROR_BAD_MAC 
BOTAN_FFI_ERROR_NO_VALUE 
BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE 
BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR 
BOTAN_FFI_ERROR_EXCEPTION_THROWN 
BOTAN_FFI_ERROR_OUT_OF_MEMORY 
BOTAN_FFI_ERROR_SYSTEM_ERROR 
BOTAN_FFI_ERROR_INTERNAL_ERROR 
BOTAN_FFI_ERROR_BAD_FLAG 
BOTAN_FFI_ERROR_NULL_POINTER 
BOTAN_FFI_ERROR_BAD_PARAMETER 
BOTAN_FFI_ERROR_KEY_NOT_SET 
BOTAN_FFI_ERROR_INVALID_KEY_LENGTH 
BOTAN_FFI_ERROR_INVALID_OBJECT_STATE 
BOTAN_FFI_ERROR_OUT_OF_RANGE 
BOTAN_FFI_ERROR_NOT_IMPLEMENTED 
BOTAN_FFI_ERROR_INVALID_OBJECT 
BOTAN_FFI_ERROR_TLS_ERROR 
BOTAN_FFI_ERROR_HTTP_ERROR 
BOTAN_FFI_ERROR_ROUGHTIME_ERROR 
BOTAN_FFI_ERROR_TPM_ERROR 
BOTAN_FFI_ERROR_UNKNOWN_ERROR 

Definition at line 115 of file ffi.h.

115 {
117
119
123
126
131
139
142
147
149};
@ BOTAN_FFI_ERROR_TPM_ERROR
Definition ffi.h:146
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:140
@ BOTAN_FFI_ERROR_INVALID_KEY_LENGTH
Definition ffi.h:136
@ BOTAN_FFI_ERROR_KEY_NOT_SET
Definition ffi.h:135
@ BOTAN_FFI_ERROR_TLS_ERROR
Definition ffi.h:143
@ BOTAN_FFI_ERROR_EXCEPTION_THROWN
Definition ffi.h:127
@ BOTAN_FFI_ERROR_OUT_OF_MEMORY
Definition ffi.h:128
@ BOTAN_FFI_ERROR_OUT_OF_RANGE
Definition ffi.h:138
@ BOTAN_FFI_ERROR_INTERNAL_ERROR
Definition ffi.h:130
@ BOTAN_FFI_INVALID_VERIFIER
Definition ffi.h:118
@ BOTAN_FFI_ERROR_INVALID_OBJECT
Definition ffi.h:141
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
Definition ffi.h:148
@ BOTAN_FFI_ERROR_HTTP_ERROR
Definition ffi.h:144
@ BOTAN_FFI_ERROR_BAD_FLAG
Definition ffi.h:132
@ BOTAN_FFI_ERROR_INVALID_INPUT
Definition ffi.h:120
@ BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR
Definition ffi.h:125
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition ffi.h:133
@ BOTAN_FFI_SUCCESS
Definition ffi.h:116
@ BOTAN_FFI_ERROR_SYSTEM_ERROR
Definition ffi.h:129
@ BOTAN_FFI_ERROR_ROUGHTIME_ERROR
Definition ffi.h:145
@ BOTAN_FFI_ERROR_NO_VALUE
Definition ffi.h:122
@ BOTAN_FFI_ERROR_INVALID_OBJECT_STATE
Definition ffi.h:137
@ BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
Definition ffi.h:124
@ BOTAN_FFI_ERROR_BAD_MAC
Definition ffi.h:121
@ BOTAN_FFI_ERROR_BAD_PARAMETER
Definition ffi.h:134

◆ botan_x509_cert_key_constraints

Enumerator
NO_CONSTRAINTS 
DIGITAL_SIGNATURE 
NON_REPUDIATION 
KEY_ENCIPHERMENT 
DATA_ENCIPHERMENT 
KEY_AGREEMENT 
KEY_CERT_SIGN 
CRL_SIGN 
ENCIPHER_ONLY 
DECIPHER_ONLY 

Definition at line 2529 of file ffi.h.

2529 {
2530 NO_CONSTRAINTS = 0,
2531 DIGITAL_SIGNATURE = 32768,
2532 NON_REPUDIATION = 16384,
2533 KEY_ENCIPHERMENT = 8192,
2534 DATA_ENCIPHERMENT = 4096,
2535 KEY_AGREEMENT = 2048,
2536 KEY_CERT_SIGN = 1024,
2537 CRL_SIGN = 512,
2538 ENCIPHER_ONLY = 256,
2539 DECIPHER_ONLY = 128
2540};
@ KEY_ENCIPHERMENT
Definition ffi.h:2533
@ NO_CONSTRAINTS
Definition ffi.h:2530
@ CRL_SIGN
Definition ffi.h:2537
@ DIGITAL_SIGNATURE
Definition ffi.h:2531
@ KEY_AGREEMENT
Definition ffi.h:2535
@ DATA_ENCIPHERMENT
Definition ffi.h:2534
@ KEY_CERT_SIGN
Definition ffi.h:2536
@ ENCIPHER_ONLY
Definition ffi.h:2538
@ NON_REPUDIATION
Definition ffi.h:2532
@ DECIPHER_ONLY
Definition ffi.h:2539

◆ botan_x509_crl_reason_code

Enumerator
BOTAN_CRL_ENTRY_UNSPECIFIED 
BOTAN_CRL_ENTRY_KEY_COMPROMISE 
BOTAN_CRL_ENTRY_CA_COMPROMISE 
BOTAN_CRL_ENTRY_AFFILIATION_CHANGED 
BOTAN_CRL_ENTRY_SUPERSEDED 
BOTAN_CRL_ENTRY_CESSATION_OF_OPERATION 
BOTAN_CRL_ENTRY_CERTIFICATE_HOLD 
BOTAN_CRL_ENTRY_REMOVE_FROM_CRL 
BOTAN_CRL_ENTRY_PRIVILEGE_WITHDRAWN 
BOTAN_CRL_ENTRY_AA_COMPROMISE 

Definition at line 2733 of file ffi.h.

2733 {
2744};
@ BOTAN_CRL_ENTRY_PRIVILEGE_WITHDRAWN
Definition ffi.h:2742
@ BOTAN_CRL_ENTRY_UNSPECIFIED
Definition ffi.h:2734
@ BOTAN_CRL_ENTRY_SUPERSEDED
Definition ffi.h:2738
@ BOTAN_CRL_ENTRY_CERTIFICATE_HOLD
Definition ffi.h:2740
@ BOTAN_CRL_ENTRY_CESSATION_OF_OPERATION
Definition ffi.h:2739
@ BOTAN_CRL_ENTRY_CA_COMPROMISE
Definition ffi.h:2736
@ BOTAN_CRL_ENTRY_REMOVE_FROM_CRL
Definition ffi.h:2741
@ BOTAN_CRL_ENTRY_AA_COMPROMISE
Definition ffi.h:2743
@ BOTAN_CRL_ENTRY_KEY_COMPROMISE
Definition ffi.h:2735
@ BOTAN_CRL_ENTRY_AFFILIATION_CHANGED
Definition ffi.h:2737

◆ botan_x509_general_name_types

GeneralName type identifiers as defined in RFC 5280 A.2 (GeneralName ::= CHOICE) Type identifiers that are omitted here are (currently) not supported. Also, there is currently no way to access OTHER_NAME values via the FFI.

Enumerator
BOTAN_X509_OTHER_NAME 
BOTAN_X509_EMAIL_ADDRESS 
BOTAN_X509_DNS_NAME 
BOTAN_X509_DIRECTORY_NAME 
BOTAN_X509_URI 
BOTAN_X509_IP_ADDRESS 

Definition at line 2577 of file ffi.h.

2577 {
2582 BOTAN_X509_URI = 6,
2584};
@ BOTAN_X509_DNS_NAME
Definition ffi.h:2580
@ BOTAN_X509_DIRECTORY_NAME
Definition ffi.h:2581
@ BOTAN_X509_OTHER_NAME
Definition ffi.h:2578
@ BOTAN_X509_EMAIL_ADDRESS
Definition ffi.h:2579
@ BOTAN_X509_IP_ADDRESS
Definition ffi.h:2583
@ BOTAN_X509_URI
Definition ffi.h:2582

◆ botan_x509_value_type

Generic values that may be retrieved from X.509 certificates or CRLs via the generic getter functions.

When extending this list the existing entries must stay backward-compatible to remain ABI compatible across versions. Therefore, new values must be added to the end of this list.

See:

Enumerator
BOTAN_X509_SERIAL_NUMBER 
BOTAN_X509_SUBJECT_DN_BITS 

singleton binary big-endian encoding

BOTAN_X509_ISSUER_DN_BITS 

singleton binary DER encoding of the subject distinguished name

BOTAN_X509_SUBJECT_KEY_IDENTIFIER 

singleton binary DER encoding of the issuer distinguished name

BOTAN_X509_AUTHORITY_KEY_IDENTIFIER 

singleton binary encoding

BOTAN_X509_PUBLIC_KEY_PKCS8_BITS 

singleton binary encoding

BOTAN_X509_TBS_DATA_BITS 

singleton binary DER encoding of the PKCS#8 public key

BOTAN_X509_SIGNATURE_SCHEME_BITS 

singleton binary DER encoding

BOTAN_X509_SIGNATURE_BITS 

singleton binary DER encoding of the algorithm identifier

BOTAN_X509_DER_ENCODING 

singleton binary signature bits

BOTAN_X509_PEM_ENCODING 

singleton binary DER encoding of the whole object

BOTAN_X509_CRL_DISTRIBUTION_URLS 

singleton string value PEM encoding of the whole object

BOTAN_X509_OCSP_RESPONDER_URLS 

multi-value string of the CRL distribution points

BOTAN_X509_CA_ISSUERS_URLS 

multi-value string of the OCSP responder URLs

Definition at line 2402 of file ffi.h.

2402 {
2403 BOTAN_X509_SERIAL_NUMBER = 0, /** singleton binary big-endian encoding */
2404 BOTAN_X509_SUBJECT_DN_BITS = 1, /** singleton binary DER encoding of the subject distinguished name */
2405 BOTAN_X509_ISSUER_DN_BITS = 2, /** singleton binary DER encoding of the issuer distinguished name */
2406 BOTAN_X509_SUBJECT_KEY_IDENTIFIER = 3, /** singleton binary encoding */
2407 BOTAN_X509_AUTHORITY_KEY_IDENTIFIER = 4, /** singleton binary encoding */
2408
2409 BOTAN_X509_PUBLIC_KEY_PKCS8_BITS = 200, /** singleton binary DER encoding of the PKCS#8 public key */
2410 BOTAN_X509_TBS_DATA_BITS = 201, /** singleton binary DER encoding */
2411 BOTAN_X509_SIGNATURE_SCHEME_BITS = 202, /** singleton binary DER encoding of the algorithm identifier */
2412 BOTAN_X509_SIGNATURE_BITS = 203, /** singleton binary signature bits */
2413
2414 BOTAN_X509_DER_ENCODING = 300, /** singleton binary DER encoding of the whole object */
2415 BOTAN_X509_PEM_ENCODING = 301, /** singleton string value PEM encoding of the whole object */
2416
2417 BOTAN_X509_CRL_DISTRIBUTION_URLS = 400, /** multi-value string of the CRL distribution points */
2418 BOTAN_X509_OCSP_RESPONDER_URLS = 401, /** multi-value string of the OCSP responder URLs */
2419 BOTAN_X509_CA_ISSUERS_URLS = 402, /** multi-value string of the CA issuer URLs */
botan_x509_value_type
Definition ffi.h:2402
@ BOTAN_X509_AUTHORITY_KEY_IDENTIFIER
Definition ffi.h:2407
@ BOTAN_X509_SUBJECT_KEY_IDENTIFIER
Definition ffi.h:2406
@ BOTAN_X509_TBS_DATA_BITS
Definition ffi.h:2410
@ BOTAN_X509_SIGNATURE_BITS
Definition ffi.h:2412
@ BOTAN_X509_PUBLIC_KEY_PKCS8_BITS
Definition ffi.h:2409
@ BOTAN_X509_DER_ENCODING
Definition ffi.h:2414
@ BOTAN_X509_PEM_ENCODING
Definition ffi.h:2415
@ BOTAN_X509_OCSP_RESPONDER_URLS
Definition ffi.h:2418
@ BOTAN_X509_SIGNATURE_SCHEME_BITS
Definition ffi.h:2411
@ BOTAN_X509_SUBJECT_DN_BITS
Definition ffi.h:2404
@ BOTAN_X509_CRL_DISTRIBUTION_URLS
Definition ffi.h:2417
@ BOTAN_X509_SERIAL_NUMBER
Definition ffi.h:2403
@ BOTAN_X509_ISSUER_DN_BITS
Definition ffi.h:2405
@ BOTAN_X509_CA_ISSUERS_URLS
Definition ffi.h:2419

Function Documentation

◆ botan_base64_decode()

int botan_base64_decode ( const char * base64_str,
size_t in_len,
uint8_t * out,
size_t * out_len )

Perform base64 decoding

Definition at line 370 of file ffi.cpp.

370 {
371 if(any_null_pointers(out, out_len, base64_str)) {
373 }
374
375 return ffi_guard_thunk(__func__, [=]() -> int {
376 if(*out_len < Botan::base64_decode_max_output(in_len)) {
377 *out_len = Botan::base64_decode_max_output(in_len);
379 }
380
381 *out_len = Botan::base64_decode(out, std::string(base64_str, in_len));
382 return BOTAN_FFI_SUCCESS;
383 });
384}
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95
bool any_null_pointers(Ptrs... ptr)
Definition mem_utils.h:54
size_t base64_decode(uint8_t out[], const char in[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
Definition base64.cpp:167
size_t base64_decode_max_output(size_t input_length)
Definition base64.cpp:199

References Botan_FFI::any_null_pointers(), Botan::base64_decode(), Botan::base64_decode_max_output(), BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and Botan_FFI::ffi_guard_thunk().

◆ botan_base64_encode()

int botan_base64_encode ( const uint8_t * x,
size_t len,
char * out,
size_t * out_len )

Perform base64 encoding

Parameters
xthe input data
lenthe length of x
outthe output buffer
out_lenthe size of the output buffer on input, set to the number of bytes written
Returns
0 on success, a negative value on failure

Definition at line 360 of file ffi.cpp.

360 {
361 if(len > 0 && in == nullptr) {
363 }
364 return ffi_guard_thunk(__func__, [=]() -> int {
365 const std::string base64 = Botan::base64_encode(in, len);
366 return Botan_FFI::write_str_output(out, out_len, base64);
367 });
368}
int write_str_output(char out[], size_t *out_len, const std::string &str)
Definition ffi_util.h:268
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
Definition base64.cpp:159

References Botan::base64_encode(), BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::write_str_output().

◆ botan_bcrypt_generate()

int botan_bcrypt_generate ( uint8_t * out,
size_t * out_len,
const char * password,
botan_rng_t rng,
size_t work_factor,
uint32_t flags )

Create a password hash using Bcrypt

Parameters
outbuffer holding the password hash, should be of length 64 bytes
out_lenthe desired output length in bytes
passwordthe password
Random Number Generatorsa random number generator
work_factorhow much work to do to slow down guessing attacks
flagsshould be 0 in current API revision, all other uses are reserved and return BOTAN_FFI_ERROR_BAD_FLAG
Returns
0 on success, a negative value on failure

Output is formatted bcrypt $2a$...

TOD(Botan4) this should use char for the type of out

Definition at line 177 of file ffi_kdf.cpp.

178 {
179#if defined(BOTAN_HAS_BCRYPT)
180 return ffi_guard_thunk(__func__, [=]() -> int {
181 if(out == nullptr || out_len == nullptr || pass == nullptr) {
183 }
184
185 if(flags != 0) {
187 }
188
189 if(wf < 4 || wf > 18) {
191 }
192
193 if(*out_len < 61) {
194 *out_len = 61;
196 }
197
199 const std::string bcrypt = Botan::generate_bcrypt(pass, rng, static_cast<uint16_t>(wf));
200 // TODO(Botan4) change the type of out and remove this cast
201 return write_str_output(reinterpret_cast<char*>(out), out_len, bcrypt);
202 });
203#else
204 BOTAN_UNUSED(out, out_len, pass, rng_obj, wf, flags);
206#endif
207}
#define BOTAN_UNUSED
Definition assert.h:144
T & safe_get(botan_struct< T, M > *p)
Definition ffi_util.h:79
std::string generate_bcrypt(std::string_view pass, RandomNumberGenerator &rng, uint16_t work_factor, char version)
Definition bcrypt.cpp:146

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan::generate_bcrypt(), Botan_FFI::safe_get(), and Botan_FFI::write_str_output().

◆ botan_bcrypt_is_valid()

int botan_bcrypt_is_valid ( const char * pass,
const char * hash )

Check a previously created password hash

Parameters
passthe password to check against
Hashesthe stored hash to check against
Returns
0 if if this password/hash combination is valid, 1 if the combination is not valid (but otherwise well formed), negative on error

Definition at line 209 of file ffi_kdf.cpp.

209 {
210 if(any_null_pointers(pass, hash)) {
212 }
213#if defined(BOTAN_HAS_BCRYPT)
214 return ffi_guard_thunk(__func__, [=]() -> int {
216 });
217#else
218 BOTAN_UNUSED(pass, hash);
220#endif
221}
bool check_bcrypt(std::string_view pass, std::string_view hash)
Definition bcrypt.cpp:161

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_INVALID_VERIFIER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan::check_bcrypt(), and Botan_FFI::ffi_guard_thunk().

◆ botan_block_cipher_block_size()

int botan_block_cipher_block_size ( botan_block_cipher_t bc)

Return the positive block size of this block cipher, or negative to indicate an error

Definition at line 60 of file ffi_block.cpp.

60 {
61 return BOTAN_FFI_VISIT(bc, [](const auto& b) { return static_cast<int>(b.block_size()); });
62}
#define BOTAN_FFI_VISIT(obj, lambda)
Definition ffi_util.h:158

References BOTAN_FFI_VISIT.

◆ botan_block_cipher_clear()

int botan_block_cipher_clear ( botan_block_cipher_t bc)

Reinitializes the block cipher

Returns
0 on success, a negative value on failure

Definition at line 42 of file ffi_block.cpp.

42 {
43 return BOTAN_FFI_VISIT(bc, [](auto& b) { b.clear(); });
44}

References BOTAN_FFI_VISIT.

◆ botan_block_cipher_decrypt_blocks()

int botan_block_cipher_decrypt_blocks ( botan_block_cipher_t bc,
const uint8_t in[],
uint8_t out[],
size_t blocks )

Decrypt one or more blocks with the cipher

Definition at line 71 of file ffi_block.cpp.

71 {
72 if(in == nullptr || out == nullptr) {
74 }
75 return BOTAN_FFI_VISIT(bc, [=](const auto& b) { b.decrypt_n(in, out, blocks); });
76}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_block_cipher_destroy()

int botan_block_cipher_destroy ( botan_block_cipher_t bc)

Destroy a block cipher object

Returns
0 if success, error if invalid object handle

Destroy a block cipher object

Definition at line 38 of file ffi_block.cpp.

38 {
39 return BOTAN_FFI_CHECKED_DELETE(bc);
40}
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition ffi_util.h:188

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_block_cipher_encrypt_blocks()

int botan_block_cipher_encrypt_blocks ( botan_block_cipher_t bc,
const uint8_t in[],
uint8_t out[],
size_t blocks )

Encrypt one or more blocks with the cipher

Definition at line 64 of file ffi_block.cpp.

64 {
65 if(in == nullptr || out == nullptr) {
67 }
68 return BOTAN_FFI_VISIT(bc, [=](const auto& b) { b.encrypt_n(in, out, blocks); });
69}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_block_cipher_get_keyspec()

int botan_block_cipher_get_keyspec ( botan_block_cipher_t cipher,
size_t * out_minimum_keylength,
size_t * out_maximum_keylength,
size_t * out_keylength_modulo )

Get the key length limits of this block cipher

Parameters
cipherthe object to read
out_minimum_keylengthif non-NULL, will be set to minimum keylength of cipher
out_maximum_keylengthif non-NULL, will be set to maximum keylength of cipher
out_keylength_moduloif non-NULL will be set to byte multiple of valid keys

Definition at line 86 of file ffi_block.cpp.

89 {
90 return BOTAN_FFI_VISIT(cipher, [=](const auto& bc) {
91 if(out_minimum_keylength) {
92 *out_minimum_keylength = bc.minimum_keylength();
93 }
94 if(out_maximum_keylength) {
95 *out_maximum_keylength = bc.maximum_keylength();
96 }
97 if(out_keylength_modulo) {
98 *out_keylength_modulo = bc.key_spec().keylength_multiple();
99 }
100 });
101}

References BOTAN_FFI_VISIT.

◆ botan_block_cipher_init()

int botan_block_cipher_init ( botan_block_cipher_t * bc,
const char * cipher_name )

Initialize a block cipher object

Definition at line 18 of file ffi_block.cpp.

18 {
19 return ffi_guard_thunk(__func__, [=]() -> int {
20 if(bc == nullptr || bc_name == nullptr || *bc_name == 0) {
22 }
23
24 *bc = nullptr;
25
26 auto cipher = Botan::BlockCipher::create(bc_name);
27 if(cipher == nullptr) {
29 }
30
31 return ffi_new_object(bc, std::move(cipher));
32 });
33}
static std::unique_ptr< BlockCipher > create(std::string_view algo_spec, std::string_view provider="")
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
Definition ffi_util.h:178

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan::BlockCipher::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_block_cipher_name()

int botan_block_cipher_name ( botan_block_cipher_t cipher,
char * name,
size_t * name_len )

Get the name of this block cipher

Parameters
cipherthe object to read
nameoutput buffer
name_lenon input, the length of buffer, on success the number of bytes written

Definition at line 78 of file ffi_block.cpp.

78 {
79 if(name_len == nullptr) {
81 }
82
83 return BOTAN_FFI_VISIT(cipher, [=](const auto& bc) { return write_str_output(name, name_len, bc.name()); });
84}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_block_cipher_set_key()

int botan_block_cipher_set_key ( botan_block_cipher_t bc,
const uint8_t key[],
size_t len )

Set the key for a block cipher instance

Definition at line 49 of file ffi_block.cpp.

49 {
50 if(key == nullptr) {
52 }
53 return BOTAN_FFI_VISIT(bc, [=](auto& b) { b.set_key(key, len); });
54}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_clear()

int botan_cipher_clear ( botan_cipher_t hash)

Reset the key, nonce, AD and all other state on this cipher object

Definition at line 123 of file ffi_cipher.cpp.

123 {
124 return BOTAN_FFI_VISIT(cipher, [=](auto& c) {
125 cipher->buf().clear();
126 c.clear();
127 });
128}

References BOTAN_FFI_VISIT.

◆ botan_cipher_destroy()

int botan_cipher_destroy ( botan_cipher_t cipher)

Destroy the cipher object

Returns
0 if success, error if invalid object handle

Definition at line 119 of file ffi_cipher.cpp.

119 {
120 return BOTAN_FFI_CHECKED_DELETE(cipher);
121}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_cipher_get_default_nonce_length()

int botan_cipher_get_default_nonce_length ( botan_cipher_t cipher,
size_t * nl )

Get the default nonce length of this cipher

Definition at line 324 of file ffi_cipher.cpp.

324 {
325 if(nl == nullptr) {
327 }
328 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { *nl = c.default_nonce_length(); });
329}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_get_ideal_update_granularity()

int botan_cipher_get_ideal_update_granularity ( botan_cipher_t cipher,
size_t * ug )

Return the ideal update granularity of the cipher. This is some multiple of the update granularity, reflecting possibilities for optimization.

Definition at line 338 of file ffi_cipher.cpp.

338 {
339 if(ug == nullptr) {
341 }
342 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { *ug = c.ideal_granularity(); });
343}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_get_keyspec()

int botan_cipher_get_keyspec ( botan_cipher_t cipher,
size_t * min_keylen,
size_t * max_keylen,
size_t * mod_keylen )

Get information about the supported key lengths.

Definition at line 156 of file ffi_cipher.cpp.

159 {
160 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) {
161 if(out_minimum_keylength) {
162 *out_minimum_keylength = c.key_spec().minimum_keylength();
163 }
164 if(out_maximum_keylength) {
165 *out_maximum_keylength = c.key_spec().maximum_keylength();
166 }
167 if(out_keylength_modulo) {
168 *out_keylength_modulo = c.key_spec().keylength_multiple();
169 }
170 });
171}

References BOTAN_FFI_VISIT.

◆ botan_cipher_get_tag_length()

int botan_cipher_get_tag_length ( botan_cipher_t cipher,
size_t * tag_size )

Get the tag length of the cipher (0 for non-AEAD modes)

Definition at line 345 of file ffi_cipher.cpp.

345 {
346 if(tl == nullptr) {
348 }
349 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { *tl = c.tag_size(); });
350}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_get_update_granularity()

int botan_cipher_get_update_granularity ( botan_cipher_t cipher,
size_t * ug )

Return the update granularity of the cipher; botan_cipher_update must be called with blocks of this size, except for the final.

Definition at line 331 of file ffi_cipher.cpp.

331 {
332 if(ug == nullptr) {
334 }
335 return BOTAN_FFI_VISIT(cipher, [=](const auto& /*c*/) { *ug = cipher->update_size(); });
336}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_init()

int botan_cipher_init ( botan_cipher_t * cipher,
const char * name,
uint32_t flags )

Initialize a cipher object

Definition at line 99 of file ffi_cipher.cpp.

99 {
100 return ffi_guard_thunk(__func__, [=]() -> int {
101 if(any_null_pointers(cipher, cipher_name)) {
103 }
106
107 std::unique_ptr<Botan::Cipher_Mode> mode(Botan::Cipher_Mode::create(cipher_name, dir));
108 if(!mode) {
110 }
111
112 const size_t update_size = ffi_choose_update_size(*mode);
113 const size_t ideal_update_size = std::max(mode->ideal_granularity(), update_size);
114
115 return ffi_new_object(cipher, std::move(mode), update_size, ideal_update_size);
116 });
117}
static std::unique_ptr< Cipher_Mode > create(std::string_view algo, Cipher_Dir direction, std::string_view provider="")
#define BOTAN_CIPHER_INIT_FLAG_ENCRYPT
Definition ffi.h:669
#define BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION
Definition ffi.h:668
Flags flags(Flag flags)
Definition p11.h:1227

References Botan_FFI::any_null_pointers(), BOTAN_CIPHER_INIT_FLAG_ENCRYPT, BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan::Cipher_Mode::create(), Botan::Decryption, Botan::Encryption, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_cipher_is_authenticated()

int botan_cipher_is_authenticated ( botan_cipher_t cipher)

Returns 1 iff the cipher provides authentication as well as confidentiality.

Definition at line 352 of file ffi_cipher.cpp.

352 {
353 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { return c.authenticated() ? 1 : 0; });
354}

References BOTAN_FFI_VISIT.

◆ botan_cipher_name()

int botan_cipher_name ( botan_cipher_t cipher,
char * name,
size_t * name_len )

Return the name of the cipher object

Definition at line 360 of file ffi_cipher.cpp.

360 {
361 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { return write_str_output(name, name_len, c.name()); });
362}

References BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_cipher_output_length()

int botan_cipher_output_length ( botan_cipher_t cipher,
size_t in_len,
size_t * out_len )

Return the output length of this cipher, for a particular input length.

Definition at line 137 of file ffi_cipher.cpp.

137 {
138 if(out_len == nullptr) {
140 }
141
142 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { *out_len = c.output_length(in_len); });
143}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_query_keylen()

int botan_cipher_query_keylen ( botan_cipher_t cipher,
size_t * out_minimum_keylength,
size_t * out_maximum_keylength )

Get information about the key lengths. Prefer botan_cipher_get_keyspec

Definition at line 145 of file ffi_cipher.cpp.

145 {
146 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) {
147 if(out_minimum_keylength) {
148 *out_minimum_keylength = c.key_spec().minimum_keylength();
149 }
150 if(out_maximum_keylength) {
151 *out_maximum_keylength = c.key_spec().maximum_keylength();
152 }
153 });
154}

References BOTAN_FFI_VISIT.

◆ botan_cipher_requires_entire_message()

int botan_cipher_requires_entire_message ( botan_cipher_t cipher)

Returns 1 iff the cipher requires the entire message before any encryption or decryption can be performed. No output data will be produced in botan_cipher_update() until the final flag is set.

Definition at line 356 of file ffi_cipher.cpp.

356 {
357 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { return c.requires_entire_message() ? 1 : 0; });
358}

References BOTAN_FFI_VISIT.

◆ botan_cipher_reset()

int botan_cipher_reset ( botan_cipher_t cipher)

Reset the message specific state for this cipher. Without resetting the keys, this resets the nonce, and any state associated with any message bits that have been processed so far.

It is conceptually equivalent to calling botan_cipher_clear followed by botan_cipher_set_key with the original key.

Definition at line 130 of file ffi_cipher.cpp.

130 {
131 return BOTAN_FFI_VISIT(cipher, [=](auto& c) {
132 cipher->buf().clear();
133 c.reset();
134 });
135}

References BOTAN_FFI_VISIT.

◆ botan_cipher_set_associated_data()

int botan_cipher_set_associated_data ( botan_cipher_t cipher,
const uint8_t * ad,
size_t ad_len )

Set the associated data. Will fail if cipher is not an AEAD

Definition at line 310 of file ffi_cipher.cpp.

310 {
311 return BOTAN_FFI_VISIT(cipher, [=](auto& c) {
312 if(Botan::AEAD_Mode* aead = dynamic_cast<Botan::AEAD_Mode*>(&c)) {
313 aead->set_associated_data(ad, ad_len);
314 return BOTAN_FFI_SUCCESS;
315 }
317 });
318}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_cipher_set_key()

int botan_cipher_set_key ( botan_cipher_t cipher,
const uint8_t * key,
size_t key_len )

Set the key for this cipher object

Definition at line 173 of file ffi_cipher.cpp.

173 {
174 if(key_len > 0 && key == nullptr) {
176 }
177 return BOTAN_FFI_VISIT(cipher, [=](auto& c) { c.set_key(key, key_len); });
178}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_cipher_start()

int botan_cipher_start ( botan_cipher_t cipher,
const uint8_t * nonce,
size_t nonce_len )

Begin processing a new message using the provided nonce

Definition at line 180 of file ffi_cipher.cpp.

180 {
181 return ffi_guard_thunk(__func__, [=]() -> int {
182 Botan::Cipher_Mode& cipher = safe_get(cipher_obj);
183 cipher.start(nonce, nonce_len);
184 return BOTAN_FFI_SUCCESS;
185 });
186}
void start(std::span< const uint8_t > nonce)
Definition cipher_mode.h:97

References BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), and Botan::Cipher_Mode::start().

◆ botan_cipher_update()

int botan_cipher_update ( botan_cipher_t cipher,
uint32_t flags,
uint8_t output[],
size_t output_size,
size_t * output_written,
const uint8_t input_bytes[],
size_t input_size,
size_t * input_consumed )

Encrypt/Decrypt some data and/or finalize the encryption/decryption.

This encrypts as many bytes from input_bytes into output_bytes as possible. Unless BOTAN_CIPHER_UPDATE_FLAG_FINAL is set, this function will consume bytes in multiples of botan_cipher_get_update_granularity(). input_consumed and output_written will be set accordingly and it is the caller's responsibility to adapt their buffers accordingly before calling this function again. Note that, unless BOTAN_CIPHER_UPDATE_FLAG_FINAL is set, the cipher will at most generate input_size output bytes.

Eventually, the caller must set the BOTAN_CIPHER_UPDATE_FLAG_FINAL flag to indicate that no more input will be provided. This will cause the cipher to consume all given input bytes and produce the final output; or return a BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE error if the given output buffer was too small. In the latter case, output_written will be set to the required buffer size. Calling again with BOTAN_CIPHER_UPDATE_FLAG_FINAL, a big enough buffer and no further input will then produce the final output.

Note that some ciphers require the entire message to be provided before any output is produced.

See also
botan_cipher_requires_entire_message().

Definition at line 188 of file ffi_cipher.cpp.

195 {
196 if(any_null_pointers(output_written, input_consumed)) {
198 }
199
200 return ffi_guard_thunk(__func__, [=]() -> int {
201 using namespace Botan;
202 Cipher_Mode& cipher = safe_get(cipher_obj);
203 secure_vector<uint8_t>& mbuf = cipher_obj->buf();
204
205 // If the cipher object's internal buffer contains residual data from
206 // a previous invocation, we can be sure that botan_cipher_update() was
207 // called with the final flag set but not enough buffer space was provided
208 // to accommodate the final output.
209 const bool was_finished_before = !mbuf.empty();
210 const bool final_input = (flags & BOTAN_CIPHER_UPDATE_FLAG_FINAL) != 0;
211
212 // Bring the output variables into a defined state.
213 *output_written = 0;
214 *input_consumed = 0;
215
216 // Once the final flag was set once, it must always be set for
217 // consecutive invocations.
218 if(was_finished_before && !final_input) {
220 }
221
222 // If the final flag was set in a previous invocation, no more input
223 // data can be processed.
224 if(was_finished_before && input_size > 0) {
226 }
227
228 // Make sure that we always clear the internal buffer before returning
229 // or aborting this invocation due to an exception.
230 auto clean_buffer = scoped_cleanup([&mbuf] { mbuf.clear(); });
231
232 if(final_input) {
233 // If the final flag is set for the first time, we need to process the
234 // remaining input data and then finalize the cipher object.
235 if(!was_finished_before) {
236 *input_consumed = input_size;
237 mbuf.resize(input_size);
238 copy_mem(mbuf, std::span(input, input_size));
239
240 try {
241 cipher.finish(mbuf);
244 }
245 }
246
247 // At this point, the cipher object is finalized (potentially in a
248 // previous invocation) and we can copy the final output to the caller.
249 *output_written = mbuf.size();
250
251 // Not enough space to copy the final output out to the caller.
252 // Inform them how much space we need for a successful operation.
253 if(output_size < mbuf.size()) {
254 // This is the only place where mbuf is not cleared before returning.
255 clean_buffer.disengage();
257 }
258
259 // Copy the final output to the caller, mbuf is cleared afterwards.
260 copy_mem(std::span(output, mbuf.size()), mbuf);
261 } else {
262 // Process data in a streamed fashion without finalizing. No data is
263 // ever retained in the cipher object's internal buffer. If we run out
264 // of either input data or output capacity, we stop and report that not
265 // all bytes were processed via *output_written and *input_consumed.
266
267 BufferSlicer in({input, input_size});
268 BufferStuffer out({output, output_size});
269
270 // Helper function to do blockwise processing of data.
271 auto blockwise_update = [&](const size_t granularity) {
272 if(granularity == 0) {
273 return;
274 }
275
276 const size_t expected_output_per_iteration = cipher.requires_entire_message() ? 0 : granularity;
277 mbuf.resize(granularity);
278
279 while(in.remaining() >= granularity && out.remaining_capacity() >= expected_output_per_iteration) {
280 copy_mem(mbuf, in.take(granularity));
281 const auto written_bytes = cipher.process(mbuf);
282 BOTAN_DEBUG_ASSERT(written_bytes == expected_output_per_iteration);
283 if(written_bytes > 0) {
284 BOTAN_ASSERT_NOMSG(written_bytes <= granularity);
285 copy_mem(out.next(written_bytes), std::span(mbuf).first(written_bytes));
286 }
287 }
288 };
289
290 // First, process as much data as possible in chunks of ideal granularity
291 blockwise_update(cipher_obj->ideal_update_size());
292
293 // Then process the remaining bytes in chunks of update_size() or, in one go
294 // if update_size() is equal to 1 --> i.e. likely a stream cipher.
295 const bool is_stream_cipher = (cipher_obj->update_size() == 1);
296 const size_t tail_granularity =
297 is_stream_cipher ? std::min(in.remaining(), out.remaining_capacity()) : cipher_obj->update_size();
298 BOTAN_DEBUG_ASSERT(tail_granularity < cipher_obj->ideal_update_size());
299 blockwise_update(tail_granularity);
300
301 // Inform the caller about the amount of data processed.
302 *output_written = output_size - out.remaining_capacity();
303 *input_consumed = input_size - in.remaining();
304 }
305
306 return BOTAN_FFI_SUCCESS;
307 });
308}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
#define BOTAN_DEBUG_ASSERT(expr)
Definition assert.h:129
Helper class to ease in-place marshalling of concatenated fixed-length values.
void finish(secure_vector< uint8_t > &final_block, size_t offset=0)
virtual bool requires_entire_message() const
size_t process(std::span< uint8_t > msg)
Helper class to create a RAII-style cleanup callback.
#define BOTAN_CIPHER_UPDATE_FLAG_FINAL
Definition ffi.h:763
constexpr void copy_mem(T *out, const T *in, size_t n)
Definition mem_ops.h:144
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:68

References Botan_FFI::any_null_pointers(), BOTAN_ASSERT_NOMSG, BOTAN_CIPHER_UPDATE_FLAG_FINAL, BOTAN_DEBUG_ASSERT, BOTAN_FFI_ERROR_BAD_MAC, BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::copy_mem(), Botan_FFI::ffi_guard_thunk(), Botan::Cipher_Mode::finish(), Botan::Cipher_Mode::process(), Botan::Cipher_Mode::requires_entire_message(), and Botan_FFI::safe_get().

◆ botan_cipher_valid_nonce_length()

int botan_cipher_valid_nonce_length ( botan_cipher_t cipher,
size_t nl )

Return if the specified nonce length is valid for this cipher

Definition at line 320 of file ffi_cipher.cpp.

320 {
321 return BOTAN_FFI_VISIT(cipher, [=](const auto& c) { return c.valid_nonce_length(nl) ? 1 : 0; });
322}

References BOTAN_FFI_VISIT.

◆ botan_constant_time_compare()

int botan_constant_time_compare ( const uint8_t * x,
const uint8_t * y,
size_t len )

Returns 0 if x[0..len] == y[0..len], or otherwise -1

Definition at line 318 of file ffi.cpp.

318 {
319 if(len > 0 && any_null_pointers(x, y)) {
321 }
322 auto same = Botan::CT::is_equal(x, y, len);
323 // Return 0 if same or -1 otherwise
324 return static_cast<int>(same.select(1, 0)) - 1;
325}
constexpr CT::Mask< T > is_equal(const T x[], const T y[], size_t len)
Definition ct_utils.h:798

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, and Botan::CT::is_equal().

Referenced by botan_same_mem().

◆ botan_ec_group_destroy()

int botan_ec_group_destroy ( botan_ec_group_t ec_group)
Returns
negative number on error, or zero on success

Definition at line 21 of file ffi_ec.cpp.

21 {
22 return BOTAN_FFI_CHECKED_DELETE(ec_group);
23}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_ec_group_equal()

int botan_ec_group_equal ( botan_ec_group_t curve1,
botan_ec_group_t curve2 )
Returns
0 if curve1 != curve2
1 if curve1 == curve2
negative number on error

Definition at line 190 of file ffi_ec.cpp.

190 {
191 return BOTAN_FFI_VISIT(curve1_w, [=](const auto& curve1) -> int { return curve1 == safe_get(curve2_w); });
192}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_ec_group_from_ber()

int botan_ec_group_from_ber ( botan_ec_group_t * ec_group,
const uint8_t * ber,
size_t ber_len )

Decode a BER encoded ECC domain parameter set

Parameters
EC Groupthe new object will be placed here
berencoding
ber_lensize of the encoding in bytes
Returns
negative number on error, or zero on success

Definition at line 72 of file ffi_ec.cpp.

72 {
73 return ffi_guard_thunk(__func__, [=]() -> int {
74 if(ec_group == nullptr || ber == nullptr) {
76 }
77
78 Botan::EC_Group group(ber, ber_len);
79
80 auto group_ptr = std::make_unique<Botan::EC_Group>(std::move(group));
81 return ffi_new_object(ec_group, std::move(group_ptr));
82 });
83}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_ec_group_from_name()

int botan_ec_group_from_name ( botan_ec_group_t * ec_group,
const char * name )

Initialize an EC Group from a common group name (eg "secp256r1")

Parameters
EC Groupthe new object will be placed here
namea known group name
Returns
negative number on error, or zero on success

Definition at line 111 of file ffi_ec.cpp.

111 {
112 return ffi_guard_thunk(__func__, [=]() -> int {
113 if(ec_group == nullptr || name == nullptr) {
115 }
116
118
119 auto group_ptr = std::make_unique<Botan::EC_Group>(std::move(group));
120 return ffi_new_object(ec_group, std::move(group_ptr));
121 });
122}
static EC_Group from_name(std::string_view name)
Definition ec_group.cpp:468

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::EC_Group::from_name().

◆ botan_ec_group_from_oid()

int botan_ec_group_from_oid ( botan_ec_group_t * ec_group,
botan_asn1_oid_t oid )

Initialize an EC Group from a group named by an object identifier

Parameters
EC Groupthe new object will be placed here
oida known OID
Returns
negative number on error, or zero on success

Definition at line 98 of file ffi_ec.cpp.

98 {
99 return ffi_guard_thunk(__func__, [=]() -> int {
100 if(ec_group == nullptr) {
102 }
103
105
106 auto group_ptr = std::make_unique<Botan::EC_Group>(std::move(group));
107 return ffi_new_object(ec_group, std::move(group_ptr));
108 });
109}
static EC_Group from_OID(const OID &oid)
Definition ec_group.cpp:457

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan::EC_Group::from_OID(), and Botan_FFI::safe_get().

◆ botan_ec_group_from_params()

int botan_ec_group_from_params ( botan_ec_group_t * ec_group,
botan_asn1_oid_t oid,
botan_mp_t p,
botan_mp_t a,
botan_mp_t b,
botan_mp_t base_x,
botan_mp_t base_y,
botan_mp_t order )

Create a new EC Group from parameters

Warning
use only elliptic curve parameters that you trust
Parameters
EC Groupthe new object will be placed here
pthe elliptic curve prime (at most 521 bits)
athe elliptic curve a param
bthe elliptic curve b param
base_xthe x coordinate of the group generator
base_ythe y coordinate of the group generator
orderthe order of the group
Returns
negative number on error, or zero on success

Definition at line 51 of file ffi_ec.cpp.

58 {
59 return ffi_guard_thunk(__func__, [=]() -> int {
60 if(ec_group == nullptr) {
62 }
63
64 Botan::EC_Group group(
65 safe_get(oid), safe_get(p), safe_get(a), safe_get(b), safe_get(base_x), safe_get(base_y), safe_get(order));
66
67 auto group_ptr = std::make_unique<Botan::EC_Group>(std::move(group));
68 return ffi_new_object(ec_group, std::move(group_ptr));
69 });
70}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_ec_group_from_pem()

int botan_ec_group_from_pem ( botan_ec_group_t * ec_group,
const char * pem )

Initialize an EC Group from the PEM/ASN.1 encoding

Parameters
EC Groupthe new object will be placed here
PEMencoding
Returns
negative number on error, or zero on success

Definition at line 85 of file ffi_ec.cpp.

85 {
86 return ffi_guard_thunk(__func__, [=]() -> int {
87 if(ec_group == nullptr || pem == nullptr) {
89 }
90
92
93 auto group_ptr = std::make_unique<Botan::EC_Group>(std::move(group));
94 return ffi_new_object(ec_group, std::move(group_ptr));
95 });
96}
static EC_Group from_PEM(std::string_view pem)
Definition ec_group.cpp:511

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::EC_Group::from_PEM().

◆ botan_ec_group_get_a()

int botan_ec_group_get_a ( botan_mp_t * a,
botan_ec_group_t ec_group )

Get the a parameter of the elliptic curve equation

Definition at line 167 of file ffi_ec.cpp.

167 {
168 return botan_ec_group_get_component(a, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_a(); });
169}

◆ botan_ec_group_get_b()

int botan_ec_group_get_b ( botan_mp_t * b,
botan_ec_group_t ec_group )

Get the b parameter of the elliptic curve equation

Definition at line 171 of file ffi_ec.cpp.

171 {
172 return botan_ec_group_get_component(b, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_b(); });
173}

◆ botan_ec_group_get_curve_oid()

int botan_ec_group_get_curve_oid ( botan_asn1_oid_t * oid,
botan_ec_group_t ec_group )

Get the curve OID of an EC Group

Definition at line 139 of file ffi_ec.cpp.

139 {
140 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
141 if(oid == nullptr) {
143 }
144 auto oid_ptr = std::make_unique<Botan::OID>(g.get_curve_oid());
145 return ffi_new_object(oid, std::move(oid_ptr));
146 });
147}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_ec_group_get_g_x()

int botan_ec_group_get_g_x ( botan_mp_t * g_x,
botan_ec_group_t ec_group )

Get the x coordinate of the base point

Definition at line 175 of file ffi_ec.cpp.

175 {
176 return botan_ec_group_get_component(
177 g_x, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_g_x(); });
178}

◆ botan_ec_group_get_g_y()

int botan_ec_group_get_g_y ( botan_mp_t * g_y,
botan_ec_group_t ec_group )

Get the y coordinate of the base point

Definition at line 180 of file ffi_ec.cpp.

180 {
181 return botan_ec_group_get_component(
182 g_y, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_g_y(); });
183}

◆ botan_ec_group_get_order()

int botan_ec_group_get_order ( botan_mp_t * order,
botan_ec_group_t ec_group )

Get the order of the base point

Definition at line 185 of file ffi_ec.cpp.

185 {
186 return botan_ec_group_get_component(
187 order, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_order(); });
188}

◆ botan_ec_group_get_p()

int botan_ec_group_get_p ( botan_mp_t * p,
botan_ec_group_t ec_group )

Get the prime modulus of the field

Definition at line 163 of file ffi_ec.cpp.

163 {
164 return botan_ec_group_get_component(p, ec_group, [](const auto& g) -> const Botan::BigInt& { return g.get_p(); });
165}

◆ botan_ec_group_supports_application_specific_group()

int botan_ec_group_supports_application_specific_group ( int * out)

Checks if in this build configuration it is possible to register an application specific elliptic curve and sets

Parameters
outto 1 if so, 0 otherwise
Returns
0 on success, a negative value on failure

Definition at line 25 of file ffi_ec.cpp.

25 {
26 if(out == nullptr) {
28 }
30 *out = 1;
31 } else {
32 *out = 0;
33 }
34 return BOTAN_FFI_SUCCESS;
35}
static bool supports_application_specific_group()
Definition ec_group.cpp:439

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and Botan::EC_Group::supports_application_specific_group().

◆ botan_ec_group_supports_named_group()

int botan_ec_group_supports_named_group ( const char * name,
int * out )

Checks if in this build configuration botan_ec_group_from_name(group_ptr, name) will succeed and sets

Parameters
outto 1 if so, 0 otherwise.
Returns
negative number on error, or zero on success

Definition at line 37 of file ffi_ec.cpp.

37 {
38 return ffi_guard_thunk(__func__, [=]() -> int {
39 if(name == nullptr || out == nullptr) {
41 }
43 *out = 1;
44 } else {
45 *out = 0;
46 }
47 return BOTAN_FFI_SUCCESS;
48 });
49}
static bool supports_named_group(std::string_view name)
Definition ec_group.cpp:412

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), and Botan::EC_Group::supports_named_group().

◆ botan_ec_group_unregister()

int botan_ec_group_unregister ( botan_asn1_oid_t oid)

Unregister a previously registered group.

Parameters
oidthe oid associated with the group to unregister
Returns
1 if the group was found and unregistered, else 0

Using this is discouraged for normal use. This is only useful or necessary if you are registering a very large number of distinct groups, and need to worry about memory constraints.

Definition at line 124 of file ffi_ec.cpp.

124 {
125 return BOTAN_FFI_VISIT(oid, [=](const auto& o) -> int { return Botan::EC_Group::unregister(o) ? 1 : 0; });
126}
static bool unregister(const OID &oid)
Definition ec_group.cpp:612

References BOTAN_FFI_VISIT, and Botan::EC_Group::unregister().

◆ botan_ec_group_view_der()

int botan_ec_group_view_der ( botan_ec_group_t ec_group,
botan_view_ctx ctx,
botan_view_bin_fn view )

View an EC Group in DER encoding

Definition at line 128 of file ffi_ec.cpp.

128 {
129 return BOTAN_FFI_VISIT(ec_group,
130 [=](const auto& g) -> int { return invoke_view_callback(view, ctx, g.DER_encode()); });
131}
int invoke_view_callback(botan_view_bin_fn view, botan_view_ctx ctx, std::span< const uint8_t > buf)
Definition ffi_util.h:190

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_group_view_pem()

int botan_ec_group_view_pem ( botan_ec_group_t ec_group,
botan_view_ctx ctx,
botan_view_str_fn view )

View an EC Group in PEM encoding

Definition at line 133 of file ffi_ec.cpp.

133 {
134 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
135 return invoke_view_callback(view, ctx, g.PEM_encode(Botan::EC_Group_Encoding::NamedCurve));
136 });
137}

References BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), and Botan::NamedCurve.

◆ botan_ec_point_add()

int botan_ec_point_add ( botan_ec_point_t * result,
botan_ec_point_t x,
botan_ec_point_t y )

Definition at line 346 of file ffi_ec.cpp.

346 {
347 if(Botan::any_null_pointers(result)) {
349 }
350 return BOTAN_FFI_VISIT(x_w, [=](auto& x) -> int {
351 Botan::EC_AffinePoint res = x.add(safe_get(y_w));
352 return ffi_new_object(result, std::make_unique<Botan::EC_AffinePoint>(std::move(res)));
353 });
354}
EC_AffinePoint add(const EC_AffinePoint &q) const
bool any_null_pointers(Ptrs... ptr)
Definition mem_utils.h:54

References Botan::EC_AffinePoint::add(), Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_ec_point_destroy()

int botan_ec_point_destroy ( botan_ec_point_t ec_point)

Definition at line 230 of file ffi_ec.cpp.

230 {
231 return BOTAN_FFI_CHECKED_DELETE(ec_point);
232}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_ec_point_equal()

int botan_ec_point_equal ( botan_ec_point_t x,
botan_ec_point_t y )
Returns
1 if
Parameters
x==
yelse 0 otherwise
Returns
negative number on error

Definition at line 319 of file ffi_ec.cpp.

319 {
320 return BOTAN_FFI_VISIT(x_w, [=](const auto& x) -> int { return x == safe_get(y_w) ? 1 : 0; });
321}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_ec_point_from_bytes()

int botan_ec_point_from_bytes ( botan_ec_point_t * ec_point,
botan_ec_group_t ec_group,
const uint8_t * bytes,
size_t bytes_len )

Create a point from a SEC1 compressed or uncompressed format.

Returns
negative number on error

Definition at line 267 of file ffi_ec.cpp.

270 {
271 if(Botan::any_null_pointers(ec_point, bytes)) {
273 }
274 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
275 Botan::EC_AffinePoint pt(g, std::span{bytes, bytes_len});
276 return ffi_new_object(ec_point, std::make_unique<Botan::EC_AffinePoint>(std::move(pt)));
277 });
278}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_ec_point_from_xy()

int botan_ec_point_from_xy ( botan_ec_point_t * ec_point,
botan_ec_group_t ec_group,
botan_mp_t x,
botan_mp_t y )

Create a point from a pair (x,y) of integers The integers must be within the field and must satisfy the curve equation

Definition at line 252 of file ffi_ec.cpp.

252 {
253 if(Botan::any_null_pointers(ec_point)) {
255 }
256 return ffi_guard_thunk(__func__, [=]() -> int {
257 std::optional<Botan::EC_AffinePoint> pt =
259 if(!pt.has_value()) {
261 }
262
263 return ffi_new_object(ec_point, std::make_unique<Botan::EC_AffinePoint>(pt.value()));
264 });
265}
static std::optional< EC_AffinePoint > from_bigint_xy(const EC_Group &group, const BigInt &x, const BigInt &y)
Definition ec_apoint.cpp:93

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan::EC_AffinePoint::from_bigint_xy(), and Botan_FFI::safe_get().

◆ botan_ec_point_generator()

int botan_ec_point_generator ( botan_ec_point_t * ec_point,
botan_ec_group_t ec_group )

Create a point set to the standard group generator

Definition at line 243 of file ffi_ec.cpp.

243 {
244 if(Botan::any_null_pointers(ec_point)) {
246 }
247 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
248 return ffi_new_object(ec_point, std::make_unique<Botan::EC_AffinePoint>(Botan::EC_AffinePoint::generator(g)));
249 });
250}
static EC_AffinePoint generator(const EC_Group &group)
Return the standard group generator.
Definition ec_apoint.cpp:84

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), and Botan::EC_AffinePoint::generator().

◆ botan_ec_point_identity()

int botan_ec_point_identity ( botan_ec_point_t * ec_point,
botan_ec_group_t ec_group )

Create a point set to the identity element of the group

Definition at line 234 of file ffi_ec.cpp.

234 {
235 if(Botan::any_null_pointers(ec_point)) {
237 }
238 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
239 return ffi_new_object(ec_point, std::make_unique<Botan::EC_AffinePoint>(Botan::EC_AffinePoint::identity(g)));
240 });
241}
static EC_AffinePoint identity(const EC_Group &group)
Return the identity element.
Definition ec_apoint.cpp:79

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), and Botan::EC_AffinePoint::identity().

◆ botan_ec_point_is_identity()

int botan_ec_point_is_identity ( botan_ec_point_t ec_point)
Returns
1 if
Parameters
ec_pointis the identity element, else 0
Returns
negative number on error

Definition at line 315 of file ffi_ec.cpp.

315 {
316 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int { return p.is_identity() ? 1 : 0; });
317}

References BOTAN_FFI_VISIT.

◆ botan_ec_point_mul()

int botan_ec_point_mul ( botan_ec_point_t * result,
botan_ec_point_t ec_point,
botan_ec_scalar_t ec_scalar,
botan_rng_t rng )

Definition at line 323 of file ffi_ec.cpp.

326 {
327 if(Botan::any_null_pointers(result)) {
329 }
330 return BOTAN_FFI_VISIT(ec_point, [=](auto& pt) -> int {
331 Botan::EC_AffinePoint res = pt.mul(safe_get(ec_scalar), safe_get(rng));
332 return ffi_new_object(result, std::make_unique<Botan::EC_AffinePoint>(std::move(res)));
333 });
334}
EC_AffinePoint mul(const EC_Scalar &scalar, RandomNumberGenerator &rng) const
Multiply a point by a scalar returning a complete point.

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), Botan::EC_AffinePoint::mul(), and Botan_FFI::safe_get().

◆ botan_ec_point_negate()

int botan_ec_point_negate ( botan_ec_point_t * result,
botan_ec_point_t ec_point )
Parameters
ec_pointpoint to negate
resultcontains the result

Definition at line 336 of file ffi_ec.cpp.

336 {
337 if(Botan::any_null_pointers(result)) {
339 }
340 return BOTAN_FFI_VISIT(ec_point, [=](auto& pt) -> int {
341 Botan::EC_AffinePoint res = pt.negate();
342 return ffi_new_object(result, std::make_unique<Botan::EC_AffinePoint>(std::move(res)));
343 });
344}
EC_AffinePoint negate() const
Point negation.

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), and Botan::EC_AffinePoint::negate().

◆ botan_ec_point_view_compressed()

int botan_ec_point_view_compressed ( botan_ec_point_t ec_point,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the fixed length SEC1 compressed encoding

Returns
negative number on error

Definition at line 308 of file ffi_ec.cpp.

308 {
309 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int {
310 auto bytes = p.serialize_compressed();
311 return invoke_view_callback(view, ctx, bytes);
312 });
313}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_point_view_uncompressed()

int botan_ec_point_view_uncompressed ( botan_ec_point_t ec_point,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the fixed length SEC1 uncompressed encoding

Returns
negative number on error

Definition at line 301 of file ffi_ec.cpp.

301 {
302 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int {
303 auto bytes = p.serialize_uncompressed();
304 return invoke_view_callback(view, ctx, bytes);
305 });
306}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_point_view_x_bytes()

int botan_ec_point_view_x_bytes ( botan_ec_point_t ec_point,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the fixed length encoding of the affine x coordinate

Returns
negative number on error

Definition at line 280 of file ffi_ec.cpp.

280 {
281 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int {
282 auto bytes = p.x_bytes();
283 return invoke_view_callback(view, ctx, bytes);
284 });
285}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_point_view_xy_bytes()

int botan_ec_point_view_xy_bytes ( botan_ec_point_t ec_point,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the fixed length encoding of the affine x and y coordinates

Returns
negative number on error

Definition at line 294 of file ffi_ec.cpp.

294 {
295 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int {
296 auto bytes = p.xy_bytes();
297 return invoke_view_callback(view, ctx, bytes);
298 });
299}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_point_view_y_bytes()

int botan_ec_point_view_y_bytes ( botan_ec_point_t ec_point,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the fixed length encoding of the affine y coordinate

Returns
negative number on error

Definition at line 287 of file ffi_ec.cpp.

287 {
288 return BOTAN_FFI_VISIT(ec_point, [=](const auto& p) -> int {
289 auto bytes = p.y_bytes();
290 return invoke_view_callback(view, ctx, bytes);
291 });
292}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_ec_privkey_create()

int botan_ec_privkey_create ( botan_privkey_t * key,
const char * algo_name,
botan_ec_group_t ec_group,
botan_rng_t rng )

Create a new ec private key

Parameters
keythe new object will be placed here
algo_namesomething like "ECDSA" or "ECDH"
EC Groupa (possibly application specific) elliptic curve
Random Number Generatorsa random number generator

Definition at line 61 of file ffi_pkey.cpp.

64 {
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}
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
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

References botan_ec_privkey_create(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan::create_ec_private_key(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

Referenced by botan_ec_privkey_create().

◆ botan_ec_privkey_get_group()

int botan_ec_privkey_get_group ( botan_privkey_t key,
botan_ec_group_t * ec_group )

Definition at line 859 of file ffi_pkey_algs.cpp.

859 {
860 if(Botan::any_null_pointers(ec_group)) {
862 }
863
864#if defined(BOTAN_HAS_ECC_KEY)
865 return ffi_guard_thunk(__func__, [=]() -> int {
866 const Botan::EC_PrivateKey* ec_key = dynamic_cast<const Botan::EC_PrivateKey*>(&safe_get(key));
867 if(ec_key == nullptr) {
869 }
870 return ffi_new_object(ec_group, std::make_unique<Botan::EC_Group>(ec_key->domain()));
871 });
872#else
873 BOTAN_UNUSED(key, ec_group);
875#endif
876}
const EC_Group & domain() const
Definition ecc_key.cpp:64

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::EC_PublicKey::domain(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_ec_privkey_get_private_key()

int botan_ec_privkey_get_private_key ( botan_privkey_t key,
botan_ec_scalar_t * value )

Loads Diffie Hellman public key

Parameters
keyvariable populated with key material
pprime order of a Z_p group
ggroup generator
ypublic key
Precondition
key is NULL on input
Postcondition
function allocates memory and assigns to `key'
Returns
0 on success, a negative value on failure */ int botan_pubkey_load_dh(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y);

/* Algorithm specific key operations: ElGamal Loads ElGamal public key

Parameters
keyvariable populated with key material
pprime order of a Z_p group
ggroup generator
ypublic key
Precondition
key is NULL on input
Postcondition
function allocates memory and assigns to `key'
Returns
0 on success, a negative value on failure */ int botan_pubkey_load_elgamal(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y);

/** Loads ElGamal private key

Parameters
keyvariable populated with key material
pprime order of a Z_p group
ggroup generator
xprivate key
Precondition
key is NULL on input
Postcondition
function allocates memory and assigns to `key'
Returns
0 on success, a negative value on failure */ int botan_privkey_load_elgamal(botan_privkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t x);

/* Algorithm specific key operations: EC keys

Definition at line 841 of file ffi_pkey_algs.cpp.

841 {
842 if(Botan::any_null_pointers(value)) {
844 }
845#if defined(BOTAN_HAS_ECC_KEY)
846 return ffi_guard_thunk(__func__, [=]() -> int {
847 const Botan::EC_PrivateKey* ec_key = dynamic_cast<const Botan::EC_PrivateKey*>(&safe_get(key));
848 if(ec_key == nullptr) {
850 }
851 return ffi_new_object(value, std::make_unique<Botan::EC_Scalar>(ec_key->_private_key()));
852 });
853#else
854 BOTAN_UNUSED(key, value);
856#endif
857}
const EC_Scalar & _private_key() const
Definition ecc_key.cpp:123

References Botan::EC_PrivateKey::_private_key(), Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_ec_pubkey_get_group()

int botan_ec_pubkey_get_group ( botan_pubkey_t key,
botan_ec_group_t * ec_group )

Definition at line 878 of file ffi_pkey_algs.cpp.

878 {
879 if(Botan::any_null_pointers(ec_group)) {
881 }
882#if defined(BOTAN_HAS_ECC_KEY)
883 return ffi_guard_thunk(__func__, [=]() -> int {
884 const Botan::EC_PublicKey* ec_key = dynamic_cast<const Botan::EC_PublicKey*>(&safe_get(key));
885 if(ec_key == nullptr) {
887 }
888 return ffi_new_object(ec_group, std::make_unique<Botan::EC_Group>(ec_key->domain()));
889 });
890#else
891 BOTAN_UNUSED(key, ec_group);
893#endif
894}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::EC_PublicKey::domain(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_ec_scalar_destroy()

int botan_ec_scalar_destroy ( botan_ec_scalar_t ec_scalar)

Definition at line 196 of file ffi_ec.cpp.

196 {
197 return BOTAN_FFI_CHECKED_DELETE(ec_scalar);
198}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_ec_scalar_from_mp()

int botan_ec_scalar_from_mp ( botan_ec_scalar_t * ec_scalar,
botan_ec_group_t ec_group,
botan_mp_t mp )

Convert from an MPI to a scalar

Returns
a negative number if the provided MPI is negative or too large, 0 on success

Definition at line 209 of file ffi_ec.cpp.

209 {
210 if(Botan::any_null_pointers(ec_scalar)) {
212 }
213 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
214 return ffi_new_object(ec_scalar,
215 std::make_unique<Botan::EC_Scalar>(Botan::EC_Scalar::from_bigint(g, safe_get(mp))));
216 });
217}
static EC_Scalar from_bigint(const EC_Group &group, const BigInt &bn)
Definition ec_scalar.cpp:69

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), Botan::EC_Scalar::from_bigint(), and Botan_FFI::safe_get().

◆ botan_ec_scalar_random()

int botan_ec_scalar_random ( botan_ec_scalar_t * ec_scalar,
botan_ec_group_t ec_group,
botan_rng_t rng )

Create a new random scalar value

Definition at line 200 of file ffi_ec.cpp.

200 {
201 if(Botan::any_null_pointers(ec_scalar)) {
203 }
204 return BOTAN_FFI_VISIT(ec_group, [=](const auto& g) -> int {
205 return ffi_new_object(ec_scalar, std::make_unique<Botan::EC_Scalar>(Botan::EC_Scalar::random(g, safe_get(rng))));
206 });
207}
static EC_Scalar random(const EC_Group &group, RandomNumberGenerator &rng)
Definition ec_scalar.cpp:61

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::ffi_new_object(), Botan::EC_Scalar::random(), and Botan_FFI::safe_get().

◆ botan_ec_scalar_to_mp()

int botan_ec_scalar_to_mp ( botan_ec_scalar_t ec_scalar,
botan_mp_t * mp )

Convert from a scalar to an MPI

Returns
a negative number on failure, 0 on success

Definition at line 219 of file ffi_ec.cpp.

219 {
222 }
223 return BOTAN_FFI_VISIT(ec_scalar, [=](const auto& sc) -> int {
224 return ffi_new_object(mp, std::make_unique<Botan::BigInt>(sc.to_bigint()));
225 });
226}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_error_description()

const char * botan_error_description ( int err)

Convert an error code into a string. Returns "Unknown error" if the error code is not a known one.

Definition at line 142 of file ffi.cpp.

142 {
143 switch(err) {
145 return "OK";
146
148 return "Invalid verifier";
149
151 return "Invalid input";
152
154 return "Invalid authentication code";
155
157 return "No value available";
158
160 return "Insufficient buffer space";
161
163 return "String conversion error";
164
166 return "Exception thrown";
167
169 return "Out of memory";
170
172 return "Error while calling system API";
173
175 return "Internal error";
176
178 return "Bad flag";
179
181 return "Null pointer argument";
182
184 return "Bad parameter";
185
187 return "Key not set on object";
188
190 return "Invalid key length";
191
193 return "Invalid object state";
194
196 return "Index out of range";
197
199 return "Not implemented";
200
202 return "Invalid object handle";
203
205 return "TLS error";
206
208 return "HTTP error";
209
211 default:
212 return "Unknown error";
213 }
214}

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_BAD_MAC, BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_EXCEPTION_THROWN, BOTAN_FFI_ERROR_HTTP_ERROR, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_INTERNAL_ERROR, BOTAN_FFI_ERROR_INVALID_INPUT, BOTAN_FFI_ERROR_INVALID_KEY_LENGTH, BOTAN_FFI_ERROR_INVALID_OBJECT, BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_KEY_NOT_SET, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_MEMORY, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR, BOTAN_FFI_ERROR_SYSTEM_ERROR, BOTAN_FFI_ERROR_TLS_ERROR, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_FFI_INVALID_VERIFIER, and BOTAN_FFI_SUCCESS.

◆ botan_error_last_exception_message()

const char * botan_error_last_exception_message ( void )

Return the message of the last exception caught in this thread.

This pointer can/will be reallocated or overwritten the next time this thread calls any other Botan FFI function and must be copied to persistent storage first.

Definition at line 138 of file ffi.cpp.

138 {
139 return g_last_exception_what.c_str();
140}

◆ botan_ffi_api_version()

uint32_t botan_ffi_api_version ( void )

Return the version of the currently supported FFI API. This is expressed in the form YYYYMMDD of the release date of this version of the API.

Definition at line 219 of file ffi.cpp.

219 {
220 return BOTAN_HAS_FFI;
221}
#define BOTAN_HAS_FFI
Definition build.h:199

References BOTAN_HAS_FFI.

◆ botan_ffi_supports_api()

int botan_ffi_supports_api ( uint32_t api_version)

Return 0 (ok) if the version given is one this library supports. botan_ffi_supports_api(botan_ffi_api_version()) will always return 0.

Definition at line 223 of file ffi.cpp.

223 {
224 // This is the API introduced in 3.12
225 if(api_version == 20260506) {
226 return BOTAN_FFI_SUCCESS;
227 }
228
229 // This is the API introduced in 3.11
230 if(api_version == 20260303) {
231 return BOTAN_FFI_SUCCESS;
232 }
233
234 // This is the API introduced in 3.10
235 if(api_version == 20250829) {
236 return BOTAN_FFI_SUCCESS;
237 }
238
239 // This is the API introduced in 3.8
240 if(api_version == 20250506) {
241 return BOTAN_FFI_SUCCESS;
242 }
243
244 // This is the API introduced in 3.4
245 if(api_version == 20240408) {
246 return BOTAN_FFI_SUCCESS;
247 }
248
249 // This is the API introduced in 3.2
250 if(api_version == 20231009) {
251 return BOTAN_FFI_SUCCESS;
252 }
253
254 // This is the API introduced in 3.1
255 if(api_version == 20230711) {
256 return BOTAN_FFI_SUCCESS;
257 }
258
259 // This is the API introduced in 3.0
260 if(api_version == 20230403) {
261 return BOTAN_FFI_SUCCESS;
262 }
263
264 // This is the API introduced in 2.18
265 if(api_version == 20210220) {
266 return BOTAN_FFI_SUCCESS;
267 }
268
269 // This is the API introduced in 2.13
270 if(api_version == 20191214) {
271 return BOTAN_FFI_SUCCESS;
272 }
273
274 // This is the API introduced in 2.8
275 if(api_version == 20180713) {
276 return BOTAN_FFI_SUCCESS;
277 }
278
279 // This is the API introduced in 2.3
280 if(api_version == 20170815) {
281 return BOTAN_FFI_SUCCESS;
282 }
283
284 // This is the API introduced in 2.1
285 if(api_version == 20170327) {
286 return BOTAN_FFI_SUCCESS;
287 }
288
289 // This is the API introduced in 2.0
290 if(api_version == 20150515) {
291 return BOTAN_FFI_SUCCESS;
292 }
293
294 // Something else:
295 return -1;
296}

References BOTAN_FFI_SUCCESS.

◆ botan_fpe_decrypt()

int botan_fpe_decrypt ( botan_fpe_t fpe,
botan_mp_t x,
const uint8_t tweak[],
size_t tweak_len )

Definition at line 78 of file ffi_fpe.cpp.

78 {
79#if defined(BOTAN_HAS_FPE_FE1)
80 return ffi_guard_thunk(__func__, [=]() {
81 const Botan::BigInt r = safe_get(fpe).decrypt(safe_get(x), tweak, tweak_len);
82 safe_get(x) = r;
83 return BOTAN_FFI_SUCCESS;
84 });
85
86#else
87 BOTAN_UNUSED(fpe, x, tweak, tweak_len);
89#endif
90}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::safe_get().

◆ botan_fpe_destroy()

int botan_fpe_destroy ( botan_fpe_t fpe)
Returns
0 if success, error if invalid object handle

Definition at line 56 of file ffi_fpe.cpp.

56 {
57#if defined(BOTAN_HAS_FPE_FE1)
58 return BOTAN_FFI_CHECKED_DELETE(fpe);
59#else
60 BOTAN_UNUSED(fpe);
62#endif
63}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_fpe_encrypt()

int botan_fpe_encrypt ( botan_fpe_t fpe,
botan_mp_t x,
const uint8_t tweak[],
size_t tweak_len )

Definition at line 65 of file ffi_fpe.cpp.

65 {
66#if defined(BOTAN_HAS_FPE_FE1)
67 return ffi_guard_thunk(__func__, [=]() {
68 const Botan::BigInt r = safe_get(fpe).encrypt(safe_get(x), tweak, tweak_len);
69 safe_get(x) = r;
70 return BOTAN_FFI_SUCCESS;
71 });
72#else
73 BOTAN_UNUSED(fpe, x, tweak, tweak_len);
75#endif
76}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::safe_get().

◆ botan_fpe_fe1_init()

int botan_fpe_fe1_init ( botan_fpe_t * fpe,
botan_mp_t n,
const uint8_t key[],
size_t key_len,
size_t rounds,
uint32_t flags )

Definition at line 28 of file ffi_fpe.cpp.

29 {
30#if defined(BOTAN_HAS_FPE_FE1)
31 return ffi_guard_thunk(__func__, [=]() {
32 if(fpe == nullptr || key == nullptr) {
34 }
35
36 *fpe = nullptr;
37
38 if(flags != 0 && flags != BOTAN_FPE_FLAG_FE1_COMPAT_MODE) {
40 }
41
42 const bool compat_mode = (flags & BOTAN_FPE_FLAG_FE1_COMPAT_MODE) != 0;
43
44 auto fpe_obj = std::make_unique<Botan::FPE_FE1>(safe_get(n), rounds, compat_mode);
45
46 fpe_obj->set_key(key, key_len);
47
48 return ffi_new_object(fpe, std::move(fpe_obj));
49 });
50#else
51 BOTAN_UNUSED(fpe, n, key, key_len, rounds, flags);
53#endif
54}
#define BOTAN_FPE_FLAG_FE1_COMPAT_MODE
Definition ffi.h:3008

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FPE_FLAG_FE1_COMPAT_MODE, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_hash_block_size()

int botan_hash_block_size ( botan_hash_t hash,
size_t * block_size )

Writes the block size of the hash function to *block_size

Parameters
Hasheshash object
block_sizeoutput buffer to hold the hash function output length
Returns
0 on success, a negative value on failure

Definition at line 48 of file ffi_hash.cpp.

48 {
49 if(out == nullptr) {
51 }
52 return BOTAN_FFI_VISIT(hash, [=](const auto& h) { *out = h.hash_block_size(); });
53}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_hash_clear()

int botan_hash_clear ( botan_hash_t hash)

Reinitializes the state of the hash computation. A hash can be computed (with update/final) immediately.

Parameters
Hasheshash object
Returns
0 on success, a negative value on failure

Definition at line 55 of file ffi_hash.cpp.

55 {
56 return BOTAN_FFI_VISIT(hash, [](auto& h) { h.clear(); });
57}

References BOTAN_FFI_VISIT.

◆ botan_hash_copy_state()

int botan_hash_copy_state ( botan_hash_t * dest,
botan_hash_t source )

Copy the state of a hash function object

Parameters
destdestination hash object
sourcesource hash object
Returns
0 on success, a negative value on failure

Definition at line 79 of file ffi_hash.cpp.

79 {
80 if(dest == nullptr) {
82 }
83 return BOTAN_FFI_VISIT(source, [=](const auto& src) { return ffi_new_object(dest, src.copy_state()); });
84}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_hash_destroy()

int botan_hash_destroy ( botan_hash_t hash)

Frees all resources of the hash object

Parameters
Hasheshash object
Returns
0 if success, error if invalid object handle

Definition at line 37 of file ffi_hash.cpp.

37 {
38 return BOTAN_FFI_CHECKED_DELETE(hash);
39}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_hash_final()

int botan_hash_final ( botan_hash_t hash,
uint8_t out[] )

Finalizes the hash computation and writes the output to out[0:botan_hash_output_length()] then reinitializes for computing another digest as if botan_hash_clear had been called.

Parameters
Hasheshash object
outoutput buffer
Returns
0 on success, a negative value on failure

Definition at line 71 of file ffi_hash.cpp.

71 {
72 if(out == nullptr) {
74 }
75 return BOTAN_FFI_VISIT(hash, [=](auto& h) { h.final(out); });
76}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_hash_init()

int botan_hash_init ( botan_hash_t * hash,
const char * hash_name,
uint32_t flags )

Initialize a hash function object

Parameters
Hasheshash object
hash_namename of the hash function, e.g., "SHA-384"
flagsshould be 0 in current API revision, all other uses are reserved and return BOTAN_FFI_ERROR_BAD_FLAG

Definition at line 18 of file ffi_hash.cpp.

18 {
19 return ffi_guard_thunk(__func__, [=]() -> int {
20 if(hash == nullptr || hash_name == nullptr || *hash_name == 0) {
22 }
23 if(flags != 0) {
25 }
26
27 auto h = Botan::HashFunction::create(hash_name);
28 if(h == nullptr) {
30 }
31
32 ffi_new_object(hash, std::move(h));
33 return BOTAN_FFI_SUCCESS;
34 });
35}
static std::unique_ptr< HashFunction > create(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:111

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::HashFunction::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_hash_name()

int botan_hash_name ( botan_hash_t hash,
char * name,
size_t * name_len )

Get the name of this hash function

Parameters
Hashesthe object to read
nameoutput buffer
name_lenon input, the length of buffer, on success the number of bytes written

Definition at line 86 of file ffi_hash.cpp.

86 {
87 if(name_len == nullptr) {
89 }
90
91 return BOTAN_FFI_VISIT(hash, [=](const auto& h) { return write_str_output(name, name_len, h.name()); });
92}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_hash_output_length()

int botan_hash_output_length ( botan_hash_t hash,
size_t * output_length )

Writes the output length of the hash function to *output_length

Parameters
Hasheshash object
output_lengthoutput buffer to hold the hash function output length
Returns
0 on success, a negative value on failure

Definition at line 41 of file ffi_hash.cpp.

41 {
42 if(out == nullptr) {
44 }
45 return BOTAN_FFI_VISIT(hash, [=](const auto& h) { *out = h.output_length(); });
46}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_hash_update()

int botan_hash_update ( botan_hash_t hash,
const uint8_t * in,
size_t in_len )

Send more input to the hash function

Parameters
Hasheshash object
ininput buffer
in_lennumber of bytes to read from the input buffer
Returns
0 on success, a negative value on failure

Definition at line 59 of file ffi_hash.cpp.

59 {
60 if(len == 0) {
61 return 0;
62 }
63
64 if(buf == nullptr) {
66 }
67
68 return BOTAN_FFI_VISIT(hash, [=](auto& h) { h.update(buf, len); });
69}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_hex_decode()

int botan_hex_decode ( const char * hex_str,
size_t in_len,
uint8_t * out,
size_t * out_len )

Perform hex decoding

Parameters
hex_stra string of hex chars (whitespace is ignored)
in_lenthe length of hex_str
outthe output buffer should be at least strlen(hex_str)/2 bytes
out_lenthe size of the output buffer on input, set to the number of bytes written
Returns
0 on success, a negative value on failure

Definition at line 350 of file ffi.cpp.

350 {
351 if(any_null_pointers(hex_str, out_len)) {
353 }
354 return ffi_guard_thunk(__func__, [=]() -> int {
355 const std::vector<uint8_t> bin = Botan::hex_decode(hex_str, in_len);
356 return Botan_FFI::write_vec_output(out, out_len, bin);
357 });
358}
int write_vec_output(uint8_t out[], size_t *out_len, std::span< const uint8_t > buf)
Definition ffi_util.h:264
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)
Definition hex.cpp:72

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan::hex_decode(), and Botan_FFI::write_vec_output().

◆ botan_hex_encode()

int botan_hex_encode ( const uint8_t * x,
size_t len,
char * out,
uint32_t flags )

Perform hex encoding

Parameters
xis some binary data
lenlength of x in bytes
outan array of at least x*2 bytes
flagsflags out be upper or lower case?
Returns
0 on success, a negative value on failure

Definition at line 339 of file ffi.cpp.

339 {
340 if(len > 0 && (in == nullptr || out == nullptr)) {
342 }
343 return ffi_guard_thunk(__func__, [=]() -> int {
344 const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0;
345 Botan::hex_encode(out, in, len, uppercase);
346 return BOTAN_FFI_SUCCESS;
347 });
348}
#define BOTAN_FFI_HEX_LOWER_CASE
Definition ffi.h:249
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition hex.cpp:34

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_HEX_LOWER_CASE, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), and Botan::hex_encode().

◆ botan_hotp_check()

int botan_hotp_check ( botan_hotp_t hotp,
uint64_t * next_hotp_counter,
uint32_t hotp_code,
uint64_t hotp_counter,
size_t resync_range )

Verify a HOTP code

Definition at line 67 of file ffi_hotp.cpp.

68 {
69#if defined(BOTAN_HAS_HOTP)
70 return BOTAN_FFI_VISIT(hotp, [=](auto& h) {
71 auto resp = h.verify_hotp(hotp_code, hotp_counter, resync_range);
72
73 if(next_hotp_counter) {
74 *next_hotp_counter = resp.second;
75 }
76
77 return (resp.first == true) ? BOTAN_FFI_SUCCESS : BOTAN_FFI_INVALID_VERIFIER;
78 });
79
80#else
81 BOTAN_UNUSED(hotp, next_hotp_counter, hotp_code, hotp_counter, resync_range);
83#endif
84}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_INVALID_VERIFIER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_hotp_destroy()

int botan_hotp_destroy ( botan_hotp_t hotp)

Destroy a HOTP instance

Returns
0 if success, error if invalid object handle

Definition at line 44 of file ffi_hotp.cpp.

44 {
45#if defined(BOTAN_HAS_HOTP)
46 return BOTAN_FFI_CHECKED_DELETE(hotp);
47#else
48 BOTAN_UNUSED(hotp);
50#endif
51}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_hotp_generate()

int botan_hotp_generate ( botan_hotp_t hotp,
uint32_t * hotp_code,
uint64_t hotp_counter )

Generate a HOTP code for the provided counter

Definition at line 53 of file ffi_hotp.cpp.

53 {
54#if defined(BOTAN_HAS_HOTP)
55 if(hotp == nullptr || hotp_code == nullptr) {
57 }
58
59 return BOTAN_FFI_VISIT(hotp, [=](auto& h) { *hotp_code = h.generate_hotp(hotp_counter); });
60
61#else
62 BOTAN_UNUSED(hotp, hotp_code, hotp_counter);
64#endif
65}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_hotp_init()

int botan_hotp_init ( botan_hotp_t * hotp,
const uint8_t key[],
size_t key_len,
const char * hash_algo,
size_t digits )

Initialize a HOTP instance

Definition at line 26 of file ffi_hotp.cpp.

26 {
27 if(hotp == nullptr || key == nullptr || hash_algo == nullptr) {
29 }
30
31 *hotp = nullptr;
32
33#if defined(BOTAN_HAS_HOTP)
34 return ffi_guard_thunk(__func__, [=]() -> int {
35 auto otp = std::make_unique<Botan::HOTP>(key, key_len, hash_algo, digits);
36 return ffi_new_object(hotp, std::move(otp));
37 });
38#else
39 BOTAN_UNUSED(hotp, key, key_len, hash_algo, digits);
41#endif
42}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_kdf()

int botan_kdf ( const char * kdf_algo,
uint8_t out[],
size_t out_len,
const uint8_t secret[],
size_t secret_len,
const uint8_t salt[],
size_t salt_len,
const uint8_t label[],
size_t label_len )

Derive a key

Parameters
kdf_algoKDF algorithm, e.g., "SP800-56C"
outbuffer holding the derived key, must be of length out_len
out_lenthe desired output length in bytes
secretthe secret input
secret_lensize of secret in bytes
salta diversifier
salt_lensize of salt in bytes
labelpurpose for the derived keying material
label_lensize of label in bytes
Returns
0 on success, a negative value on failure

Definition at line 143 of file ffi_kdf.cpp.

151 {
152 if(kdf_algo == nullptr) {
154 }
155 if((out_len > 0 && out == nullptr) || (secret_len > 0 && secret == nullptr) || (salt_len > 0 && salt == nullptr) ||
156 (label_len > 0 && label == nullptr)) {
158 }
159 return ffi_guard_thunk(__func__, [=]() -> int {
160 auto kdf = Botan::KDF::create_or_throw(kdf_algo);
161 kdf->kdf(out, out_len, secret, secret_len, salt, salt_len, label, label_len);
162 return BOTAN_FFI_SUCCESS;
163 });
164}
static std::unique_ptr< KDF > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition kdf.cpp:204

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::KDF::create_or_throw(), and Botan_FFI::ffi_guard_thunk().

◆ botan_key_unwrap3394()

int botan_key_unwrap3394 ( const uint8_t wrapped_key[],
size_t wrapped_key_len,
const uint8_t kek[],
size_t kek_len,
uint8_t key[],
size_t * key_len )

Definition at line 104 of file ffi_keywrap.cpp.

109 {
110 const std::string cipher_name = "AES-" + std::to_string(8 * kek_len);
111
112 return botan_nist_kw_dec(cipher_name.c_str(), 0, wrapped_key, wrapped_key_len, kek, kek_len, key, key_len);
113}
int botan_nist_kw_dec(const char *cipher_algo, int padded, const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len)

References botan_nist_kw_dec().

◆ botan_key_wrap3394()

int botan_key_wrap3394 ( const uint8_t key[],
size_t key_len,
const uint8_t kek[],
size_t kek_len,
uint8_t wrapped_key[],
size_t * wrapped_key_len )

Key wrapping as per RFC 3394

Definition at line 93 of file ffi_keywrap.cpp.

98 {
99 const std::string cipher_name = "AES-" + std::to_string(8 * kek_len);
100
101 return botan_nist_kw_enc(cipher_name.c_str(), 0, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
102}
int botan_nist_kw_enc(const char *cipher_algo, int padded, const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len)

References botan_nist_kw_enc().

◆ botan_mac_clear()

int botan_mac_clear ( botan_mac_t mac)

Reinitializes the state of the MAC computation. A MAC can be computed (with update/final) immediately.

Parameters
Message Authentication Codesmac object
Returns
0 on success, a negative value on failure

Definition at line 58 of file ffi_mac.cpp.

58 {
59 return BOTAN_FFI_VISIT(mac, [](auto& m) { m.clear(); });
60}

References BOTAN_FFI_VISIT.

◆ botan_mac_destroy()

int botan_mac_destroy ( botan_mac_t mac)

Frees all resources of the MAC object

Parameters
Message Authentication Codesmac object
Returns
0 if success, error if invalid object handle

Definition at line 36 of file ffi_mac.cpp.

36 {
37 return BOTAN_FFI_CHECKED_DELETE(mac);
38}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_mac_final()

int botan_mac_final ( botan_mac_t mac,
uint8_t out[] )

Finalizes the MAC computation and writes the output to out[0:botan_mac_output_length()] then reinitializes for computing another MAC as if botan_mac_clear had been called.

Parameters
Message Authentication Codesmac object
outoutput buffer
Returns
0 on success, a negative value on failure

Definition at line 72 of file ffi_mac.cpp.

72 {
73 if(out == nullptr) {
75 }
76 return BOTAN_FFI_VISIT(mac, [=](auto& m) { m.final(out); });
77}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mac_get_keyspec()

int botan_mac_get_keyspec ( botan_mac_t mac,
size_t * out_minimum_keylength,
size_t * out_maximum_keylength,
size_t * out_keylength_modulo )

Get the key length limits of this auth code

Parameters
Message Authentication Codesthe object to read
out_minimum_keylengthif non-NULL, will be set to minimum keylength of MAC
out_maximum_keylengthif non-NULL, will be set to maximum keylength of MAC
out_keylength_moduloif non-NULL will be set to byte multiple of valid keys

Definition at line 83 of file ffi_mac.cpp.

86 {
87 return BOTAN_FFI_VISIT(mac, [=](auto& m) {
88 if(out_minimum_keylength) {
89 *out_minimum_keylength = m.minimum_keylength();
90 }
91 if(out_maximum_keylength) {
92 *out_maximum_keylength = m.maximum_keylength();
93 }
94 if(out_keylength_modulo) {
95 *out_keylength_modulo = m.key_spec().keylength_multiple();
96 }
97 });
98}

References BOTAN_FFI_VISIT.

◆ botan_mac_init()

int botan_mac_init ( botan_mac_t * mac,
const char * mac_name,
uint32_t flags )

Initialize a message authentication code object

Parameters
Message Authentication Codesmac object
mac_namename of the hash function, e.g., "HMAC(SHA-384)"
flagsshould be 0 in current API revision, all other uses are reserved and return a negative value (error code)
Returns
0 on success, a negative value on failure

Definition at line 18 of file ffi_mac.cpp.

18 {
19 return ffi_guard_thunk(__func__, [=]() -> int {
20 if(any_null_pointers(mac, mac_name)) {
22 }
23
24 if(flags != 0) {
26 }
27
28 if(auto m = Botan::MessageAuthenticationCode::create(mac_name)) {
29 return ffi_new_object(mac, std::move(m));
30 } else {
32 }
33 });
34}
static std::unique_ptr< MessageAuthenticationCode > create(std::string_view algo_spec, std::string_view provider="")
Definition mac.cpp:50

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan::MessageAuthenticationCode::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_mac_name()

int botan_mac_name ( botan_mac_t mac,
char * name,
size_t * name_len )

Get the name of this MAC

Parameters
Message Authentication Codesthe object to read
nameoutput buffer
name_lenon input, the length of buffer, on success the number of bytes written

Definition at line 79 of file ffi_mac.cpp.

79 {
80 return BOTAN_FFI_VISIT(mac, [=](const auto& m) { return write_str_output(name, name_len, m.name()); });
81}

References BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_mac_output_length()

int botan_mac_output_length ( botan_mac_t mac,
size_t * output_length )

Writes the output length of the message authentication code to *output_length

Parameters
Message Authentication Codesmac object
output_lengthoutput buffer to hold the MAC output length
Returns
0 on success, a negative value on failure

Definition at line 51 of file ffi_mac.cpp.

51 {
52 if(out == nullptr) {
54 }
55 return BOTAN_FFI_VISIT(mac, [=](const auto& m) { *out = m.output_length(); });
56}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mac_set_key()

int botan_mac_set_key ( botan_mac_t mac,
const uint8_t * key,
size_t key_len )

Sets the key on the MAC

Parameters
Message Authentication Codesmac object
keybuffer holding the key
key_lensize of the key buffer in bytes
Returns
0 on success, a negative value on failure

Definition at line 40 of file ffi_mac.cpp.

40 {
41 if(key_len > 0 && key == nullptr) {
43 }
44 return BOTAN_FFI_VISIT(mac, [=](auto& m) { m.set_key(key, key_len); });
45}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mac_set_nonce()

int botan_mac_set_nonce ( botan_mac_t mac,
const uint8_t * nonce,
size_t nonce_len )

Sets the nonce on the MAC

Parameters
Message Authentication Codesmac object
noncebuffer holding the key
nonce_lensize of the key buffer in bytes
Returns
0 on success, a negative value on failure

Definition at line 47 of file ffi_mac.cpp.

47 {
48 return BOTAN_FFI_VISIT(mac, [=](auto& m) { m.start(nonce, nonce_len); });
49}

References BOTAN_FFI_VISIT.

◆ botan_mac_update()

int botan_mac_update ( botan_mac_t mac,
const uint8_t * buf,
size_t len )

Send more input to the message authentication code

Parameters
Message Authentication Codesmac object
bufinput buffer
lennumber of bytes to read from the input buffer
Returns
0 on success, a negative value on failure

Definition at line 62 of file ffi_mac.cpp.

62 {
63 if(len == 0) {
64 return BOTAN_FFI_SUCCESS;
65 }
66 if(buf == nullptr) {
68 }
69 return BOTAN_FFI_VISIT(mac, [=](auto& m) { m.update(buf, len); });
70}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_mceies_decrypt()

int botan_mceies_decrypt ( botan_privkey_t mce_key,
const char * aead,
const uint8_t ct[],
size_t ct_len,
const uint8_t ad[],
size_t ad_len,
uint8_t pt[],
size_t * pt_len )

Definition at line 1564 of file ffi_pkey_algs.cpp.

1571 {
1572 BOTAN_UNUSED(mce_key_obj, aead, ct, ct_len, ad, ad_len, out, out_len);
1574}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_mceies_encrypt()

int botan_mceies_encrypt ( botan_pubkey_t mce_key,
botan_rng_t rng,
const char * aead,
const uint8_t pt[],
size_t pt_len,
const uint8_t ad[],
size_t ad_len,
uint8_t ct[],
size_t * ct_len )

Definition at line 1576 of file ffi_pkey_algs.cpp.

1584 {
1585 BOTAN_UNUSED(mce_key_obj, rng_obj, aead, pt, pt_len, ad, ad_len, out, out_len);
1587}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_mp_add()

int botan_mp_add ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Definition at line 153 of file ffi_mp.cpp.

153 {
154 return BOTAN_FFI_VISIT(result, [=](auto& res) {
155 if(result == x) {
156 res += safe_get(y);
157 } else {
158 res = safe_get(x) + safe_get(y);
159 }
160 });
161}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_add_u32()

int botan_mp_add_u32 ( botan_mp_t result,
botan_mp_t x,
uint32_t y )

Definition at line 173 of file ffi_mp.cpp.

173 {
174 return BOTAN_FFI_VISIT(result, [=](auto& res) {
175 if(result == x) {
176 res += static_cast<Botan::word>(y);
177 } else {
178 res = safe_get(x) + static_cast<Botan::word>(y);
179 }
180 });
181}
std::conditional_t< HasNative64BitRegisters, std::uint64_t, uint32_t > word
Definition types.h:119

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_clear()

int botan_mp_clear ( botan_mp_t mp)

Set the MPI to zero

Definition at line 35 of file ffi_mp.cpp.

35 {
36 return BOTAN_FFI_VISIT(mp, [](auto& bn) { bn.clear(); });
37}

References BOTAN_FFI_VISIT.

◆ botan_mp_clear_bit()

int botan_mp_clear_bit ( botan_mp_t n,
size_t bit )

Clear the specified bit

Definition at line 290 of file ffi_mp.cpp.

290 {
291 return BOTAN_FFI_VISIT(mp, [=](auto& n) { n.clear_bit(bit); });
292}

References BOTAN_FFI_VISIT.

◆ botan_mp_cmp()

int botan_mp_cmp ( int * result,
botan_mp_t x,
botan_mp_t y )

Definition at line 227 of file ffi_mp.cpp.

227 {
228 if(result == nullptr) {
230 }
231 return BOTAN_FFI_VISIT(x_w, [=](auto& x) { *result = x.cmp(safe_get(y_w)); });
232}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_destroy()

int botan_mp_destroy ( botan_mp_t mp)

Destroy (deallocate) an MPI

Returns
0 if success, error if invalid object handle

Definition at line 149 of file ffi_mp.cpp.

149 {
150 return BOTAN_FFI_CHECKED_DELETE(mp);
151}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_mp_div()

int botan_mp_div ( botan_mp_t quotient,
botan_mp_t remainder,
botan_mp_t x,
botan_mp_t y )

Definition at line 203 of file ffi_mp.cpp.

203 {
204 return BOTAN_FFI_VISIT(quotient, [=](auto& q) {
207 safe_get(remainder) = r;
208 });
209}
void vartime_divide(const BigInt &x, const BigInt &y_arg, BigInt &q_out, BigInt &r_out)
Definition divide.cpp:325

References BOTAN_FFI_VISIT, Botan_FFI::safe_get(), and Botan::vartime_divide().

◆ botan_mp_equal()

int botan_mp_equal ( botan_mp_t x,
botan_mp_t y )

Definition at line 211 of file ffi_mp.cpp.

211 {
212 return BOTAN_FFI_VISIT(x_w, [=](const auto& x) -> int { return x == safe_get(y_w); });
213}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_flip_sign()

int botan_mp_flip_sign ( botan_mp_t mp)

Definition at line 72 of file ffi_mp.cpp.

72 {
73 return BOTAN_FFI_VISIT(mp, [](auto& bn) { bn.flip_sign(); });
74}

References BOTAN_FFI_VISIT.

◆ botan_mp_from_bin()

int botan_mp_from_bin ( botan_mp_t mp,
const uint8_t vec[],
size_t vec_len )

Definition at line 76 of file ffi_mp.cpp.

76 {
77 if(bin_len > 0 && bin == nullptr) {
79 }
80 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn._assign_from_bytes({bin, bin_len}); });
81}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_gcd()

int botan_mp_gcd ( botan_mp_t out,
botan_mp_t x,
botan_mp_t y )

Definition at line 274 of file ffi_mp.cpp.

274 {
275 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = Botan::gcd(safe_get(x), safe_get(y)); });
276}
BigInt gcd(const BigInt &a, const BigInt &b)
Definition numthry.cpp:220

References BOTAN_FFI_VISIT, Botan::gcd(), and Botan_FFI::safe_get().

◆ botan_mp_get_bit()

int botan_mp_get_bit ( botan_mp_t n,
size_t bit )

Returns 0 if specified bit of n is not set Returns 1 if specified bit of n is set Returns negative number on error

Definition at line 282 of file ffi_mp.cpp.

282 {
283 return BOTAN_FFI_VISIT(mp, [=](const auto& n) -> int { return n.get_bit(bit); });
284}

References BOTAN_FFI_VISIT.

◆ botan_mp_init()

int botan_mp_init ( botan_mp_t * mp)

Initialize an MPI

Definition at line 24 of file ffi_mp.cpp.

24 {
25 return ffi_guard_thunk(__func__, [=]() -> int {
26 if(mp_out == nullptr) {
28 }
29
30 auto mp = std::make_unique<Botan::BigInt>();
31 return ffi_new_object(mp_out, std::move(mp));
32 });
33}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_mp_is_even()

int botan_mp_is_even ( botan_mp_t mp)

Definition at line 223 of file ffi_mp.cpp.

223 {
224 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_even(); });
225}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_negative()

int botan_mp_is_negative ( botan_mp_t mp)

Return 1 iff mp is less than 0

Definition at line 64 of file ffi_mp.cpp.

64 {
65 return BOTAN_FFI_VISIT(mp, [](const auto& bn) { return bn.signum() < 0 ? 1 : 0; });
66}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_odd()

int botan_mp_is_odd ( botan_mp_t mp)

Definition at line 219 of file ffi_mp.cpp.

219 {
220 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_odd(); });
221}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_positive()

int botan_mp_is_positive ( botan_mp_t mp)

This function should have been named mp_is_non_negative. Returns 1 iff mp is greater than or equal to zero. Use botan_mp_is_negative to detect negative numbers, botan_mp_is_zero to check for zero.

Definition at line 68 of file ffi_mp.cpp.

68 {
69 return BOTAN_FFI_VISIT(mp, [](const auto& bn) { return bn.signum() >= 0 ? 1 : 0; });
70}

References BOTAN_FFI_VISIT.

◆ botan_mp_is_prime()

int botan_mp_is_prime ( botan_mp_t n,
botan_rng_t rng,
size_t test_prob )

Returns 0 if n is not prime Returns 1 if n is prime Returns negative number on error

Definition at line 278 of file ffi_mp.cpp.

278 {
279 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { return (Botan::is_prime(n, safe_get(rng), test_prob)) ? 1 : 0; });
280}
bool is_prime(const BigInt &n, RandomNumberGenerator &rng, size_t prob, bool is_random)
Definition numthry.cpp:381

References BOTAN_FFI_VISIT, Botan::is_prime(), and Botan_FFI::safe_get().

◆ botan_mp_is_zero()

int botan_mp_is_zero ( botan_mp_t mp)

Definition at line 215 of file ffi_mp.cpp.

215 {
216 return BOTAN_FFI_VISIT(mp, [](const auto& bn) -> int { return bn.is_zero(); });
217}

References BOTAN_FFI_VISIT.

◆ botan_mp_lshift()

int botan_mp_lshift ( botan_mp_t out,
botan_mp_t in,
size_t shift )

Definition at line 244 of file ffi_mp.cpp.

244 {
245 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = safe_get(in) << shift; });
246}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_mod_inverse()

int botan_mp_mod_inverse ( botan_mp_t out,
botan_mp_t in,
botan_mp_t modulus )

Definition at line 252 of file ffi_mp.cpp.

252 {
253 return BOTAN_FFI_VISIT(out, [=](auto& o) {
255 });
256}
static BigInt zero()
Definition bigint.h:50
std::optional< BigInt > inverse_mod_general(const BigInt &x, const BigInt &mod)
Definition mod_inv.cpp:179

References BOTAN_FFI_VISIT, Botan::inverse_mod_general(), Botan_FFI::safe_get(), and Botan::BigInt::zero().

◆ botan_mp_mod_mul()

int botan_mp_mod_mul ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y,
botan_mp_t mod )

Definition at line 258 of file ffi_mp.cpp.

258 {
259 return BOTAN_FFI_VISIT(out, [=](auto& o) {
261 o = reducer.multiply(safe_get(x), safe_get(y));
262 });
263}
static Barrett_Reduction for_secret_modulus(const BigInt &m)
Definition barrett.cpp:23

References BOTAN_FFI_VISIT, Botan::Barrett_Reduction::for_secret_modulus(), and Botan_FFI::safe_get().

◆ botan_mp_mul()

int botan_mp_mul ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Definition at line 193 of file ffi_mp.cpp.

193 {
194 return BOTAN_FFI_VISIT(result, [=](auto& res) {
195 if(result == x) {
196 res *= safe_get(y);
197 } else {
198 res = safe_get(x) * safe_get(y);
199 }
200 });
201}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_num_bits()

int botan_mp_num_bits ( botan_mp_t n,
size_t * bits )

Return the number of significant bits in the MPI

Definition at line 294 of file ffi_mp.cpp.

294 {
295 if(bits == nullptr) {
297 }
298 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { *bits = n.bits(); });
299}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_num_bytes()

int botan_mp_num_bytes ( botan_mp_t n,
size_t * bytes )

Return the number of significant bytes in the MPI

Definition at line 301 of file ffi_mp.cpp.

301 {
302 if(bytes == nullptr) {
304 }
305 return BOTAN_FFI_VISIT(mp, [=](const auto& n) { *bytes = n.bytes(); });
306}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_powmod()

int botan_mp_powmod ( botan_mp_t out,
botan_mp_t base,
botan_mp_t exponent,
botan_mp_t modulus )

Definition at line 239 of file ffi_mp.cpp.

239 {
240 return BOTAN_FFI_VISIT(
241 out, [=](auto& o) { o = Botan::power_mod(safe_get(base), safe_get(exponent), safe_get(modulus)); });
242}
BigInt power_mod(const BigInt &base, const BigInt &exp, const BigInt &mod)
Definition numthry.cpp:310

References BOTAN_FFI_VISIT, Botan::power_mod(), and Botan_FFI::safe_get().

◆ botan_mp_rand_bits()

int botan_mp_rand_bits ( botan_mp_t rand_out,
botan_rng_t rng,
size_t bits )

Definition at line 265 of file ffi_mp.cpp.

265 {
266 return BOTAN_FFI_VISIT(rng, [=](auto& r) { safe_get(rand_out).randomize(r, bits); });
267}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_rand_range()

int botan_mp_rand_range ( botan_mp_t rand_out,
botan_rng_t rng,
botan_mp_t lower_bound,
botan_mp_t upper_bound )

Definition at line 269 of file ffi_mp.cpp.

269 {
270 return BOTAN_FFI_VISIT(
271 rng, [=](auto& r) { safe_get(rand_out) = Botan::BigInt::random_integer(r, safe_get(lower), safe_get(upper)); });
272}
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Definition big_rand.cpp:44

References BOTAN_FFI_VISIT, Botan::BigInt::random_integer(), and Botan_FFI::safe_get().

◆ botan_mp_rshift()

int botan_mp_rshift ( botan_mp_t out,
botan_mp_t in,
size_t shift )

Definition at line 248 of file ffi_mp.cpp.

248 {
249 return BOTAN_FFI_VISIT(out, [=](auto& o) { o = safe_get(in) >> shift; });
250}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_set_bit()

int botan_mp_set_bit ( botan_mp_t n,
size_t bit )

Set the specified bit

Definition at line 286 of file ffi_mp.cpp.

286 {
287 return BOTAN_FFI_VISIT(mp, [=](auto& n) { n.set_bit(bit); });
288}

References BOTAN_FFI_VISIT.

◆ botan_mp_set_from_int()

int botan_mp_set_from_int ( botan_mp_t mp,
int initial_value )

Set the MPI value from an int

Definition at line 39 of file ffi_mp.cpp.

39 {
40 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn = Botan::BigInt::from_s32(initial_value); });
41}
static BigInt from_s32(int32_t n)
Definition bigint.cpp:42

References BOTAN_FFI_VISIT, and Botan::BigInt::from_s32().

◆ botan_mp_set_from_mp()

int botan_mp_set_from_mp ( botan_mp_t dest,
botan_mp_t source )

Set the MPI value from another MP object

Definition at line 60 of file ffi_mp.cpp.

60 {
61 return BOTAN_FFI_VISIT(dest, [=](auto& bn) { bn = safe_get(source); });
62}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_set_from_radix_str()

int botan_mp_set_from_radix_str ( botan_mp_t dest,
const char * str,
size_t radix )

Set the MPI value from a string with arbitrary radix. For arbitrary being 10 or 16.

Definition at line 47 of file ffi_mp.cpp.

47 {
48 return BOTAN_FFI_VISIT(mp, [=](auto& bn) {
49 if(radix != 10 && radix != 16) {
51 }
52
53 bn = Botan::BigInt::from_radix_digits(std::string_view(str), radix);
54 return BOTAN_FFI_SUCCESS;
55 });
56}
static BigInt from_radix_digits(std::string_view digits, size_t radix)
Definition big_code.cpp:125

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan::BigInt::from_radix_digits().

◆ botan_mp_set_from_str()

int botan_mp_set_from_str ( botan_mp_t dest,
const char * str )

Set the MPI value from a string

Definition at line 43 of file ffi_mp.cpp.

43 {
44 return BOTAN_FFI_VISIT(mp, [=](auto& bn) { bn = Botan::BigInt(str); });
45}

References BOTAN_FFI_VISIT.

◆ botan_mp_sub()

int botan_mp_sub ( botan_mp_t result,
botan_mp_t x,
botan_mp_t y )

Definition at line 163 of file ffi_mp.cpp.

163 {
164 return BOTAN_FFI_VISIT(result, [=](auto& res) {
165 if(result == x) {
166 res -= safe_get(y);
167 } else {
168 res = safe_get(x) - safe_get(y);
169 }
170 });
171}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_sub_u32()

int botan_mp_sub_u32 ( botan_mp_t result,
botan_mp_t x,
uint32_t y )

Definition at line 183 of file ffi_mp.cpp.

183 {
184 return BOTAN_FFI_VISIT(result, [=](auto& res) {
185 if(result == x) {
186 res -= static_cast<Botan::word>(y);
187 } else {
188 res = safe_get(x) - static_cast<Botan::word>(y);
189 }
190 });
191}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_swap()

int botan_mp_swap ( botan_mp_t x,
botan_mp_t y )

Definition at line 234 of file ffi_mp.cpp.

234 {
235 return BOTAN_FFI_VISIT(x_w, [=](auto& x) { x.swap(safe_get(y_w)); });
236}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_mp_to_bin()

int botan_mp_to_bin ( botan_mp_t mp,
uint8_t vec[] )

Definition at line 128 of file ffi_mp.cpp.

128 {
129 if(vec == nullptr) {
131 }
132 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) { bn.serialize_to(std::span{vec, bn.bytes()}); });
133}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_to_hex()

int botan_mp_to_hex ( botan_mp_t mp,
char * out )

Convert the MPI to a hex string. Writes up to botan_mp_num_bytes(mp)*2 + 5 bytes

Prefer botan_mp_view_hex

Definition at line 83 of file ffi_mp.cpp.

83 {
84 if(out == nullptr) {
86 }
87 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) {
88 const std::string hex = bn.to_hex_string();
89
90 // Check that we are about to write no more than the documented upper bound
91 const size_t upper_bound = 2 * bn.bytes() + 5;
92 BOTAN_ASSERT_NOMSG(hex.size() + 1 <= upper_bound);
93 std::memcpy(out, hex.c_str(), 1 + hex.size());
94 });
95}

References BOTAN_ASSERT_NOMSG, BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_to_str()

int botan_mp_to_str ( botan_mp_t mp,
uint8_t radix,
char * out,
size_t * out_len )

Convert the MPI to a string. Currently radix == 10 and radix == 16 are supported.

Definition at line 104 of file ffi_mp.cpp.

104 {
105 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
106 if(radix == 0 || radix == 10) {
107 return write_str_output(out, out_len, bn.to_dec_string());
108 } else if(radix == 16) {
109 return write_str_output(out, out_len, bn.to_hex_string());
110 } else {
112 }
113 });
114}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_mp_to_uint32()

int botan_mp_to_uint32 ( botan_mp_t mp,
uint32_t * val )

Definition at line 142 of file ffi_mp.cpp.

142 {
143 if(val == nullptr) {
145 }
146 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) { *val = bn.to_u32bit(); });
147}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_mp_view_bin()

int botan_mp_view_bin ( botan_mp_t mp,
botan_view_ctx ctx,
botan_view_bin_fn view )

Definition at line 135 of file ffi_mp.cpp.

135 {
136 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) {
137 const auto bytes = bn.serialize();
138 return invoke_view_callback(view, ctx, bytes);
139 });
140}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_mp_view_hex()

int botan_mp_view_hex ( botan_mp_t mp,
botan_view_ctx ctx,
botan_view_str_fn view )

View the hex string encoding of the MPI.

Definition at line 97 of file ffi_mp.cpp.

97 {
98 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
99 const std::string hex = bn.to_hex_string();
100 return invoke_view_callback(view, ctx, hex);
101 });
102}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_mp_view_str()

int botan_mp_view_str ( botan_mp_t mp,
uint8_t radix,
botan_view_ctx ctx,
botan_view_str_fn view )

View the MPI as a radix-N integer. Currently only radix 10 and radix 16 are supported

Definition at line 116 of file ffi_mp.cpp.

116 {
117 return BOTAN_FFI_VISIT(mp, [=](const auto& bn) -> int {
118 if(radix == 10) {
119 return invoke_view_callback(view, ctx, bn.to_dec_string());
120 } else if(radix == 16) {
121 return invoke_view_callback(view, ctx, bn.to_hex_string());
122 } else {
124 }
125 });
126}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_nist_kw_dec()

int botan_nist_kw_dec ( const char * cipher_algo,
int padded,
const uint8_t wrapped_key[],
size_t wrapped_key_len,
const uint8_t kek[],
size_t kek_len,
uint8_t key[],
size_t * key_len )

Definition at line 57 of file ffi_keywrap.cpp.

64 {
65 if(any_null_pointers(cipher_algo, wrapped_key, kek)) {
67 }
68#if defined(BOTAN_HAS_NIST_KEYWRAP)
69 return ffi_guard_thunk(__func__, [=]() -> int {
70 if(padded != 0 && padded != 1) {
72 }
73
74 auto bc = Botan::BlockCipher::create_or_throw(cipher_algo);
75 bc->set_key(kek, kek_len);
76
78
79 if(padded == 0) {
80 output = Botan::nist_key_unwrap(wrapped_key, wrapped_key_len, *bc);
81 } else {
82 output = Botan::nist_key_unwrap_padded(wrapped_key, wrapped_key_len, *bc);
83 }
84
85 return write_vec_output(key, key_len, output);
86 });
87#else
88 BOTAN_UNUSED(cipher_algo, padded, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
90#endif
91}
static std::unique_ptr< BlockCipher > create_or_throw(std::string_view algo_spec, std::string_view provider="")
secure_vector< uint8_t > nist_key_unwrap_padded(const uint8_t input[], size_t input_len, const BlockCipher &bc)
secure_vector< uint8_t > nist_key_unwrap(const uint8_t input[], size_t input_len, const BlockCipher &bc)

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::BlockCipher::create_or_throw(), Botan_FFI::ffi_guard_thunk(), Botan::nist_key_unwrap(), Botan::nist_key_unwrap_padded(), and Botan_FFI::write_vec_output().

Referenced by botan_key_unwrap3394().

◆ botan_nist_kw_enc()

int botan_nist_kw_enc ( const char * cipher_algo,
int padded,
const uint8_t key[],
size_t key_len,
const uint8_t kek[],
size_t kek_len,
uint8_t wrapped_key[],
size_t * wrapped_key_len )

Definition at line 22 of file ffi_keywrap.cpp.

29 {
30 if(any_null_pointers(cipher_algo, key, kek)) {
32 }
33#if defined(BOTAN_HAS_NIST_KEYWRAP)
34 return ffi_guard_thunk(__func__, [=]() -> int {
35 if(padded != 0 && padded != 1) {
37 }
38 auto bc = Botan::BlockCipher::create_or_throw(cipher_algo);
39 bc->set_key(kek, kek_len);
40
41 std::vector<uint8_t> output;
42
43 if(padded == 0) {
44 output = Botan::nist_key_wrap(key, key_len, *bc);
45 } else {
46 output = Botan::nist_key_wrap_padded(key, key_len, *bc);
47 }
48
49 return write_vec_output(wrapped_key, wrapped_key_len, output);
50 });
51#else
52 BOTAN_UNUSED(cipher_algo, padded, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
54#endif
55}
std::vector< uint8_t > nist_key_wrap(const uint8_t input[], size_t input_len, const BlockCipher &bc)
std::vector< uint8_t > nist_key_wrap_padded(const uint8_t input[], size_t input_len, const BlockCipher &bc)

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::BlockCipher::create_or_throw(), Botan_FFI::ffi_guard_thunk(), Botan::nist_key_wrap(), Botan::nist_key_wrap_padded(), and Botan_FFI::write_vec_output().

Referenced by botan_key_wrap3394().

◆ botan_oid_cmp()

int botan_oid_cmp ( int * result,
botan_asn1_oid_t a,
botan_asn1_oid_t b )

Sets

Parameters
resultto comparison result: -1 if a < b, 0 if a == b, 1 if a > b
Returns
negative number on error or zero on success

Definition at line 63 of file ffi_oid.cpp.

63 {
64 return BOTAN_FFI_VISIT(a_w, [=](auto& a) {
65 if(result == nullptr) {
67 }
68 const Botan::OID b = safe_get(b_w);
69 // we don't have .cmp for OID
70 if(a == b) {
71 *result = 0;
72 } else if(a < b) {
73 *result = -1;
74 } else {
75 *result = 1;
76 }
77 return BOTAN_FFI_SUCCESS;
78 });
79}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_oid_destroy()

int botan_oid_destroy ( botan_asn1_oid_t oid)
Returns
negative number on error, or zero on success

Definition at line 18 of file ffi_oid.cpp.

18 {
19 return BOTAN_FFI_CHECKED_DELETE(oid);
20}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_oid_equal()

int botan_oid_equal ( botan_asn1_oid_t a,
botan_asn1_oid_t b )
Returns
0 if a != b
1 if a == b
negative number on error

Definition at line 59 of file ffi_oid.cpp.

59 {
60 return BOTAN_FFI_VISIT(a_w, [=](const auto& a) -> int { return a == safe_get(b_w); });
61}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_oid_from_string()

int botan_oid_from_string ( botan_asn1_oid_t * oid,
const char * oid_str )

Create an OID from a string, either dot notation (e.g. '1.2.3.4') or a registered name (e.g. 'RSA')

Parameters
oidhandle to the resulting OID
oid_strthe name of the OID to create
Returns
negative number on error, or zero on success

Definition at line 22 of file ffi_oid.cpp.

22 {
23 return ffi_guard_thunk(__func__, [=]() -> int {
24 if(oid_obj == nullptr || oid_str == nullptr) {
26 }
27 Botan::OID oid;
28 // This returns a Lookup_Error if an unknown name is passed,
29 // which would get turned into NOT_IMPLEMENTED
30 try {
31 oid = Botan::OID::from_string(oid_str);
32 } catch(Botan::Lookup_Error&) {
34 }
35 auto oid_ptr = std::make_unique<Botan::OID>(std::move(oid));
36 return ffi_new_object(oid_obj, std::move(oid_ptr));
37 });
38}
static OID from_string(std::string_view str)
Definition asn1_oid.cpp:86

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::OID::from_string().

◆ botan_oid_register()

int botan_oid_register ( botan_asn1_oid_t oid,
const char * name )

Registers an OID so that it may later be retrieved by name

Returns
negative number on error, or zero on success

Definition at line 40 of file ffi_oid.cpp.

40 {
41 return BOTAN_FFI_VISIT(oid, [=](const auto& o) -> int {
42 if(name == nullptr) {
44 }
46 return BOTAN_FFI_SUCCESS;
47 });
48}
static void register_oid(const OID &oid, std::string_view name)
Definition asn1_oid.cpp:67

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan::OID::register_oid().

◆ botan_oid_view_name()

int botan_oid_view_name ( botan_asn1_oid_t oid,
botan_view_ctx ctx,
botan_view_str_fn view )

View an OIDs registered name if it exists, else its dot notation

Definition at line 54 of file ffi_oid.cpp.

54 {
55 return BOTAN_FFI_VISIT(
56 oid, [=](const auto& o) -> int { return invoke_view_callback(view, ctx, o.to_formatted_string()); });
57}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_oid_view_string()

int botan_oid_view_string ( botan_asn1_oid_t oid,
botan_view_ctx ctx,
botan_view_str_fn view )

View an OID in dot notation

Definition at line 50 of file ffi_oid.cpp.

50 {
51 return BOTAN_FFI_VISIT(oid, [=](const auto& o) -> int { return invoke_view_callback(view, ctx, o.to_string()); });
52}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

◆ botan_pbkdf()

int botan_pbkdf ( const char * pbkdf_algo,
uint8_t out[],
size_t out_len,
const char * passphrase,
const uint8_t salt[],
size_t salt_len,
size_t iterations )

Definition at line 23 of file ffi_kdf.cpp.

29 {
30 return botan_pwdhash(algo, iterations, 0, 0, out, out_len, pass, 0, salt, salt_len);
31}
int botan_pwdhash(const char *algo, size_t param1, size_t param2, size_t param3, uint8_t out[], size_t out_len, const char *password, size_t password_len, const uint8_t salt[], size_t salt_len)
Definition ffi_kdf.cpp:54

References botan_pwdhash().

◆ botan_pbkdf_timed()

int botan_pbkdf_timed ( const char * pbkdf_algo,
uint8_t out[],
size_t out_len,
const char * passphrase,
const uint8_t salt[],
size_t salt_len,
size_t milliseconds_to_run,
size_t * out_iterations_used )

Derive a key from a passphrase, running until msec time has elapsed.

Parameters
pbkdf_algoPBKDF algorithm, e.g., "PBKDF2(SHA-256)"
outbuffer to store the derived key, must be of out_len bytes
out_lenthe desired length of the key to produce
passphrasethe password to derive the key from
salta randomly chosen salt
salt_lenlength of salt in bytes
milliseconds_to_runif iterations is zero, then instead the PBKDF is run until milliseconds_to_run milliseconds has passed
out_iterations_usedset to the number iterations executed
Returns
0 on success, a negative value on failure

Deprecated: use

botan_pwdhash_timed(pbkdf_algo, static_cast<uint32_t>(ms_to_run), iterations_used, nullptr, nullptr, out, out_len, password, 0, salt, salt_len);

Definition at line 33 of file ffi_kdf.cpp.

40 {
41 return botan_pwdhash_timed(algo,
42 static_cast<uint32_t>(ms_to_run),
43 iterations_used,
44 nullptr,
45 nullptr,
46 out,
47 out_len,
48 password,
49 0,
50 salt,
51 salt_len);
52}
int botan_pwdhash_timed(const char *algo, uint32_t msec, size_t *param1, size_t *param2, size_t *param3, uint8_t out[], size_t out_len, const char *password, size_t password_len, const uint8_t salt[], size_t salt_len)
Definition ffi_kdf.cpp:93

References botan_pwdhash_timed().

◆ botan_pk_op_decrypt()

int botan_pk_op_decrypt ( botan_pk_op_decrypt_t op,
uint8_t out[],
size_t * out_len,
const uint8_t ciphertext[],
size_t ciphertext_len )

Definition at line 101 of file ffi_pk_op.cpp.

102 {
103 return BOTAN_FFI_VISIT(
104 op, [=](const auto& o) { return write_vec_output(out, out_len, o.decrypt(ciphertext, ciphertext_len)); });
105}

References BOTAN_FFI_VISIT, and Botan_FFI::write_vec_output().

◆ botan_pk_op_decrypt_create()

int botan_pk_op_decrypt_create ( botan_pk_op_decrypt_t * op,
botan_privkey_t key,
const char * padding,
uint32_t flags )

Definition at line 70 of file ffi_pk_op.cpp.

73 {
74 if(op == nullptr) {
76 }
77
78 if(flags != 0) {
80 }
81
82 return ffi_guard_thunk(__func__, [=]() -> int {
83 *op = nullptr;
84
85 auto pk = std::make_unique<Botan::PK_Decryptor_EME>(safe_get(key_obj), Botan::system_rng(), padding);
86 return ffi_new_object(op, std::move(pk));
87 });
88}
RandomNumberGenerator & system_rng()

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::system_rng().

◆ botan_pk_op_decrypt_destroy()

int botan_pk_op_decrypt_destroy ( botan_pk_op_decrypt_t op)
Returns
0 if success, error if invalid object handle

Definition at line 90 of file ffi_pk_op.cpp.

90 {
91 return BOTAN_FFI_CHECKED_DELETE(op);
92}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_decrypt_output_length()

int botan_pk_op_decrypt_output_length ( botan_pk_op_decrypt_t op,
size_t ctext_len,
size_t * ptext_len )

Definition at line 94 of file ffi_pk_op.cpp.

94 {
95 if(ptext_len == nullptr) {
97 }
98 return BOTAN_FFI_VISIT(op, [=](const auto& o) { *ptext_len = o.plaintext_length(ctext_len); });
99}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_pk_op_encrypt()

int botan_pk_op_encrypt ( botan_pk_op_encrypt_t op,
botan_rng_t rng,
uint8_t out[],
size_t * out_len,
const uint8_t plaintext[],
size_t plaintext_len )

Definition at line 56 of file ffi_pk_op.cpp.

61 {
62 return BOTAN_FFI_VISIT(op, [=](const auto& o) {
63 return write_vec_output(out, out_len, o.encrypt(plaintext, plaintext_len, safe_get(rng_obj)));
64 });
65}

References BOTAN_FFI_VISIT, Botan_FFI::safe_get(), and Botan_FFI::write_vec_output().

◆ botan_pk_op_encrypt_create()

int botan_pk_op_encrypt_create ( botan_pk_op_encrypt_t * op,
botan_pubkey_t key,
const char * padding,
uint32_t flags )

Definition at line 28 of file ffi_pk_op.cpp.

28 {
29 if(op == nullptr) {
31 }
32
33 if(flags != 0 && flags != BOTAN_PUBKEY_DER_FORMAT_SIGNATURE) {
35 }
36
37 return ffi_guard_thunk(__func__, [=]() -> int {
38 *op = nullptr;
39
40 auto pk = std::make_unique<Botan::PK_Encryptor_EME>(safe_get(key_obj), Botan::system_rng(), padding);
41 return ffi_new_object(op, std::move(pk));
42 });
43}
#define BOTAN_PUBKEY_DER_FORMAT_SIGNATURE
Definition ffi.h:2223

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_PUBKEY_DER_FORMAT_SIGNATURE, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::system_rng().

◆ botan_pk_op_encrypt_destroy()

int botan_pk_op_encrypt_destroy ( botan_pk_op_encrypt_t op)
Returns
0 if success, error if invalid object handle

Definition at line 45 of file ffi_pk_op.cpp.

45 {
46 return BOTAN_FFI_CHECKED_DELETE(op);
47}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_encrypt_output_length()

int botan_pk_op_encrypt_output_length ( botan_pk_op_encrypt_t op,
size_t ptext_len,
size_t * ctext_len )

Definition at line 49 of file ffi_pk_op.cpp.

49 {
50 if(ctext_len == nullptr) {
52 }
53 return BOTAN_FFI_VISIT(op, [=](const auto& o) { *ctext_len = o.ciphertext_length(ptext_len); });
54}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_pk_op_kem_decrypt_create()

int botan_pk_op_kem_decrypt_create ( botan_pk_op_kem_decrypt_t * op,
botan_privkey_t key,
const char * kdf )

Definition at line 307 of file ffi_pk_op.cpp.

307 {
308 if(op == nullptr || padding == nullptr) {
310 }
311
312 return ffi_guard_thunk(__func__, [=]() -> int {
313 auto pk = std::make_unique<Botan::PK_KEM_Decryptor>(safe_get(key_obj), Botan::system_rng(), padding);
314 return ffi_new_object(op, std::move(pk));
315 });
316}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::system_rng().

◆ botan_pk_op_kem_decrypt_destroy()

int botan_pk_op_kem_decrypt_destroy ( botan_pk_op_kem_decrypt_t op)
Returns
0 if success, error if invalid object handle

Definition at line 347 of file ffi_pk_op.cpp.

347 {
348 return BOTAN_FFI_CHECKED_DELETE(op);
349}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_kem_decrypt_shared_key()

int botan_pk_op_kem_decrypt_shared_key ( botan_pk_op_kem_decrypt_t op,
const uint8_t salt[],
size_t salt_len,
const uint8_t encapsulated_key[],
size_t encapsulated_key_len,
size_t desired_shared_key_len,
uint8_t shared_key[],
size_t * shared_key_len )

Definition at line 331 of file ffi_pk_op.cpp.

338 {
339 return BOTAN_FFI_VISIT(op, [=](auto& kem) {
340 const auto shared_key =
341 kem.decrypt(encapsulated_key, encapsulated_key_len, desired_shared_key_len, salt, salt_len);
342
343 return write_vec_output(shared_key_out, shared_key_len, shared_key);
344 });
345}

References BOTAN_FFI_VISIT, and Botan_FFI::write_vec_output().

◆ botan_pk_op_kem_decrypt_shared_key_length()

int botan_pk_op_kem_decrypt_shared_key_length ( botan_pk_op_kem_decrypt_t op,
size_t desired_shared_key_length,
size_t * output_shared_key_length )

Definition at line 318 of file ffi_pk_op.cpp.

320 {
321 if(output_shared_key_length == nullptr) {
323 }
324
325 return BOTAN_FFI_VISIT(op, [=](auto& kem) {
326 *output_shared_key_length = kem.shared_key_length(desired_shared_key_length);
327 return BOTAN_FFI_SUCCESS;
328 });
329}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_pk_op_kem_encrypt_create()

int botan_pk_op_kem_encrypt_create ( botan_pk_op_kem_encrypt_t * op,
botan_pubkey_t key,
const char * kdf )

Definition at line 245 of file ffi_pk_op.cpp.

245 {
246 if(op == nullptr || padding == nullptr) {
248 }
249
250 return ffi_guard_thunk(__func__, [=]() -> int {
251 auto pk = std::make_unique<Botan::PK_KEM_Encryptor>(safe_get(key_obj), padding);
252 return ffi_new_object(op, std::move(pk));
253 });
254}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_pk_op_kem_encrypt_create_shared_key()

int botan_pk_op_kem_encrypt_create_shared_key ( botan_pk_op_kem_encrypt_t op,
botan_rng_t rng,
const uint8_t salt[],
size_t salt_len,
size_t desired_shared_key_len,
uint8_t shared_key[],
size_t * shared_key_len,
uint8_t encapsulated_key[],
size_t * encapsulated_key_len )

Definition at line 285 of file ffi_pk_op.cpp.

293 {
294 return BOTAN_FFI_VISIT(op, [=](auto& kem) {
295 const auto result = kem.encrypt(safe_get(rng), desired_shared_key_len, {salt, salt_len});
296
297 const int rc = write_vec_output(encapsulated_key_out, encapsulated_key_len, result.encapsulated_shared_key());
298
299 if(rc != 0) {
300 return rc;
301 }
302
303 return write_vec_output(shared_key_out, shared_key_len, result.shared_key());
304 });
305}

References BOTAN_FFI_VISIT, Botan_FFI::safe_get(), and Botan_FFI::write_vec_output().

◆ botan_pk_op_kem_encrypt_destroy()

int botan_pk_op_kem_encrypt_destroy ( botan_pk_op_kem_encrypt_t op)
Returns
0 if success, error if invalid object handle

Definition at line 256 of file ffi_pk_op.cpp.

256 {
257 return BOTAN_FFI_CHECKED_DELETE(op);
258}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_kem_encrypt_encapsulated_key_length()

int botan_pk_op_kem_encrypt_encapsulated_key_length ( botan_pk_op_kem_encrypt_t op,
size_t * output_encapsulated_key_length )

Definition at line 273 of file ffi_pk_op.cpp.

274 {
275 if(output_encapsulated_key_length == nullptr) {
277 }
278
279 return BOTAN_FFI_VISIT(op, [=](auto& kem) {
280 *output_encapsulated_key_length = kem.encapsulated_key_length();
281 return BOTAN_FFI_SUCCESS;
282 });
283}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_pk_op_kem_encrypt_shared_key_length()

int botan_pk_op_kem_encrypt_shared_key_length ( botan_pk_op_kem_encrypt_t op,
size_t desired_shared_key_length,
size_t * output_shared_key_length )

Definition at line 260 of file ffi_pk_op.cpp.

262 {
263 if(output_shared_key_length == nullptr) {
265 }
266
267 return BOTAN_FFI_VISIT(op, [=](auto& kem) {
268 *output_shared_key_length = kem.shared_key_length(desired_shared_key_length);
269 return BOTAN_FFI_SUCCESS;
270 });
271}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_pk_op_key_agreement()

int botan_pk_op_key_agreement ( botan_pk_op_ka_t op,
uint8_t out[],
size_t * out_len,
const uint8_t other_key[],
size_t other_key_len,
const uint8_t salt[],
size_t salt_len )

Definition at line 232 of file ffi_pk_op.cpp.

238 {
239 return BOTAN_FFI_VISIT(op, [=](const auto& o) {
240 auto k = o.derive_key(*out_len, other_key, other_key_len, salt, salt_len).bits_of();
241 return write_vec_output(out, out_len, k);
242 });
243}

References BOTAN_FFI_VISIT, and Botan_FFI::write_vec_output().

◆ botan_pk_op_key_agreement_create()

int botan_pk_op_key_agreement_create ( botan_pk_op_ka_t * op,
botan_privkey_t key,
const char * kdf,
uint32_t flags )

Definition at line 188 of file ffi_pk_op.cpp.

188 {
189 if(op == nullptr) {
191 }
192
193 if(flags != 0) {
195 }
196
197 return ffi_guard_thunk(__func__, [=]() -> int {
198 *op = nullptr;
199 auto pk = std::make_unique<Botan::PK_Key_Agreement>(safe_get(key_obj), Botan::system_rng(), kdf);
200 return ffi_new_object(op, std::move(pk));
201 });
202}

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::system_rng().

◆ botan_pk_op_key_agreement_destroy()

int botan_pk_op_key_agreement_destroy ( botan_pk_op_ka_t op)
Returns
0 if success, error if invalid object handle

Definition at line 204 of file ffi_pk_op.cpp.

204 {
205 return BOTAN_FFI_CHECKED_DELETE(op);
206}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_key_agreement_export_public()

int botan_pk_op_key_agreement_export_public ( botan_privkey_t key,
uint8_t out[],
size_t * out_len )

Definition at line 208 of file ffi_pk_op.cpp.

208 {
209 return copy_view_bin(out, out_len, botan_pk_op_key_agreement_view_public, key);
210}
int botan_pk_op_key_agreement_view_public(botan_privkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
int copy_view_bin(uint8_t out[], size_t *out_len, Fn fn, Args... args)
Definition ffi_util.h:214

References botan_pk_op_key_agreement_view_public(), and Botan_FFI::copy_view_bin().

◆ botan_pk_op_key_agreement_size()

int botan_pk_op_key_agreement_size ( botan_pk_op_ka_t op,
size_t * out_len )

Definition at line 222 of file ffi_pk_op.cpp.

222 {
223 return BOTAN_FFI_VISIT(op, [=](const auto& o) {
224 if(out_len == nullptr) {
226 }
227 *out_len = o.agreed_value_size();
228 return BOTAN_FFI_SUCCESS;
229 });
230}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_pk_op_key_agreement_view_public()

int botan_pk_op_key_agreement_view_public ( botan_privkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

Definition at line 212 of file ffi_pk_op.cpp.

212 {
213 return BOTAN_FFI_VISIT(key, [=](const auto& k) -> int {
214 if(auto kak = dynamic_cast<const Botan::PK_Key_Agreement_Key*>(&k)) {
215 return invoke_view_callback(view, ctx, kak->public_value());
216 } else {
218 }
219 });
220}

References BOTAN_FFI_ERROR_INVALID_INPUT, BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

Referenced by botan_pk_op_key_agreement_export_public().

◆ botan_pk_op_sign_create()

int botan_pk_op_sign_create ( botan_pk_op_sign_t * op,
botan_privkey_t key,
const char * hash_and_padding,
uint32_t flags )

Definition at line 110 of file ffi_pk_op.cpp.

110 {
111 if(op == nullptr) {
113 }
114
115 if(flags != 0 && flags != BOTAN_PUBKEY_DER_FORMAT_SIGNATURE) {
117 }
118
119 return ffi_guard_thunk(__func__, [=]() -> int {
120 *op = nullptr;
121
122 const bool use_der = (flags & BOTAN_PUBKEY_DER_FORMAT_SIGNATURE) != 0;
124
125 auto pk = std::make_unique<Botan::PK_Signer>(safe_get(key_obj), Botan::system_rng(), hash, format);
126 return ffi_new_object(op, std::move(pk));
127 });
128}

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_PUBKEY_DER_FORMAT_SIGNATURE, Botan::DerSequence, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), Botan::Standard, and Botan::system_rng().

◆ botan_pk_op_sign_destroy()

int botan_pk_op_sign_destroy ( botan_pk_op_sign_t op)
Returns
0 if success, error if invalid object handle

Definition at line 130 of file ffi_pk_op.cpp.

130 {
131 return BOTAN_FFI_CHECKED_DELETE(op);
132}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_sign_finish()

int botan_pk_op_sign_finish ( botan_pk_op_sign_t op,
botan_rng_t rng,
uint8_t sig[],
size_t * sig_len )

Definition at line 146 of file ffi_pk_op.cpp.

146 {
147 return BOTAN_FFI_VISIT(op, [=](auto& o) { return write_vec_output(out, out_len, o.signature(safe_get(rng_obj))); });
148}

References BOTAN_FFI_VISIT, Botan_FFI::safe_get(), and Botan_FFI::write_vec_output().

◆ botan_pk_op_sign_output_length()

int botan_pk_op_sign_output_length ( botan_pk_op_sign_t op,
size_t * olen )

Definition at line 134 of file ffi_pk_op.cpp.

134 {
135 if(sig_len == nullptr) {
137 }
138
139 return BOTAN_FFI_VISIT(op, [=](const auto& o) { *sig_len = o.signature_length(); });
140}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_pk_op_sign_update()

int botan_pk_op_sign_update ( botan_pk_op_sign_t op,
const uint8_t in[],
size_t in_len )

Definition at line 142 of file ffi_pk_op.cpp.

142 {
143 return BOTAN_FFI_VISIT(op, [=](auto& o) { o.update(in, in_len); });
144}

References BOTAN_FFI_VISIT.

◆ botan_pk_op_verify_create()

int botan_pk_op_verify_create ( botan_pk_op_verify_t * op,
botan_pubkey_t key,
const char * hash_and_padding,
uint32_t flags )

Definition at line 150 of file ffi_pk_op.cpp.

150 {
151 if(op == nullptr) {
153 }
154
155 if(flags != 0 && flags != BOTAN_PUBKEY_DER_FORMAT_SIGNATURE) {
157 }
158
159 return ffi_guard_thunk(__func__, [=]() -> int {
160 *op = nullptr;
161 const bool use_der = (flags & BOTAN_PUBKEY_DER_FORMAT_SIGNATURE) != 0;
163 auto pk = std::make_unique<Botan::PK_Verifier>(safe_get(key_obj), hash, format);
164 return ffi_new_object(op, std::move(pk));
165 });
166}

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_PUBKEY_DER_FORMAT_SIGNATURE, Botan::DerSequence, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::Standard.

◆ botan_pk_op_verify_destroy()

int botan_pk_op_verify_destroy ( botan_pk_op_verify_t op)
Returns
0 if success, error if invalid object handle

Definition at line 168 of file ffi_pk_op.cpp.

168 {
169 return BOTAN_FFI_CHECKED_DELETE(op);
170}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pk_op_verify_finish()

int botan_pk_op_verify_finish ( botan_pk_op_verify_t op,
const uint8_t sig[],
size_t sig_len )

Definition at line 176 of file ffi_pk_op.cpp.

176 {
177 return BOTAN_FFI_VISIT(op, [=](auto& o) {
178 const bool legit = o.check_signature(sig, sig_len);
179
180 if(legit) {
181 return BOTAN_FFI_SUCCESS;
182 } else {
184 }
185 });
186}

References BOTAN_FFI_INVALID_VERIFIER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_pk_op_verify_update()

int botan_pk_op_verify_update ( botan_pk_op_verify_t op,
const uint8_t in[],
size_t in_len )

Definition at line 172 of file ffi_pk_op.cpp.

172 {
173 return BOTAN_FFI_VISIT(op, [=](auto& o) { o.update(in, in_len); });
174}

References BOTAN_FFI_VISIT.

◆ botan_pkcs_hash_id()

int botan_pkcs_hash_id ( const char * hash_name,
uint8_t pkcs_id[],
size_t * pkcs_id_len )

Signature Scheme Utility Functions

Definition at line 469 of file ffi_pkey.cpp.

469 {
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}
int write_output(T out[], size_t *out_len, const T buf[], size_t buf_len)
Definition ffi_util.h:249
std::vector< uint8_t > pkcs_hash_id(std::string_view name)
Definition hash_id.cpp:78

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan::pkcs_hash_id(), and Botan_FFI::write_output().

◆ botan_privkey_algo_name()

int botan_privkey_algo_name ( botan_privkey_t key,
char out[],
size_t * out_len )

Definition at line 162 of file ffi_pkey.cpp.

162 {
163 return BOTAN_FFI_VISIT(key, [=](const auto& k) { return write_str_output(out, out_len, k.algo_name()); });
164}

References BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_privkey_check_key()

int botan_privkey_check_key ( botan_privkey_t key,
botan_rng_t rng,
uint32_t flags )

Definition at line 178 of file ffi_pkey.cpp.

178 {
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}
#define BOTAN_CHECK_KEY_EXPENSIVE_TESTS
Definition ffi.h:1587

References BOTAN_CHECK_KEY_EXPENSIVE_TESTS, BOTAN_FFI_ERROR_INVALID_INPUT, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_privkey_create()

int botan_privkey_create ( botan_privkey_t * key,
const char * algo_name,
const char * algo_params,
botan_rng_t rng )

Create a new private key

Parameters
keythe new object will be placed here
algo_namesomething like "RSA" or "ECDSA"
algo_paramsis specific to the algorithm. For RSA, specifies the modulus bit length. For ECC is the name of the curve.
Random Number Generatorsa random number generator

Definition at line 30 of file ffi_pkey.cpp.

33 {
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}
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
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

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, botan_privkey_create(), Botan::create_private_key(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

Referenced by botan_privkey_create(), botan_privkey_create_dh(), botan_privkey_create_ecdh(), botan_privkey_create_ecdsa(), botan_privkey_create_mceliece(), and botan_privkey_create_rsa().

◆ botan_privkey_create_dh()

int botan_privkey_create_dh ( botan_privkey_t * key,
botan_rng_t rng,
const char * param )

Definition at line 598 of file ffi_pkey_algs.cpp.

598 {
599 return botan_privkey_create(key_obj, "DH", param_str, rng_obj);
600}
int botan_privkey_create(botan_privkey_t *key, const char *algo_name, const char *algo_params, botan_rng_t rng)
Definition ffi_pkey.cpp:30

References botan_privkey_create().

◆ botan_privkey_create_ecdh()

int botan_privkey_create_ecdh ( botan_privkey_t * key,
botan_rng_t rng,
const char * params )

Definition at line 638 of file ffi_pkey_algs.cpp.

638 {
639 if(Botan::any_null_pointers(key_obj, param_str)) {
641 }
642 *key_obj = nullptr;
643
644 const std::string params(param_str);
645
646 if(params == "X25519" || params == "x25519" || params == "curve25519") {
647 return botan_privkey_create(key_obj, "X25519", "", rng_obj);
648 }
649
650 if(params == "X448" || params == "x448") {
651 return botan_privkey_create(key_obj, "X448", "", rng_obj);
652 }
653
654 return botan_privkey_create(key_obj, "ECDH", param_str, rng_obj);
655}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, and botan_privkey_create().

◆ botan_privkey_create_ecdsa()

int botan_privkey_create_ecdsa ( botan_privkey_t * key,
botan_rng_t rng,
const char * params )

Definition at line 439 of file ffi_pkey_algs.cpp.

439 {
440 return botan_privkey_create(key_obj, "ECDSA", param_str, rng_obj);
441}

References botan_privkey_create().

◆ botan_privkey_create_mceliece()

int botan_privkey_create_mceliece ( botan_privkey_t * key,
botan_rng_t rng,
size_t n,
size_t t )

Definition at line 1559 of file ffi_pkey_algs.cpp.

1559 {
1560 const std::string mce_params = std::to_string(n) + "," + std::to_string(t);
1561 return botan_privkey_create(key_obj, "McEliece", mce_params.c_str(), rng_obj);
1562}

References botan_privkey_create().

◆ botan_privkey_create_rsa()

int botan_privkey_create_rsa ( botan_privkey_t * key,
botan_rng_t rng,
size_t n_bits )

Definition at line 228 of file ffi_pkey_algs.cpp.

228 {
229 if(n_bits < 1024 || n_bits > 16 * 1024) {
231 }
232
233 const std::string n_str = std::to_string(n_bits);
234
235 return botan_privkey_create(key_obj, "RSA", n_str.c_str(), rng_obj);
236}

References BOTAN_FFI_ERROR_BAD_PARAMETER, and botan_privkey_create().

◆ botan_privkey_destroy()

int botan_privkey_destroy ( botan_privkey_t key)
Returns
0 if success, error if invalid object handle

Definition at line 120 of file ffi_pkey.cpp.

120 {
121 return BOTAN_FFI_CHECKED_DELETE(key);
122}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_privkey_dsa_get_x()

int botan_privkey_dsa_get_x ( botan_mp_t n,
botan_privkey_t key )

Definition at line 419 of file ffi_pkey_algs.cpp.

419 {
420 return botan_privkey_get_field(x, key, "x");
421}
int botan_privkey_get_field(botan_mp_t output, botan_privkey_t key, const char *field_name_cstr)

References botan_privkey_get_field().

◆ botan_privkey_ed25519_get_privkey()

int botan_privkey_ed25519_get_privkey ( botan_privkey_t key,
uint8_t output[64] )

Definition at line 932 of file ffi_pkey_algs.cpp.

932 {
933 if(output == nullptr) {
935 }
936#if defined(BOTAN_HAS_ED25519)
937 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
938 if(auto ed = dynamic_cast<const Botan::Ed25519_PrivateKey*>(&k)) {
939 const auto ed_key = ed->raw_private_key_bits();
940 if(ed_key.size() != 64) {
942 }
943 Botan::copy_mem(output, ed_key.data(), ed_key.size());
944 return BOTAN_FFI_SUCCESS;
945 } else {
947 }
948 });
949#else
950 BOTAN_UNUSED(key, output);
952#endif
953}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_privkey_ed448_get_privkey()

int botan_privkey_ed448_get_privkey ( botan_privkey_t key,
uint8_t output[57] )

Definition at line 1012 of file ffi_pkey_algs.cpp.

1012 {
1013 if(output == nullptr) {
1015 }
1016#if defined(BOTAN_HAS_ED448)
1017 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1018 if(auto ed = dynamic_cast<const Botan::Ed448_PrivateKey*>(&k)) {
1019 const auto ed_key = ed->raw_private_key_bits();
1020 Botan::copy_mem(std::span(output, 57), ed_key);
1021 return BOTAN_FFI_SUCCESS;
1022 } else {
1024 }
1025 });
1026#else
1027 BOTAN_UNUSED(key, output);
1029#endif
1030}
A private key for Ed448/Ed448ph according to RFC 8032.
Definition ed448.h:83

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_privkey_export()

int botan_privkey_export ( botan_privkey_t key,
uint8_t out[],
size_t * out_len,
uint32_t flags )

On input *out_len is number of bytes in out[] On output *out_len is number of bytes written (or required) If out is not big enough no output is written, *out_len is set and 1 is returned Returns 0 on success and sets If some other error occurs a negative integer is returned.

Definition at line 212 of file ffi_pkey.cpp.

212 {
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}
#define BOTAN_PRIVKEY_EXPORT_FLAG_RAW
Definition ffi.h:1659
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
#define BOTAN_PRIVKEY_EXPORT_FLAG_PEM
Definition ffi.h:1658
#define BOTAN_PRIVKEY_EXPORT_FLAG_DER
Definition ffi.h:1657
int botan_privkey_view_pem(botan_privkey_t key, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_pkey.cpp:229
int copy_view_str(uint8_t out[], size_t *out_len, Fn fn, Args... args)
Definition ffi_util.h:220

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_PRIVKEY_EXPORT_FLAG_DER, BOTAN_PRIVKEY_EXPORT_FLAG_PEM, BOTAN_PRIVKEY_EXPORT_FLAG_RAW, botan_privkey_view_der(), botan_privkey_view_pem(), botan_privkey_view_raw(), Botan_FFI::copy_view_bin(), and Botan_FFI::copy_view_str().

◆ botan_privkey_export_encrypted()

int botan_privkey_export_encrypted ( botan_privkey_t key,
uint8_t out[],
size_t * out_len,
botan_rng_t rng,
const char * passphrase,
const char * encryption_algo,
uint32_t flags )

Set encryption_algo to NULL or "" to have the library choose a default (recommended)

Definition at line 239 of file ffi_pkey.cpp.

245 {
246 return botan_privkey_export_encrypted_pbkdf_iter(key, out, out_len, rng_obj, pass, 100000, nullptr, nullptr, flags);
247}
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

References botan_privkey_export_encrypted_pbkdf_iter().

◆ botan_privkey_export_encrypted_pbkdf_iter()

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_iterations,
const char * cipher_algo,
const char * pbkdf_algo,
uint32_t flags )

Export a private key using the specified number of iterations.

Definition at line 326 of file ffi_pkey.cpp.

334 {
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}
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
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

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_PRIVKEY_EXPORT_FLAG_DER, BOTAN_PRIVKEY_EXPORT_FLAG_PEM, botan_privkey_view_encrypted_der(), botan_privkey_view_encrypted_pem(), Botan_FFI::copy_view_bin(), and Botan_FFI::copy_view_str().

Referenced by botan_privkey_export_encrypted().

◆ botan_privkey_export_encrypted_pbkdf_msec()

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_runtime,
size_t * pbkdf_iterations_out,
const char * cipher_algo,
const char * pbkdf_algo,
uint32_t flags )

Definition at line 249 of file ffi_pkey.cpp.

258 {
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}
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
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

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_PRIVKEY_EXPORT_FLAG_DER, BOTAN_PRIVKEY_EXPORT_FLAG_PEM, botan_privkey_view_encrypted_der_timed(), botan_privkey_view_encrypted_pem_timed(), Botan_FFI::copy_view_bin(), and Botan_FFI::copy_view_str().

◆ botan_privkey_export_pubkey()

int botan_privkey_export_pubkey ( botan_pubkey_t * out,
botan_privkey_t in )

Definition at line 152 of file ffi_pkey.cpp.

152 {
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}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_get_field()

int botan_privkey_get_field ( botan_mp_t output,
botan_privkey_t key,
const char * field_name )

Definition at line 216 of file ffi_pkey_algs.cpp.

216 {
217 if(field_name_cstr == nullptr) {
219 }
220
221 const std::string field_name(field_name_cstr);
222
223 return BOTAN_FFI_VISIT(key, [=](const auto& k) { safe_get(output) = privkey_get_field(k, field_name); });
224}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

Referenced by botan_privkey_dsa_get_x(), botan_privkey_rsa_get_d(), botan_privkey_rsa_get_e(), botan_privkey_rsa_get_n(), botan_privkey_rsa_get_p(), and botan_privkey_rsa_get_q().

◆ botan_privkey_load()

int botan_privkey_load ( botan_privkey_t * key,
botan_rng_t rng,
const uint8_t bits[],
size_t len,
const char * password )

Generates DSA key pair. Gives to a caller control over key length and order of a subgroup 'q'.

Parameters
keyhandler to the resulting key
Random Number Generatorsinitialized PRNG
pbitslength of the key in bits. Must be between in range (1024, 3072) and multiple of 64. Bit size of the prime 'p'
qbitsorder of the subgroup. Must be in range (160, 256) and multiple of 8
Returns
BOTAN_FFI_SUCCESS Success, key' initialized with DSA key @returns BOTAN_FFI_ERROR_NULL_POINTER either key' or Random Number Generators' is NULL @returns BOTAN_FFI_ERROR_BAD_PARAMETER unexpected value for either pbits' or `qbits'
BOTAN_FFI_ERROR_NOT_IMPLEMENTED functionality not implemented

*/ int botan_privkey_create_dsa(botan_privkey_t* key, botan_rng_t rng, size_t pbits, size_t qbits);

/** Generates ElGamal key pair. Caller has a control over key length and order of a subgroup 'q'. Function is able to use two types of primes:

  • if pbits-1 == qbits then safe primes are used for key generation
  • otherwise generation uses group of prime order
Parameters
keyhandler to the resulting key
Random Number Generatorsinitialized PRNG
pbitslength of the key in bits. Must be at least 1024
qbitsorder of the subgroup. Must be at least 160
Returns
BOTAN_FFI_SUCCESS Success, key' initialized with DSA key @returns BOTAN_FFI_ERROR_NULL_POINTER either key' or Random Number Generators' is NULL @returns BOTAN_FFI_ERROR_BAD_PARAMETER unexpected value for either pbits' or `qbits'
BOTAN_FFI_ERROR_NOT_IMPLEMENTED functionality not implemented

*/

int botan_privkey_create_elgamal(botan_privkey_t* key, botan_rng_t rng, size_t pbits, size_t qbits);

/** Input currently assumed to be PKCS #8 structure; Set password to NULL to indicate no encryption expected Starting in 2.8.0, the rng parameter is unused and may be set to null

Definition at line 87 of file ffi_pkey.cpp.

88 {
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}
std::unique_ptr< Private_Key > load_key(DataSource &source, const std::function< std::string()> &get_pass)
Definition pkcs8.cpp:319

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::PKCS8::load_key().

◆ botan_privkey_load_classic_mceliece()

int botan_privkey_load_classic_mceliece ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len,
const char * cmce_mode )

Algorithm specific key operation: Classic McEliece

Definition at line 1497 of file ffi_pkey_algs.cpp.

1500 {
1501#if defined(BOTAN_HAS_CLASSICMCELIECE)
1502 if(Botan::any_null_pointers(key, privkey, cmce_mode)) {
1504 }
1505
1506 *key = nullptr;
1507
1508 return ffi_guard_thunk(__func__, [=]() -> int {
1509 const auto mode = Botan::Classic_McEliece_Parameter_Set::from_string(cmce_mode);
1510 auto cmce_key = std::make_unique<Botan::Classic_McEliece_PrivateKey>(std::span{privkey, key_len}, mode);
1511 return ffi_new_object(key, std::move(cmce_key));
1512 });
1513#else
1514 BOTAN_UNUSED(key, privkey, key_len, cmce_mode);
1516#endif
1517}
static Classic_McEliece_Parameter_Set from_string(std::string_view param_name)
Get the parameter set for a given parameter set name.

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::Classic_McEliece_Parameter_Set::from_string().

◆ botan_privkey_load_dh()

int botan_privkey_load_dh ( botan_privkey_t * key,
botan_mp_t p,
botan_mp_t g,
botan_mp_t x )

Definition at line 602 of file ffi_pkey_algs.cpp.

602 {
603#if defined(BOTAN_HAS_DIFFIE_HELLMAN)
604 if(key == nullptr) {
606 }
607 *key = nullptr;
608 return ffi_guard_thunk(__func__, [=]() -> int {
609 const Botan::DL_Group group(safe_get(p), safe_get(g));
610 auto dh = std::make_unique<Botan::DH_PrivateKey>(group, safe_get(x));
611 return ffi_new_object(key, std::move(dh));
612 });
613#else
614 BOTAN_UNUSED(key, p, g, x);
616#endif
617}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_load_dsa()

int botan_privkey_load_dsa ( botan_privkey_t * key,
botan_mp_t p,
botan_mp_t q,
botan_mp_t g,
botan_mp_t x )

Definition at line 383 of file ffi_pkey_algs.cpp.

383 {
384#if defined(BOTAN_HAS_DSA)
385 if(key == nullptr) {
387 }
388 *key = nullptr;
389
390 return ffi_guard_thunk(__func__, [=]() -> int {
391 const Botan::DL_Group group(safe_get(p), safe_get(q), safe_get(g));
392 auto dsa = std::make_unique<Botan::DSA_PrivateKey>(group, safe_get(x));
393 return ffi_new_object(key, std::move(dsa));
394 });
395#else
396 BOTAN_UNUSED(key, p, q, g, x);
398#endif
399}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_load_ecdh()

int botan_privkey_load_ecdh ( botan_privkey_t * key,
botan_mp_t scalar,
const char * curve_name )

Definition at line 704 of file ffi_pkey_algs.cpp.

704 {
705#if defined(BOTAN_HAS_ECDH)
706 if(Botan::any_null_pointers(key, curve_name)) {
708 }
709 *key = nullptr;
710 return ffi_guard_thunk(__func__, [=]() -> int {
711 std::unique_ptr<Botan::ECDH_PrivateKey> p_key;
712 const int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name);
713 if(rc == BOTAN_FFI_SUCCESS) {
714 ffi_new_object(key, std::move(p_key));
715 }
716 return rc;
717 });
718#else
719 BOTAN_UNUSED(key, scalar, curve_name);
721#endif
722}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_load_ecdsa()

int botan_privkey_load_ecdsa ( botan_privkey_t * key,
botan_mp_t scalar,
const char * curve_name )

Definition at line 514 of file ffi_pkey_algs.cpp.

514 {
515#if defined(BOTAN_HAS_ECDSA)
516 if(Botan::any_null_pointers(key, curve_name)) {
518 }
519 *key = nullptr;
520
521 return ffi_guard_thunk(__func__, [=]() -> int {
522 std::unique_ptr<Botan::ECDSA_PrivateKey> p_key;
523 const int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name);
524 if(rc == BOTAN_FFI_SUCCESS) {
525 ffi_new_object(key, std::move(p_key));
526 }
527 return rc;
528 });
529#else
530 BOTAN_UNUSED(key, scalar, curve_name);
532#endif
533}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_load_ed25519()

int botan_privkey_load_ed25519 ( botan_privkey_t * key,
const uint8_t privkey[32] )

Definition at line 898 of file ffi_pkey_algs.cpp.

898 {
899#if defined(BOTAN_HAS_ED25519)
900 if(key == nullptr) {
902 }
903 *key = nullptr;
904 return ffi_guard_thunk(__func__, [=]() -> int {
905 auto ed25519 =
906 std::make_unique<Botan::Ed25519_PrivateKey>(Botan::Ed25519_PrivateKey::from_seed(std::span{privkey, 32}));
907 return ffi_new_object(key, std::move(ed25519));
908 });
909#else
910 BOTAN_UNUSED(key, privkey);
912#endif
913}
static Ed25519_PrivateKey from_seed(std::span< const uint8_t > seed)

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::Ed25519_PrivateKey::from_seed().

◆ botan_privkey_load_ed448()

int botan_privkey_load_ed448 ( botan_privkey_t * key,
const uint8_t privkey[57] )

Definition at line 980 of file ffi_pkey_algs.cpp.

980 {
981#if defined(BOTAN_HAS_ED448)
982 if(key == nullptr) {
984 }
985 *key = nullptr;
986 return ffi_guard_thunk(__func__, [=]() -> int {
987 auto ed448 = std::make_unique<Botan::Ed448_PrivateKey>(std::span(privkey, 57));
988 return ffi_new_object(key, std::move(ed448));
989 });
990#else
991 BOTAN_UNUSED(key, privkey);
993#endif
994}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_frodokem()

int botan_privkey_load_frodokem ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len,
const char * frodo_mode )

Algorithm specific key operation: FrodoKEM

Definition at line 1455 of file ffi_pkey_algs.cpp.

1455 {
1456#if defined(BOTAN_HAS_FRODOKEM)
1457 if(Botan::any_null_pointers(key, privkey, frodo_mode)) {
1459 }
1460
1461 *key = nullptr;
1462
1463 return ffi_guard_thunk(__func__, [=]() -> int {
1464 const auto mode = Botan::FrodoKEMMode(frodo_mode);
1465 auto frodo_key = std::make_unique<Botan::FrodoKEM_PrivateKey>(std::span{privkey, key_len}, mode);
1466 return ffi_new_object(key, std::move(frodo_key));
1467 });
1468#else
1469 BOTAN_UNUSED(key, privkey, key_len, frodo_mode);
1471#endif
1472}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_kyber()

int botan_privkey_load_kyber ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len )

Definition at line 1205 of file ffi_pkey_algs.cpp.

1205 {
1206#if defined(BOTAN_HAS_KYBER)
1207 if(Botan::any_null_pointers(key, privkey)) {
1209 }
1210 *key = nullptr;
1211
1212 const auto mode = [](size_t len) -> std::optional<Botan::KyberMode> {
1213 if(len == 1632) {
1215 } else if(len == 2400) {
1217 } else if(len == 3168) {
1219 } else {
1220 return {};
1221 }
1222 }(key_len);
1223
1224 if(mode.has_value()) {
1225 return ffi_guard_thunk(__func__, [=]() -> int {
1226 auto kyber = std::make_unique<Botan::Kyber_PrivateKey>(std::span{privkey, key_len}, *mode);
1227 return ffi_new_object(key, std::move(kyber));
1228 });
1229 } else {
1231 }
1232#else
1233 BOTAN_UNUSED(key, key_len, privkey);
1235#endif
1236}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan::KyberMode::Kyber1024_R3, Botan::KyberMode::Kyber512_R3, and Botan::KyberMode::Kyber768_R3.

◆ botan_privkey_load_ml_dsa()

int botan_privkey_load_ml_dsa ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len,
const char * mldsa_mode )

Definition at line 1355 of file ffi_pkey_algs.cpp.

1355 {
1356#if defined(BOTAN_HAS_ML_DSA)
1357 if(Botan::any_null_pointers(key, privkey, mldsa_mode)) {
1359 }
1360
1361 *key = nullptr;
1362
1363 return ffi_guard_thunk(__func__, [=]() -> int {
1364 auto mode = Botan::ML_DSA_Mode(mldsa_mode);
1365 if(!mode.is_ml_dsa()) {
1367 }
1368
1369 auto mldsa_key = std::make_unique<Botan::ML_DSA_PrivateKey>(std::span{privkey, key_len}, mode);
1370 return ffi_new_object(key, std::move(mldsa_key));
1371 });
1372#else
1373 BOTAN_UNUSED(key, key_len, privkey, mldsa_mode);
1375#endif
1376}
DilithiumMode ML_DSA_Mode
Definition ml_dsa.h:21

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_ml_kem()

int botan_privkey_load_ml_kem ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len,
const char * mlkem_mode )

Definition at line 1305 of file ffi_pkey_algs.cpp.

1305 {
1306#if defined(BOTAN_HAS_ML_KEM)
1307 if(Botan::any_null_pointers(key, privkey, mlkem_mode)) {
1309 }
1310
1311 *key = nullptr;
1312
1313 return ffi_guard_thunk(__func__, [=]() -> int {
1314 auto mode = Botan::ML_KEM_Mode(mlkem_mode);
1315 if(!mode.is_ml_kem()) {
1317 }
1318
1319 auto mlkem_key = std::make_unique<Botan::ML_KEM_PrivateKey>(std::span{privkey, key_len}, mode);
1320 return ffi_new_object(key, std::move(mlkem_key));
1321 });
1322#else
1323 BOTAN_UNUSED(key, key_len, privkey, mlkem_mode);
1325#endif
1326}
KyberMode ML_KEM_Mode
Definition ml_kem.h:21

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_rsa()

int botan_privkey_load_rsa ( botan_privkey_t * key,
botan_mp_t p,
botan_mp_t q,
botan_mp_t e )

Definition at line 238 of file ffi_pkey_algs.cpp.

238 {
239#if defined(BOTAN_HAS_RSA)
240 if(key == nullptr) {
242 }
243 *key = nullptr;
244
245 return ffi_guard_thunk(__func__, [=]() -> int {
246 auto rsa = std::make_unique<Botan::RSA_PrivateKey>(safe_get(rsa_p), safe_get(rsa_q), safe_get(rsa_e));
247 return ffi_new_object(key, std::move(rsa));
248 });
249#else
250 BOTAN_UNUSED(key, rsa_p, rsa_q, rsa_e);
252#endif
253}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_privkey_load_rsa_pkcs1()

int botan_privkey_load_rsa_pkcs1 ( botan_privkey_t * key,
const uint8_t bits[],
size_t len )

Definition at line 255 of file ffi_pkey_algs.cpp.

255 {
256#if defined(BOTAN_HAS_RSA)
257 if(Botan::any_null_pointers(key, bits)) {
259 }
260 *key = nullptr;
261
262 return ffi_guard_thunk(__func__, [=]() -> int {
264 auto rsa = std::make_unique<Botan::RSA_PrivateKey>(alg_id, std::span{bits, len});
265 return ffi_new_object(key, std::move(rsa));
266 });
267#else
268 BOTAN_UNUSED(key, bits, len);
270#endif
271}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::AlgorithmIdentifier::USE_NULL_PARAM.

◆ botan_privkey_load_slh_dsa()

int botan_privkey_load_slh_dsa ( botan_privkey_t * key,
const uint8_t privkey[],
size_t key_len,
const char * slhdsa_mode )

Definition at line 1405 of file ffi_pkey_algs.cpp.

1405 {
1406#if defined(BOTAN_HAS_SLH_DSA_WITH_SHA2) || defined(BOTAN_HAS_SLH_DSA_WITH_SHAKE)
1407 if(Botan::any_null_pointers(key, privkey, slhdsa_mode)) {
1409 }
1410
1411 *key = nullptr;
1412
1413 return ffi_guard_thunk(__func__, [=]() -> int {
1414 auto mode = Botan::SLH_DSA_Parameters::create(slhdsa_mode);
1415 if(!mode.is_slh_dsa()) {
1417 }
1418
1419 auto slhdsa_key = std::make_unique<Botan::SLH_DSA_PrivateKey>(std::span{privkey, key_len}, mode);
1420 return ffi_new_object(key, std::move(slhdsa_key));
1421 });
1422#else
1423 BOTAN_UNUSED(key, key_len, privkey, slhdsa_mode);
1425#endif
1426}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_sm2()

int botan_privkey_load_sm2 ( botan_privkey_t * key,
botan_mp_t scalar,
const char * curve_name )

Definition at line 806 of file ffi_pkey_algs.cpp.

806 {
807#if defined(BOTAN_HAS_SM2)
808 if(Botan::any_null_pointers(key, curve_name)) {
810 }
811 *key = nullptr;
812
813 return ffi_guard_thunk(__func__, [=]() -> int {
814 std::unique_ptr<Botan::SM2_PrivateKey> p_key;
815 const int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name);
816
817 if(rc == BOTAN_FFI_SUCCESS) {
818 ffi_new_object(key, std::move(p_key));
819 }
820 return rc;
821 });
822#else
823 BOTAN_UNUSED(key, scalar, curve_name);
825#endif
826}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

Referenced by botan_privkey_load_sm2_enc().

◆ botan_privkey_load_sm2_enc()

int botan_privkey_load_sm2_enc ( botan_privkey_t * key,
botan_mp_t scalar,
const char * curve_name )

Definition at line 835 of file ffi_pkey_algs.cpp.

835 {
836 return botan_privkey_load_sm2(key, scalar, curve_name);
837}
int botan_privkey_load_sm2(botan_privkey_t *key, const botan_mp_t scalar, const char *curve_name)

References botan_privkey_load_sm2().

◆ botan_privkey_load_x25519()

int botan_privkey_load_x25519 ( botan_privkey_t * key,
const uint8_t privkey[32] )

Definition at line 1054 of file ffi_pkey_algs.cpp.

1054 {
1055#if defined(BOTAN_HAS_X25519)
1056 if(key == nullptr) {
1058 }
1059 *key = nullptr;
1060 return ffi_guard_thunk(__func__, [=]() -> int {
1061 auto x25519 = std::make_unique<Botan::X25519_PrivateKey>(std::span{privkey, 32});
1062 return ffi_new_object(key, std::move(x25519));
1063 });
1064#else
1065 BOTAN_UNUSED(key, privkey);
1067#endif
1068}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_load_x448()

int botan_privkey_load_x448 ( botan_privkey_t * key,
const uint8_t privkey[56] )

Definition at line 1130 of file ffi_pkey_algs.cpp.

1130 {
1131#if defined(BOTAN_HAS_X448)
1132 if(key == nullptr) {
1134 }
1135 *key = nullptr;
1136 return ffi_guard_thunk(__func__, [=]() -> int {
1137 auto x448 = std::make_unique<Botan::X448_PrivateKey>(std::span{privkey, 56});
1138 return ffi_new_object(key, std::move(x448));
1139 });
1140#else
1141 BOTAN_UNUSED(key, privkey);
1143#endif
1144}
Point448 x448(const ScalarX448 &k, const Point448 &u)
Multiply a scalar k with a point u.

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_privkey_oid()

int botan_privkey_oid ( botan_asn1_oid_t * oid,
botan_privkey_t key )

Definition at line 409 of file ffi_pkey.cpp.

409 {
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}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_privkey_remaining_operations()

int botan_privkey_remaining_operations ( botan_privkey_t key,
uint64_t * out )

Gets information on many operations a (stateful) key has remaining and sets

Parameters
outto that value
Returns
0 on success, a negative value on failure or if the key is not stateful

Definition at line 437 of file ffi_pkey.cpp.

437 {
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}

References BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_privkey_rsa_get_d()

int botan_privkey_rsa_get_d ( botan_mp_t d,
botan_privkey_t rsa_key )

Definition at line 323 of file ffi_pkey_algs.cpp.

323 {
324 return botan_privkey_get_field(d, key, "d");
325}

References botan_privkey_get_field().

◆ botan_privkey_rsa_get_e()

int botan_privkey_rsa_get_e ( botan_mp_t e,
botan_privkey_t rsa_key )

Definition at line 319 of file ffi_pkey_algs.cpp.

319 {
320 return botan_privkey_get_field(e, key, "e");
321}

References botan_privkey_get_field().

◆ botan_privkey_rsa_get_n()

int botan_privkey_rsa_get_n ( botan_mp_t n,
botan_privkey_t rsa_key )

Definition at line 315 of file ffi_pkey_algs.cpp.

315 {
316 return botan_privkey_get_field(n, key, "n");
317}

References botan_privkey_get_field().

◆ botan_privkey_rsa_get_p()

int botan_privkey_rsa_get_p ( botan_mp_t p,
botan_privkey_t rsa_key )

Definition at line 307 of file ffi_pkey_algs.cpp.

307 {
308 return botan_privkey_get_field(p, key, "p");
309}

References botan_privkey_get_field().

◆ botan_privkey_rsa_get_privkey()

int botan_privkey_rsa_get_privkey ( botan_privkey_t rsa_key,
uint8_t out[],
size_t * out_len,
uint32_t flags )

Definition at line 335 of file ffi_pkey_algs.cpp.

335 {
336#if defined(BOTAN_HAS_RSA)
337 return BOTAN_FFI_VISIT(rsa_key, [=](const auto& k) -> int {
338 if(const Botan::RSA_PrivateKey* rsa = dynamic_cast<const Botan::RSA_PrivateKey*>(&k)) {
339 if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) {
340 return write_vec_output(out, out_len, rsa->private_key_bits());
341 } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) {
342 // TODO define new generic functions for this
343 return write_str_output(reinterpret_cast<char*>(out),
344 out_len,
345 Botan::PEM_Code::encode(rsa->private_key_bits(), "RSA PRIVATE KEY"));
346 } else {
348 }
349 } else {
351 }
352 });
353#else
354 BOTAN_UNUSED(rsa_key, out, out_len, flags);
356#endif
357}
std::string encode(const uint8_t der[], size_t length, std::string_view label, size_t width)
Definition pem.cpp:39

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_PRIVKEY_EXPORT_FLAG_DER, BOTAN_PRIVKEY_EXPORT_FLAG_PEM, BOTAN_UNUSED, Botan::PEM_Code::encode(), Botan_FFI::write_str_output(), and Botan_FFI::write_vec_output().

◆ botan_privkey_rsa_get_q()

int botan_privkey_rsa_get_q ( botan_mp_t q,
botan_privkey_t rsa_key )

Definition at line 311 of file ffi_pkey_algs.cpp.

311 {
312 return botan_privkey_get_field(q, key, "q");
313}

References botan_privkey_get_field().

◆ botan_privkey_stateful_operation()

int botan_privkey_stateful_operation ( botan_privkey_t key,
int * out )

Checks whether a key is stateful and sets

Parameters
outto 1 if it is, or 0 if the key is not stateful
Returns
0 on success, a negative value on failure

Definition at line 422 of file ffi_pkey.cpp.

422 {
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}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and BOTAN_FFI_VISIT.

◆ botan_privkey_view_der()

int botan_privkey_view_der ( botan_privkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the private key's DER encoding

Definition at line 224 of file ffi_pkey.cpp.

224 {
225 return BOTAN_FFI_VISIT(key,
226 [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.private_key_info()); });
227}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

Referenced by botan_privkey_export().

◆ botan_privkey_view_encrypted_der()

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 )

View the encryption of a private key (binary DER encoding)

Set cipher_algo, pbkdf_algo to NULL to use defaults Set pbkdf_iterations to 0 to use defaults

Definition at line 346 of file ffi_pkey.cpp.

353 {
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}
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

References Botan::PKCS8::BER_encode_encrypted_pbkdf_iter(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), and Botan_FFI::safe_get().

Referenced by botan_privkey_export_encrypted_pbkdf_iter().

◆ botan_privkey_view_encrypted_der_timed()

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 )

View the encryption of a private key (binary DER encoding)

Set cipher_algo, pbkdf_algo to NULL to use defaults

Definition at line 274 of file ffi_pkey.cpp.

281 {
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}
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

References Botan::PKCS8::BER_encode_encrypted_pbkdf_msec(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), and Botan_FFI::safe_get().

Referenced by botan_privkey_export_encrypted_pbkdf_msec().

◆ botan_privkey_view_encrypted_pem()

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 )

View the encryption of a private key (PEM encoding)

Set cipher_algo, pbkdf_algo to NULL to use defaults Set pbkdf_iterations to 0 to use defaults

Definition at line 371 of file ffi_pkey.cpp.

378 {
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}
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

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), Botan::PKCS8::PEM_encode_encrypted_pbkdf_iter(), and Botan_FFI::safe_get().

Referenced by botan_privkey_export_encrypted_pbkdf_iter().

◆ botan_privkey_view_encrypted_pem_timed()

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 )

View the encryption of a private key (PEM encoding)

Set cipher_algo, pbkdf_algo to NULL to use defaults

Definition at line 300 of file ffi_pkey.cpp.

307 {
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}
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

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), Botan::PKCS8::PEM_encode_encrypted_pbkdf_msec(), and Botan_FFI::safe_get().

Referenced by botan_privkey_export_encrypted_pbkdf_msec().

◆ botan_privkey_view_kyber_raw_key()

int botan_privkey_view_kyber_raw_key ( botan_privkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

Definition at line 1271 of file ffi_pkey_algs.cpp.

1271 {
1272#if defined(BOTAN_HAS_KYBER)
1273 return BOTAN_FFI_VISIT(key, [=](const auto& k) -> int {
1274 if(auto kyber = dynamic_cast<const Botan::Kyber_PrivateKey*>(&k)) {
1275 return invoke_view_callback(view, ctx, kyber->raw_private_key_bits());
1276 } else {
1278 }
1279 });
1280#else
1281 BOTAN_UNUSED(key, ctx, view);
1283#endif
1284}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::invoke_view_callback().

◆ botan_privkey_view_pem()

int botan_privkey_view_pem ( botan_privkey_t key,
botan_view_ctx ctx,
botan_view_str_fn view )

View the private key's PEM encoding

Definition at line 229 of file ffi_pkey.cpp.

229 {
230 return BOTAN_FFI_VISIT(
231 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, Botan::PKCS8::PEM_encode(k)); });
232}
std::string PEM_encode(const Private_Key &key)
Definition pkcs8.cpp:121

References BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), and Botan::PKCS8::PEM_encode().

Referenced by botan_privkey_export().

◆ botan_privkey_view_raw()

int botan_privkey_view_raw ( botan_privkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the private key's raw encoding

Definition at line 234 of file ffi_pkey.cpp.

234 {
235 return BOTAN_FFI_VISIT(
236 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.raw_private_key_bits()); });
237}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

Referenced by botan_privkey_export().

◆ botan_privkey_x25519_get_privkey()

int botan_privkey_x25519_get_privkey ( botan_privkey_t key,
uint8_t output[32] )

Definition at line 1086 of file ffi_pkey_algs.cpp.

1086 {
1087 if(output == nullptr) {
1089 }
1090#if defined(BOTAN_HAS_X25519)
1091 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1092 if(auto x25519 = dynamic_cast<const Botan::X25519_PrivateKey*>(&k)) {
1093 const auto x25519_key = x25519->raw_private_key_bits();
1094 if(x25519_key.size() != 32) {
1096 }
1097 Botan::copy_mem(output, x25519_key.data(), x25519_key.size());
1098 return BOTAN_FFI_SUCCESS;
1099 } else {
1101 }
1102 });
1103#else
1104 BOTAN_UNUSED(key, output);
1106#endif
1107}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_privkey_x448_get_privkey()

int botan_privkey_x448_get_privkey ( botan_privkey_t key,
uint8_t output[56] )

Definition at line 1162 of file ffi_pkey_algs.cpp.

1162 {
1163 if(output == nullptr) {
1165 }
1166#if defined(BOTAN_HAS_X448)
1167 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1168 if(auto x448 = dynamic_cast<const Botan::X448_PrivateKey*>(&k)) {
1169 const auto x448_key = x448->raw_private_key_bits();
1170 Botan::copy_mem(std::span{output, 56}, x448_key);
1171 return BOTAN_FFI_SUCCESS;
1172 } else {
1174 }
1175 });
1176#else
1177 BOTAN_UNUSED(key, output);
1179#endif
1180}
A private key for the X448 key agreement scheme according to RFC 7748.
Definition x448.h:69

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_pubkey_algo_name()

int botan_pubkey_algo_name ( botan_pubkey_t key,
char out[],
size_t * out_len )

Definition at line 166 of file ffi_pkey.cpp.

166 {
167 return BOTAN_FFI_VISIT(key, [=](const auto& k) { return write_str_output(out, out_len, k.algo_name()); });
168}

References BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_pubkey_check_key()

int botan_pubkey_check_key ( botan_pubkey_t key,
botan_rng_t rng,
uint32_t flags )

Returns 0 if key is valid, negative if invalid key or some other error

Definition at line 170 of file ffi_pkey.cpp.

170 {
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}

References BOTAN_CHECK_KEY_EXPENSIVE_TESTS, BOTAN_FFI_ERROR_INVALID_INPUT, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_pubkey_destroy()

int botan_pubkey_destroy ( botan_pubkey_t key)
Returns
0 if success, error if invalid object handle

Definition at line 148 of file ffi_pkey.cpp.

148 {
149 return BOTAN_FFI_CHECKED_DELETE(key);
150}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_pubkey_dsa_get_g()

int botan_pubkey_dsa_get_g ( botan_mp_t d,
botan_pubkey_t key )

Definition at line 431 of file ffi_pkey_algs.cpp.

431 {
432 return botan_pubkey_get_field(g, key, "g");
433}
int botan_pubkey_get_field(botan_mp_t output, botan_pubkey_t key, const char *field_name_cstr)

References botan_pubkey_get_field().

◆ botan_pubkey_dsa_get_p()

int botan_pubkey_dsa_get_p ( botan_mp_t p,
botan_pubkey_t key )

Definition at line 423 of file ffi_pkey_algs.cpp.

423 {
424 return botan_pubkey_get_field(p, key, "p");
425}

References botan_pubkey_get_field().

◆ botan_pubkey_dsa_get_q()

int botan_pubkey_dsa_get_q ( botan_mp_t q,
botan_pubkey_t key )

Definition at line 427 of file ffi_pkey_algs.cpp.

427 {
428 return botan_pubkey_get_field(q, key, "q");
429}

References botan_pubkey_get_field().

◆ botan_pubkey_dsa_get_y()

int botan_pubkey_dsa_get_y ( botan_mp_t y,
botan_pubkey_t key )

Definition at line 435 of file ffi_pkey_algs.cpp.

435 {
436 return botan_pubkey_get_field(y, key, "y");
437}

References botan_pubkey_get_field().

◆ botan_pubkey_ecc_key_used_explicit_encoding()

int botan_pubkey_ecc_key_used_explicit_encoding ( botan_pubkey_t key)

Definition at line 445 of file ffi_pkey_algs.cpp.

445 {
446#if defined(BOTAN_HAS_ECC_KEY)
447 return ffi_guard_thunk(__func__, [=]() -> int {
448 const Botan::Public_Key& pub_key = safe_get(key);
449 const Botan::EC_PublicKey* ec_key = dynamic_cast<const Botan::EC_PublicKey*>(&pub_key);
450
451 if(ec_key == nullptr) {
453 }
454
455 return ec_key->domain().used_explicit_encoding() ? 1 : 0;
456 });
457#else
458 BOTAN_UNUSED(key);
460#endif
461}
bool used_explicit_encoding() const
Definition ec_group.h:264

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_UNUSED, Botan::EC_PublicKey::domain(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), and Botan::EC_Group::used_explicit_encoding().

◆ botan_pubkey_ed25519_get_pubkey()

int botan_pubkey_ed25519_get_pubkey ( botan_pubkey_t key,
uint8_t pubkey[32] )

Definition at line 955 of file ffi_pkey_algs.cpp.

955 {
956 if(output == nullptr) {
958 }
959#if defined(BOTAN_HAS_ED25519)
960 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
961 if(auto ed = dynamic_cast<const Botan::Ed25519_PublicKey*>(&k)) {
962 const std::vector<uint8_t>& ed_key = ed->get_public_key();
963 if(ed_key.size() != 32) {
965 }
966 Botan::copy_mem(output, ed_key.data(), ed_key.size());
967 return BOTAN_FFI_SUCCESS;
968 } else {
970 }
971 });
972#else
973 BOTAN_UNUSED(key, output);
975#endif
976}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_pubkey_ed448_get_pubkey()

int botan_pubkey_ed448_get_pubkey ( botan_pubkey_t key,
uint8_t pubkey[57] )

Definition at line 1032 of file ffi_pkey_algs.cpp.

1032 {
1033 if(output == nullptr) {
1035 }
1036#if defined(BOTAN_HAS_ED448)
1037 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1038 if(auto ed = dynamic_cast<const Botan::Ed448_PublicKey*>(&k)) {
1039 const auto ed_key = ed->public_key_bits();
1040 Botan::copy_mem(std::span(output, 57), ed_key);
1041 return BOTAN_FFI_SUCCESS;
1042 } else {
1044 }
1045 });
1046#else
1047 BOTAN_UNUSED(key, output);
1049#endif
1050}
A public key for Ed448/Ed448ph according to RFC 8032.
Definition ed448.h:27

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_pubkey_estimated_strength()

int botan_pubkey_estimated_strength ( botan_pubkey_t key,
size_t * estimate )

Definition at line 452 of file ffi_pkey.cpp.

452 {
453 if(estimate == nullptr) {
455 }
456 return BOTAN_FFI_VISIT(key, [=](const auto& k) { *estimate = k.estimated_strength(); });
457}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_pubkey_export()

int botan_pubkey_export ( botan_pubkey_t key,
uint8_t out[],
size_t * out_len,
uint32_t flags )

Definition at line 185 of file ffi_pkey.cpp.

185 {
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}
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_pubkey_view_der(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:197
int botan_pubkey_view_raw(botan_pubkey_t key, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_pkey.cpp:207

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_PRIVKEY_EXPORT_FLAG_DER, BOTAN_PRIVKEY_EXPORT_FLAG_PEM, BOTAN_PRIVKEY_EXPORT_FLAG_RAW, botan_pubkey_view_der(), botan_pubkey_view_pem(), botan_pubkey_view_raw(), Botan_FFI::copy_view_bin(), and Botan_FFI::copy_view_str().

◆ botan_pubkey_fingerprint()

int botan_pubkey_fingerprint ( botan_pubkey_t key,
const char * hash,
uint8_t out[],
size_t * out_len )

Definition at line 459 of file ffi_pkey.cpp.

459 {
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}
static std::unique_ptr< HashFunction > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Definition hash.cpp:308

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, Botan::HashFunction::create_or_throw(), and Botan_FFI::write_vec_output().

◆ botan_pubkey_get_field()

int botan_pubkey_get_field ( botan_mp_t output,
botan_pubkey_t key,
const char * field_name )

Definition at line 206 of file ffi_pkey_algs.cpp.

206 {
207 if(field_name_cstr == nullptr) {
209 }
210
211 const std::string field_name(field_name_cstr);
212
213 return BOTAN_FFI_VISIT(key, [=](const auto& k) { safe_get(output) = pubkey_get_field(k, field_name); });
214}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

Referenced by botan_pubkey_dsa_get_g(), botan_pubkey_dsa_get_p(), botan_pubkey_dsa_get_q(), botan_pubkey_dsa_get_y(), botan_pubkey_rsa_get_e(), and botan_pubkey_rsa_get_n().

◆ botan_pubkey_load()

int botan_pubkey_load ( botan_pubkey_t * key,
const uint8_t bits[],
size_t len )

Definition at line 124 of file ffi_pkey.cpp.

124 {
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}
std::unique_ptr< Public_Key > load_key(DataSource &source)
Definition x509_key.cpp:28

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::X509::load_key().

◆ botan_pubkey_load_classic_mceliece()

int botan_pubkey_load_classic_mceliece ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len,
const char * cmce_mode )

Definition at line 1519 of file ffi_pkey_algs.cpp.

1522 {
1523#if defined(BOTAN_HAS_CLASSICMCELIECE)
1524 if(Botan::any_null_pointers(key, pubkey, cmce_mode)) {
1526 }
1527
1528 *key = nullptr;
1529
1530 return ffi_guard_thunk(__func__, [=]() -> int {
1531 const auto mode = Botan::Classic_McEliece_Parameter_Set::from_string(cmce_mode);
1532 auto cmce_key = std::make_unique<Botan::Classic_McEliece_PublicKey>(std::span{pubkey, key_len}, mode);
1533 return ffi_new_object(key, std::move(cmce_key));
1534 });
1535#else
1536 BOTAN_UNUSED(key, pubkey, key_len, cmce_mode);
1538#endif
1539}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::Classic_McEliece_Parameter_Set::from_string().

◆ botan_pubkey_load_dsa()

int botan_pubkey_load_dsa ( botan_pubkey_t * key,
botan_mp_t p,
botan_mp_t q,
botan_mp_t g,
botan_mp_t y )

Definition at line 401 of file ffi_pkey_algs.cpp.

401 {
402#if defined(BOTAN_HAS_DSA)
403 if(key == nullptr) {
405 }
406 *key = nullptr;
407
408 return ffi_guard_thunk(__func__, [=]() -> int {
409 const Botan::DL_Group group(safe_get(p), safe_get(q), safe_get(g));
410 auto dsa = std::make_unique<Botan::DSA_PublicKey>(group, safe_get(y));
411 return ffi_new_object(key, std::move(dsa));
412 });
413#else
414 BOTAN_UNUSED(key, p, q, g, y);
416#endif
417}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_pubkey_load_ecdh()

int botan_pubkey_load_ecdh ( botan_pubkey_t * key,
botan_mp_t public_x,
botan_mp_t public_y,
const char * curve_name )

Definition at line 657 of file ffi_pkey_algs.cpp.

660 {
661#if defined(BOTAN_HAS_ECDH)
662 if(Botan::any_null_pointers(key, curve_name)) {
664 }
665 *key = nullptr;
666 return ffi_guard_thunk(__func__, [=]() -> int {
667 std::unique_ptr<Botan::ECDH_PublicKey> p_key;
668 const int rc = pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name);
669
670 if(rc == BOTAN_FFI_SUCCESS) {
671 ffi_new_object(key, std::move(p_key));
672 }
673 return rc;
674 });
675#else
676 BOTAN_UNUSED(key, public_x, public_y, curve_name);
678#endif
679}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_pubkey_load_ecdh_sec1()

int botan_pubkey_load_ecdh_sec1 ( botan_pubkey_t * key,
const uint8_t sec1[],
size_t sec1_len,
const char * curve_name )

Definition at line 681 of file ffi_pkey_algs.cpp.

681 {
682#if defined(BOTAN_HAS_ECDH)
683 if(Botan::any_null_pointers(key, sec1, curve_name)) {
685 }
686 *key = nullptr;
687
688 return ffi_guard_thunk(__func__, [=]() -> int {
689 std::unique_ptr<Botan::ECDH_PublicKey> p_key;
690
691 const int rc = pubkey_load_ec_sec1(p_key, {sec1, sec1_len}, curve_name);
692 if(rc == BOTAN_FFI_SUCCESS) {
693 ffi_new_object(key, std::move(p_key));
694 }
695
696 return rc;
697 });
698#else
699 BOTAN_UNUSED(key, sec1, sec1_len, curve_name);
701#endif
702}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_ecdsa()

int botan_pubkey_load_ecdsa ( botan_pubkey_t * key,
botan_mp_t public_x,
botan_mp_t public_y,
const char * curve_name )

Definition at line 465 of file ffi_pkey_algs.cpp.

468 {
469#if defined(BOTAN_HAS_ECDSA)
470 if(Botan::any_null_pointers(key, curve_name)) {
472 }
473 *key = nullptr;
474
475 return ffi_guard_thunk(__func__, [=]() -> int {
476 std::unique_ptr<Botan::ECDSA_PublicKey> p_key;
477
478 const int rc = pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name);
479 if(rc == BOTAN_FFI_SUCCESS) {
480 ffi_new_object(key, std::move(p_key));
481 }
482
483 return rc;
484 });
485#else
486 BOTAN_UNUSED(key, public_x, public_y, curve_name);
488#endif
489}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_pubkey_load_ecdsa_sec1()

int botan_pubkey_load_ecdsa_sec1 ( botan_pubkey_t * key,
const uint8_t sec1[],
size_t sec1_len,
const char * curve_name )

Definition at line 491 of file ffi_pkey_algs.cpp.

491 {
492#if defined(BOTAN_HAS_ECDSA)
493 if(Botan::any_null_pointers(key, sec1, curve_name)) {
495 }
496 *key = nullptr;
497
498 return ffi_guard_thunk(__func__, [=]() -> int {
499 std::unique_ptr<Botan::ECDSA_PublicKey> p_key;
500
501 const int rc = pubkey_load_ec_sec1(p_key, {sec1, sec1_len}, curve_name);
502 if(rc == BOTAN_FFI_SUCCESS) {
503 ffi_new_object(key, std::move(p_key));
504 }
505
506 return rc;
507 });
508#else
509 BOTAN_UNUSED(key, sec1, sec1_len, curve_name);
511#endif
512}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_ed25519()

int botan_pubkey_load_ed25519 ( botan_pubkey_t * key,
const uint8_t pubkey[32] )

Definition at line 915 of file ffi_pkey_algs.cpp.

915 {
916#if defined(BOTAN_HAS_ED25519)
917 if(key == nullptr) {
919 }
920 *key = nullptr;
921 return ffi_guard_thunk(__func__, [=]() -> int {
922 const std::vector<uint8_t> pubkey_vec(pubkey, pubkey + 32);
923 auto ed25519 = std::make_unique<Botan::Ed25519_PublicKey>(pubkey_vec);
924 return ffi_new_object(key, std::move(ed25519));
925 });
926#else
927 BOTAN_UNUSED(key, pubkey);
929#endif
930}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_ed448()

int botan_pubkey_load_ed448 ( botan_pubkey_t * key,
const uint8_t pubkey[57] )

Definition at line 996 of file ffi_pkey_algs.cpp.

996 {
997#if defined(BOTAN_HAS_ED448)
998 if(key == nullptr) {
1000 }
1001 *key = nullptr;
1002 return ffi_guard_thunk(__func__, [=]() -> int {
1003 auto ed448 = std::make_unique<Botan::Ed448_PublicKey>(std::span(pubkey, 57));
1004 return ffi_new_object(key, std::move(ed448));
1005 });
1006#else
1007 BOTAN_UNUSED(key, pubkey);
1009#endif
1010}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_frodokem()

int botan_pubkey_load_frodokem ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len,
const char * frodo_mode )

Definition at line 1474 of file ffi_pkey_algs.cpp.

1474 {
1475#if defined(BOTAN_HAS_FRODOKEM)
1476 if(Botan::any_null_pointers(key, pubkey, frodo_mode)) {
1478 }
1479
1480 *key = nullptr;
1481
1482 return ffi_guard_thunk(__func__, [=]() -> int {
1483 const auto mode = Botan::FrodoKEMMode(frodo_mode);
1484 auto frodo_key = std::make_unique<Botan::FrodoKEM_PublicKey>(std::span{pubkey, key_len}, mode);
1485 return ffi_new_object(key, std::move(frodo_key));
1486 });
1487#else
1488 BOTAN_UNUSED(key, pubkey, key_len, frodo_mode);
1490#endif
1491}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_kyber()

int botan_pubkey_load_kyber ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len )

Definition at line 1238 of file ffi_pkey_algs.cpp.

1238 {
1239#if defined(BOTAN_HAS_KYBER)
1240 if(Botan::any_null_pointers(key, pubkey)) {
1242 }
1243 *key = nullptr;
1244
1245 const auto mode = [](size_t len) -> std::optional<Botan::KyberMode> {
1246 if(len == 800) {
1248 } else if(len == 1184) {
1250 } else if(len == 1568) {
1252 } else {
1253 return {};
1254 }
1255 }(key_len);
1256
1257 if(mode.has_value()) {
1258 return ffi_guard_thunk(__func__, [=]() -> int {
1259 auto kyber = std::make_unique<Botan::Kyber_PublicKey>(std::span{pubkey, key_len}, *mode);
1260 return ffi_new_object(key, std::move(kyber));
1261 });
1262 } else {
1264 }
1265#else
1266 BOTAN_UNUSED(key, pubkey, key_len);
1268#endif
1269}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan::KyberMode::Kyber1024_R3, Botan::KyberMode::Kyber512_R3, and Botan::KyberMode::Kyber768_R3.

◆ botan_pubkey_load_ml_dsa()

int botan_pubkey_load_ml_dsa ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len,
const char * mldsa_mode )

Definition at line 1378 of file ffi_pkey_algs.cpp.

1378 {
1379#if defined(BOTAN_HAS_ML_DSA)
1380 if(Botan::any_null_pointers(key, pubkey, mldsa_mode)) {
1382 }
1383
1384 *key = nullptr;
1385
1386 return ffi_guard_thunk(__func__, [=]() -> int {
1387 auto mode = Botan::ML_DSA_Mode(mldsa_mode);
1388 if(!mode.is_ml_dsa()) {
1390 }
1391
1392 auto mldsa_key = std::make_unique<Botan::ML_DSA_PublicKey>(std::span{pubkey, key_len}, mode);
1393 return ffi_new_object(key, std::move(mldsa_key));
1394 });
1395#else
1396 BOTAN_UNUSED(key, key_len, pubkey, mldsa_mode);
1398#endif
1399}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_ml_kem()

int botan_pubkey_load_ml_kem ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len,
const char * mlkem_mode )

Definition at line 1328 of file ffi_pkey_algs.cpp.

1328 {
1329#if defined(BOTAN_HAS_ML_KEM)
1330 if(Botan::any_null_pointers(key, pubkey, mlkem_mode)) {
1332 }
1333
1334 *key = nullptr;
1335
1336 return ffi_guard_thunk(__func__, [=]() -> int {
1337 auto mode = Botan::ML_KEM_Mode(mlkem_mode);
1338 if(!mode.is_ml_kem()) {
1340 }
1341
1342 auto mlkem_key = std::make_unique<Botan::ML_KEM_PublicKey>(std::span{pubkey, key_len}, mode.mode());
1343 return ffi_new_object(key, std::move(mlkem_key));
1344 });
1345#else
1346 BOTAN_UNUSED(key, key_len, pubkey, mlkem_mode);
1348#endif
1349}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_rsa()

int botan_pubkey_load_rsa ( botan_pubkey_t * key,
botan_mp_t n,
botan_mp_t e )

Definition at line 273 of file ffi_pkey_algs.cpp.

273 {
274#if defined(BOTAN_HAS_RSA)
275 if(key == nullptr) {
277 }
278 *key = nullptr;
279 return ffi_guard_thunk(__func__, [=]() -> int {
280 auto rsa = std::make_unique<Botan::RSA_PublicKey>(safe_get(n), safe_get(e));
281 return ffi_new_object(key, std::move(rsa));
282 });
283#else
284 BOTAN_UNUSED(key, n, e);
286#endif
287}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_pubkey_load_rsa_pkcs1()

int botan_pubkey_load_rsa_pkcs1 ( botan_pubkey_t * key,
const uint8_t bits[],
size_t len )

Definition at line 289 of file ffi_pkey_algs.cpp.

289 {
290#if defined(BOTAN_HAS_RSA)
291 if(Botan::any_null_pointers(key, bits)) {
293 }
294 *key = nullptr;
295
296 return ffi_guard_thunk(__func__, [=]() -> int {
298 auto rsa = std::make_unique<Botan::RSA_PublicKey>(alg_id, std::span{bits, len});
299 return ffi_new_object(key, std::move(rsa));
300 });
301#else
302 BOTAN_UNUSED(key, bits, len);
304#endif
305}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan::AlgorithmIdentifier::USE_NULL_PARAM.

◆ botan_pubkey_load_slh_dsa()

int botan_pubkey_load_slh_dsa ( botan_pubkey_t * key,
const uint8_t pubkey[],
size_t key_len,
const char * slhdsa_mode )

Definition at line 1428 of file ffi_pkey_algs.cpp.

1428 {
1429#if defined(BOTAN_HAS_SLH_DSA_WITH_SHA2) || defined(BOTAN_HAS_SLH_DSA_WITH_SHAKE)
1430 if(Botan::any_null_pointers(key, pubkey, slhdsa_mode)) {
1432 }
1433
1434 *key = nullptr;
1435
1436 return ffi_guard_thunk(__func__, [=]() -> int {
1437 auto mode = Botan::SLH_DSA_Parameters::create(slhdsa_mode);
1438 if(!mode.is_slh_dsa()) {
1440 }
1441
1442 auto mldsa_key = std::make_unique<Botan::SLH_DSA_PublicKey>(std::span{pubkey, key_len}, mode);
1443 return ffi_new_object(key, std::move(mldsa_key));
1444 });
1445#else
1446 BOTAN_UNUSED(key, key_len, pubkey, slhdsa_mode);
1448#endif
1449}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_sm2()

int botan_pubkey_load_sm2 ( botan_pubkey_t * key,
botan_mp_t public_x,
botan_mp_t public_y,
const char * curve_name )

Definition at line 759 of file ffi_pkey_algs.cpp.

762 {
763#if defined(BOTAN_HAS_SM2)
764 if(Botan::any_null_pointers(key, curve_name)) {
766 }
767 *key = nullptr;
768
769 return ffi_guard_thunk(__func__, [=]() -> int {
770 std::unique_ptr<Botan::SM2_PublicKey> p_key;
771 if(pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name) == 0) {
772 return ffi_new_object(key, std::move(p_key));
773 } else {
775 }
776 });
777#else
778 BOTAN_UNUSED(key, public_x, public_y, curve_name);
780#endif
781}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

Referenced by botan_pubkey_load_sm2_enc().

◆ botan_pubkey_load_sm2_enc()

int botan_pubkey_load_sm2_enc ( botan_pubkey_t * key,
botan_mp_t public_x,
botan_mp_t public_y,
const char * curve_name )

Definition at line 828 of file ffi_pkey_algs.cpp.

831 {
832 return botan_pubkey_load_sm2(key, public_x, public_y, curve_name);
833}
int botan_pubkey_load_sm2(botan_pubkey_t *key, const botan_mp_t public_x, const botan_mp_t public_y, const char *curve_name)

References botan_pubkey_load_sm2().

◆ botan_pubkey_load_sm2_sec1()

int botan_pubkey_load_sm2_sec1 ( botan_pubkey_t * key,
const uint8_t sec1[],
size_t sec1_len,
const char * curve_name )

Definition at line 783 of file ffi_pkey_algs.cpp.

783 {
784#if defined(BOTAN_HAS_SM2)
785 if(Botan::any_null_pointers(key, sec1, curve_name)) {
787 }
788 *key = nullptr;
789
790 return ffi_guard_thunk(__func__, [=]() -> int {
791 std::unique_ptr<Botan::SM2_PublicKey> p_key;
792
793 const int rc = pubkey_load_ec_sec1(p_key, {sec1, sec1_len}, curve_name);
794 if(rc == BOTAN_FFI_SUCCESS) {
795 ffi_new_object(key, std::move(p_key));
796 }
797
798 return rc;
799 });
800#else
801 BOTAN_UNUSED(key, sec1, sec1_len, curve_name);
803#endif
804}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_x25519()

int botan_pubkey_load_x25519 ( botan_pubkey_t * key,
const uint8_t pubkey[32] )

Definition at line 1070 of file ffi_pkey_algs.cpp.

1070 {
1071#if defined(BOTAN_HAS_X25519)
1072 if(key == nullptr) {
1074 }
1075 *key = nullptr;
1076 return ffi_guard_thunk(__func__, [=]() -> int {
1077 auto x25519 = std::make_unique<Botan::X25519_PublicKey>(std::span{pubkey, 32});
1078 return ffi_new_object(key, std::move(x25519));
1079 });
1080#else
1081 BOTAN_UNUSED(key, pubkey);
1083#endif
1084}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_load_x448()

int botan_pubkey_load_x448 ( botan_pubkey_t * key,
const uint8_t pubkey[56] )

Definition at line 1146 of file ffi_pkey_algs.cpp.

1146 {
1147#if defined(BOTAN_HAS_X448)
1148 if(key == nullptr) {
1150 }
1151 *key = nullptr;
1152 return ffi_guard_thunk(__func__, [=]() -> int {
1153 auto x448 = std::make_unique<Botan::X448_PublicKey>(std::span{pubkey, 56});
1154 return ffi_new_object(key, std::move(x448));
1155 });
1156#else
1157 BOTAN_UNUSED(key, pubkey);
1159#endif
1160}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_pubkey_oid()

int botan_pubkey_oid ( botan_asn1_oid_t * oid,
botan_pubkey_t key )

Definition at line 396 of file ffi_pkey.cpp.

396 {
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}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_pubkey_rsa_get_e()

int botan_pubkey_rsa_get_e ( botan_mp_t e,
botan_pubkey_t rsa_key )

Definition at line 327 of file ffi_pkey_algs.cpp.

327 {
328 return botan_pubkey_get_field(e, key, "e");
329}

References botan_pubkey_get_field().

◆ botan_pubkey_rsa_get_n()

int botan_pubkey_rsa_get_n ( botan_mp_t n,
botan_pubkey_t rsa_key )

Definition at line 331 of file ffi_pkey_algs.cpp.

331 {
332 return botan_pubkey_get_field(n, key, "n");
333}

References botan_pubkey_get_field().

◆ botan_pubkey_sm2_compute_za()

int botan_pubkey_sm2_compute_za ( uint8_t out[],
size_t * out_len,
const char * ident,
const char * hash_algo,
botan_pubkey_t key )

Definition at line 726 of file ffi_pkey_algs.cpp.

727 {
728 if(Botan::any_null_pointers(out, out_len, ident, hash_algo, key)) {
730 }
731
732#if defined(BOTAN_HAS_SM2)
733 return ffi_guard_thunk(__func__, [=]() -> int {
734 const Botan::Public_Key& pub_key = safe_get(key);
735 const Botan::EC_PublicKey* ec_key = dynamic_cast<const Botan::EC_PublicKey*>(&pub_key);
736
737 if(ec_key == nullptr) {
739 }
740
741 if(ec_key->algo_name() != "SM2") {
743 }
744
745 const std::string ident_str(ident);
746 std::unique_ptr<Botan::HashFunction> hash = Botan::HashFunction::create_or_throw(hash_algo);
747
748 const auto& pt = ec_key->_public_ec_point();
749
750 const auto za = Botan::sm2_compute_za(*hash, ident_str, ec_key->domain(), pt);
751
752 return write_vec_output(out, out_len, za);
753 });
754#else
756#endif
757}
virtual std::string algo_name() const =0
const EC_AffinePoint & _public_ec_point() const
Definition ecc_key.cpp:76
std::vector< uint8_t > sm2_compute_za(HashFunction &hash, std::string_view user_id, const EC_Group &group, const EC_AffinePoint &pubkey)
Definition sm2.cpp:82

References Botan::EC_PublicKey::_public_ec_point(), Botan::Asymmetric_Key::algo_name(), Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan::HashFunction::create_or_throw(), Botan::EC_PublicKey::domain(), Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), Botan::sm2_compute_za(), and Botan_FFI::write_vec_output().

◆ botan_pubkey_view_der()

int botan_pubkey_view_der ( botan_pubkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the public key's DER encoding

Definition at line 197 of file ffi_pkey.cpp.

197 {
198 return BOTAN_FFI_VISIT(
199 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.subject_public_key()); });
200}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

Referenced by botan_pubkey_export().

◆ botan_pubkey_view_ec_public_point()

int botan_pubkey_view_ec_public_point ( botan_pubkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the uncompressed public point associated with the key

Definition at line 1541 of file ffi_pkey_algs.cpp.

1541 {
1542#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO)
1543 return BOTAN_FFI_VISIT(key, [=](const auto& k) -> int {
1544 if(auto ecc = dynamic_cast<const Botan::EC_PublicKey*>(&k)) {
1545 auto pt = ecc->_public_ec_point().serialize_uncompressed();
1546 return invoke_view_callback(view, ctx, pt);
1547 } else {
1549 }
1550 });
1551#else
1552 BOTAN_UNUSED(key, view, ctx);
1554#endif
1555}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::invoke_view_callback().

◆ botan_pubkey_view_kyber_raw_key()

int botan_pubkey_view_kyber_raw_key ( botan_pubkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

Definition at line 1286 of file ffi_pkey_algs.cpp.

1286 {
1287#if defined(BOTAN_HAS_KYBER)
1288 return BOTAN_FFI_VISIT(key, [=](const auto& k) -> int {
1289 if(auto kyber = dynamic_cast<const Botan::Kyber_PublicKey*>(&k)) {
1290 return invoke_view_callback(view, ctx, kyber->public_key_bits());
1291 } else {
1293 }
1294 });
1295#else
1296 BOTAN_UNUSED(key, ctx, view);
1298#endif
1299}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::invoke_view_callback().

◆ botan_pubkey_view_pem()

int botan_pubkey_view_pem ( botan_pubkey_t key,
botan_view_ctx ctx,
botan_view_str_fn view )

View the public key's PEM encoding

Definition at line 202 of file ffi_pkey.cpp.

202 {
203 return BOTAN_FFI_VISIT(
204 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, Botan::X509::PEM_encode(k)); });
205}
std::string PEM_encode(const Public_Key &key)
Definition x509_key.cpp:21

References BOTAN_FFI_VISIT, Botan_FFI::invoke_view_callback(), and Botan::X509::PEM_encode().

Referenced by botan_pubkey_export().

◆ botan_pubkey_view_raw()

int botan_pubkey_view_raw ( botan_pubkey_t key,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the public key's raw encoding

Definition at line 207 of file ffi_pkey.cpp.

207 {
208 return BOTAN_FFI_VISIT(
209 key, [=](const auto& k) -> int { return invoke_view_callback(view, ctx, k.raw_public_key_bits()); });
210}

References BOTAN_FFI_VISIT, and Botan_FFI::invoke_view_callback().

Referenced by botan_pubkey_export().

◆ botan_pubkey_x25519_get_pubkey()

int botan_pubkey_x25519_get_pubkey ( botan_pubkey_t key,
uint8_t pubkey[32] )

Definition at line 1109 of file ffi_pkey_algs.cpp.

1109 {
1110 if(output == nullptr) {
1112 }
1113#if defined(BOTAN_HAS_X25519)
1114 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1115 if(auto x25519 = dynamic_cast<const Botan::X25519_PublicKey*>(&k)) {
1116 Botan::copy_mem(std::span{output, 32}, x25519->raw_public_key_bits());
1117 return BOTAN_FFI_SUCCESS;
1118 } else {
1120 }
1121 });
1122#else
1123 BOTAN_UNUSED(key, output);
1125#endif
1126}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_pubkey_x448_get_pubkey()

int botan_pubkey_x448_get_pubkey ( botan_pubkey_t key,
uint8_t pubkey[56] )

Definition at line 1182 of file ffi_pkey_algs.cpp.

1182 {
1183 if(output == nullptr) {
1185 }
1186#if defined(BOTAN_HAS_X448)
1187 return BOTAN_FFI_VISIT(key, [=](const auto& k) {
1188 if(auto x448 = dynamic_cast<const Botan::X448_PublicKey*>(&k)) {
1189 Botan::copy_mem(std::span{output, 56}, x448->raw_public_key_bits());
1190 return BOTAN_FFI_SUCCESS;
1191 } else {
1193 }
1194 });
1195#else
1196 BOTAN_UNUSED(key, output);
1198#endif
1199}
A public key for the X448 key agreement scheme according to RFC 7748.
Definition x448.h:19

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::copy_mem().

◆ botan_pwdhash()

int botan_pwdhash ( const char * algo,
size_t param1,
size_t param2,
size_t param3,
uint8_t out[],
size_t out_len,
const char * passphrase,
size_t passphrase_len,
const uint8_t salt[],
size_t salt_len )

Definition at line 54 of file ffi_kdf.cpp.

63 {
64 if(algo == nullptr || password == nullptr) {
66 }
67 if(out_len > 0 && out == nullptr) {
69 }
70 if(salt_len > 0 && salt == nullptr) {
72 }
73
74 if(password_len == 0) {
75 password_len = std::strlen(password);
76 }
77
78 return ffi_guard_thunk(__func__, [=]() -> int {
79 auto pwdhash_fam = Botan::PasswordHashFamily::create(algo);
80
81 if(!pwdhash_fam) {
83 }
84
85 auto pwdhash = pwdhash_fam->from_params(param1, param2, param3);
86
87 pwdhash->derive_key(out, out_len, password, password_len, salt, salt_len);
88
89 return BOTAN_FFI_SUCCESS;
90 });
91}
static std::unique_ptr< PasswordHashFamily > create(std::string_view algo_spec, std::string_view provider="")
Definition pwdhash.cpp:54

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::PasswordHashFamily::create(), and Botan_FFI::ffi_guard_thunk().

Referenced by botan_pbkdf(), and botan_scrypt().

◆ botan_pwdhash_timed()

int botan_pwdhash_timed ( const char * algo,
uint32_t msec,
size_t * param1,
size_t * param2,
size_t * param3,
uint8_t out[],
size_t out_len,
const char * passphrase,
size_t passphrase_len,
const uint8_t salt[],
size_t salt_len )

Definition at line 93 of file ffi_kdf.cpp.

103 {
104 if(algo == nullptr || password == nullptr) {
106 }
107 if(out_len > 0 && out == nullptr) {
109 }
110 if(salt_len > 0 && salt == nullptr) {
112 }
113
114 if(password_len == 0) {
115 password_len = std::strlen(password);
116 }
117
118 return ffi_guard_thunk(__func__, [=]() -> int {
119 auto pwdhash_fam = Botan::PasswordHashFamily::create(algo);
120
121 if(!pwdhash_fam) {
123 }
124
125 auto pwdhash = pwdhash_fam->tune_params(out_len, msec);
126
127 if(param1 != nullptr) {
128 *param1 = pwdhash->iterations();
129 }
130 if(param2 != nullptr) {
131 *param2 = pwdhash->parallelism();
132 }
133 if(param3 != nullptr) {
134 *param3 = pwdhash->memory_param();
135 }
136
137 pwdhash->derive_key(out, out_len, password, password_len, salt, salt_len);
138
139 return BOTAN_FFI_SUCCESS;
140 });
141}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::PasswordHashFamily::create(), and Botan_FFI::ffi_guard_thunk().

Referenced by botan_pbkdf_timed().

◆ botan_rng_add_entropy()

int botan_rng_add_entropy ( botan_rng_t rng,
const uint8_t * entropy,
size_t entropy_len )

Add some seed material to a random number generator

Parameters
Random Number Generatorsrng object
Entropy Collectionthe data to add
entropy_lenlength of entropy buffer
Returns
0 on success, a negative value on failure

Definition at line 189 of file ffi_rng.cpp.

189 {
190 if(len > 0 && input == nullptr) {
192 }
193 return BOTAN_FFI_VISIT(rng, [=](auto& r) { r.add_entropy(input, len); });
194}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_rng_destroy()

int botan_rng_destroy ( botan_rng_t rng)

Frees all resources of the random number generator object

Parameters
Random Number Generatorsrng object
Returns
0 if success, error if invalid object handle

Definition at line 164 of file ffi_rng.cpp.

164 {
165 return BOTAN_FFI_CHECKED_DELETE(rng);
166}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_rng_generate_with_input()

int botan_rng_generate_with_input ( botan_rng_t rng,
uint8_t * out,
size_t out_len,
const uint8_t * addl_input,
size_t addl_len )

Generate random bytes from an RNG with additional input.

For a DRBG, the additional input is mixed in before generating. Many other RNG types (eg RDRAND or system RNG) will ignore the input.

Parameters
Random Number Generatorsthe RNG object
outoutput buffer
out_lennumber of bytes to generate
addl_inputadditional input to mix in (may be NULL if addl_len is 0)
addl_lenlength of additional input
Returns
0 on success, negative on failure

Definition at line 230 of file ffi_rng.cpp.

231 {
232 if(out_len > 0 && out == nullptr) {
234 }
235 if(addl_len > 0 && addl_input == nullptr) {
237 }
238 return BOTAN_FFI_VISIT(rng, [=](auto& r) { r.randomize_with_input({out, out_len}, {addl_input, addl_len}); });
239}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_rng_get()

int botan_rng_get ( botan_rng_t rng,
uint8_t * out,
size_t out_len )

Get random bytes from a random number generator

Parameters
Random Number Generatorsrng object
outoutput buffer of size out_len
out_lennumber of requested bytes
Returns
0 on success, negative on failure

Definition at line 168 of file ffi_rng.cpp.

168 {
169 if(out_len > 0 && out == nullptr) {
171 }
172 return BOTAN_FFI_VISIT(rng, [=](auto& r) { r.randomize(out, out_len); });
173}

References BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_rng_init()

int botan_rng_init ( botan_rng_t * rng,
const char * rng_type )

Initialize a random number generator object

Parameters
Random Number Generatorsrng object
rng_typetype of the rng, possible values: "system": system RNG "esdm-full": ESDM RNG (fully seeded) "esdm-pr": ESDM RNG (w. prediction resistance) "user": userspace RNG "user-threadsafe": userspace RNG, with internal locking "rdrand": directly read RDRAND Set rng_type to null to let the library choose some default.

Definition at line 38 of file ffi_rng.cpp.

38 {
39 return ffi_guard_thunk(__func__, [=]() -> int {
40 if(rng_out == nullptr) {
42 }
43
44 const std::string rng_type_s(rng_type != nullptr ? rng_type : "system");
45
46 std::unique_ptr<Botan::RandomNumberGenerator> rng;
47
48 if(rng_type_s == "system") {
49 rng = std::make_unique<Botan::System_RNG>();
50 } else if(rng_type_s == "user" || rng_type_s == "user-threadsafe") {
51 rng = std::make_unique<Botan::AutoSeeded_RNG>();
52 } else if(rng_type_s == "null") {
53 rng = std::make_unique<Botan::Null_RNG>();
54 }
55#if defined(BOTAN_HAS_PROCESSOR_RNG)
56 else if((rng_type_s == "rdrand" || rng_type_s == "hwrng") && Botan::Processor_RNG::available()) {
57 rng = std::make_unique<Botan::Processor_RNG>();
58 }
59#endif
60#if defined(BOTAN_HAS_JITTER_RNG)
61 else if(rng_type_s == "jitter") {
62 rng = std::make_unique<Botan::Jitter_RNG>();
63 }
64#endif
65#if defined(BOTAN_HAS_ESDM_RNG)
66 else if(rng_type_s == "esdm-full") {
67 rng = std::make_unique<Botan::ESDM_RNG>(false);
68 } else if(rng_type_s == "esdm-pr") {
69 rng = std::make_unique<Botan::ESDM_RNG>(true);
70 }
71#endif
72
73 if(!rng) {
75 }
76
77 return ffi_new_object(rng_out, std::move(rng));
78 });
79}

References Botan::Processor_RNG::available(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_rng_init_custom()

int botan_rng_init_custom ( botan_rng_t * rng_out,
const char * rng_name,
void * context,
int(* get_cb )(void *context, uint8_t *out, size_t out_len),
int(* add_entropy_cb )(void *context, const uint8_t input[], size_t length),
void(* destroy_cb )(void *context) )

Initialize a custom random number generator from a set of callback functions

Parameters
rng_outrng object to create
rng_namename of the rng
contextAn application-specific context passed to the callback functions
get_cbCallback for getting random bytes from the rng, return 0 for success
add_entropy_cbCallback for adding entropy to the rng, return 0 for success, may be NULL
destroy_cbCallback called when rng is destroyed, may be NULL

Definition at line 81 of file ffi_rng.cpp.

86 {
87 return ffi_guard_thunk(__func__, [=]() -> int {
88 if(rng_out == nullptr) {
90 }
91
92 if(rng_name == nullptr) {
94 }
95
96 if(get_cb == nullptr) {
98 }
99
100 class Custom_RNG final : public Botan::RandomNumberGenerator {
101 public:
102 Custom_RNG(std::string_view name,
103 void* context,
104 int (*get_cb)(void* context, uint8_t* out, size_t out_len),
105 int (*add_entropy_cb)(void* context, const uint8_t input[], size_t length),
106 void (*destroy_cb)(void* context)) :
107 m_name(name),
108 m_context(context),
109 m_get_cb(get_cb),
110 m_add_entropy_cb(add_entropy_cb),
111 m_destroy_cb(destroy_cb) {}
112
113 ~Custom_RNG() override {
114 if(m_destroy_cb) {
115 m_destroy_cb(m_context);
116 }
117 }
118
119 Custom_RNG(const Custom_RNG& other) = delete;
120 Custom_RNG(Custom_RNG&& other) = delete;
121 Custom_RNG& operator=(const Custom_RNG& other) = delete;
122 Custom_RNG& operator=(Custom_RNG&& other) = delete;
123
124 protected:
125 void fill_bytes_with_input(std::span<uint8_t> output, std::span<const uint8_t> input) override {
126 if(accepts_input() && !input.empty()) {
127 const int rc = m_add_entropy_cb(m_context, input.data(), input.size());
128 if(rc != 0) {
129 throw Botan::Invalid_State("Failed to add entropy via C callback, rc=" + std::to_string(rc));
130 }
131 }
132
133 if(!output.empty()) {
134 const int rc = m_get_cb(m_context, output.data(), output.size());
135 if(rc != 0) {
136 throw Botan::Invalid_State("Failed to get random from C callback, rc=" + std::to_string(rc));
137 }
138 }
139 }
140
141 public:
142 bool accepts_input() const override { return m_add_entropy_cb != nullptr; }
143
144 std::string name() const override { return m_name; }
145
146 void clear() override {}
147
148 bool is_seeded() const override { return true; }
149
150 private:
151 std::string m_name;
152 void* m_context;
153 std::function<int(void* context, uint8_t* out, size_t out_len)> m_get_cb;
154 std::function<int(void* context, const uint8_t input[], size_t length)> m_add_entropy_cb;
155 std::function<void(void* context)> m_destroy_cb;
156 };
157
158 auto rng = std::make_unique<Custom_RNG>(rng_name, context, get_cb, add_entropy_cb, destroy_cb);
159
160 return ffi_new_object(rng_out, std::move(rng));
161 });
162}

References BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_rng_init_drbg()

int botan_rng_init_drbg ( botan_rng_t * rng_out,
const char * drbg_name,
const uint8_t * seed,
size_t seed_len )

Create and seed a DRBG

Parameters
rng_outthe new DRBG object
drbg_namethe name of the DRBG (e.g. "HMAC_DRBG(SHA-256)")
SEEDthe seed material (entropy || nonce || personalization_string)
seed_lenlength of seed in bytes
Returns
0 on success, negative on failure

Definition at line 200 of file ffi_rng.cpp.

200 {
201 return ffi_guard_thunk(__func__, [=]() -> int {
202 if(rng_out == nullptr || drbg_name == nullptr) {
204 }
205 if(seed_len > 0 && seed == nullptr) {
207 }
208
209 std::unique_ptr<Botan::Stateful_RNG> drbg;
210 const std::string name(drbg_name);
211
212#if defined(BOTAN_HAS_HMAC_DRBG)
213 if(name.starts_with("HMAC_DRBG(") && name.ends_with(")") && name.size() > 12) {
214 const std::string hash = name.substr(10, name.size() - 11);
215 drbg = std::make_unique<Botan::HMAC_DRBG>(hash);
216 }
217#endif
218
219 if(!drbg) {
221 }
222
223 drbg->initialize_with(std::span(seed, seed_len));
224 // Upcast to RandomNumberGenerator for the FFI object
225 std::unique_ptr<Botan::RandomNumberGenerator> rng(std::move(drbg));
226 return ffi_new_object(rng_out, std::move(rng));
227 });
228}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_rng_reseed()

int botan_rng_reseed ( botan_rng_t rng,
size_t bits )

Reseed a random number generator Uses the System_RNG as a seed generator.

Parameters
Random Number Generatorsrng object
bitsnumber of bits to reseed with
Returns
0 on success, a negative value on failure

Definition at line 185 of file ffi_rng.cpp.

185 {
186 return BOTAN_FFI_VISIT(rng, [=](auto& r) { r.reseed_from_rng(Botan::system_rng(), bits); });
187}

References BOTAN_FFI_VISIT, and Botan::system_rng().

◆ botan_rng_reseed_from_rng()

int botan_rng_reseed_from_rng ( botan_rng_t rng,
botan_rng_t source_rng,
size_t bits )

Reseed a random number generator

Parameters
Random Number Generatorsrng object
source_rngthe rng that will be read from
bitsnumber of bits to reseed with
Returns
0 on success, a negative value on failure

Definition at line 196 of file ffi_rng.cpp.

196 {
197 return BOTAN_FFI_VISIT(rng, [=](auto& r) { r.reseed_from_rng(safe_get(source_rng), bits); });
198}

References BOTAN_FFI_VISIT, and Botan_FFI::safe_get().

◆ botan_same_mem()

int botan_same_mem ( const uint8_t * x,
const uint8_t * y,
size_t len )

Deprecated equivalent to botan_constant_time_compare

Definition at line 327 of file ffi.cpp.

327 {
328 return botan_constant_time_compare(x, y, len);
329}
int botan_constant_time_compare(const uint8_t *x, const uint8_t *y, size_t len)
Definition ffi.cpp:318

References botan_constant_time_compare().

◆ botan_scrub_mem()

int botan_scrub_mem ( void * mem,
size_t bytes )

Clear out memory using a system specific approach to bypass elision by the compiler (currently using RtlSecureZeroMemory or tricks with volatile pointers).

Definition at line 331 of file ffi.cpp.

331 {
332 if(bytes > 0 && mem == nullptr) {
334 }
335 Botan::secure_scrub_memory(mem, bytes);
336 return BOTAN_FFI_SUCCESS;
337}
void secure_scrub_memory(void *ptr, size_t n)
Definition mem_utils.cpp:25

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, and Botan::secure_scrub_memory().

◆ botan_scrypt()

int botan_scrypt ( uint8_t out[],
size_t out_len,
const char * passphrase,
const uint8_t salt[],
size_t salt_len,
size_t N,
size_t r,
size_t p )

Derive a key using scrypt Deprecated; use botan_pwdhash("Scrypt", N, r, p, out, out_len, password, 0, salt, salt_len);

Definition at line 166 of file ffi_kdf.cpp.

173 {
174 return botan_pwdhash("Scrypt", N, r, p, out, out_len, password, 0, salt, salt_len);
175}

References botan_pwdhash().

◆ botan_srp6_client_agree()

int botan_srp6_client_agree ( const char * username,
const char * password,
const char * group_id,
const char * hash_id,
const uint8_t salt[],
size_t salt_len,
const uint8_t B[],
size_t B_len,
botan_rng_t rng_obj,
uint8_t A[],
size_t * A_len,
uint8_t K[],
size_t * K_len )

SRP6a Client side

Parameters
usernamethe username we are attempting login for
passwordthe password we are attempting to use
group_idspecifies the shared SRP group
Hash Function Identificationspecifies a secure hash function
saltis the salt value sent by the server
salt_lenthe length of salt
Bis the server's public value
B_lenis the server's public value length
rng_objis a random number generator object
Aout buffer to store the SRP-6 A value
A_lenSRP-6 A verifier value length
Kout buffer to store the symmetric value
K_lensymmetric key length
Returns
0 on success, negative on failure

Definition at line 153 of file ffi_srp6.cpp.

165 {
166#if defined(BOTAN_HAS_SRP6)
167 return ffi_guard_thunk(__func__, [=]() -> int {
168 if(any_null_pointers(identity, password, salt, group_id, hash_id, b, rng_obj)) {
170 }
171 try {
172 const std::vector<uint8_t> saltv(salt, salt + salt_len);
174 auto b_bn = Botan::BigInt::from_bytes({b, b_len});
175 const auto group = Botan::DL_Group::from_name(group_id);
176 const size_t a_bits = group.exponent_bits();
177 auto [A_bn, K_sk] = Botan::srp6_client_agree(identity, password, group, hash_id, saltv, b_bn, a_bits, rng);
178 auto ret_a = write_vec_output(A, A_len, A_bn.serialize(group.p_bytes()));
179 auto ret_k = write_vec_output(K, K_len, K_sk.bits_of());
180 if(ret_a != BOTAN_FFI_SUCCESS) {
181 return ret_a;
182 }
183 if(ret_k != BOTAN_FFI_SUCCESS) {
184 return ret_k;
185 }
186 return BOTAN_FFI_SUCCESS;
187 } catch(Botan::Lookup_Error&) {
189 }
190 });
191#else
192 BOTAN_UNUSED(identity, password, group_id, hash_id, rng_obj);
193 BOTAN_UNUSED(salt, salt_len, b, b_len, A, A_len, K, K_len);
195#endif
196}
static BigInt from_bytes(std::span< const uint8_t > bytes)
Definition bigint.cpp:83
static DL_Group from_name(std::string_view name)
Definition dl_group.cpp:262
std::pair< BigInt, SymmetricKey > srp6_client_agree(std::string_view identifier, std::string_view password, std::string_view group_id, std::string_view hash_id, const std::vector< uint8_t > &salt, const BigInt &B, RandomNumberGenerator &rng)
Definition srp6.cpp:66

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan::BigInt::from_bytes(), Botan::DL_Group::from_name(), Botan_FFI::safe_get(), Botan::srp6_client_agree(), and Botan_FFI::write_vec_output().

Referenced by botan_srp6_server_session_step1().

◆ botan_srp6_generate_verifier()

int botan_srp6_generate_verifier ( const char * identifier,
const char * password,
const uint8_t salt[],
size_t salt_len,
const char * group_id,
const char * hash_id,
uint8_t verifier[],
size_t * verifier_len )

Generate a new SRP-6 verifier

Parameters
identifiera username or other client identifier
passwordthe secret used to authenticate user
salta randomly chosen value, at least 128 bits long
salt_lenthe length of salt
group_idspecifies the shared SRP group
Hash Function Identificationspecifies a secure hash function
verifierout buffer to store the SRP-6 verifier value
verifier_lenSRP-6 verifier value length
Returns
0 on success, negative on failure

Definition at line 123 of file ffi_srp6.cpp.

130 {
131#if defined(BOTAN_HAS_SRP6)
132 return ffi_guard_thunk(__func__, [=]() -> int {
133 if(any_null_pointers(username, password, salt, group_id, hash_id)) {
135 }
136 try {
137 const std::vector<uint8_t> salt_vec(salt, salt + salt_len);
138 const auto group = Botan::DL_Group::from_name(group_id);
139 const size_t p_bytes = group.p_bytes();
140 auto verifier_bn = Botan::srp6_generate_verifier(username, password, salt_vec, group, hash_id);
141 return write_vec_output(verifier, verifier_len, verifier_bn.serialize(p_bytes));
142 } catch(Botan::Lookup_Error&) {
144 }
145 });
146#else
147 BOTAN_UNUSED(username, password, group_id, hash_id);
148 BOTAN_UNUSED(salt, salt_len, verifier, verifier_len);
150#endif
151}
BigInt srp6_generate_verifier(std::string_view identifier, std::string_view password, const std::vector< uint8_t > &salt, std::string_view group_id, std::string_view hash_id)
Definition srp6.cpp:130

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan::DL_Group::from_name(), Botan::srp6_generate_verifier(), and Botan_FFI::write_vec_output().

Referenced by botan_srp6_server_session_step1().

◆ botan_srp6_group_size()

int botan_srp6_group_size ( const char * group_id,
size_t * group_p_bytes )

Return the size, in bytes, of the prime associated with group_id

Definition at line 49 of file ffi_srp6.cpp.

49 {
50#if defined(BOTAN_HAS_SRP6)
51 if(any_null_pointers(group_id, group_p_bytes)) {
53 }
54
55 return ffi_guard_thunk(__func__, [=]() -> int {
56 const auto group = Botan::DL_Group::from_name(group_id);
57 *group_p_bytes = group.p_bytes();
58 return BOTAN_FFI_SUCCESS;
59 });
60#else
61 BOTAN_UNUSED(group_id, group_p_bytes);
63#endif
64}

References Botan_FFI::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan::DL_Group::from_name().

Referenced by botan_srp6_server_session_step1().

◆ botan_srp6_server_session_destroy()

int botan_srp6_server_session_destroy ( botan_srp6_server_session_t srp6)

Frees all resources of the SRP-6 server session object

Parameters
SRP-6aSRP-6 server session object
Returns
0 if success, error if invalid object handle

Definition at line 45 of file ffi_srp6.cpp.

45 {
46 return BOTAN_FFI_CHECKED_DELETE(srp6);
47}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_srp6_server_session_init()

int botan_srp6_server_session_init ( botan_srp6_server_session_t * srp6)

Initialize an SRP-6 server session object

Parameters
SRP-6aSRP-6 server session object

Definition at line 32 of file ffi_srp6.cpp.

32 {
33#if defined(BOTAN_HAS_SRP6)
34 if(srp6 == nullptr) {
36 }
37 return ffi_guard_thunk(
38 __func__, [=]() -> int { return ffi_new_object(srp6, std::make_unique<Botan::SRP6_Server_Session>()); });
39#else
40 BOTAN_UNUSED(srp6);
42#endif
43}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_srp6_server_session_step1()

int botan_srp6_server_session_step1 ( botan_srp6_server_session_t srp6,
const uint8_t verifier[],
size_t verifier_len,
const char * group_id,
const char * hash_id,
botan_rng_t rng_obj,
uint8_t B_pub[],
size_t * B_pub_len )

SRP-6 Server side step 1

Parameters
SRP-6aSRP-6 server session object
verifierthe verification value saved from client registration
verifier_lenSRP-6 verifier value length
group_idthe SRP group id
Hash Function Identificationthe SRP hash in use
rng_obja random number generator object
B_pubout buffer to store the SRP-6 B value
B_pub_lenSRP-6 B value length
Returns
0 on success, negative on failure

References BOTAN_FFI_EXPORT, botan_srp6_client_agree(), botan_srp6_generate_verifier(), botan_srp6_group_size(), botan_srp6_server_session_step1(), botan_srp6_server_session_step2(), botan_zfec_decode(), and botan_zfec_encode().

Referenced by botan_srp6_server_session_step1().

◆ botan_srp6_server_session_step2()

int botan_srp6_server_session_step2 ( botan_srp6_server_session_t srp6,
const uint8_t A[],
size_t A_len,
uint8_t key[],
size_t * key_len )

SRP-6 Server side step 2

Parameters
SRP-6aSRP-6 server session object
Athe client's value
A_lenthe client's value length
keyout buffer to store the symmetric key value
key_lensymmetric key length
Returns
0 on success, negative on failure

Definition at line 102 of file ffi_srp6.cpp.

103 {
104#if defined(BOTAN_HAS_SRP6)
105 return BOTAN_FFI_VISIT(srp6, [=](auto& s) -> int {
106 if(!a) {
108 }
109 try {
110 const Botan::BigInt a_bn = Botan::BigInt::from_bytes({a, a_len});
111 auto key_sk = s.step2(a_bn);
112 return write_vec_output(key, key_len, key_sk.bits_of());
113 } catch(Botan::Decoding_Error&) {
115 }
116 });
117#else
118 BOTAN_UNUSED(srp6, a, a_len, key, key_len);
120#endif
121}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::BigInt::from_bytes(), and Botan_FFI::write_vec_output().

Referenced by botan_srp6_server_session_step1().

◆ botan_system_rng_get()

int botan_system_rng_get ( uint8_t * out,
size_t out_len )

Get random bytes from system random number generator

Parameters
outoutput buffer of size out_len
out_lennumber of requested bytes
Returns
0 on success, negative on failure

Definition at line 175 of file ffi_rng.cpp.

175 {
176 if(out_len > 0 && out == nullptr) {
178 }
179 return ffi_guard_thunk(__func__, [=]() -> int {
180 Botan::system_rng().randomize(out, out_len);
181 return BOTAN_FFI_SUCCESS;
182 });
183}
void randomize(std::span< uint8_t > output)
Definition rng.h:75

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), Botan::RandomNumberGenerator::randomize(), and Botan::system_rng().

◆ botan_totp_check()

int botan_totp_check ( botan_totp_t totp,
uint32_t totp_code,
uint64_t timestamp,
size_t acceptable_clock_drift )

Verify a TOTP code

Parameters
totpthe TOTP object
totp_codethe presented OTP
timestampthe current local timestamp
acceptable_clock_driftspecifies the acceptable amount of clock drift (in terms of time steps) between the two hosts.

Definition at line 68 of file ffi_totp.cpp.

68 {
69#if defined(BOTAN_HAS_TOTP)
70 return BOTAN_FFI_VISIT(totp, [=](auto& t) {
71 const bool ok = t.verify_totp(totp_code, timestamp, acceptable_clock_drift);
73 });
74
75#else
76 BOTAN_UNUSED(totp, totp_code, timestamp, acceptable_clock_drift);
78#endif
79}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_INVALID_VERIFIER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_totp_destroy()

int botan_totp_destroy ( botan_totp_t totp)

Destroy a TOTP instance

Returns
0 if success, error if invalid object handle

Definition at line 45 of file ffi_totp.cpp.

45 {
46#if defined(BOTAN_HAS_TOTP)
47 return BOTAN_FFI_CHECKED_DELETE(totp);
48#else
49 BOTAN_UNUSED(totp);
51#endif
52}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_totp_generate()

int botan_totp_generate ( botan_totp_t totp,
uint32_t * totp_code,
uint64_t timestamp )

Generate a TOTP code for the provided timestamp

Parameters
totpthe TOTP object
totp_codethe OTP code will be written here
timestampthe current local timestamp

Definition at line 54 of file ffi_totp.cpp.

54 {
55#if defined(BOTAN_HAS_TOTP)
56 if(totp == nullptr || totp_code == nullptr) {
58 }
59
60 return BOTAN_FFI_VISIT(totp, [=](auto& t) { *totp_code = t.generate_totp(timestamp); });
61
62#else
63 BOTAN_UNUSED(totp, totp_code, timestamp);
65#endif
66}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_totp_init()

int botan_totp_init ( botan_totp_t * totp,
const uint8_t key[],
size_t key_len,
const char * hash_algo,
size_t digits,
size_t time_step )

Initialize a TOTP instance

Definition at line 26 of file ffi_totp.cpp.

27 {
28 if(totp == nullptr || key == nullptr || hash_algo == nullptr) {
30 }
31
32 *totp = nullptr;
33
34#if defined(BOTAN_HAS_TOTP)
35 return ffi_guard_thunk(__func__, [=]() -> int {
36 auto otp = std::make_unique<Botan::TOTP>(key, key_len, hash_algo, digits, time_step);
37 return ffi_new_object(totp, std::move(otp));
38 });
39#else
40 BOTAN_UNUSED(totp, key, key_len, hash_algo, digits, time_step);
42#endif
43}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_tpm2_crypto_backend_state_destroy()

int botan_tpm2_crypto_backend_state_destroy ( botan_tpm2_crypto_backend_state_t cbs)

Frees all resources of a TPM2 Crypto Callback State Note that this does not attempt to de-register the crypto backend, it just frees the resource pointed to by cbs. Use the ESAPI function Esys_SetCryptoCallbacks(ctx, nullptr) to deregister manually.

Parameters
cbsTPM2 Crypto Callback State
Returns
0 on success

Definition at line 203 of file ffi_tpm2.cpp.

203 {
204#if defined(BOTAN_HAS_TPM2_CRYPTO_BACKEND)
205 return BOTAN_FFI_CHECKED_DELETE(cbs);
206#else
207 BOTAN_UNUSED(cbs);
209#endif
210}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_tpm2_ctx_destroy()

int botan_tpm2_ctx_destroy ( botan_tpm2_ctx_t ctx)

Frees all resources of a TPM2 context

Parameters
ctxTPM2 context
Returns
0 on success

Definition at line 172 of file ffi_tpm2.cpp.

172 {
173#if defined(BOTAN_HAS_TPM2)
174 return BOTAN_FFI_CHECKED_DELETE(ctx);
175#else
176 BOTAN_UNUSED(ctx);
178#endif
179}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_tpm2_ctx_enable_crypto_backend()

int botan_tpm2_ctx_enable_crypto_backend ( botan_tpm2_ctx_t ctx,
botan_rng_t rng )

Enable Botan's TSS2 crypto backend that replaces the cryptographic functions required for the communication with the TPM with implementations provided by Botan instead of using TSS' defaults OpenSSL or mbedTLS. Note that the provided rng should not be dependent on the TPM and the caller must ensure that it remains usable for the lifetime of the ctx.

Parameters
ctxTPM2 context
Random Number Generatorsrandom number generator to be used by the crypto backend

Definition at line 150 of file ffi_tpm2.cpp.

150 {
151#if defined(BOTAN_HAS_TPM2)
152 return BOTAN_FFI_VISIT(ctx, [=](botan_tpm2_ctx_wrapper& ctx_wrapper) -> int {
154
155 // The lifetime of the RNG used for the crypto backend should be managed
156 // by the TPM2::Context. Here, we just need to trust the user that they
157 // keep the passed-in RNG instance intact for the lifetime of the context.
158 ctx_wrapper.ctx->use_botan_crypto_backend(std::shared_ptr<Botan::RandomNumberGenerator>(&rng_ref, [](auto*) {}));
159 return BOTAN_FFI_SUCCESS;
160 });
161#else
162 BOTAN_UNUSED(ctx, rng);
164#endif
165}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::safe_get().

◆ botan_tpm2_ctx_from_esys()

int botan_tpm2_ctx_from_esys ( botan_tpm2_ctx_t * ctx_out,
struct ESYS_CONTEXT * esys_ctx )

Wrap an existing ESYS_CONTEXT for use in Botan. Note that destroying the created botan_tpm2_ctx_t won't finalize esys_ctx

Parameters
ctx_outoutput TPM2 context
esys_ctxESYS_CONTEXT to wrap
Returns
0 on success

Definition at line 133 of file ffi_tpm2.cpp.

133 {
134#if defined(BOTAN_HAS_TPM2)
135 return ffi_guard_thunk(__func__, [=]() -> int {
136 if(ctx_out == nullptr || esys_ctx == nullptr) {
138 }
139
140 auto ctx = std::make_unique<botan_tpm2_ctx_wrapper>();
141 ctx->ctx = Botan::TPM2::Context::create(esys_ctx);
142 return ffi_new_object(ctx_out, std::move(ctx));
143 });
144#else
145 BOTAN_UNUSED(ctx_out, esys_ctx);
147#endif
148}
static std::shared_ptr< Context > create(const std::string &tcti_nameconf)

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::TPM2::Context::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_tpm2_ctx_init()

int botan_tpm2_ctx_init ( botan_tpm2_ctx_t * ctx_out,
const char * tcti_nameconf )

Initialize a TPM2 context

Parameters
ctx_outoutput TPM2 context
tcti_nameconfTCTI config (may be nullptr)
Returns
0 on success

Definition at line 75 of file ffi_tpm2.cpp.

75 {
76#if defined(BOTAN_HAS_TPM2)
77 return ffi_guard_thunk(__func__, [=]() -> int {
78 if(ctx_out == nullptr) {
80 }
81 auto ctx = std::make_unique<botan_tpm2_ctx_wrapper>();
82
83 auto tcti = [=]() -> std::optional<std::string> {
84 if(tcti_nameconf == nullptr) {
85 return {};
86 } else {
87 return std::string(tcti_nameconf);
88 }
89 }();
90
91 ctx->ctx = Botan::TPM2::Context::create(std::move(tcti));
92 return ffi_new_object(ctx_out, std::move(ctx));
93 });
94#else
95 BOTAN_UNUSED(ctx_out, tcti_nameconf);
97#endif
98}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::TPM2::Context::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_tpm2_ctx_init_ex()

int botan_tpm2_ctx_init_ex ( botan_tpm2_ctx_t * ctx_out,
const char * tcti_name,
const char * tcti_conf )

Initialize a TPM2 context

Parameters
ctx_outoutput TPM2 context
tcti_nameTCTI name (may be nullptr)
tcti_confTCTI config (may be nullptr)
Returns
0 on success

Definition at line 100 of file ffi_tpm2.cpp.

100 {
101#if defined(BOTAN_HAS_TPM2)
102 return ffi_guard_thunk(__func__, [=]() -> int {
103 if(ctx_out == nullptr) {
105 }
106 auto ctx = std::make_unique<botan_tpm2_ctx_wrapper>();
107
108 auto tcti_name_str = [=]() -> std::optional<std::string> {
109 if(tcti_name == nullptr) {
110 return {};
111 } else {
112 return std::string(tcti_name);
113 }
114 }();
115
116 auto tcti_conf_str = [=]() -> std::optional<std::string> {
117 if(tcti_conf == nullptr) {
118 return {};
119 } else {
120 return std::string(tcti_conf);
121 }
122 }();
123
124 ctx->ctx = Botan::TPM2::Context::create(std::move(tcti_name_str), std::move(tcti_conf_str));
125 return ffi_new_object(ctx_out, std::move(ctx));
126 });
127#else
128 BOTAN_UNUSED(ctx_out, tcti_name, tcti_conf);
130#endif
131}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan::TPM2::Context::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_tpm2_enable_crypto_backend()

int botan_tpm2_enable_crypto_backend ( botan_tpm2_crypto_backend_state_t * cbs_out,
struct ESYS_CONTEXT * esys_ctx,
botan_rng_t rng )

Use this if you just need Botan's crypto backend but do not want to wrap any other ESYS functionality using Botan's TPM2 wrapper. A Crypto Backend State is created that the user needs to keep alive for as long as the crypto backend is used and needs to be destroyed after. Note that the provided rng should not be dependent on the TPM and the caller must ensure that it remains usable for the lifetime of the esys_ctx.

Parameters
cbs_outTo be created Crypto Backend State
esys_ctxTPM2 context
Random Number Generatorsrandom number generator to be used by the crypto backend

Definition at line 181 of file ffi_tpm2.cpp.

183 {
184#if defined(BOTAN_HAS_TPM2_CRYPTO_BACKEND)
185 return ffi_guard_thunk(__func__, [=]() -> int {
186 if(cbs_out == nullptr || esys_ctx == nullptr) {
188 }
189
191
192 // Here, we just need to trust the user that they keep the passed-in RNG
193 // instance intact for the lifetime of the context.
194 const std::shared_ptr<Botan::RandomNumberGenerator> rng_ptr(&rng_ref, [](auto*) {});
195 return ffi_new_object(cbs_out, Botan::TPM2::use_botan_crypto_backend(esys_ctx, rng_ptr));
196 });
197#else
198 BOTAN_UNUSED(cbs_out, esys_ctx, rng);
200#endif
201}
std::unique_ptr< CryptoCallbackState > use_botan_crypto_backend(ESYS_CONTEXT *context, const std::shared_ptr< Botan::RandomNumberGenerator > &rng)

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), Botan_FFI::safe_get(), and Botan::TPM2::use_botan_crypto_backend().

◆ botan_tpm2_rng_init()

int botan_tpm2_rng_init ( botan_rng_t * rng_out,
botan_tpm2_ctx_t ctx,
botan_tpm2_session_t s1,
botan_tpm2_session_t s2,
botan_tpm2_session_t s3 )

Initialize a random number generator object via TPM2

Parameters
rng_outrng object to create
ctxTPM2 context
s1the first session to use (optional, may be nullptr)
s2the second session to use (optional, may be nullptr)
s3the third session to use (optional, may be nullptr)

Definition at line 212 of file ffi_tpm2.cpp.

216 {
217#if defined(BOTAN_HAS_TPM2)
218 return BOTAN_FFI_VISIT(ctx, [=](botan_tpm2_ctx_wrapper& ctx_wrapper) -> int {
219 if(rng_out == nullptr) {
221 }
222
223 return ffi_new_object(
224 rng_out, std::make_unique<Botan::TPM2::RandomNumberGenerator>(ctx_wrapper.ctx, sessions(s1, s2, s3)));
225 });
226#else
227 BOTAN_UNUSED(rng_out, ctx, s1, s2, s3);
229#endif
230}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::ffi_new_object().

◆ botan_tpm2_session_destroy()

int botan_tpm2_session_destroy ( botan_tpm2_session_t session)

Create an unauthenticated session for use with TPM2

Parameters
sessionthe session object to destroy

Definition at line 249 of file ffi_tpm2.cpp.

249 {
250#if defined(BOTAN_HAS_TPM2)
251 return BOTAN_FFI_CHECKED_DELETE(session);
252#else
253 BOTAN_UNUSED(session);
255#endif
256}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_tpm2_supports_crypto_backend()

int botan_tpm2_supports_crypto_backend ( void )

Checks if Botan's TSS2 crypto backend can be used in this build

Returns
1 if the crypto backend can be enabled

Definition at line 67 of file ffi_tpm2.cpp.

67 {
68#if defined(BOTAN_HAS_TPM2)
70#else
71 return 0;
72#endif
73}
static bool supports_botan_crypto_backend() noexcept

References Botan::TPM2::Context::supports_botan_crypto_backend().

◆ botan_tpm2_unauthenticated_session_init()

int botan_tpm2_unauthenticated_session_init ( botan_tpm2_session_t * session_out,
botan_tpm2_ctx_t ctx )

Create an unauthenticated session for use with TPM2

Parameters
session_outthe session object to create
ctxTPM2 context

Definition at line 232 of file ffi_tpm2.cpp.

232 {
233#if defined(BOTAN_HAS_TPM2)
234 return BOTAN_FFI_VISIT(ctx, [=](botan_tpm2_ctx_wrapper& ctx_wrapper) -> int {
235 if(session_out == nullptr) {
237 }
238
239 auto session = std::make_unique<botan_tpm2_session_wrapper>();
240 session->session = Botan::TPM2::Session::unauthenticated_session(ctx_wrapper.ctx);
241 return ffi_new_object(session_out, std::move(session));
242 });
243#else
244 BOTAN_UNUSED(session_out, ctx);
246#endif
247}
static std::shared_ptr< Session > unauthenticated_session(const std::shared_ptr< Context > &ctx, std::string_view sym_algo="CFB(AES-256)", std::string_view hash_algo="SHA-256")

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::ffi_new_object(), and Botan::TPM2::Session::unauthenticated_session().

◆ botan_version_datestamp()

uint32_t botan_version_datestamp ( void )

Return the date this version was released as an integer.

Returns 0 if the library was not built from an official release

Definition at line 314 of file ffi.cpp.

314 {
316}
uint32_t version_datestamp()
Definition version.cpp:32

References Botan::version_datestamp().

◆ botan_version_major()

uint32_t botan_version_major ( void )

Return the major version of the library

Definition at line 302 of file ffi.cpp.

302 {
303 return Botan::version_major();
304}
uint32_t version_major()
Definition version.cpp:55

References Botan::version_major().

◆ botan_version_minor()

uint32_t botan_version_minor ( void )

Return the minor version of the library

Definition at line 306 of file ffi.cpp.

306 {
307 return Botan::version_minor();
308}
uint32_t version_minor()
Definition version.cpp:59

References Botan::version_minor().

◆ botan_version_patch()

uint32_t botan_version_patch ( void )

Return the patch version of the library

Definition at line 310 of file ffi.cpp.

310 {
311 return Botan::version_patch();
312}
uint32_t version_patch()
Definition version.cpp:63

References Botan::version_patch().

◆ botan_version_string()

const char * botan_version_string ( void )

Return a free-form version string, e.g., 2.0.0

Definition at line 298 of file ffi.cpp.

298 {
299 return Botan::version_cstr();
300}
const char * version_cstr()
Definition version.cpp:20

References Botan::version_cstr().

◆ botan_x509_cert_allowed_extended_usage_oid()

int botan_x509_cert_allowed_extended_usage_oid ( botan_x509_cert_t cert,
botan_asn1_oid_t oid )

Check if the certificate allows the specified extended usage OID. See RFC 5280 Section 4.2.1.12 for OIDs to query for this. If no extended key usage extension is found in the certificate, this always returns "not success".

This is similar to botan_x509_cert_allowed_extended_usage_str but takes an OID object instead of a string describing the OID.

Definition at line 598 of file ffi_cert.cpp.

598 {
599#if defined(BOTAN_HAS_X509_CERTIFICATES)
600 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int { return c.has_ex_constraint(safe_get(oid)) ? 1 : 0; });
601#else
602 BOTAN_UNUSED(cert, oid);
604#endif
605}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::safe_get().

◆ botan_x509_cert_allowed_extended_usage_str()

int botan_x509_cert_allowed_extended_usage_str ( botan_x509_cert_t cert,
const char * oid )

Check if the certificate allows the specified extended usage OID. See RFC 5280 Section 4.2.1.12 for OIDs to query for this. If no extended key usage extension is found in the certificate, this always returns "not success".

Typical OIDs to check for:

  • "PKIX.ServerAuth"
  • "PKIX.ClientAuth"
  • "PKIX.CodeSigning"
  • "PKIX.OCSPSigning"

The oid parameter can be either a canonical OID string or identifiers as indicated in the examples above.

Definition at line 583 of file ffi_cert.cpp.

583 {
584#if defined(BOTAN_HAS_X509_CERTIFICATES)
585 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
586 if(Botan::any_null_pointers(oid)) {
588 }
589
590 return c.has_ex_constraint(oid) ? 1 : 0;
591 });
592#else
593 BOTAN_UNUSED(cert, oid);
595#endif
596}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_allowed_usage()

int botan_x509_cert_allowed_usage ( botan_x509_cert_t cert,
unsigned int key_usage )

Definition at line 568 of file ffi_cert.cpp.

568 {
569#if defined(BOTAN_HAS_X509_CERTIFICATES)
570 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
571 const Botan::Key_Constraints k = static_cast<Botan::Key_Constraints>(key_usage);
572 if(c.allowed_usage(k)) {
573 return BOTAN_FFI_SUCCESS;
574 }
575 return 1;
576 });
577#else
578 BOTAN_UNUSED(cert, key_usage);
580#endif
581}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_destroy()

int botan_x509_cert_destroy ( botan_x509_cert_t cert)
Returns
0 if success, error if invalid object handle

Definition at line 607 of file ffi_cert.cpp.

607 {
608#if defined(BOTAN_HAS_X509_CERTIFICATES)
609 return BOTAN_FFI_CHECKED_DELETE(cert);
610#else
611 BOTAN_UNUSED(cert);
613#endif
614}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_x509_cert_dup()

int botan_x509_cert_dup ( botan_x509_cert_t * new_cert,
botan_x509_cert_t cert )

Definition at line 194 of file ffi_cert.cpp.

194 {
195 if(cert_obj == nullptr) {
197 }
198
199#if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
200
201 return ffi_guard_thunk(__func__, [=]() -> int {
202 auto c = std::make_unique<Botan::X509_Certificate>(safe_get(cert));
203 return ffi_new_object(cert_obj, std::move(c));
204 });
205
206#else
207 BOTAN_UNUSED(cert);
209#endif
210}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_x509_cert_excluded_name_constraints()

int botan_x509_cert_excluded_name_constraints ( botan_x509_cert_t cert,
size_t index,
botan_x509_general_name_t * constraint )

Extracts "excluded" name constraints from a given cert one-by-one. Returns BOTAN_FFI_ERROR_OUT_OF_RANGE if the given index is larger than the available number of "excluded" name constraints.

Definition at line 847 of file ffi_cert.cpp.

849 {
850#if defined(BOTAN_HAS_X509_CERTIFICATES)
851 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) {
852 if(Botan::any_null_pointers(constraint)) {
854 }
855
856 const auto& constraints = c.name_constraints().excluded();
857 if(index >= constraints.size()) {
859 }
860
861 return ffi_new_object(constraint, std::make_unique<Botan::GeneralName>(constraints[index].base()));
862 });
863#else
864 BOTAN_UNUSED(cert, index, constraint);
866#endif
867}
const std::vector< GeneralSubtree > & excluded() const
Definition pkix_types.h:456
const NameConstraints & name_constraints() const
Definition x509cert.cpp:473

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::NameConstraints::excluded(), Botan_FFI::ffi_new_object(), and Botan::X509_Certificate::name_constraints().

◆ botan_x509_cert_excluded_name_constraints_count()

int botan_x509_cert_excluded_name_constraints_count ( botan_x509_cert_t cert,
size_t * count )

Definition at line 869 of file ffi_cert.cpp.

869 {
870#if defined(BOTAN_HAS_X509_CERTIFICATES)
871 if(Botan::any_null_pointers(count)) {
873 }
874
875 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { *count = c.name_constraints().excluded().size(); });
876#else
877 BOTAN_UNUSED(cert, count);
879#endif
880}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_get_authority_key_id()

int botan_x509_cert_get_authority_key_id ( botan_x509_cert_t cert,
uint8_t out[],
size_t * out_len )

Definition at line 701 of file ffi_cert.cpp.

701 {
702#if defined(BOTAN_HAS_X509_CERTIFICATES)
703 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return write_vec_output(out, out_len, c.authority_key_id()); });
704#else
705 BOTAN_UNUSED(cert, out, out_len);
707#endif
708}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_vec_output().

◆ botan_x509_cert_get_fingerprint()

int botan_x509_cert_get_fingerprint ( botan_x509_cert_t cert,
const char * hash,
uint8_t out[],
size_t * out_len )

Definition at line 685 of file ffi_cert.cpp.

685 {
686 if(hash == nullptr) {
688 }
689#if defined(BOTAN_HAS_X509_CERTIFICATES)
690 // TODO(Botan4) change the type of out and remove this cast
691
692 return BOTAN_FFI_VISIT(cert, [=](const auto& c) {
693 return write_str_output(reinterpret_cast<char*>(out), out_len, c.fingerprint(hash));
694 });
695#else
696 BOTAN_UNUSED(cert, hash, out, out_len);
698#endif
699}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_str_output().

◆ botan_x509_cert_get_issuer_dn()

int botan_x509_cert_get_issuer_dn ( botan_x509_cert_t cert,
const char * key,
size_t index,
uint8_t out[],
size_t * out_len )

Enumerates the names of the given key in the issuer DN. If index is out of bounds, BOTAN_FFI_ERROR_BAD_PARAMETER is returned.

TODO(Botan4) use BOTAN_FFI_ERROR_OUT_OF_RANGE instead of BAD_PARAMETER TODO(Botan4) this should use char for the out param

Definition at line 481 of file ffi_cert.cpp.

482 {
483 if(key == nullptr) {
485 }
486#if defined(BOTAN_HAS_X509_CERTIFICATES)
487 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
488 auto issuer_info = c.issuer_info(key);
489 if(index < issuer_info.size()) {
490 // TODO(Botan4) change the type of out and remove this cast
491 return write_str_output(reinterpret_cast<char*>(out), out_len, c.issuer_info(key).at(index));
492 } else {
493 return BOTAN_FFI_ERROR_BAD_PARAMETER; // TODO(Botan4): use BOTAN_FFI_ERROR_OUT_OF_RANGE
494 }
495 });
496#else
497 BOTAN_UNUSED(cert, key, index, out, out_len);
499#endif
500}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_str_output().

◆ botan_x509_cert_get_issuer_dn_count()

int botan_x509_cert_get_issuer_dn_count ( botan_x509_cert_t cert,
const char * key,
size_t * count )

Definition at line 502 of file ffi_cert.cpp.

502 {
503#if defined(BOTAN_HAS_X509_CERTIFICATES)
504 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
505 if(Botan::any_null_pointers(count)) {
507 }
508
509 *count = c.issuer_info(key).size();
510 return BOTAN_FFI_SUCCESS;
511 });
512#else
513 BOTAN_UNUSED(cert, key, count);
515#endif
516}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_get_path_length_constraint()

int botan_x509_cert_get_path_length_constraint ( botan_x509_cert_t cert,
size_t * path_limit )

Retrieves the path length constraint from the certificate. If no such constraint is present, BOTAN_FFI_ERROR_NO_VALUE is returned.

Definition at line 443 of file ffi_cert.cpp.

443 {
444#if defined(BOTAN_HAS_X509_CERTIFICATES)
445 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
446 if(Botan::any_null_pointers(path_limit)) {
448 }
449
450 if(const auto path_len = c.path_length_constraint()) {
451 *path_limit = path_len.value();
452 return BOTAN_FFI_SUCCESS;
453 } else {
455 }
456 });
457#else
458 BOTAN_UNUSED(cert, path_limit);
460#endif
461}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_get_public_key()

int botan_x509_cert_get_public_key ( botan_x509_cert_t cert,
botan_pubkey_t * key )

Definition at line 463 of file ffi_cert.cpp.

463 {
464 if(key == nullptr) {
466 }
467
468 *key = nullptr;
469
470#if defined(BOTAN_HAS_X509_CERTIFICATES)
471 return ffi_guard_thunk(__func__, [=]() -> int {
472 auto public_key = safe_get(cert).subject_public_key();
473 return ffi_new_object(key, std::move(public_key));
474 });
475#else
476 BOTAN_UNUSED(cert);
478#endif
479}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_x509_cert_get_public_key_bits()

int botan_x509_cert_get_public_key_bits ( botan_x509_cert_t cert,
uint8_t out[],
size_t * out_len )

Definition at line 719 of file ffi_cert.cpp.

719 {
720 return copy_view_bin(out, out_len, botan_x509_cert_view_public_key_bits, cert);
721}
int botan_x509_cert_view_public_key_bits(botan_x509_cert_t cert, botan_view_ctx ctx, botan_view_bin_fn view)
Definition ffi_cert.cpp:723

References botan_x509_cert_view_public_key_bits(), and Botan_FFI::copy_view_bin().

◆ botan_x509_cert_get_serial_number()

int botan_x509_cert_get_serial_number ( botan_x509_cert_t cert,
uint8_t out[],
size_t * out_len )

Definition at line 660 of file ffi_cert.cpp.

660 {
661#if defined(BOTAN_HAS_X509_CERTIFICATES)
662 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return write_vec_output(out, out_len, c.serial_number()); });
663#else
664 BOTAN_UNUSED(cert, out, out_len);
666#endif
667}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_vec_output().

◆ botan_x509_cert_get_subject_dn()

int botan_x509_cert_get_subject_dn ( botan_x509_cert_t cert,
const char * key,
size_t index,
uint8_t out[],
size_t * out_len )

Enumerates the names of the given key in the subject DN. If index is out of bounds, BOTAN_FFI_ERROR_BAD_PARAMETER is returned.

TODO(Botan4) use BOTAN_FFI_ERROR_OUT_OF_RANGE instead of BAD_PARAMETER TODO(Botan4) this should use char for the out param

Definition at line 518 of file ffi_cert.cpp.

519 {
520 if(key == nullptr) {
522 }
523#if defined(BOTAN_HAS_X509_CERTIFICATES)
524 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
525 auto subject_info = c.subject_info(key);
526 if(index < subject_info.size()) {
527 // TODO(Botan4) change the type of out and remove this cast
528 return write_str_output(reinterpret_cast<char*>(out), out_len, c.subject_info(key).at(index));
529 } else {
530 return BOTAN_FFI_ERROR_BAD_PARAMETER; // TODO(Botan4): use BOTAN_FFI_ERROR_OUT_OF_RANGE
531 }
532 });
533#else
534 BOTAN_UNUSED(cert, key, index, out, out_len);
536#endif
537}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_str_output().

◆ botan_x509_cert_get_subject_dn_count()

int botan_x509_cert_get_subject_dn_count ( botan_x509_cert_t cert,
const char * key,
size_t * count )

Definition at line 539 of file ffi_cert.cpp.

539 {
540#if defined(BOTAN_HAS_X509_CERTIFICATES)
541 return BOTAN_FFI_VISIT(cert, [=](const auto& c) -> int {
542 if(Botan::any_null_pointers(count)) {
544 }
545
546 *count = c.subject_info(key).size();
547 return BOTAN_FFI_SUCCESS;
548 });
549#else
550 BOTAN_UNUSED(cert, key, count);
552#endif
553}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_get_subject_key_id()

int botan_x509_cert_get_subject_key_id ( botan_x509_cert_t cert,
uint8_t out[],
size_t * out_len )

Definition at line 710 of file ffi_cert.cpp.

710 {
711#if defined(BOTAN_HAS_X509_CERTIFICATES)
712 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return write_vec_output(out, out_len, c.subject_key_id()); });
713#else
714 BOTAN_UNUSED(cert, out, out_len);
716#endif
717}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_vec_output().

◆ botan_x509_cert_get_time_expires()

int botan_x509_cert_get_time_expires ( botan_x509_cert_t cert,
char out[],
size_t * out_len )

Definition at line 626 of file ffi_cert.cpp.

626 {
627#if defined(BOTAN_HAS_X509_CERTIFICATES)
628 return BOTAN_FFI_VISIT(cert,
629 [=](const auto& c) { return write_str_output(out, out_len, c.not_after().to_string()); });
630#else
631 BOTAN_UNUSED(cert, out, out_len);
633#endif
634}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_str_output().

◆ botan_x509_cert_get_time_starts()

int botan_x509_cert_get_time_starts ( botan_x509_cert_t cert,
char out[],
size_t * out_len )

Definition at line 616 of file ffi_cert.cpp.

616 {
617#if defined(BOTAN_HAS_X509_CERTIFICATES)
618 return BOTAN_FFI_VISIT(cert,
619 [=](const auto& c) { return write_str_output(out, out_len, c.not_before().to_string()); });
620#else
621 BOTAN_UNUSED(cert, out, out_len);
623#endif
624}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::write_str_output().

◆ botan_x509_cert_hostname_match()

int botan_x509_cert_hostname_match ( botan_x509_cert_t cert,
const char * hostname )

Check if the certificate matches the specified hostname via alternative name or CN match. RFC 5280 wildcards also supported.

Definition at line 960 of file ffi_cert.cpp.

960 {
961 if(hostname == nullptr) {
963 }
964
965#if defined(BOTAN_HAS_X509_CERTIFICATES)
966 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return c.matches_dns_name(hostname) ? 0 : -1; });
967#else
968 BOTAN_UNUSED(cert);
970#endif
971}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_is_ca()

int botan_x509_cert_is_ca ( botan_x509_cert_t cert)

Returns 1 iff the cert is a CA certificate

Definition at line 434 of file ffi_cert.cpp.

434 {
435#if defined(BOTAN_HAS_X509_CERTIFICATES)
436 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return c.is_CA_cert() ? 1 : 0; });
437#else
438 BOTAN_UNUSED(cert);
440#endif
441}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_issuer_alternative_names()

int botan_x509_cert_issuer_alternative_names ( botan_x509_cert_t cert,
size_t index,
botan_x509_general_name_t * alt_name )

Provides access to all "issuer alternative names", where each entry is returned as a botan_x509_general_name_t. If the given index is not within range of the available entries, BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. If cert does not contain an IssuerAlternativeNames extension, BOTAN_FFI_ERROR_NO_VALUE is returned.

Definition at line 921 of file ffi_cert.cpp.

923 {
924#if defined(BOTAN_HAS_X509_CERTIFICATES)
925 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) {
926 if(Botan::any_null_pointers(alt_name)) {
928 }
929
930 if(!c.v3_extensions().extension_set(Botan::OID::from_string("X509v3.IssuerAlternativeName"))) {
932 }
933
934 if(auto name = extract_general_name_at(c.issuer_alt_name(), index)) {
935 return ffi_new_object(alt_name, std::make_unique<Botan::GeneralName>(std::move(name).value()));
936 }
937
939 });
940#else
941 BOTAN_UNUSED(cert, index, alt_name);
943#endif
944}
bool extension_set(const OID &oid) const
Definition x509_ext.cpp:211
const AlternativeName & issuer_alt_name() const
Definition x509cert.cpp:606
const Extensions & v3_extensions() const
Definition x509cert.cpp:477

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::Extensions::extension_set(), Botan_FFI::ffi_new_object(), Botan::OID::from_string(), Botan::X509_Certificate::issuer_alt_name(), and Botan::X509_Certificate::v3_extensions().

◆ botan_x509_cert_issuer_alternative_names_count()

int botan_x509_cert_issuer_alternative_names_count ( botan_x509_cert_t cert,
size_t * count )

Definition at line 946 of file ffi_cert.cpp.

946 {
947#if defined(BOTAN_HAS_X509_CERTIFICATES)
948 if(Botan::any_null_pointers(count)) {
950 }
951
952 return BOTAN_FFI_VISIT(
953 cert, [=](const Botan::X509_Certificate& c) { *count = count_general_names_in(c.issuer_alt_name()); });
954#else
955 BOTAN_UNUSED(cert, count);
957#endif
958}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::X509_Certificate::issuer_alt_name().

◆ botan_x509_cert_load()

int botan_x509_cert_load ( botan_x509_cert_t * cert_obj,
const uint8_t cert[],
size_t cert_len )

Definition at line 212 of file ffi_cert.cpp.

212 {
213 if(cert_obj == nullptr || cert_bits == nullptr) {
215 }
216
217#if defined(BOTAN_HAS_X509_CERTIFICATES)
218 return ffi_guard_thunk(__func__, [=]() -> int {
219 Botan::DataSource_Memory bits(cert_bits, cert_bits_len);
220 auto c = std::make_unique<Botan::X509_Certificate>(bits);
221 return ffi_new_object(cert_obj, std::move(c));
222 });
223#else
224 BOTAN_UNUSED(cert_bits_len);
226#endif
227}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_x509_cert_load_file()

int botan_x509_cert_load_file ( botan_x509_cert_t * cert_obj,
const char * filename )

Definition at line 177 of file ffi_cert.cpp.

177 {
178 if(cert_obj == nullptr || cert_path == nullptr) {
180 }
181
182#if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
183
184 return ffi_guard_thunk(__func__, [=]() -> int {
185 auto c = std::make_unique<Botan::X509_Certificate>(cert_path);
186 return ffi_new_object(cert_obj, std::move(c));
187 });
188
189#else
191#endif
192}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_x509_cert_not_after()

int botan_x509_cert_not_after ( botan_x509_cert_t cert,
uint64_t * time_since_epoch )

Definition at line 648 of file ffi_cert.cpp.

648 {
649 if(time_since_epoch == nullptr) {
651 }
652#if defined(BOTAN_HAS_X509_CERTIFICATES)
653 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { *time_since_epoch = c.not_after().time_since_epoch(); });
654#else
655 BOTAN_UNUSED(cert, time_since_epoch);
657#endif
658}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_not_before()

int botan_x509_cert_not_before ( botan_x509_cert_t cert,
uint64_t * time_since_epoch )

Definition at line 636 of file ffi_cert.cpp.

636 {
637 if(time_since_epoch == nullptr) {
639 }
640#if defined(BOTAN_HAS_X509_CERTIFICATES)
641 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { *time_since_epoch = c.not_before().time_since_epoch(); });
642#else
643 BOTAN_UNUSED(cert, time_since_epoch);
645#endif
646}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_permitted_name_constraints()

int botan_x509_cert_permitted_name_constraints ( botan_x509_cert_t cert,
size_t index,
botan_x509_general_name_t * constraint )

Extracts "permitted" name constraints from a given cert one-by-one. Returns BOTAN_FFI_ERROR_OUT_OF_RANGE if the given index is larger than the available number of "permitted" name constraints.

Definition at line 812 of file ffi_cert.cpp.

814 {
815#if defined(BOTAN_HAS_X509_CERTIFICATES)
816 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) {
817 if(Botan::any_null_pointers(constraint)) {
819 }
820
821 const auto& constraints = c.name_constraints().permitted();
822 if(index >= constraints.size()) {
824 }
825
826 return ffi_new_object(constraint, std::make_unique<Botan::GeneralName>(constraints[index].base()));
827 });
828#else
829 BOTAN_UNUSED(cert, index, constraint);
831#endif
832}
const std::vector< GeneralSubtree > & permitted() const
Definition pkix_types.h:449

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::ffi_new_object(), Botan::X509_Certificate::name_constraints(), and Botan::NameConstraints::permitted().

◆ botan_x509_cert_permitted_name_constraints_count()

int botan_x509_cert_permitted_name_constraints_count ( botan_x509_cert_t cert,
size_t * count )

Definition at line 834 of file ffi_cert.cpp.

834 {
835#if defined(BOTAN_HAS_X509_CERTIFICATES)
836 if(Botan::any_null_pointers(count)) {
838 }
839
840 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { *count = c.name_constraints().permitted().size(); });
841#else
842 BOTAN_UNUSED(cert, count);
844#endif
845}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_cert_serial_number()

int botan_x509_cert_serial_number ( botan_x509_cert_t cert,
botan_mp_t * serial_number )

Definition at line 669 of file ffi_cert.cpp.

669 {
670#if defined(BOTAN_HAS_X509_CERTIFICATES)
671 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) {
672 if(Botan::any_null_pointers(serial_number)) {
674 }
675
676 auto serial_bn = Botan::BigInt::from_bytes(c.serial_number());
677 return ffi_new_object(serial_number, std::make_unique<Botan::BigInt>(std::move(serial_bn)));
678 });
679#else
680 BOTAN_UNUSED(cert, serial_number);
682#endif
683}
const std::vector< uint8_t > & serial_number() const
Definition x509cert.cpp:406

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::ffi_new_object(), Botan::BigInt::from_bytes(), and Botan::X509_Certificate::serial_number().

◆ botan_x509_cert_subject_alternative_names()

int botan_x509_cert_subject_alternative_names ( botan_x509_cert_t cert,
size_t index,
botan_x509_general_name_t * alt_name )

Provides access to all "subject alternative names", where each entry is returned as a botan_x509_general_name_t. If the given index is not within range of the available entries, BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. If cert does not contain a SubjectAlternativeNames extension, BOTAN_FFI_ERROR_NO_VALUE is returned.

Definition at line 882 of file ffi_cert.cpp.

884 {
885#if defined(BOTAN_HAS_X509_CERTIFICATES)
886 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) {
887 if(Botan::any_null_pointers(alt_name)) {
889 }
890
891 if(!c.v3_extensions().extension_set(Botan::OID::from_string("X509v3.SubjectAlternativeName"))) {
893 }
894
895 if(auto name = extract_general_name_at(c.subject_alt_name(), index)) {
896 return ffi_new_object(alt_name, std::make_unique<Botan::GeneralName>(std::move(name).value()));
897 }
898
900 });
901#else
902 BOTAN_UNUSED(cert, index, alt_name);
904#endif
905}
const AlternativeName & subject_alt_name() const
Definition x509cert.cpp:602

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::Extensions::extension_set(), Botan_FFI::ffi_new_object(), Botan::OID::from_string(), Botan::X509_Certificate::subject_alt_name(), and Botan::X509_Certificate::v3_extensions().

◆ botan_x509_cert_subject_alternative_names_count()

int botan_x509_cert_subject_alternative_names_count ( botan_x509_cert_t cert,
size_t * count )

Definition at line 907 of file ffi_cert.cpp.

907 {
908#if defined(BOTAN_HAS_X509_CERTIFICATES)
909 if(Botan::any_null_pointers(count)) {
911 }
912
913 return BOTAN_FFI_VISIT(
914 cert, [=](const Botan::X509_Certificate& c) { *count = count_general_names_in(c.subject_alt_name()); });
915#else
916 BOTAN_UNUSED(cert, count);
918#endif
919}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::X509_Certificate::subject_alt_name().

◆ botan_x509_cert_to_string()

int botan_x509_cert_to_string ( botan_x509_cert_t cert,
char out[],
size_t * out_len )

Definition at line 555 of file ffi_cert.cpp.

555 {
556 return copy_view_str(reinterpret_cast<uint8_t*>(out), out_len, botan_x509_cert_view_as_string, cert);
557}
int botan_x509_cert_view_as_string(botan_x509_cert_t cert, botan_view_ctx ctx, botan_view_str_fn view)
Definition ffi_cert.cpp:559

References botan_x509_cert_view_as_string(), and Botan_FFI::copy_view_str().

◆ botan_x509_cert_validation_status()

const char * botan_x509_cert_validation_status ( int code)

Returns a pointer to a static character string explaining the status code, or else NULL if unknown.

Definition at line 1040 of file ffi_cert.cpp.

1040 {
1041 if(code < 0) {
1042 return nullptr;
1043 }
1044
1045#if defined(BOTAN_HAS_X509_CERTIFICATES)
1047 return Botan::to_string(sc);
1048#else
1049 return nullptr;
1050#endif
1051}
Certificate_Status_Code
Definition pkix_enums.h:20
std::string to_string(ErrorType type)
Convert an ErrorType to string.
Definition exceptn.cpp:13

References Botan::to_string().

◆ botan_x509_cert_verify()

int botan_x509_cert_verify ( int * validation_result,
botan_x509_cert_t cert,
const botan_x509_cert_t * intermediates,
size_t intermediates_len,
const botan_x509_cert_t * trusted,
size_t trusted_len,
const char * trusted_path,
size_t required_strength,
const char * hostname,
uint64_t reference_time )

Returns 0 if the validation was successful, 1 if validation failed, and negative on error. A status code with details is written to *validation_result

Intermediates or trusted lists can be null Trusted path can be null

Definition at line 973 of file ffi_cert.cpp.

982 {
983 if(required_strength == 0) {
984 required_strength = 110;
985 }
986
987#if defined(BOTAN_HAS_X509_CERTIFICATES)
988 return ffi_guard_thunk(__func__, [=]() -> int {
989 const std::string hostname((hostname_cstr == nullptr) ? "" : hostname_cstr);
991 const auto validation_time = reference_time == 0
992 ? std::chrono::system_clock::now()
993 : std::chrono::system_clock::from_time_t(static_cast<time_t>(reference_time));
994
995 std::vector<Botan::X509_Certificate> end_certs;
996 end_certs.push_back(safe_get(cert));
997 for(size_t i = 0; i != intermediates_len; ++i) {
998 end_certs.push_back(safe_get(intermediates[i]));
999 }
1000
1001 std::unique_ptr<Botan::Certificate_Store> trusted_from_path;
1002 std::unique_ptr<Botan::Certificate_Store_In_Memory> trusted_extra;
1003 std::vector<Botan::Certificate_Store*> trusted_roots;
1004
1005 if(trusted_path != nullptr && *trusted_path != 0) {
1006 trusted_from_path = std::make_unique<Botan::Certificate_Store_In_Memory>(trusted_path);
1007 trusted_roots.push_back(trusted_from_path.get());
1008 }
1009
1010 if(trusted_len > 0) {
1011 trusted_extra = std::make_unique<Botan::Certificate_Store_In_Memory>();
1012 for(size_t i = 0; i != trusted_len; ++i) {
1013 trusted_extra->add_certificate(safe_get(trusted[i]));
1014 }
1015 trusted_roots.push_back(trusted_extra.get());
1016 }
1017
1018 const Botan::Path_Validation_Restrictions restrictions(false, required_strength);
1019
1020 auto validation_result =
1021 Botan::x509_path_validate(end_certs, restrictions, trusted_roots, hostname, usage, validation_time);
1022
1023 if(result_code != nullptr) {
1024 *result_code = static_cast<int>(validation_result.result());
1025 }
1026
1027 if(validation_result.successful_validation()) {
1028 return 0;
1029 } else {
1030 return 1;
1031 }
1032 });
1033#else
1034 BOTAN_UNUSED(result_code, cert, intermediates, intermediates_len, trusted);
1035 BOTAN_UNUSED(trusted_len, trusted_path, hostname_cstr, reference_time);
1037#endif
1038}
Path_Validation_Result x509_path_validate(const std::vector< X509_Certificate > &end_certs, const Path_Validation_Restrictions &restrictions, const std::vector< Certificate_Store * > &trusted_roots, std::string_view hostname, Usage_Type usage, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds ocsp_timeout, const std::vector< std::optional< OCSP::Response > > &ocsp_resp)
Definition x509path.cpp:933

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), Botan::UNSPECIFIED, and Botan::x509_path_validate().

◆ botan_x509_cert_verify_with_crl()

int botan_x509_cert_verify_with_crl ( int * validation_result,
botan_x509_cert_t cert,
const botan_x509_cert_t * intermediates,
size_t intermediates_len,
const botan_x509_cert_t * trusted,
size_t trusted_len,
const botan_x509_crl_t * crls,
size_t crls_len,
const char * trusted_path,
size_t required_strength,
const char * hostname,
uint64_t reference_time )

Different flavor of botan_x509_cert_verify, supports revocation lists. CRLs are passed as an array, same as intermediates and trusted CAs

Definition at line 1443 of file ffi_cert.cpp.

1454 {
1455 if(required_strength == 0) {
1456 required_strength = 110;
1457 }
1458
1459#if defined(BOTAN_HAS_X509_CERTIFICATES)
1460 return ffi_guard_thunk(__func__, [=]() -> int {
1461 const std::string hostname((hostname_cstr == nullptr) ? "" : hostname_cstr);
1463 const auto validation_time = reference_time == 0
1464 ? std::chrono::system_clock::now()
1465 : std::chrono::system_clock::from_time_t(static_cast<time_t>(reference_time));
1466
1467 std::vector<Botan::X509_Certificate> end_certs;
1468 end_certs.push_back(safe_get(cert));
1469 for(size_t i = 0; i != intermediates_len; ++i) {
1470 end_certs.push_back(safe_get(intermediates[i]));
1471 }
1472
1473 std::unique_ptr<Botan::Certificate_Store> trusted_from_path;
1474 std::unique_ptr<Botan::Certificate_Store_In_Memory> trusted_extra;
1475 std::unique_ptr<Botan::Certificate_Store_In_Memory> trusted_crls;
1476 std::vector<Botan::Certificate_Store*> trusted_roots;
1477
1478 if(trusted_path != nullptr && *trusted_path != 0) {
1479 trusted_from_path = std::make_unique<Botan::Certificate_Store_In_Memory>(trusted_path);
1480 trusted_roots.push_back(trusted_from_path.get());
1481 }
1482
1483 if(trusted_len > 0) {
1484 trusted_extra = std::make_unique<Botan::Certificate_Store_In_Memory>();
1485 for(size_t i = 0; i != trusted_len; ++i) {
1486 trusted_extra->add_certificate(safe_get(trusted[i]));
1487 }
1488 trusted_roots.push_back(trusted_extra.get());
1489 }
1490
1491 if(crls_len > 0) {
1492 trusted_crls = std::make_unique<Botan::Certificate_Store_In_Memory>();
1493 for(size_t i = 0; i != crls_len; ++i) {
1494 trusted_crls->add_crl(safe_get(crls[i]));
1495 }
1496 trusted_roots.push_back(trusted_crls.get());
1497 }
1498
1499 const Botan::Path_Validation_Restrictions restrictions(false, required_strength);
1500
1501 auto validation_result =
1502 Botan::x509_path_validate(end_certs, restrictions, trusted_roots, hostname, usage, validation_time);
1503
1504 if(result_code != nullptr) {
1505 *result_code = static_cast<int>(validation_result.result());
1506 }
1507
1508 if(validation_result.successful_validation()) {
1509 return 0;
1510 } else {
1511 return 1;
1512 }
1513 });
1514#else
1515 BOTAN_UNUSED(result_code, cert, intermediates, intermediates_len, trusted);
1516 BOTAN_UNUSED(trusted_len, trusted_path, hostname_cstr, reference_time, crls, crls_len);
1518#endif
1519}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), Botan::UNSPECIFIED, and Botan::x509_path_validate().

◆ botan_x509_cert_view_as_string()

int botan_x509_cert_view_as_string ( botan_x509_cert_t cert,
botan_view_ctx ctx,
botan_view_str_fn view )

Definition at line 559 of file ffi_cert.cpp.

559 {
560#if defined(BOTAN_HAS_X509_CERTIFICATES)
561 return BOTAN_FFI_VISIT(cert, [=](const auto& c) { return invoke_view_callback(view, ctx, c.to_string()); });
562#else
563 BOTAN_UNUSED(cert, ctx, view);
565#endif
566}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::invoke_view_callback().

Referenced by botan_x509_cert_to_string().

◆ botan_x509_cert_view_binary_values()

int botan_x509_cert_view_binary_values ( botan_x509_cert_t cert,
botan_x509_value_type value_type,
size_t index,
botan_view_ctx ctx,
botan_view_bin_fn view )

Retrieve a specific binary value from an X.509 certificate.

For multi-values index allows enumerating the available entries, until BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. For singleton values, an index of value "0" is expected.

Returns
BOTAN_FFI_ERROR_NO_VALUE if the provided cert does not provide the requested value_type at all or not in binary format.

Definition at line 286 of file ffi_cert.cpp.

290 {
291#if defined(BOTAN_HAS_X509_CERTIFICATES)
292 if(index != 0) {
293 // As of now there are no multi-value binary entries.
295 }
296
297 auto view = [=](std::span<const uint8_t> value) -> int {
298 if(value.empty()) {
300 } else {
301 return invoke_view_callback(view_fn, ctx, value);
302 }
303 };
304
305 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) -> int {
306 switch(value_type) {
308 return view(c.serial_number());
310 return view(c.raw_subject_dn());
312 return view(c.raw_issuer_dn());
314 return view(c.subject_key_id());
316 return view(c.authority_key_id());
318 return view(c.subject_public_key_info());
319
324 return botan_x509_object_view_value(c, value_type, index, ctx, view_fn);
325
331 }
332
334 });
335#else
336 BOTAN_UNUSED(cert, value_type, index, ctx, view_fn);
338#endif
339}
const std::vector< uint8_t > & authority_key_id() const
Definition x509cert.cpp:398
const std::vector< uint8_t > & raw_subject_dn() const
Definition x509cert.cpp:426
const std::vector< uint8_t > & subject_key_id() const
Definition x509cert.cpp:402
const std::vector< uint8_t > & raw_issuer_dn() const
Definition x509cert.cpp:422
const std::vector< uint8_t > & subject_public_key_info() const
Definition x509cert.cpp:382

References Botan::X509_Certificate::authority_key_id(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_AUTHORITY_KEY_IDENTIFIER, BOTAN_X509_CA_ISSUERS_URLS, BOTAN_X509_CRL_DISTRIBUTION_URLS, BOTAN_X509_DER_ENCODING, BOTAN_X509_ISSUER_DN_BITS, BOTAN_X509_OCSP_RESPONDER_URLS, BOTAN_X509_PEM_ENCODING, BOTAN_X509_PUBLIC_KEY_PKCS8_BITS, BOTAN_X509_SERIAL_NUMBER, BOTAN_X509_SIGNATURE_BITS, BOTAN_X509_SIGNATURE_SCHEME_BITS, BOTAN_X509_SUBJECT_DN_BITS, BOTAN_X509_SUBJECT_KEY_IDENTIFIER, BOTAN_X509_TBS_DATA_BITS, Botan_FFI::invoke_view_callback(), Botan::X509_Certificate::raw_issuer_dn(), Botan::X509_Certificate::raw_subject_dn(), Botan::X509_Certificate::serial_number(), Botan::X509_Certificate::subject_key_id(), and Botan::X509_Certificate::subject_public_key_info().

Referenced by botan_x509_cert_view_binary_values_count().

◆ botan_x509_cert_view_binary_values_count()

int botan_x509_cert_view_binary_values_count ( botan_x509_cert_t cert,
botan_x509_value_type value_type,
size_t * count )

Definition at line 341 of file ffi_cert.cpp.

341 {
342#if defined(BOTAN_HAS_X509_CERTIFICATES)
343 return enumerator_count_values(count, [=](size_t index) {
345 cert, value_type, index, nullptr, [](auto, auto, auto) -> int { return BOTAN_FFI_SUCCESS; });
346 });
347#else
348 BOTAN_UNUSED(cert, value_type, count);
350#endif
351}
int botan_x509_cert_view_binary_values(botan_x509_cert_t cert, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_bin_fn view_fn)
Definition ffi_cert.cpp:286

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, and botan_x509_cert_view_binary_values().

◆ botan_x509_cert_view_public_key_bits()

int botan_x509_cert_view_public_key_bits ( botan_x509_cert_t cert,
botan_view_ctx ctx,
botan_view_bin_fn view )

Definition at line 723 of file ffi_cert.cpp.

723 {
724#if defined(BOTAN_HAS_X509_CERTIFICATES)
725 return BOTAN_FFI_VISIT(cert,
726 [=](const auto& c) { return invoke_view_callback(view, ctx, c.subject_public_key_bits()); });
727#else
728 BOTAN_UNUSED(cert, ctx, view);
730#endif
731}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::invoke_view_callback().

Referenced by botan_x509_cert_get_public_key_bits().

◆ botan_x509_cert_view_string_values()

int botan_x509_cert_view_string_values ( botan_x509_cert_t cert,
botan_x509_value_type value_type,
size_t index,
botan_view_ctx ctx,
botan_view_str_fn view )

Retrieve a specific string value from an X.509 certificate.

For multi-values index allows enumerating the available entries, until BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. For singleton values, an index of value "0" is expected.

Returns
BOTAN_FFI_ERROR_NO_VALUE if the provided cert does not provide the requested value_type at all or not in string format.

Definition at line 353 of file ffi_cert.cpp.

357 {
358#if defined(BOTAN_HAS_X509_CERTIFICATES)
359 auto enumerate = [view_fn, ctx](auto values, size_t idx) -> int {
360 if(idx >= values.size()) {
362 } else {
363 return invoke_view_callback(view_fn, ctx, values[idx]);
364 }
365 };
366
367 auto enumerate_crl_distribution_points = [view_fn, ctx](const Botan::X509_Certificate& c, size_t idx) -> int {
368 const auto* crl_dp_ext =
369 c.v3_extensions().get_extension_object_as<Botan::Cert_Extension::CRL_Distribution_Points>();
370 if(crl_dp_ext == nullptr) {
371 return BOTAN_FFI_ERROR_OUT_OF_RANGE; // essentially an empty list
372 }
373
374 const auto& dps = crl_dp_ext->distribution_points();
375 for(size_t i = idx; const auto& dp : dps) {
376 const auto& uris = dp.point().uris();
377 if(i >= uris.size()) {
378 i -= uris.size();
379 continue;
380 }
381
382 auto itr = uris.begin();
383 std::advance(itr, i);
384 return invoke_view_callback(view_fn, ctx, *itr);
385 }
386
388 };
389
390 return BOTAN_FFI_VISIT(cert, [=](const Botan::X509_Certificate& c) -> int {
391 switch(value_type) {
393 return enumerate_crl_distribution_points(c, index);
395 return enumerate(c.ocsp_responders(), index);
397 return enumerate(c.ca_issuers(), index);
399 return botan_x509_object_view_value(c, value_type, index, ctx, view_fn);
400
412 }
413
415 });
416#else
417 BOTAN_UNUSED(cert, value_type, index, ctx, view_fn);
419#endif
420}
const std::vector< Distribution_Point > & distribution_points() const
Definition x509_ext.h:450
const std::vector< std::string > & ocsp_responders() const
Definition x509cert.cpp:582
std::vector< std::string > ca_issuers() const
Definition x509cert.cpp:586

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_AUTHORITY_KEY_IDENTIFIER, BOTAN_X509_CA_ISSUERS_URLS, BOTAN_X509_CRL_DISTRIBUTION_URLS, BOTAN_X509_DER_ENCODING, BOTAN_X509_ISSUER_DN_BITS, BOTAN_X509_OCSP_RESPONDER_URLS, BOTAN_X509_PEM_ENCODING, BOTAN_X509_PUBLIC_KEY_PKCS8_BITS, BOTAN_X509_SERIAL_NUMBER, BOTAN_X509_SIGNATURE_BITS, BOTAN_X509_SIGNATURE_SCHEME_BITS, BOTAN_X509_SUBJECT_DN_BITS, BOTAN_X509_SUBJECT_KEY_IDENTIFIER, BOTAN_X509_TBS_DATA_BITS, Botan::Cert_Extension::CRL_Distribution_Points::distribution_points(), and Botan_FFI::invoke_view_callback().

Referenced by botan_x509_cert_view_string_values_count().

◆ botan_x509_cert_view_string_values_count()

int botan_x509_cert_view_string_values_count ( botan_x509_cert_t cert,
botan_x509_value_type value_type,
size_t * count )

Definition at line 422 of file ffi_cert.cpp.

422 {
423#if defined(BOTAN_HAS_X509_CERTIFICATES)
424 return enumerator_count_values(count, [=](size_t index) {
426 cert, value_type, index, nullptr, [](auto, auto, auto) -> int { return BOTAN_FFI_SUCCESS; });
427 });
428#else
429 BOTAN_UNUSED(cert, value_type, count);
431#endif
432}
int botan_x509_cert_view_string_values(botan_x509_cert_t cert, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_str_fn view_fn)
Definition ffi_cert.cpp:353

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, and botan_x509_cert_view_string_values().

◆ botan_x509_crl_create()

int botan_x509_crl_create ( botan_x509_crl_t * crl_obj,
botan_rng_t rng,
botan_x509_cert_t ca_cert,
botan_privkey_t ca_key,
uint64_t issue_time,
uint32_t next_update,
const char * hash_fn,
const char * padding )

Create a new CRL

Parameters
crl_objThe newly created CRL
Random Number Generatorsa random number generator object
ca_certThe CA Certificate the CRL belongs to
ca_keyThe private key of that CA
issue_timeThe time when the CRL becomes valid
next_updateThe number of seconds after issue_time until the CRL expires
hash_fnThe hash function to use, may be null
paddingThe padding to use, may be null

Definition at line 1123 of file ffi_cert.cpp.

1130 {
1131 if(Botan::any_null_pointers(crl_obj)) {
1133 }
1134#if defined(BOTAN_HAS_X509_CERTIFICATES)
1135 return ffi_guard_thunk(__func__, [=]() -> int {
1136 auto& rng_ = safe_get(rng);
1137 auto ca = Botan::X509_CA(
1138 safe_get(ca_cert), safe_get(ca_key), default_from_ptr(hash_fn), default_from_ptr(padding), rng_);
1139 auto crl = std::make_unique<Botan::X509_CRL>(
1140 ca.new_crl(rng_, timepoint_from_timestamp(issue_time), std::chrono::seconds(next_update)));
1141 return ffi_new_object(crl_obj, std::move(crl));
1142 });
1143#else
1144 BOTAN_UNUSED(rng, ca_cert, ca_key, hash_fn, padding, issue_time, next_update);
1146#endif
1147}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_x509_crl_destroy()

int botan_x509_crl_destroy ( botan_x509_crl_t crl)

Definition at line 1213 of file ffi_cert.cpp.

1213 {
1214#if defined(BOTAN_HAS_X509_CERTIFICATES)
1215 return BOTAN_FFI_CHECKED_DELETE(crl);
1216#else
1217 BOTAN_UNUSED(crl);
1219#endif
1220}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_x509_crl_entries()

int botan_x509_crl_entries ( botan_x509_crl_t crl,
size_t index,
botan_x509_crl_entry_t * entry )

Allows iterating all entries of the CRL.

Parameters
crlthe CRL whose entries should be listed
indexthe index of the CRL entry to return
entryan object handle containing the CRL entry data
Returns
BOTAN_FFI_ERROR_OUT_OF_RANGE if the given index is out of range of the CRL entry list.

Definition at line 1343 of file ffi_cert.cpp.

1343 {
1344#if defined(BOTAN_HAS_X509_CERTIFICATES)
1345 return BOTAN_FFI_VISIT(crl, [=](const Botan::X509_CRL& c) -> int {
1346 const auto& entries = c.get_revoked();
1347 if(index >= entries.size()) {
1349 }
1350
1351 if(Botan::any_null_pointers(entry)) {
1353 }
1354
1355 return ffi_new_object(entry, std::make_unique<Botan::CRL_Entry>(entries[index]));
1356 });
1357#else
1358 BOTAN_UNUSED(crl, index, entry);
1360#endif
1361}
const std::vector< CRL_Entry > & get_revoked() const
Definition x509_crl.cpp:220

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::ffi_new_object(), and Botan::X509_CRL::get_revoked().

◆ botan_x509_crl_entries_count()

int botan_x509_crl_entries_count ( botan_x509_crl_t crl,
size_t * count )

Definition at line 1363 of file ffi_cert.cpp.

1363 {
1364#if defined(BOTAN_HAS_X509_CERTIFICATES)
1365 if(Botan::any_null_pointers(count)) {
1367 }
1368
1369 return BOTAN_FFI_VISIT(crl, [=](const Botan::X509_CRL& c) { *count = c.get_revoked().size(); });
1370#else
1371 BOTAN_UNUSED(crl, count);
1373#endif
1374}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::X509_CRL::get_revoked().

◆ botan_x509_crl_entry_create()

int botan_x509_crl_entry_create ( botan_x509_crl_entry_t * entry,
botan_x509_cert_t cert,
int reason_code )

Create a new CRL entry that marks cert as revoked

Parameters
entryThe newly created CRL entry
certThe certificate to mark as revoked
reason_codeThe reason code for revocation

Definition at line 1149 of file ffi_cert.cpp.

1149 {
1150 if(Botan::any_null_pointers(entry)) {
1152 }
1153#if defined(BOTAN_HAS_X509_CERTIFICATES)
1154 return ffi_guard_thunk(__func__, [=]() -> int {
1155 return ffi_new_object(
1156 entry, std::make_unique<Botan::CRL_Entry>(safe_get(cert), static_cast<Botan::CRL_Code>(reason_code)));
1157 });
1158#else
1159 BOTAN_UNUSED(cert, reason_code);
1161#endif
1162}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_x509_crl_entry_destroy()

int botan_x509_crl_entry_destroy ( botan_x509_crl_entry_t entry)

Definition at line 1376 of file ffi_cert.cpp.

1376 {
1377#if defined(BOTAN_HAS_X509_CERTIFICATES)
1378 return BOTAN_FFI_CHECKED_DELETE(entry);
1379#else
1380 BOTAN_UNUSED(entry);
1382#endif
1383}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_x509_crl_entry_reason()

int botan_x509_crl_entry_reason ( botan_x509_crl_entry_t entry,
int * reason_code )

Return the revocation reason code for the given CRL entry. See botan_x509_crl_reason_code and RFC 5280 - 5.3.1 for possible reason codes.

Definition at line 1385 of file ffi_cert.cpp.

1385 {
1386#if defined(BOTAN_HAS_X509_CERTIFICATES)
1387 return BOTAN_FFI_VISIT(entry, [=](const Botan::CRL_Entry& e) {
1388 if(Botan::any_null_pointers(reason_code)) {
1390 }
1391
1392 *reason_code = static_cast<int>(e.reason_code());
1393 return BOTAN_FFI_SUCCESS;
1394 });
1395#else
1396 BOTAN_UNUSED(entry, reason_code);
1398#endif
1399}
Definition x509_crl.h:29
CRL_Code reason_code() const
Definition crl_ent.cpp:126

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan::CRL_Entry::reason_code().

◆ botan_x509_crl_entry_revocation_date()

int botan_x509_crl_entry_revocation_date ( botan_x509_crl_entry_t entry,
uint64_t * time_since_epoch )

Return the revocation date for the given CRL entry as time since epoch in seconds.

Definition at line 1427 of file ffi_cert.cpp.

1427 {
1428#if defined(BOTAN_HAS_X509_CERTIFICATES)
1429 return BOTAN_FFI_VISIT(entry, [=](const Botan::CRL_Entry& e) {
1430 if(Botan::any_null_pointers(time_since_epoch)) {
1432 }
1433
1434 *time_since_epoch = e.expire_time().time_since_epoch();
1435 return BOTAN_FFI_SUCCESS;
1436 });
1437#else
1438 BOTAN_UNUSED(entry, time_since_epoch);
1440#endif
1441}
uint64_t time_since_epoch() const
Return time since epoch.
const X509_Time & expire_time() const
Definition crl_ent.cpp:122

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan::CRL_Entry::expire_time(), and Botan::ASN1_Time::time_since_epoch().

◆ botan_x509_crl_entry_serial_number()

int botan_x509_crl_entry_serial_number ( botan_x509_crl_entry_t entry,
botan_mp_t * serial_number )

Return the serial number associated with the given CRL entry.

Definition at line 1401 of file ffi_cert.cpp.

1401 {
1402#if defined(BOTAN_HAS_X509_CERTIFICATES)
1403 return BOTAN_FFI_VISIT(entry, [=](const Botan::CRL_Entry& e) {
1404 if(Botan::any_null_pointers(serial_number)) {
1406 }
1407
1408 auto serial_bn = Botan::BigInt::from_bytes(e.serial_number());
1409 return ffi_new_object(serial_number, std::make_unique<Botan::BigInt>(std::move(serial_bn)));
1410 });
1411#else
1412 BOTAN_UNUSED(entry, serial_number);
1414#endif
1415}
const std::vector< uint8_t > & serial_number() const
Definition crl_ent.cpp:118

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::ffi_new_object(), Botan::BigInt::from_bytes(), and Botan::CRL_Entry::serial_number().

◆ botan_x509_crl_entry_view_serial_number()

int botan_x509_crl_entry_view_serial_number ( botan_x509_crl_entry_t entry,
botan_view_ctx ctx,
botan_view_bin_fn view )

View the serial number associated with the given CRL entry.

Definition at line 1417 of file ffi_cert.cpp.

1417 {
1418#if defined(BOTAN_HAS_X509_CERTIFICATES)
1419 return BOTAN_FFI_VISIT(
1420 entry, [=](const Botan::CRL_Entry& e) { return invoke_view_callback(view, ctx, e.serial_number()); });
1421#else
1422 BOTAN_UNUSED(entry, ctx, view);
1424#endif
1425}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, Botan_FFI::invoke_view_callback(), and Botan::CRL_Entry::serial_number().

◆ botan_x509_crl_load()

int botan_x509_crl_load ( botan_x509_crl_t * crl_obj,
const uint8_t crl_bits[],
size_t crl_bits_len )

Definition at line 1070 of file ffi_cert.cpp.

1070 {
1071 if(crl_obj == nullptr || crl_bits == nullptr) {
1073 }
1074
1075#if defined(BOTAN_HAS_X509_CERTIFICATES)
1076 return ffi_guard_thunk(__func__, [=]() -> int {
1077 Botan::DataSource_Memory bits(crl_bits, crl_bits_len);
1078 auto c = std::make_unique<Botan::X509_CRL>(bits);
1079 return ffi_new_object(crl_obj, std::move(c));
1080 });
1081#else
1082 BOTAN_UNUSED(crl_bits_len);
1084#endif
1085}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_x509_crl_load_file()

int botan_x509_crl_load_file ( botan_x509_crl_t * crl_obj,
const char * crl_path )

Definition at line 1053 of file ffi_cert.cpp.

1053 {
1054 if(crl_obj == nullptr || crl_path == nullptr) {
1056 }
1057
1058#if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
1059
1060 return ffi_guard_thunk(__func__, [=]() -> int {
1061 auto c = std::make_unique<Botan::X509_CRL>(crl_path);
1062 return ffi_new_object(crl_obj, std::move(c));
1063 });
1064
1065#else
1067#endif
1068}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_x509_crl_next_update()

int botan_x509_crl_next_update ( botan_x509_crl_t crl,
uint64_t * time_since_epoch )

Definition at line 1102 of file ffi_cert.cpp.

1102 {
1103#if defined(BOTAN_HAS_X509_CERTIFICATES)
1104 return BOTAN_FFI_VISIT(crl, [=](const auto& c) {
1105 const auto& time = c.next_update();
1106 if(!time.time_is_set()) {
1108 }
1109
1110 if(Botan::any_null_pointers(time_since_epoch)) {
1112 }
1113
1114 *time_since_epoch = c.next_update().time_since_epoch();
1115 return BOTAN_FFI_SUCCESS;
1116 });
1117#else
1118 BOTAN_UNUSED(crl, time_since_epoch);
1120#endif
1121}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_crl_this_update()

int botan_x509_crl_this_update ( botan_x509_crl_t crl,
uint64_t * time_since_epoch )

Definition at line 1087 of file ffi_cert.cpp.

1087 {
1088#if defined(BOTAN_HAS_X509_CERTIFICATES)
1089 return BOTAN_FFI_VISIT(crl, [=](const auto& c) {
1090 if(Botan::any_null_pointers(time_since_epoch)) {
1092 }
1093 *time_since_epoch = c.this_update().time_since_epoch();
1094 return BOTAN_FFI_SUCCESS;
1095 });
1096#else
1097 BOTAN_UNUSED(crl, time_since_epoch);
1099#endif
1100}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, and BOTAN_UNUSED.

◆ botan_x509_crl_update()

int botan_x509_crl_update ( botan_x509_crl_t * crl_obj,
botan_x509_crl_t last_crl,
botan_rng_t rng,
botan_x509_cert_t ca_cert,
botan_privkey_t ca_key,
uint64_t issue_time,
uint32_t next_update,
const botan_x509_crl_entry_t * new_entries,
size_t new_entries_len,
const char * hash_fn,
const char * padding )

Update a CRL with new revoked entries. This does not modify the old crl, and instead creates a new one.

Parameters
crl_objThe newly created CRL
last_crlThe CRL to update
Random Number Generatorsa random number generator object
ca_certThe CA Certificate the CRL belongs to
ca_keyThe private key of that CA
issue_timeThe time when the CRL becomes valid
next_updateThe number of seconds after issue_time until the CRL expires
new_entriesThe entries to add to the CRL
new_entries_lenThe number of entries
hash_fnThe hash function to use, may be null
paddingThe padding to use, may be null

Definition at line 1164 of file ffi_cert.cpp.

1174 {
1175 if(Botan::any_null_pointers(crl_obj)) {
1177 }
1178 if(new_entries_len > 0 && Botan::any_null_pointers(new_entries)) {
1180 }
1181#if defined(BOTAN_HAS_X509_CERTIFICATES)
1182 return ffi_guard_thunk(__func__, [=]() -> int {
1183 auto& rng_ = safe_get(rng);
1184 auto ca = Botan::X509_CA(
1185 safe_get(ca_cert), safe_get(ca_key), default_from_ptr(hash_fn), default_from_ptr(padding), rng_);
1186
1187 std::vector<Botan::CRL_Entry> entries;
1188 entries.reserve(new_entries_len);
1189 for(size_t i = 0; i < new_entries_len; i++) {
1190 entries.push_back(safe_get(new_entries[i]));
1191 }
1192
1193 auto crl = std::make_unique<Botan::X509_CRL>(ca.update_crl(
1194 safe_get(last_crl), entries, rng_, timepoint_from_timestamp(issue_time), std::chrono::seconds(next_update)));
1195 return ffi_new_object(crl_obj, std::move(crl));
1196 });
1197#else
1199 last_crl, rng, ca_cert, ca_key, hash_fn, padding, issue_time, next_update, new_entries, new_entries_len);
1201#endif
1202}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_UNUSED, Botan_FFI::ffi_guard_thunk(), Botan_FFI::ffi_new_object(), and Botan_FFI::safe_get().

◆ botan_x509_crl_verify_signature()

int botan_x509_crl_verify_signature ( botan_x509_crl_t crl,
botan_pubkey_t key )

Definition at line 1204 of file ffi_cert.cpp.

1204 {
1205#if defined(BOTAN_HAS_X509_CERTIFICATES)
1206 return BOTAN_FFI_VISIT(crl, [=](const auto& c) -> int { return c.check_signature(safe_get(key)) ? 1 : 0; });
1207#else
1208 BOTAN_UNUSED(crl, key);
1210#endif
1211}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::safe_get().

◆ botan_x509_crl_view_binary_values()

int botan_x509_crl_view_binary_values ( botan_x509_crl_t crl_obj,
botan_x509_value_type value_type,
size_t index,
botan_view_ctx ctx,
botan_view_bin_fn view )

Retrieve a specific binary value from an X.509 certificate revocation list.

For multi-values index allows enumerating the available entries, until BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. For singleton values, an index of value "0" is expected.

Returns
BOTAN_FFI_ERROR_NO_VALUE if the provided crl_obj does not provide the requested value_type at all or not in binary format.

Definition at line 1222 of file ffi_cert.cpp.

1226 {
1227#if defined(BOTAN_HAS_X509_CERTIFICATES)
1228 if(index != 0) {
1229 // As of now there are no multi-value binary entries.
1231 }
1232
1233 auto view = [=](std::span<const uint8_t> value) -> int {
1234 if(value.empty()) {
1236 } else {
1237 return invoke_view_callback(view_fn, ctx, value);
1238 }
1239 };
1240
1241 return BOTAN_FFI_VISIT(crl_obj, [=](const Botan::X509_CRL& crl) -> int {
1242 switch(value_type) {
1244 return view(Botan::store_be(crl.crl_number()));
1246 return view(Botan::ASN1::put_in_sequence(crl.issuer_dn().get_bits()));
1248 return view(crl.authority_key_id());
1249
1254 return botan_x509_object_view_value(crl, value_type, index, ctx, view_fn);
1255
1264 }
1265
1267 });
1268#else
1269 BOTAN_UNUSED(crl_obj, value_type, index, ctx, view_fn);
1271#endif
1272}
const std::vector< uint8_t > & authority_key_id() const
Definition x509_crl.cpp:238
uint32_t crl_number() const
Definition x509_crl.cpp:245
const X509_DN & issuer_dn() const
Definition x509_crl.cpp:231
const std::vector< uint8_t > & get_bits() const
Definition pkix_types.h:84
std::vector< uint8_t > put_in_sequence(const std::vector< uint8_t > &contents)
Definition asn1_obj.cpp:177
constexpr auto store_be(ParamTs &&... params)
Definition loadstor.h:745

References Botan::X509_CRL::authority_key_id(), BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_OUT_OF_RANGE, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_AUTHORITY_KEY_IDENTIFIER, BOTAN_X509_CA_ISSUERS_URLS, BOTAN_X509_CRL_DISTRIBUTION_URLS, BOTAN_X509_DER_ENCODING, BOTAN_X509_ISSUER_DN_BITS, BOTAN_X509_OCSP_RESPONDER_URLS, BOTAN_X509_PEM_ENCODING, BOTAN_X509_PUBLIC_KEY_PKCS8_BITS, BOTAN_X509_SERIAL_NUMBER, BOTAN_X509_SIGNATURE_BITS, BOTAN_X509_SIGNATURE_SCHEME_BITS, BOTAN_X509_SUBJECT_DN_BITS, BOTAN_X509_SUBJECT_KEY_IDENTIFIER, BOTAN_X509_TBS_DATA_BITS, Botan::X509_CRL::crl_number(), Botan::X509_DN::get_bits(), Botan_FFI::invoke_view_callback(), Botan::X509_CRL::issuer_dn(), Botan::ASN1::put_in_sequence(), and Botan::store_be().

Referenced by botan_x509_crl_view_binary_values_count().

◆ botan_x509_crl_view_binary_values_count()

int botan_x509_crl_view_binary_values_count ( botan_x509_crl_t crl_obj,
botan_x509_value_type value_type,
size_t * count )

Definition at line 1274 of file ffi_cert.cpp.

1274 {
1275#if defined(BOTAN_HAS_X509_CERTIFICATES)
1276 return enumerator_count_values(count, [=](size_t index) {
1278 crl_obj, value_type, index, nullptr, [](auto, auto, auto) -> int { return BOTAN_FFI_SUCCESS; });
1279 });
1280#else
1281 BOTAN_UNUSED(crl_obj, value_type, count);
1283#endif
1284}
int botan_x509_crl_view_binary_values(botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_bin_fn view_fn)

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, and botan_x509_crl_view_binary_values().

◆ botan_x509_crl_view_string_values()

int botan_x509_crl_view_string_values ( botan_x509_crl_t crl_obj,
botan_x509_value_type value_type,
size_t index,
botan_view_ctx ctx,
botan_view_str_fn view )

Retrieve a specific string value from an X.509 certificate revocation list.

For multi-values index allows enumerating the available entries, until BOTAN_FFI_ERROR_OUT_OF_RANGE is returned. For singleton values, an index of value "0" is expected.

Returns
BOTAN_FFI_ERROR_NO_VALUE if the provided crl_obj does not provide the requested value_type at all or not in string format.

Definition at line 1286 of file ffi_cert.cpp.

1290 {
1291#if defined(BOTAN_HAS_X509_CERTIFICATES)
1292 return BOTAN_FFI_VISIT(crl_obj, [=](const Botan::X509_CRL& crl) -> int {
1293 switch(value_type) {
1295 return botan_x509_object_view_value(crl, value_type, index, ctx, view);
1296
1311 }
1312
1314 });
1315#else
1316 BOTAN_UNUSED(crl_obj, value_type, index, ctx, view);
1318#endif
1319}

References BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_AUTHORITY_KEY_IDENTIFIER, BOTAN_X509_CA_ISSUERS_URLS, BOTAN_X509_CRL_DISTRIBUTION_URLS, BOTAN_X509_DER_ENCODING, BOTAN_X509_ISSUER_DN_BITS, BOTAN_X509_OCSP_RESPONDER_URLS, BOTAN_X509_PEM_ENCODING, BOTAN_X509_PUBLIC_KEY_PKCS8_BITS, BOTAN_X509_SERIAL_NUMBER, BOTAN_X509_SIGNATURE_BITS, BOTAN_X509_SIGNATURE_SCHEME_BITS, BOTAN_X509_SUBJECT_DN_BITS, BOTAN_X509_SUBJECT_KEY_IDENTIFIER, and BOTAN_X509_TBS_DATA_BITS.

Referenced by botan_x509_crl_view_string_values_count().

◆ botan_x509_crl_view_string_values_count()

int botan_x509_crl_view_string_values_count ( botan_x509_crl_t crl_obj,
botan_x509_value_type value_type,
size_t * count )

Definition at line 1321 of file ffi_cert.cpp.

1321 {
1322#if defined(BOTAN_HAS_X509_CERTIFICATES)
1323 return enumerator_count_values(count, [=](size_t index) {
1325 crl_obj, value_type, index, nullptr, [](auto, auto, auto) -> int { return BOTAN_FFI_SUCCESS; });
1326 });
1327#else
1328 BOTAN_UNUSED(crl_obj, value_type, count);
1330#endif
1331}
int botan_x509_crl_view_string_values(botan_x509_crl_t crl_obj, botan_x509_value_type value_type, size_t index, botan_view_ctx ctx, botan_view_str_fn view)

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, and botan_x509_crl_view_string_values().

◆ botan_x509_general_name_destroy()

int botan_x509_general_name_destroy ( botan_x509_general_name_t alt_names)

Definition at line 803 of file ffi_cert.cpp.

803 {
804#if defined(BOTAN_HAS_X509_CERTIFICATES)
805 return BOTAN_FFI_CHECKED_DELETE(name);
806#else
807 BOTAN_UNUSED(name);
809#endif
810}

References BOTAN_FFI_CHECKED_DELETE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, and BOTAN_UNUSED.

◆ botan_x509_general_name_get_type()

int botan_x509_general_name_get_type ( botan_x509_general_name_t name,
unsigned int * type )

Provides the contained type of the name and returns BOTAN_FFI_SUCCESS if that type is supported and may be retrieved via the view functions below. Otherwise BOTAN_FFI_ERROR_INVALID_OBJECT_STATE is returned.

Definition at line 733 of file ffi_cert.cpp.

733 {
734#if defined(BOTAN_HAS_X509_CERTIFICATES)
735 return BOTAN_FFI_VISIT(name, [=](const Botan::GeneralName& n) {
736 if(Botan::any_null_pointers(type)) {
738 }
739
740 const auto mapped_type = to_botan_x509_general_name_types(n.type_code());
741 if(!mapped_type.has_value()) {
743 }
744
745 *type = mapped_type.value();
746 if(*type == BOTAN_X509_OTHER_NAME /* ... viewing of other-names not supported */) {
748 }
749
750 return BOTAN_FFI_SUCCESS;
751 });
752#else
753 BOTAN_UNUSED(name, type);
755#endif
756}
X.509 GeneralName Type.
Definition pkix_types.h:286
NameType type_code() const
Definition pkix_types.h:328

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_OTHER_NAME, and Botan::GeneralName::type_code().

◆ botan_x509_general_name_view_binary_value()

int botan_x509_general_name_view_binary_value ( botan_x509_general_name_t name,
botan_view_ctx ctx,
botan_view_bin_fn view )

Views the name as a bit string or returns BOTAN_FFI_ERROR_INVALID_OBJECT_STATE if the contained GeneralName value cannot be represented as a binary string.

The types BOTAN_X509_DIRECTORY_NAME, BOTAN_X509_IP_ADDRESS may be viewed as "binary".

Definition at line 781 of file ffi_cert.cpp.

783 {
784#if defined(BOTAN_HAS_X509_CERTIFICATES)
785 return BOTAN_FFI_VISIT(name, [=](const Botan::GeneralName& n) -> int {
786 const auto type = to_botan_x509_general_name_types(n.type_code());
787 if(!type) {
789 }
790
791 if(type != BOTAN_X509_DIRECTORY_NAME && type != BOTAN_X509_IP_ADDRESS) {
793 }
794
795 return invoke_view_callback(view, ctx, n.binary_name());
796 });
797#else
798 BOTAN_UNUSED(name, ctx, view);
800#endif
801}
std::vector< uint8_t > binary_name() const

References Botan::GeneralName::binary_name(), BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_DIRECTORY_NAME, BOTAN_X509_IP_ADDRESS, Botan_FFI::invoke_view_callback(), and Botan::GeneralName::type_code().

◆ botan_x509_general_name_view_string_value()

int botan_x509_general_name_view_string_value ( botan_x509_general_name_t name,
botan_view_ctx ctx,
botan_view_str_fn view )

Views the name as a string or returns BOTAN_FFI_ERROR_INVALID_OBJECT_STATE if the contained GeneralName value cannot be represented as a string.

The types BOTAN_X509_EMAIL_ADDRESS, BOTAN_X509_DNS_NAME, BOTAN_X509_URI, BOTAN_X509_IP_ADDRESS may be viewed as "string".

Definition at line 758 of file ffi_cert.cpp.

760 {
761#if defined(BOTAN_HAS_X509_CERTIFICATES)
762 return BOTAN_FFI_VISIT(name, [=](const Botan::GeneralName& n) -> int {
763 const auto type = to_botan_x509_general_name_types(n.type_code());
764 if(!type) {
766 }
767
768 if(type != BOTAN_X509_EMAIL_ADDRESS && type != BOTAN_X509_DNS_NAME && type != BOTAN_X509_URI &&
769 type != BOTAN_X509_IP_ADDRESS) {
771 }
772
773 return invoke_view_callback(view, ctx, n.name());
774 });
775#else
776 BOTAN_UNUSED(name, ctx, view);
778#endif
779}
std::string name() const

References BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, BOTAN_X509_DNS_NAME, BOTAN_X509_EMAIL_ADDRESS, BOTAN_X509_IP_ADDRESS, BOTAN_X509_URI, Botan_FFI::invoke_view_callback(), Botan::GeneralName::name(), and Botan::GeneralName::type_code().

◆ botan_x509_is_revoked()

int botan_x509_is_revoked ( botan_x509_crl_t crl,
botan_x509_cert_t cert )

Given a CRL and a certificate, check if the certificate is revoked on that particular CRL

Definition at line 1333 of file ffi_cert.cpp.

1333 {
1334#if defined(BOTAN_HAS_X509_CERTIFICATES)
1335 return BOTAN_FFI_VISIT(crl, [=](const auto& c) { return c.is_revoked(safe_get(cert)) ? 0 : -1; });
1336#else
1337 BOTAN_UNUSED(cert);
1338 BOTAN_UNUSED(crl);
1340#endif
1341}

References BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_VISIT, BOTAN_UNUSED, and Botan_FFI::safe_get().

◆ botan_xof_accepts_input()

int botan_xof_accepts_input ( botan_xof_t xof)

Get the input/output state of this eXtendable Output Function Typically, XOFs don't accept input as soon as the first output bytes were requested.

Parameters
eXtendable Output Functionthe object to read
Returns
1 iff the XOF is still accepting input bytes

Definition at line 61 of file ffi_xof.cpp.

61 {
62 return BOTAN_FFI_VISIT(this_xof, [=](const auto& xof) { return xof.accepts_input() ? 1 : 0; });
63}

References BOTAN_FFI_VISIT.

◆ botan_xof_block_size()

int botan_xof_block_size ( botan_xof_t xof,
size_t * block_size )

Writes the block size of the eXtendable Output Function to *block_size

Parameters
eXtendable Output FunctionXOF object
block_sizevariable to hold the XOF's block size
Returns
0 on success, a negative value on failure

Definition at line 46 of file ffi_xof.cpp.

46 {
49 }
50 return BOTAN_FFI_VISIT(this_xof, [=](const auto& xof) { *out = xof.block_size(); });
51}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_xof_clear()

int botan_xof_clear ( botan_xof_t xof)

Reinitializes the state of the eXtendable Output Function.

Parameters
eXtendable Output FunctionXOF object
Returns
0 on success, a negative value on failure

Definition at line 65 of file ffi_xof.cpp.

65 {
66 return BOTAN_FFI_VISIT(this_xof, [](auto& xof) { xof.clear(); });
67}

References BOTAN_FFI_VISIT.

◆ botan_xof_copy_state()

int botan_xof_copy_state ( botan_xof_t * dest,
botan_xof_t source )

Copy the state of an eXtendable Output Function

Parameters
destdestination XOF object
sourcesource XOF object
Returns
0 on success, a negative value on failure

Definition at line 39 of file ffi_xof.cpp.

39 {
40 if(dest == nullptr) {
42 }
43 return BOTAN_FFI_VISIT(this_xof, [=](const auto& src) { return ffi_new_object(dest, src.copy_state()); });
44}

References BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::ffi_new_object().

◆ botan_xof_destroy()

int botan_xof_destroy ( botan_xof_t xof)

Frees all resources of the eXtendable Output Function object

Parameters
eXtendable Output Functionxof object
Returns
0 if success, error if invalid object handle

Definition at line 93 of file ffi_xof.cpp.

93 {
94 return BOTAN_FFI_CHECKED_DELETE(xof);
95}

References BOTAN_FFI_CHECKED_DELETE.

◆ botan_xof_init()

int botan_xof_init ( botan_xof_t * xof,
const char * xof_name,
uint32_t flags )

Initialize an eXtendable Output Function

Parameters
eXtendable Output FunctionXOF object
xof_namename of the XOF, e.g., "SHAKE-128"
flagsshould be 0 in current API revision, all other uses are reserved and return BOTAN_FFI_ERROR_BAD_FLAG

Definition at line 19 of file ffi_xof.cpp.

19 {
20 return ffi_guard_thunk(__func__, [=]() -> int {
21 if(Botan::any_null_pointers(this_xof, xof_name) || *xof_name == 0) {
23 }
24 if(flags != 0) {
26 }
27
28 auto xof = Botan::XOF::create(xof_name);
29 if(xof == nullptr) {
31 }
32
33 ffi_new_object(this_xof, std::move(xof));
34 return BOTAN_FFI_SUCCESS;
35 });
36}
static std::unique_ptr< XOF > create(std::string_view algo_spec, std::string_view provider="")
Definition xof.cpp:28

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, Botan::XOF::create(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::ffi_new_object().

◆ botan_xof_name()

int botan_xof_name ( botan_xof_t xof,
char * name,
size_t * name_len )

Get the name of this eXtendable Output Function

Parameters
eXtendable Output Functionthe object to read
nameoutput buffer
name_lenon input, the length of buffer, on success the number of bytes written

Definition at line 53 of file ffi_xof.cpp.

53 {
54 if(Botan::any_null_pointers(name_len)) {
56 }
57
58 return BOTAN_FFI_VISIT(this_xof, [=](const auto& xof) { return write_str_output(name, name_len, xof.name()); });
59}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_VISIT, and Botan_FFI::write_str_output().

◆ botan_xof_output()

int botan_xof_output ( botan_xof_t xof,
uint8_t * out,
size_t out_len )

Generate output bytes from the eXtendable Output Function

Parameters
eXtendable Output FunctionXOF object
outoutput buffer
out_lennumber of bytes to write into the output buffer
Returns
0 on success, a negative value on failure

Definition at line 81 of file ffi_xof.cpp.

81 {
82 if(out_len == 0) {
83 return 0;
84 }
85
88 }
89
90 return BOTAN_FFI_VISIT(this_xof, [=](auto& xof) { xof.output({out, out_len}); });
91}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_xof_update()

int botan_xof_update ( botan_xof_t xof,
const uint8_t * in,
size_t in_len )

Send more input to the eXtendable Output Function

Parameters
eXtendable Output FunctionXOF object
ininput buffer
in_lennumber of bytes to read from the input buffer
Returns
0 on success, a negative value on failure

Definition at line 69 of file ffi_xof.cpp.

69 {
70 if(in_len == 0) {
71 return 0;
72 }
73
76 }
77
78 return BOTAN_FFI_VISIT(this_xof, [=](auto& xof) { xof.update({in, in_len}); });
79}

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NULL_POINTER, and BOTAN_FFI_VISIT.

◆ botan_zfec_decode()

int botan_zfec_decode ( size_t K,
size_t N,
const size_t * indexes,
uint8_t *const * inputs,
size_t shareSize,
uint8_t ** outputs )

Decode some previously encoded shares using certain ZFEC parameters.

Parameters
Kthe number of shares needed for recovery
Nthe total number of shares
indexesThe index into the encoder's outputs for the corresponding element of the inputs array. Must be of length K.
inputsK previously encoded shares to decode
shareSizethe length in bytes of each input
outputsAn out parameter pointing to a fully allocated array of size [K][shareSize]. For all k in range, a decoded block will written to the memory starting at outputs[k][0].
Returns
0 on success, negative on failure

Definition at line 35 of file ffi_zfec.cpp.

36 {
37 if(Botan::any_null_pointers(indexes, inputs, outputs)) {
39 }
40#if defined(BOTAN_HAS_ZFEC)
41 return Botan_FFI::ffi_guard_thunk(__func__, [=]() -> int {
42 std::map<size_t, const uint8_t*> shares;
43 for(size_t k = 0; k < K; ++k) {
44 shares.insert(std::pair<size_t, const uint8_t*>(indexes[k], inputs[k]));
45 }
47 shares, shareSize, [=](size_t index, const uint8_t block[], size_t blockSize) -> void {
48 std::copy(block, block + blockSize, outputs[index]);
49 });
50 return BOTAN_FFI_SUCCESS;
51 });
52#else
53 BOTAN_UNUSED(K, N, indexes, inputs, shareSize, outputs);
55#endif
56}
void decode_shares(const std::map< size_t, const uint8_t * > &shares, size_t share_size, const output_cb_t &output_cb) const
Definition zfec.cpp:436

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan::ZFEC::decode_shares(), and Botan_FFI::ffi_guard_thunk().

Referenced by botan_srp6_server_session_step1().

◆ botan_zfec_encode()

int botan_zfec_encode ( size_t K,
size_t N,
const uint8_t * input,
size_t size,
uint8_t ** outputs )

ZFEC Encode some bytes with certain ZFEC parameters.

Parameters
Kthe number of shares needed for recovery
Nthe number of shares generated
inputthe data to FEC
sizethe length in bytes of input, which must be a multiple of K
outputsAn out parameter pointing to a fully allocated array of size [N][size / K]. For all n in range, an encoded block will be written to the memory starting at outputs[n][0].
Returns
0 on success, negative on failure

Definition at line 18 of file ffi_zfec.cpp.

18 {
19 if(Botan::any_null_pointers(input, outputs)) {
21 }
22#if defined(BOTAN_HAS_ZFEC)
23 return Botan_FFI::ffi_guard_thunk(__func__, [=]() -> int {
24 Botan::ZFEC(K, N).encode(input, size, [=](size_t index, const uint8_t block[], size_t blockSize) -> void {
25 std::copy(block, block + blockSize, outputs[index]);
26 });
27 return BOTAN_FFI_SUCCESS;
28 });
29#else
30 BOTAN_UNUSED(K, N, input, size, outputs);
32#endif
33}
void encode(const uint8_t input[], size_t size, const output_cb_t &output_cb) const
Definition zfec.cpp:393

References Botan::any_null_pointers(), BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_SUCCESS, BOTAN_UNUSED, Botan::ZFEC::encode(), and Botan_FFI::ffi_guard_thunk().

Referenced by botan_srp6_server_session_step1().