19#ifndef COMMON_CONFIG_H_ 
   20#define COMMON_CONFIG_H_ 
   22#include <openssl/evp.h> 
   60#define generate_bool_string_prototypes(param_name) \ 
   61enum param_name ## _enum { \ 
   62    param_name ## _UNKNOWN = -1, \ 
   63    param_name ## _NO = 0, \ 
   65    param_name ## _NOT_SET, \ 
   67enum param_name ## _enum \ 
   68    param_name ## _from_str(const char *value); \ 
   69const char *param_name ## _to_str(enum param_name ## _enum value); 
 
   96#define generate_enum_string_prototypes(param_name, ...) \ 
   97enum param_name ## _enum { \ 
  100enum param_name ## _enum \ 
  101    param_name ## _from_str(const char *value); \ 
  102const char *param_name ## _to_str(enum param_name ## _enum value); 
 
  105    endpoint_behavior_UNKNOWN = -1,
 
  106    endpoint_behavior_OFF = 0,
 
  107    endpoint_behavior_ATTEST,
 
  108    endpoint_behavior_VERIFY,
 
  109    endpoint_behavior_ON,
 
  110    endpoint_behavior_NOT_SET
 
  114    attest_level_UNKNOWN = -1,
 
  115    attest_level_NOT_SET = 0,
 
  147#define generate_sorcery_enum_to_str_ex(__struct, __substruct, __lc_param, __base_enum) \ 
  148static int sorcery_ ## __lc_param ## _to_str(const void *obj, const intptr_t *args, char **buf) \ 
  150    const struct __struct *cfg = obj; \ 
  151    *buf = ast_strdup(__base_enum ## _to_str(cfg->__substruct __lc_param)); \ 
  152    return *buf ? 0 : -1; \ 
 
  155#define generate_sorcery_enum_to_str(__struct, __substruct, __lc_param) \ 
  156    generate_sorcery_enum_to_str_ex(__struct, __substruct, __lc_param, __lc_param) 
 
  158#define generate_sorcery_enum_from_str_ex(__struct, __substruct, __lc_param, __base_enum, __unknown) \ 
  159static int sorcery_ ## __lc_param ## _from_str(const struct aco_option *opt, struct ast_variable *var, void *obj) \ 
  161    struct __struct *cfg = obj; \ 
  162    cfg->__substruct __lc_param = __base_enum ## _from_str (var->value); \ 
  163    if (cfg->__substruct __lc_param == __base_enum ## _ ## __unknown) { \ 
  164        ast_log(LOG_WARNING, "Unknown value '%s' specified for %s\n", \ 
  165            var->value, var->name); \ 
 
  171#define generate_sorcery_enum_from_str(__struct, __substruct, __lc_param, __unknown) \ 
  172    generate_sorcery_enum_from_str_ex(__struct, __substruct, __lc_param, __lc_param, __unknown) \ 
 
  175#define generate_sorcery_acl_to_str(__struct, __lc_param) \ 
  176static int sorcery_acl_to_str(const void *obj, const intptr_t *args, char **buf) \ 
  178    const struct __struct *cfg = obj; \ 
  179    struct ast_acl *first_acl; \ 
  180    if (!ast_acl_list_is_empty(cfg->vcfg_common.acl)) { \ 
  181        AST_LIST_LOCK(cfg->vcfg_common.acl); \ 
  182        first_acl = AST_LIST_FIRST(cfg->vcfg_common.acl); \ 
  183        if (ast_strlen_zero(first_acl->name)) { \ 
  184            *buf = "deny/permit"; \ 
  186            *buf = first_acl->name; \ 
  188        AST_LIST_UNLOCK(cfg->vcfg_common.acl); \ 
  190    *buf = ast_strdup(*buf); \ 
 
  194#define generate_sorcery_acl_from_str(__struct, __lc_param, __unknown) \ 
  195static int sorcery_acl_from_str(const struct aco_option *opt, struct ast_variable *var, void *obj) \ 
  197    struct __struct *cfg = obj; \ 
  200    const char *name = var->name + strlen("x5u_"); \ 
  201    if (ast_strlen_zero(var->value)) { \ 
  204    ast_append_acl(name, var->value, &cfg->vcfg_common.acl, &error, &ignore); \ 
 
  210#define EFFECTIVE_ENUM(__enum1, __enum2,  __field, __default) \ 
  211    ( __enum1 != ( __field ## _ ## NOT_SET ) ? __enum1 : \ 
  212        (__enum2 != __field ## _ ## NOT_SET ? \ 
  213            __enum2 : __default )) 
 
  215#define EFFECTIVE_ENUM_BOOL(__enum1, __enum2, __field, __default) \ 
  216    (( __enum1 != ( __field ## _ ## NOT_SET ) ? __enum1 : \ 
  217        (__enum2 != __field ## _ ## NOT_SET ? \ 
  218            __enum2 : __field ## _ ## __default )) == __field ## _ ## YES) 
 
  220#define ENUM_BOOL(__enum1, __field) \ 
  221    (__enum1 == ( __field ## _ ## YES )) 
 
  233#define cfg_stringfield_copy(__cfg_dst, __cfg_src, __field) \ 
  236    if (!ast_strlen_zero(__cfg_src->__field)) { \ 
  237        __res = ast_string_field_set(__cfg_dst, __field, __cfg_src->__field); \ 
 
  248#define cfg_sf_copy_wrapper(id, __cfg_dst, __cfg_src, __field) \ 
  250    int rc = cfg_stringfield_copy(__cfg_dst, __cfg_src, __field); \ 
  252        ast_log(LOG_ERROR, "%s: Unable to copy field %s from %s to %s\n", \ 
  253            id, #__field, #__cfg_src, #__cfg_dst); \ 
 
  264#define cfg_uint_copy(__cfg_dst, __cfg_src, __field) \ 
  266    if (__cfg_src->__field > 0) { \ 
  267        __cfg_dst->__field = __cfg_src->__field; \ 
 
  277#define cfg_enum_copy_ex(__cfg_dst, __cfg_src, __field, __not_set, __unknown) \ 
  279    if (__cfg_src->__field != __not_set \ 
  280        && __cfg_src->__field != __unknown) { \ 
  281        __cfg_dst->__field = __cfg_src->__field; \ 
 
  285#define cfg_enum_copy(__cfg_dst, __cfg_src, __field) \ 
  286    cfg_enum_copy_ex(__cfg_dst, __cfg_src, __field, __field ## _NOT_SET, __field ## _UNKNOWN) 
 
  306#define generate_acfg_common_sorcery_handlers(object) \ 
  307    generate_sorcery_enum_from_str(object, acfg_common., check_tn_cert_public_url, UNKNOWN); \ 
  308    generate_sorcery_enum_to_str(object, acfg_common., check_tn_cert_public_url); \ 
  309    generate_sorcery_enum_from_str(object, acfg_common., send_mky, UNKNOWN); \ 
  310    generate_sorcery_enum_to_str(object, acfg_common., send_mky); \ 
  311    generate_sorcery_enum_from_str(object, acfg_common., attest_level, UNKNOWN); \ 
  312    generate_sorcery_enum_to_str(object, acfg_common., attest_level); 
 
  365    enum relax_x5u_port_scheme_restrictions_enum
 
  367    enum relax_x5u_path_restrictions_enum
 
 
  375#define generate_vcfg_common_sorcery_handlers(object) \ 
  376    generate_sorcery_enum_from_str(object, vcfg_common.,use_rfc9410_responses, UNKNOWN); \ 
  377    generate_sorcery_enum_to_str(object, vcfg_common.,use_rfc9410_responses); \ 
  378    generate_sorcery_enum_from_str(object, vcfg_common.,stir_shaken_failure_action, UNKNOWN); \ 
  379    generate_sorcery_enum_to_str(object, vcfg_common.,stir_shaken_failure_action); \ 
  380    generate_sorcery_enum_from_str(object, vcfg_common.,relax_x5u_port_scheme_restrictions, UNKNOWN); \ 
  381    generate_sorcery_enum_to_str(object, vcfg_common.,relax_x5u_port_scheme_restrictions); \ 
  382    generate_sorcery_enum_from_str(object, vcfg_common.,relax_x5u_path_restrictions, UNKNOWN); \ 
  383    generate_sorcery_enum_to_str(object, vcfg_common.,relax_x5u_path_restrictions); \ 
  384    generate_sorcery_enum_from_str(object, vcfg_common.,load_system_certs, UNKNOWN); \ 
  385    generate_sorcery_enum_to_str(object, vcfg_common.,load_system_certs); \ 
  386    generate_sorcery_enum_from_str(object, vcfg_common.,ignore_sip_date_header, UNKNOWN); \ 
  387    generate_sorcery_enum_to_str(object, vcfg_common.,ignore_sip_date_header); \ 
  388    generate_sorcery_acl_from_str(object, acl, NULL); \ 
  389    generate_sorcery_acl_to_str(object, acl); 
 
  445#define PROFILE_ALLOW_ATTEST(__profile) \ 
  446    (__profile->endpoint_behavior == endpoint_behavior_ON || \ 
  447        __profile->endpoint_behavior == endpoint_behavior_ATTEST) 
 
  449#define PROFILE_ALLOW_VERIFY(__profile) \ 
  450    (__profile->endpoint_behavior == endpoint_behavior_ON || \ 
  451        __profile->endpoint_behavior == endpoint_behavior_VERIFY) 
 
  498#define stringfield_option_register(sorcery, CONFIG_TYPE, object, name, field, nodoc) \ 
  499    ast_sorcery_object_field_register ## nodoc(sorcery, CONFIG_TYPE, #name, \ 
  500        DEFAULT_ ## name, OPT_STRINGFIELD_T, 0, \ 
  501        STRFLDSET(struct object, field)) 
 
  503#define uint_option_register(sorcery, CONFIG_TYPE, object, name, field, nodoc) \ 
  504    ast_sorcery_object_field_register ## nodoc(sorcery, CONFIG_TYPE, #name, \ 
  505        __stringify(DEFAULT_ ## name), OPT_UINT_T, 0, \ 
  506        FLDSET(struct object, field)) 
 
  508#define enum_option_register_ex(sorcery, CONFIG_TYPE, name, field, function_prefix, nodoc) \ 
  509    ast_sorcery_object_field_register_custom ## nodoc(sorcery, CONFIG_TYPE, \ 
  510        #name, function_prefix ## _to_str(DEFAULT_ ## field), \ 
  511        sorcery_ ## field ## _from_str, sorcery_ ## field ## _to_str, NULL, 0, 0) 
 
  513#define enum_option_register(sorcery, CONFIG_TYPE, name, nodoc) \ 
  514    enum_option_register_ex(sorcery, CONFIG_TYPE, name, name, name, nodoc) 
 
  516#define register_common_verification_fields(sorcery, object, CONFIG_TYPE, nodoc) \ 
  518    stringfield_option_register(sorcery, CONFIG_TYPE, object, ca_file, vcfg_common.ca_file, nodoc); \ 
  519    stringfield_option_register(sorcery, CONFIG_TYPE, object, ca_path, vcfg_common.ca_path, nodoc); \ 
  520    stringfield_option_register(sorcery, CONFIG_TYPE, object, crl_file, vcfg_common.crl_file, nodoc); \ 
  521    stringfield_option_register(sorcery, CONFIG_TYPE, object, crl_path, vcfg_common.crl_path, nodoc); \ 
  522    stringfield_option_register(sorcery, CONFIG_TYPE, object, untrusted_cert_file, vcfg_common.untrusted_cert_file, nodoc); \ 
  523    stringfield_option_register(sorcery, CONFIG_TYPE, object, untrusted_cert_path, vcfg_common.untrusted_cert_path, nodoc); \ 
  524    stringfield_option_register(sorcery, CONFIG_TYPE, object, cert_cache_dir, vcfg_common.cert_cache_dir, nodoc); \ 
  526    uint_option_register(sorcery, CONFIG_TYPE, object, curl_timeout, vcfg_common.curl_timeout, nodoc);\ 
  527    uint_option_register(sorcery, CONFIG_TYPE, object, max_iat_age, vcfg_common.max_iat_age, nodoc);\ 
  528    uint_option_register(sorcery, CONFIG_TYPE, object, max_date_header_age, vcfg_common.max_date_header_age, nodoc);\ 
  529    uint_option_register(sorcery, CONFIG_TYPE, object, max_cache_entry_age, vcfg_common.max_cache_entry_age, nodoc);\ 
  530    uint_option_register(sorcery, CONFIG_TYPE, object, max_cache_size, vcfg_common.max_cache_size, nodoc);\ 
  532    enum_option_register_ex(sorcery, CONFIG_TYPE, failure_action, stir_shaken_failure_action, stir_shaken_failure_action, nodoc); \ 
  533    enum_option_register(sorcery, CONFIG_TYPE, use_rfc9410_responses, nodoc); \ 
  534    enum_option_register(sorcery, CONFIG_TYPE, \ 
  535        relax_x5u_port_scheme_restrictions, nodoc); \ 
  536    enum_option_register(sorcery, CONFIG_TYPE, \ 
  537        relax_x5u_path_restrictions, nodoc); \ 
  538        enum_option_register(sorcery, CONFIG_TYPE, \ 
  539            load_system_certs, nodoc); \ 
  540    enum_option_register(sorcery, CONFIG_TYPE, ignore_sip_date_header, nodoc); \ 
  542    ast_sorcery_object_field_register_custom ## nodoc(sorcery, CONFIG_TYPE, "x5u_deny", "", sorcery_acl_from_str, NULL, NULL, 0, 0); \ 
  543    ast_sorcery_object_field_register_custom ## nodoc(sorcery, CONFIG_TYPE, "x5u_permit", "", sorcery_acl_from_str, NULL, NULL, 0, 0); \ 
  544    ast_sorcery_object_field_register_custom ## nodoc(sorcery, CONFIG_TYPE, "x5u_acl", "", sorcery_acl_from_str, sorcery_acl_to_str, NULL, 0, 0); \ 
 
  547#define register_common_attestation_fields(sorcery, object, CONFIG_TYPE, nodoc) \ 
  549    stringfield_option_register(sorcery, CONFIG_TYPE, object, private_key_file, acfg_common.private_key_file, nodoc); \ 
  550    stringfield_option_register(sorcery, CONFIG_TYPE, object, public_cert_url, acfg_common.public_cert_url, nodoc); \ 
  551    enum_option_register(sorcery, CONFIG_TYPE, attest_level, nodoc); \ 
  552    enum_option_register(sorcery, CONFIG_TYPE, check_tn_cert_public_url, nodoc); \ 
  553    enum_option_register(sorcery, CONFIG_TYPE, send_mky, nodoc); \ 
 
Asterisk main include file. File version handling, generic pbx functions.
int as_config_unload(void)
int as_config_reload(void)
@ config_object_type_attestation
@ config_object_type_profile
@ config_object_type_verification
int vs_config_reload(void)
int config_object_cli_show(void *obj, void *arg, void *data, int flags)
Output configuration settings to the Asterisk CLI.
char * config_object_tab_complete_name(const char *word, struct ao2_container *container)
Tab completion for name matching with STIR/SHAKEN CLI commands.
int common_config_unload(void)
struct ast_acl_list * get_default_acl_list(void)
#define generate_enum_string_prototypes(param_name,...)
Enum field to/from string prototype generator.
int common_config_reload(void)
struct attestation_cfg * as_get_cfg(void)
int vs_is_config_loaded(void)
char * canonicalize_tn_alloc(const char *tn)
Canonicalize a TN into nre buffer.
int common_config_load(void)
struct tn_cfg * tn_get_cfg(const char *tn)
const char * unknown_tn_attest_level_to_str(enum attest_level_enum value)
struct verification_cfg * vs_get_cfg(void)
struct profile_cfg * eprofile_get_cfg(const char *id)
int tn_config_unload(void)
int as_check_common_config(const char *id, struct attestation_cfg_common *acfg_common)
struct ao2_container * eprofile_get_all(void)
struct profile_cfg * profile_get_cfg(const char *id)
struct ao2_container * profile_get_all(void)
char * canonicalize_tn(const char *tn, char *dest_tn)
Canonicalize a TN.
int vs_copy_cfg_common(const char *id, struct verification_cfg_common *cfg_dst, struct verification_cfg_common *cfg_src)
int as_is_config_loaded(void)
int tn_config_reload(void)
enum attest_level_enum unknown_tn_attest_level_from_str(const char *value)
struct tn_cfg * tn_get_etn(const char *tn, struct profile_cfg *eprofile)
int as_copy_cfg_common(const char *id, struct attestation_cfg_common *cfg_dst, struct attestation_cfg_common *cfg_src)
int vs_config_unload(void)
enum stir_shaken_failure_action_enum stir_shaken_failure_action_from_str(const char *action_str)
#define generate_bool_string_prototypes(param_name)
Boolean field to/from string prototype generator.
int vs_check_common_config(const char *id, struct verification_cfg_common *vcfg_common)
void vcfg_cleanup(struct verification_cfg_common *cfg)
void acfg_cleanup(struct attestation_cfg_common *cfg)
const char * stir_shaken_failure_action_to_str(enum stir_shaken_failure_action_enum action)
Asterisk file paths, configured in asterisk.conf.
struct ao2_container * container
stir_shaken_failure_action_enum
Sorcery Data Access Layer API.
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
#define AST_STRING_FIELD(name)
Declare a string field.
Wrapper for an ast_acl linked list.
Attestation Service configuration for stir/shaken.
enum check_tn_cert_public_url_enum check_tn_cert_public_url
enum attest_level_enum attest_level
const ast_string_field public_cert_url
const ast_string_field private_key_file
enum send_mky_enum send_mky
struct attestation_cfg_common acfg_common
enum attest_level_enum unknown_tn_attest_level
enum config_object_type object_type
ao2 object wrapper for X509_STORE that provides locking and refcounting
Profile configuration for stir/shaken.
enum endpoint_behavior_enum endpoint_behavior
struct attestation_cfg_common acfg_common
struct profile_cfg * eprofile
enum attest_level_enum unknown_tn_attest_level
struct verification_cfg_common vcfg_common
TN configuration for stir/shaken.
struct attestation_cfg_common acfg_common
Verification Service configuration for stir/shaken.
struct crypto_cert_store * tcs
unsigned int max_cache_size
enum stir_shaken_failure_action_enum stir_shaken_failure_action
enum use_rfc9410_responses_enum use_rfc9410_responses
const ast_string_field cert_cache_dir
const ast_string_field ca_path
enum relax_x5u_path_restrictions_enum relax_x5u_path_restrictions
unsigned int curl_timeout
const ast_string_field crl_file
const ast_string_field crl_path
enum load_system_certs_enum load_system_certs
enum ignore_sip_date_header_enum ignore_sip_date_header
const ast_string_field ca_file
enum relax_x5u_port_scheme_restrictions_enum relax_x5u_port_scheme_restrictions
unsigned int max_date_header_age
const ast_string_field untrusted_cert_file
struct ast_acl_list * acl
const ast_string_field untrusted_cert_path
unsigned int max_cache_entry_age
struct verification_cfg_common vcfg_common