Hi, In general this looks good. Some remarks inline. Please bear with me, we're almost there ;)
On 27-12-16 12:24, Antonio Quartulli wrote: > Carrying around the INLINE_TAG is not really efficient, > because it requires a strcmp() to be performed every > time we want to understand if the data is stored inline > or not. > > Convert all the *_inline attributes to bool to make the > logic easier and checks more efficient. > > Cc: Steffan Karger <stef...@karger.me> > Signed-off-by: Antonio Quartulli <a...@unstable.cc> > --- > > Based on master + [PATCH v3] reformatting: fix style in crypto*.{c, h} > > Changes from v1: > - remove the INLINE_TAG from the options parsing logic at all. Now a > boolean variable is passed around. > - add print_if_inline() helper function (to misc.c/h) to make sure we > never print the inline data, but only the INLINE tag. Such function > checks also for NULL pointers; > - make sure print_if_inline() is always used when printing possibly > inline data; > - remove the INLINE_TAG from the options parsing logic at all. Now a > boolean variable is passed around. > - fix alignment error in comment; > - remove CHKACC_INLINE from check_file_access() logic: this function > is now not invoked at all in case of inline data. > > > > src/openvpn/crypto.c | 25 +++--- > src/openvpn/crypto.h | 5 +- > src/openvpn/misc.c | 17 +++- > src/openvpn/misc.h | 15 +++- > src/openvpn/options.c | 221 > ++++++++++++++++++++++++---------------------- > src/openvpn/options.h | 20 ++--- > src/openvpn/plugin.c | 6 +- > src/openvpn/plugin.h | 3 +- > src/openvpn/push.c | 5 +- > src/openvpn/push.h | 3 +- > src/openvpn/ssl.c | 6 +- > src/openvpn/ssl_backend.h | 64 ++++++++------ > src/openvpn/ssl_common.h | 2 +- > src/openvpn/ssl_mbedtls.c | 63 +++++++------ > src/openvpn/ssl_openssl.c | 92 ++++++++++--------- > src/openvpn/tls_crypt.c | 2 +- > src/openvpn/tls_crypt.h | 9 +- > 17 files changed, 297 insertions(+), 261 deletions(-) > > diff --git a/src/openvpn/crypto.c b/src/openvpn/crypto.c > index 63f8806..3e710aa 100644 > --- a/src/openvpn/crypto.c > +++ b/src/openvpn/crypto.c > @@ -36,6 +36,7 @@ > #include "crypto.h" > #include "error.h" > #include "integer.h" > +#include "misc.h" > #include "platform.h" > > #include "memdbg.h" > @@ -1184,27 +1185,26 @@ test_crypto(struct crypto_options *co, struct frame > *frame) > > void > crypto_read_openvpn_key(const struct key_type *key_type, struct key_ctx_bi > *ctx, > - const char *key_file, const char *key_inline, > + const char *key_file, bool key_inline, > const int key_direction, const char *key_name, > const char *opt_name) > { > struct key2 key2; > struct key_direction_state kds; > char log_prefix[128] = { 0 }; > + unsigned int flags = RKF_MUST_SUCCEED; > > if (key_inline) > { > - read_key_file(&key2, key_inline, RKF_MUST_SUCCEED | RKF_INLINE); > - } > - else > - { > - read_key_file(&key2, key_file, RKF_MUST_SUCCEED); > + flags |= RKF_INLINE; > } > + read_key_file(&key2, key_file, flags); > > if (key2.n != 2) > { > msg(M_ERR, "File '%s' does not have OpenVPN Static Key format. > Using " > - "free-form passphrase file is not supported anymore.", key_file); > + "free-form passphrase file is not supported anymore.", > + print_if_inline(key_file, key_inline)); > } > > /* check for and fix highly unlikely key problems */ > @@ -1244,7 +1244,6 @@ read_key_file(struct key2 *key2, const char *file, > const unsigned int flags) > struct buffer in; > int fd, size; > uint8_t hex_byte[3] = {0, 0, 0}; > - const char *error_filename = file; > > /* parse info */ > const unsigned char *cp; > @@ -1283,7 +1282,6 @@ read_key_file(struct key2 *key2, const char *file, > const unsigned int flags) > /* 'file' is a string containing ascii representation of key */ > size = strlen(file) + 1; > buf_set_read(&in, (const uint8_t *)file, size); > - error_filename = INLINE_FILE_TAG; > } > else > { > @@ -1391,7 +1389,8 @@ read_key_file(struct key2 *key2, const char *file, > const unsigned int flags) > { > msg(M_FATAL, > isprint(c) ? printable_char_fmt : > unprintable_char_fmt, > - c, line_num, error_filename, count, onekeylen, > keylen); > + c, line_num, print_if_inline(file, flags & > RKF_INLINE), > + count, onekeylen, keylen); > } > } > ++line_index; > @@ -1413,14 +1412,16 @@ read_key_file(struct key2 *key2, const char *file, > const unsigned int flags) > { > msg(M_FATAL, > "Insufficient key material or header text not found in file > '%s' (%d/%d/%d bytes found/min/max)", > - error_filename, count, onekeylen, keylen); > + print_if_inline(file, flags & RKF_INLINE), count, onekeylen, > + keylen); > } > > if (state != PARSE_FINISHED) > { > msg(M_FATAL, > "Footer text not found in file '%s' (%d/%d/%d bytes > found/min/max)", > - error_filename, count, onekeylen, keylen); > + print_if_inline(file, flags & RKF_INLINE), count, onekeylen, > + keylen); > } > } > > diff --git a/src/openvpn/crypto.h b/src/openvpn/crypto.h > index afd0aa6..c1bf614 100644 > --- a/src/openvpn/crypto.h > +++ b/src/openvpn/crypto.h > @@ -497,9 +497,8 @@ void key2_print(const struct key2 *k, > > void crypto_read_openvpn_key(const struct key_type *key_type, > struct key_ctx_bi *ctx, const char *key_file, > - const char *key_inline, > - const int key_direction, const char *key_name, > - const char *opt_name); > + bool key_inline, const int key_direction, > + const char *key_name, const char *opt_name); > > /* > * Inline functions > diff --git a/src/openvpn/misc.c b/src/openvpn/misc.c > index 87f03be..7658900 100644 > --- a/src/openvpn/misc.c > +++ b/src/openvpn/misc.c > @@ -1645,12 +1645,12 @@ make_arg_copy(char **p, struct gc_arena *gc) > } > > const char ** > -make_extended_arg_array(char **p, struct gc_arena *gc) > +make_extended_arg_array(char **p, bool is_inline, struct gc_arena *gc) > { > const int argc = string_array_len((const char **)p); > - if (!strcmp(p[0], INLINE_FILE_TAG) && argc == 2) > + if (is_inline) > { > - return make_inline_array(p[1], gc); > + return make_inline_array(p[0], gc); > } > else if (argc == 0) > { > @@ -1788,6 +1788,17 @@ compat_flag(unsigned int flag) > > } > > +const char * > +print_if_inline(const char *str, bool is_inline) > +{ > + if (is_inline) > + { > + return INLINE_FILE_TAG; > + } > + > + return np(str); > +} > + > #if P2MP_SERVER > > /* helper to parse peer_info received from multi client, validate > diff --git a/src/openvpn/misc.h b/src/openvpn/misc.h > index 16be621..9cb42e4 100644 > --- a/src/openvpn/misc.h > +++ b/src/openvpn/misc.h > @@ -173,7 +173,8 @@ const char **make_env_array(const struct env_set *es, > > const char **make_arg_array(const char *first, const char *parms, struct > gc_arena *gc); > > -const char **make_extended_arg_array(char **p, struct gc_arena *gc); > +const char **make_extended_arg_array(char **p, bool is_inline, > + struct gc_arena *gc); > > /* an analogue to the random() function, but use OpenSSL functions if > available */ > #ifdef ENABLE_CRYPTO > @@ -348,4 +349,16 @@ void output_peer_info_env(struct env_set *es, const char > *peer_info); > > #endif /* P2MP_SERVER */ > > +/** > + * To be used when printing a string that may contain inline data. > + * > + * If "is_inline" is true, return the inline tag. > + * If "is_inline" is false and "str" is not NULL, return "str". > + * Return the constant string "[NULL]" otherwise. > + * > + * @param str the original string to return when is_inline is false > + * @param is_inline true when str contains an inline data of some sort > + */ > +const char *print_if_inline(const char *str, bool is_inline); > + > #endif /* ifndef MISC_H */ > diff --git a/src/openvpn/options.c b/src/openvpn/options.c > index bfedb6a..249619b 100644 > --- a/src/openvpn/options.c > +++ b/src/openvpn/options.c > @@ -3055,9 +3055,8 @@ options_postprocess_mutate(struct options *o) > #define CHKACC_FILE (1<<0) /** Check for a file/directory precense */ > #define CHKACC_DIRPATH (1<<1) /** Check for directory precense where a > file should reside */ > #define CHKACC_FILEXSTWR (1<<2) /** If file exists, is it writable? */ > -#define CHKACC_INLINE (1<<3) /** File is present if it's an inline file > */ > -#define CHKACC_ACPTSTDIN (1<<4) /** If filename is stdin, it's allowed and > "exists" */ > -#define CHKACC_PRIVATE (1<<5) /** Warn if this (private) file is > group/others accessible */ > +#define CHKACC_ACPTSTDIN (1<<3) /** If filename is stdin, it's allowed and > "exists" */ > +#define CHKACC_PRIVATE (1<<4) /** Warn if this (private) file is > group/others accessible */ > > static bool > check_file_access(const int type, const char *file, const int mode, const > char *opt) > @@ -3070,12 +3069,6 @@ check_file_access(const int type, const char *file, > const int mode, const char * > return false; > } > > - /* If this may be an inline file, and the proper inline "filename" is > set - no issues */ > - if ((type & CHKACC_INLINE) && streq(file, INLINE_FILE_TAG) ) > - { > - return false; > - } > - > /* If stdin is allowed and the file name is 'stdin', then do no > * further checks as stdin is always available > */ > @@ -3246,39 +3239,71 @@ options_postprocess_filechecks(struct options > *options) > > #ifdef ENABLE_CRYPTO > /* ** SSL/TLS/crypto related files ** */ > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE, options->dh_file, > R_OK, "--dh"); > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE, options->ca_file, > R_OK, "--ca"); > - errs |= check_file_access_chroot(options->chroot_dir, CHKACC_FILE, > options->ca_path, R_OK, "--capath"); > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE, options->cert_file, > R_OK, "--cert"); > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE, > options->extra_certs_file, R_OK, > - "--extra-certs"); > + if (!options->dh_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE, options->dh_file, R_OK, > "--dh"); > + } > + if (!options->ca_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE, options->ca_file, R_OK, > "--ca"); > + } > + errs |= check_file_access_chroot(options->chroot_dir, CHKACC_FILE, > + options->ca_path, R_OK, "--capath"); > + if (!options->cert_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE, options->cert_file, R_OK, > "--cert"); > + } > + if (!options->extra_certs_file) > + { > + errs |= check_file_access(CHKACC_FILE, options->extra_certs_file, > R_OK, > + "--extra-certs"); > + } ... more add ifs follow. I don't particularly like all these ifs. What about adding a wrapper function like check_file_access_inline(bool inline, int flags, ...), containing basically "if(!inline) check_file_access(flags, ...)", so that we will here still have a nice 'check_file_access*()'-sled? (Thanks to Adriaan for the suggestion.) > #ifdef MANAGMENT_EXTERNAL_KEY > if (!(options->management_flags & MF_EXTERNAL_KEY)) > #endif > { > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE|CHKACC_PRIVATE, > - options->priv_key_file, R_OK, "--key"); > + if (!options->priv_key_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE|CHKACC_PRIVATE, > + options->priv_key_file, R_OK, "--key"); > + } > + } > + if (!options->pkcs12_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE|CHKACC_PRIVATE, > + options->pkcs12_file, R_OK, "--pkcs12"); > } > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE|CHKACC_PRIVATE, > - options->pkcs12_file, R_OK, "--pkcs12"); > > if (options->ssl_flags & SSLF_CRL_VERIFY_DIR) > { > - errs |= check_file_access_chroot(options->chroot_dir, CHKACC_FILE, > options->crl_file, R_OK|X_OK, > + errs |= check_file_access_chroot(options->chroot_dir, CHKACC_FILE, > + options->crl_file, R_OK|X_OK, > "--crl-verify directory"); > } > - else > + else if (!options->crl_file_inline) > + { > + errs |= check_file_access_chroot(options->chroot_dir, CHKACC_FILE, > + options->crl_file, R_OK, > + "--crl-verify"); > + } > + > + if (!options->tls_auth_file_inline) > + { > + errs |= check_file_access(CHKACC_FILE|CHKACC_PRIVATE, > + options->tls_auth_file, R_OK, > "--tls-auth"); > + } > + if (!options->tls_crypt_inline) > + { > + errs |= check_file_access(CHKACC_FILE|CHKACC_PRIVATE, > + options->tls_crypt_file, R_OK, > "--tls-crypt"); > + } > + if (!options->shared_secret_file_inline) > { > - errs |= check_file_access_chroot(options->chroot_dir, > CHKACC_FILE|CHKACC_INLINE, > - options->crl_file, R_OK, > "--crl-verify"); > + errs |= check_file_access(CHKACC_FILE|CHKACC_PRIVATE, > + options->shared_secret_file, R_OK, > + "--secret"); > } > > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE|CHKACC_PRIVATE, > - options->tls_auth_file, R_OK, "--tls-auth"); > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE|CHKACC_PRIVATE, > - options->tls_crypt_file, R_OK, "--tls-crypt"); > - errs |= check_file_access(CHKACC_FILE|CHKACC_INLINE|CHKACC_PRIVATE, > - options->shared_secret_file, R_OK, "--secret"); > errs |= check_file_access(CHKACC_DIRPATH|CHKACC_FILEXSTWR, > options->packet_id_file, R_OK|W_OK, > "--replay-persist"); > > @@ -4459,22 +4484,25 @@ read_inline_file(struct in_src *is, const char > *close_tag, struct gc_arena *gc) > } > > static bool > -check_inline_file(struct in_src *is, char *p[], struct gc_arena *gc) > +check_inline_file(struct in_src *is, char *p[], bool *is_inline, > + struct gc_arena *gc) > { > bool ret = false; > + > + *is_inline = false; > if (p[0] && !p[1]) > { > char *arg = p[0]; > if (arg[0] == '<' && arg[strlen(arg)-1] == '>') > { > struct buffer close_tag; > + *is_inline = true; > arg[strlen(arg)-1] = '\0'; > p[0] = string_alloc(arg+1, gc); > - p[1] = string_alloc(INLINE_FILE_TAG, gc); > close_tag = alloc_buf(strlen(p[0]) + 4); > buf_printf(&close_tag, "</%s>", p[0]); > - p[2] = read_inline_file(is, BSTR(&close_tag), gc); > - p[3] = NULL; > + p[1] = read_inline_file(is, BSTR(&close_tag), gc); > + p[2] = NULL; > free_buf(&close_tag); > ret = true; > } > @@ -4483,26 +4511,29 @@ check_inline_file(struct in_src *is, char *p[], > struct gc_arena *gc) > } > > static bool > -check_inline_file_via_fp(FILE *fp, char *p[], struct gc_arena *gc) > +check_inline_file_via_fp(FILE *fp, char *p[], bool *is_inline, > + struct gc_arena *gc) > { > struct in_src is; > is.type = IS_TYPE_FP; > is.u.fp = fp; > - return check_inline_file(&is, p, gc); > + return check_inline_file(&is, p, is_inline, gc); > } > > static bool > -check_inline_file_via_buf(struct buffer *multiline, char *p[], struct > gc_arena *gc) > +check_inline_file_via_buf(struct buffer *multiline, char *p[], bool > *is_inline, > + struct gc_arena *gc) > { > struct in_src is; > is.type = IS_TYPE_BUF; > is.u.multiline = multiline; > - return check_inline_file(&is, p, gc); > + return check_inline_file(&is, p, is_inline, gc); > } > > static void > add_option(struct options *options, > char *p[], > + bool is_inline, > const char *file, > int line, > const int level, > @@ -4523,6 +4554,7 @@ read_config_file(struct options *options, > struct env_set *es) > { > const int max_recursive_levels = 10; > + bool is_inline; > FILE *fp; > int line_num; > char line[OPTION_LINE_SIZE+1]; > @@ -4561,8 +4593,10 @@ read_config_file(struct options *options, > if (parse_line(line + offset, p, SIZE(p), file, line_num, > msglevel, &options->gc)) > { > bypass_doubledash(&p[0]); > - check_inline_file_via_fp(fp, p, &options->gc); > - add_option(options, p, file, line_num, level, msglevel, > permission_mask, option_types_found, es); > + check_inline_file_via_fp(fp, p, &is_inline, > &options->gc); > + add_option(options, p, is_inline, file, line_num, level, > + msglevel, permission_mask, option_types_found, > + es); > } > } > if (fp != stdin) > @@ -4595,6 +4629,7 @@ read_config_string(const char *prefix, > char line[OPTION_LINE_SIZE]; > struct buffer multiline; > int line_num = 0; > + bool is_inline; > > buf_set_read(&multiline, (uint8_t *)config, strlen(config)); > > @@ -4606,8 +4641,9 @@ read_config_string(const char *prefix, > if (parse_line(line, p, SIZE(p), prefix, line_num, msglevel, > &options->gc)) > { > bypass_doubledash(&p[0]); > - check_inline_file_via_buf(&multiline, p, &options->gc); > - add_option(options, p, prefix, line_num, 0, msglevel, > permission_mask, option_types_found, es); > + check_inline_file_via_buf(&multiline, p, &is_inline, > &options->gc); > + add_option(options, p, is_inline, prefix, line_num, 0, msglevel, > + permission_mask, option_types_found, es); > } > CLEAR(p); > } > @@ -4638,7 +4674,8 @@ parse_argv(struct options *options, > CLEAR(p); > p[0] = "config"; > p[1] = argv[1]; > - add_option(options, p, NULL, 0, 0, msglevel, permission_mask, > option_types_found, es); > + add_option(options, p, false, NULL, 0, 0, msglevel, permission_mask, > + option_types_found, es); > } > else > { > @@ -4672,7 +4709,8 @@ parse_argv(struct options *options, > } > } > } > - add_option(options, p, NULL, 0, 0, msglevel, permission_mask, > option_types_found, es); > + add_option(options, p, false, NULL, 0, 0, msglevel, > permission_mask, > + option_types_found, es); > i += j - 1; > } > } > @@ -4743,7 +4781,8 @@ apply_push_options(struct options *options, > } > if (parse_line(line, p, SIZE(p), file, line_num, msglevel, > &options->gc)) > { > - add_option(options, p, file, line_num, 0, msglevel, > permission_mask, option_types_found, es); > + add_option(options, p, false, file, line_num, 0, msglevel, > + permission_mask, option_types_found, es); > } > } > return true; > @@ -4908,6 +4947,7 @@ set_user_script(struct options *options, > static void > add_option(struct options *options, > char *p[], > + bool is_inline, > const char *file, > int line, > const int level, > @@ -5154,7 +5194,8 @@ add_option(struct options *options, > { > options->plugin_list = plugin_option_list_new(&options->gc); > } > - if (!plugin_option_list_add(options->plugin_list, &p[1], > &options->gc)) > + if (!plugin_option_list_add(options->plugin_list, &p[1], is_inline, > + &options->gc)) Can we inline a plugin? I wouldn't think so, but I've been surprised by our option parser before ;-) (Arne or David might know this.) If not, you don't need to add the is_inline argument to plugin_option_list_add(), but just add a 'false' when someone down the chain calls make_extended_arg_array(). > { > msg(msglevel, "plugin add failed: %s", p[1]); > goto err; > @@ -5286,14 +5327,15 @@ add_option(struct options *options, > else if (streq(p[0], "connection") && p[1] && !p[3]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > + if (is_inline) > { > struct options sub; > struct connection_entry *e; > > init_options(&sub, true); > sub.ce = options->ce; > - read_config_string("[CONNECTION-OPTIONS]", &sub, p[2], msglevel, > OPT_P_CONNECTION, option_types_found, es); > + read_config_string("[CONNECTION-OPTIONS]", &sub, p[1], msglevel, > + OPT_P_CONNECTION, option_types_found, es); > if (!sub.ce.remote) > { > msg(msglevel, "Each 'connection' block must contain exactly > one 'remote' directive"); > @@ -5968,15 +6010,8 @@ add_option(struct options *options, > struct http_proxy_options *ho; > VERIFY_PERMISSION(OPT_P_GENERAL); > ho = init_http_proxy_options_once(&options->ce.http_proxy_options, > &options->gc); > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - ho->auth_file = p[2]; > - ho->inline_creds = true; > - } > - else > - { > - ho->auth_file = p[1]; > - } > + ho->auth_file = p[1]; > + ho->inline_creds = is_inline; > } > else if (streq(p[0], "http-proxy-retry") || streq(p[0], > "socks-proxy-retry")) > { > @@ -6496,7 +6531,7 @@ add_option(struct options *options, > else if (streq(p[0], "push") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_PUSH); > - push_options(options, &p[1], msglevel, &options->gc); > + push_options(options, &p[1], is_inline, msglevel, &options->gc); Same as with 'plugin', I don't think we can inline a 'push' option? > } > else if (streq(p[0], "push-reset") && !p[1]) > { > @@ -7436,11 +7471,9 @@ add_option(struct options *options, > else if (streq(p[0], "secret") && p[1] && !p[3]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->shared_secret_file_inline = p[2]; > - } > - else if (p[2]) > + options->shared_secret_file = p[1]; > + options->shared_secret_file_inline = is_inline; > + if (!is_inline && p[2]) > { > int key_direction; > > @@ -7454,7 +7487,6 @@ add_option(struct options *options, > goto err; > } > } > - options->shared_secret_file = p[1]; > } > else if (streq(p[0], "genkey") && !p[1]) > { > @@ -7633,14 +7665,11 @@ add_option(struct options *options, > VERIFY_PERMISSION(OPT_P_GENERAL); > options->tls_client = true; > } > - else if (streq(p[0], "ca") && p[1] && ((streq(p[1], INLINE_FILE_TAG) && > p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "ca") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->ca_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->ca_file_inline = p[2]; > - } > + options->ca_file_inline = is_inline; > } > #ifndef ENABLE_CRYPTO_MBEDTLS > else if (streq(p[0], "capath") && p[1] && !p[2]) > @@ -7649,32 +7678,23 @@ add_option(struct options *options, > options->ca_path = p[1]; > } > #endif /* ENABLE_CRYPTO_MBEDTLS */ > - else if (streq(p[0], "dh") && p[1] && ((streq(p[1], INLINE_FILE_TAG) && > p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "dh") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->dh_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->dh_file_inline = p[2]; > - } > + options->dh_file_inline = is_inline; > } > - else if (streq(p[0], "cert") && p[1] && ((streq(p[1], INLINE_FILE_TAG) > && p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "cert") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->cert_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->cert_file_inline = p[2]; > - } > + options->cert_file_inline = is_inline; > } > - else if (streq(p[0], "extra-certs") && p[1] && ((streq(p[1], > INLINE_FILE_TAG) && p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "extra-certs") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->extra_certs_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->extra_certs_file_inline = p[2]; > - } > + options->extra_certs_file_inline = is_inline; > } > else if (streq(p[0], "verify-hash") && p[1] && !p[2]) > { > @@ -7688,14 +7708,11 @@ add_option(struct options *options, > options->cryptoapi_cert = p[1]; > } > #endif > - else if (streq(p[0], "key") && p[1] && ((streq(p[1], INLINE_FILE_TAG) && > p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "key") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->priv_key_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->priv_key_file_inline = p[2]; > - } > + options->priv_key_file_inline = is_inline; > } > else if (streq(p[0], "tls-version-min") && p[1] && !p[3]) > { > @@ -7726,14 +7743,11 @@ add_option(struct options *options, > options->ssl_flags |= (ver << SSLF_TLS_VERSION_MAX_SHIFT); > } > #ifndef ENABLE_CRYPTO_MBEDTLS > - else if (streq(p[0], "pkcs12") && p[1] && ((streq(p[1], INLINE_FILE_TAG) > && p[2]) || !p[2]) && !p[3]) > + else if (streq(p[0], "pkcs12") && p[1] && !p[2]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > options->pkcs12_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->pkcs12_file_inline = p[2]; > - } > + options->pkcs12_file_inline = is_inline; > } > #endif /* ENABLE_CRYPTO_MBEDTLS */ > else if (streq(p[0], "askpass") && !p[2]) > @@ -7787,7 +7801,7 @@ add_option(struct options *options, > options->cipher_list = p[1]; > } > else if (streq(p[0], "crl-verify") && p[1] && ((p[2] && streq(p[2], > "dir")) > - || (p[2] && streq(p[1], > INLINE_FILE_TAG) ) || !p[2]) && !p[3]) > + || !p[2])) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > if (p[2] && streq(p[2], "dir")) > @@ -7795,10 +7809,7 @@ add_option(struct options *options, > options->ssl_flags |= SSLF_CRL_VERIFY_DIR; > } > options->crl_file = p[1]; > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->crl_file_inline = p[2]; > - } > + options->crl_file_inline = is_inline; > } > else if (streq(p[0], "tls-verify") && p[1]) > { > @@ -7971,11 +7982,9 @@ add_option(struct options *options, > else if (streq(p[0], "tls-auth") && p[1] && !p[3]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->tls_auth_file_inline = p[2]; > - } > - else if (p[2]) > + options->tls_auth_file = p[1]; > + options->tls_auth_file_inline = is_inline; > + if (!is_inline && p[2]) > { > int key_direction; > > @@ -7989,16 +7998,12 @@ add_option(struct options *options, > goto err; > } > } > - options->tls_auth_file = p[1]; > } > else if (streq(p[0], "tls-crypt") && p[1] && !p[3]) > { > VERIFY_PERMISSION(OPT_P_GENERAL); > - if (streq(p[1], INLINE_FILE_TAG) && p[2]) > - { > - options->tls_crypt_inline = p[2]; > - } > options->tls_crypt_file = p[1]; > + options->tls_crypt_inline = is_inline; > } > else if (streq(p[0], "key-method") && p[1] && !p[2]) > { > diff --git a/src/openvpn/options.h b/src/openvpn/options.h > index b3ab029..00b0cb7 100644 > --- a/src/openvpn/options.h > +++ b/src/openvpn/options.h > @@ -468,7 +468,7 @@ struct options > #ifdef ENABLE_CRYPTO > /* Cipher parms */ > const char *shared_secret_file; > - const char *shared_secret_file_inline; > + bool shared_secret_file_inline; > int key_direction; > const char *ciphername; > bool ncp_enabled; > @@ -507,13 +507,13 @@ struct options > const char *tls_export_cert; > const char *crl_file; > > - const char *ca_file_inline; > - const char *cert_file_inline; > - const char *extra_certs_file_inline; > - const char *crl_file_inline; > - char *priv_key_file_inline; > - const char *dh_file_inline; > - const char *pkcs12_file_inline; /* contains the base64 encoding of > pkcs12 file */ > + bool ca_file_inline; > + bool cert_file_inline; > + bool extra_certs_file_inline; > + bool crl_file_inline; > + bool priv_key_file_inline; > + bool dh_file_inline; > + bool pkcs12_file_inline; > > int ns_cert_type; /* set to 0, NS_CERT_CHECK_SERVER, or > NS_CERT_CHECK_CLIENT */ > unsigned remote_cert_ku[MAX_PARMS]; > @@ -560,11 +560,11 @@ struct options > > /* Shared secret used for TLS control channel authentication */ > const char *tls_auth_file; > - const char *tls_auth_file_inline; > + bool tls_auth_file_inline; > > /* Shared secret used for TLS control channel authenticated encryption */ > const char *tls_crypt_file; > - const char *tls_crypt_inline; > + bool tls_crypt_inline; > > /* Allow only one session */ > bool single_session; > diff --git a/src/openvpn/plugin.c b/src/openvpn/plugin.c > index 17eb2d8..d3e4188 100644 > --- a/src/openvpn/plugin.c > +++ b/src/openvpn/plugin.c > @@ -160,13 +160,13 @@ plugin_option_list_new(struct gc_arena *gc) > return ret; > } > > -bool > -plugin_option_list_add(struct plugin_option_list *list, char **p, struct > gc_arena *gc) > +bool plugin_option_list_add(struct plugin_option_list *list, char **p, > + bool is_inline, struct gc_arena *gc) > { > if (list->n < MAX_PLUGINS) > { > struct plugin_option *o = &list->plugins[list->n++]; > - o->argv = make_extended_arg_array(p, gc); > + o->argv = make_extended_arg_array(p, is_inline, gc); > if (o->argv[0]) > { > o->so_pathname = o->argv[0]; > diff --git a/src/openvpn/plugin.h b/src/openvpn/plugin.h > index 4ded529..86a64ed 100644 > --- a/src/openvpn/plugin.h > +++ b/src/openvpn/plugin.h > @@ -107,7 +107,8 @@ struct plugin_return > > struct plugin_option_list *plugin_option_list_new(struct gc_arena *gc); > > -bool plugin_option_list_add(struct plugin_option_list *list, char **p, > struct gc_arena *gc); > +bool plugin_option_list_add(struct plugin_option_list *list, char **p, > + bool is_inline, struct gc_arena *gc); > > #ifndef ENABLE_SMALL > void plugin_option_list_print(const struct plugin_option_list *list, int > msglevel); > diff --git a/src/openvpn/push.c b/src/openvpn/push.c > index f515475..a1f1090 100644 > --- a/src/openvpn/push.c > +++ b/src/openvpn/push.c > @@ -564,9 +564,10 @@ clone_push_list(struct options *o) > } > > void > -push_options(struct options *o, char **p, int msglevel, struct gc_arena *gc) > +push_options(struct options *o, char **p, bool is_inline, int msglevel, > + struct gc_arena *gc) > { > - const char **argv = make_extended_arg_array(p, gc); > + const char **argv = make_extended_arg_array(p, is_inline, gc); > char *opt = print_argv(argv, gc, 0); > push_option(o, opt, msglevel); > } > diff --git a/src/openvpn/push.h b/src/openvpn/push.h > index 86900c8..89807de 100644 > --- a/src/openvpn/push.h > +++ b/src/openvpn/push.h > @@ -58,7 +58,8 @@ void clone_push_list(struct options *o); > > void push_option(struct options *o, const char *opt, int msglevel); > > -void push_options(struct options *o, char **p, int msglevel, struct gc_arena > *gc); > +void push_options(struct options *o, char **p, bool is_inline, int msglevel, > + struct gc_arena *gc); > > void push_reset(struct options *o); > > diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c > index cff4052..4fab645 100644 > --- a/src/openvpn/ssl.c > +++ b/src/openvpn/ssl.c > @@ -542,7 +542,7 @@ tls_version_parse(const char *vstr, const char *extra) > */ > static void > tls_ctx_reload_crl(struct tls_root_ctx *ssl_ctx, const char *crl_file, > - const char *crl_file_inline) > + bool crl_file_inline) > { > /* if something goes wrong with stat(), we'll store 0 as mtime */ > platform_stat_t crl_stat = {0}; > @@ -645,8 +645,8 @@ init_ssl(const struct options *options, struct > tls_root_ctx *new_ctx) > { > char *external_certificate = management_query_cert(management, > > options->management_certificate); > - tls_ctx_use_external_private_key(new_ctx, INLINE_FILE_TAG, > - external_certificate); > + tls_ctx_use_external_private_key(new_ctx, external_certificate, > + true); > free(external_certificate); > } > } > diff --git a/src/openvpn/ssl_backend.h b/src/openvpn/ssl_backend.h > index 206400f..ef9887b 100644 > --- a/src/openvpn/ssl_backend.h > +++ b/src/openvpn/ssl_backend.h > @@ -192,11 +192,12 @@ void tls_ctx_check_cert_time(const struct tls_root_ctx > *ctx); > * > * @param ctx TLS context to use > * @param dh_file The file name to load the parameters from, or > - * "[[INLINE]]" in the case of inline files. > - * @param dh_file_inline A string containing the parameters > + * a string containing the parameters in the > case > + * of inline files. > + * @param dh_file_inline True if dh_file is an inline file. > */ > void tls_ctx_load_dh_params(struct tls_root_ctx *ctx, const char *dh_file, > - const char *dh_file_inline); > + bool dh_file_inline); > > /** > * Load Elliptic Curve Parameters, and load them into the library-specific > @@ -214,15 +215,15 @@ void tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, > const char *curve_name > * > * @param ctx TLS context to use > * @param pkcs12_file The file name to load the information from, > or > - * "[[INLINE]]" in the case of inline files. > - * @param pkcs12_file_inline A string containing the information > + * a string containing the information in the > case > + * of inline files. > + * @param pkcs12_file_inline True if pkcs12_file is an inline file. > * > * @return 1 if an error occurred, 0 if parsing was > * successful. > */ > int tls_ctx_load_pkcs12(struct tls_root_ctx *ctx, const char *pkcs12_file, > - const char *pkcs12_file_inline, bool load_ca_file > - ); > + bool pkcs12_file_inline, bool load_ca_file); > > /** > * Use Windows cryptoapi for key and cert, and add to library-specific TLS > @@ -242,26 +243,27 @@ void tls_ctx_load_cryptoapi(struct tls_root_ctx *ctx, > const char *cryptoapi_cert > * > * @param ctx TLS context to use > * @param cert_file The file name to load the certificate from, > or > - * "[[INLINE]]" in the case of inline files. > - * @param cert_file_inline A string containing the certificate > + * a string containing the certificate in the > case > + * of inline files. > + * @param cert_file_inline True if cert_file is an inline file. > */ > void tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const char *cert_file, > - const char *cert_file_inline); > + bool cert_file_inline); > > /** > * Load private key file into the given TLS context. > * > * @param ctx TLS context to use > * @param priv_key_file The file name to load the private key from, > or > - * "[[INLINE]]" in the case of inline files. > - * @param priv_key_file_inline A string containing the private key > + * a string containing the private key in the > case > + * of inline files. > + * @param priv_key_file_inline True if priv_key_file is an inline file > * > * @return 1 if an error occurred, 0 if parsing was > * successful. > */ > int tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const char > *priv_key_file, > - const char *priv_key_file_inline > - ); > + bool priv_key_file_inline); > > #ifdef MANAGMENT_EXTERNAL_KEY > > @@ -271,14 +273,16 @@ int tls_ctx_load_priv_file(struct tls_root_ctx *ctx, > const char *priv_key_file, > * > * @param ctx TLS context to use > * @param cert_file The file name to load the certificate from, > or > - * "[[INLINE]]" in the case of inline files. > - * @param cert_file_inline A string containing the certificate > + * a string containing the certificate in the > case > + * of inline files. > + * @param cert_file_inline True if cert_file is an inline file. > * > * @return 1 if an error occurred, 0 if parsing was > * successful. > */ > int tls_ctx_use_external_private_key(struct tls_root_ctx *ctx, > - const char *cert_file, const char > *cert_file_inline); > + const char *cert_file, > + bool cert_file_inline); > > #endif > > @@ -290,13 +294,13 @@ int tls_ctx_use_external_private_key(struct > tls_root_ctx *ctx, > * > * @param ctx TLS context to use > * @param ca_file The file name to load the CAs from, or > - * "[[INLINE]]" in the case of inline files. > - * @param ca_file_inline A string containing the CAs > + * a string containing the CAs in the case of > + * inline files. > + * @param ca_file_inline True if ca_file is an inline file > * @param ca_path The path to load the CAs from > */ > void tls_ctx_load_ca(struct tls_root_ctx *ctx, const char *ca_file, > - const char *ca_file_inline, const char *ca_path, bool > tls_server > - ); > + bool ca_file_inline, const char *ca_path, bool > tls_server); > > /** > * Load extra certificate authority certificates from the given file or path. > @@ -306,12 +310,14 @@ void tls_ctx_load_ca(struct tls_root_ctx *ctx, const > char *ca_file, > * > * @param ctx TLS context to use > * @param extra_certs_file The file name to load the certs > from, or > - * "[[INLINE]]" in the case of inline > files. > - * @param extra_certs_file_inline A string containing the certs > + * a string containing the certs in the > + * case of inline files. > + * @param extra_certs_file_inline True if extra_certs_file is an inline > + * file. > */ > -void tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, const char > *extra_certs_file, > - const char *extra_certs_file_inline > - ); > +void tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, > + const char *extra_certs_file, > + bool extra_certs_file_inline); > > #ifdef ENABLE_CRYPTO_MBEDTLS > /** > @@ -354,11 +360,11 @@ void key_state_ssl_free(struct key_state_ssl *ks_ssl); > * > * @param ssl_ctx The TLS context to use when reloading the CRL > * @param crl_file The file name to load the CRL from, or > - * "[[INLINE]]" in the case of inline files. > - * @param crl_inline A string containing the CRL > + * an array containing the inline CRL. > + * @param crl_inline True if crl_file is an inline CRL. > */ > void backend_tls_ctx_reload_crl(struct tls_root_ctx *ssl_ctx, > - const char *crl_file, const char > *crl_inline); > + const char *crl_file, bool crl_inline); > > /** > * Keying Material Exporters [RFC 5705] allows additional keying material to > be > diff --git a/src/openvpn/ssl_common.h b/src/openvpn/ssl_common.h > index 9a16d77..75b129f 100644 > --- a/src/openvpn/ssl_common.h > +++ b/src/openvpn/ssl_common.h > @@ -266,7 +266,7 @@ struct tls_options > int verify_x509_type; > const char *verify_x509_name; > const char *crl_file; > - const char *crl_file_inline; > + bool crl_file_inline; > int ns_cert_type; > unsigned remote_cert_ku[MAX_PARMS]; > const char *remote_cert_eku; > diff --git a/src/openvpn/ssl_mbedtls.c b/src/openvpn/ssl_mbedtls.c > index 5c84e30..f5ff18b 100644 > --- a/src/openvpn/ssl_mbedtls.c > +++ b/src/openvpn/ssl_mbedtls.c > @@ -270,13 +270,13 @@ tls_ctx_check_cert_time(const struct tls_root_ctx *ctx) > > void > tls_ctx_load_dh_params(struct tls_root_ctx *ctx, const char *dh_file, > - const char *dh_inline > - ) > + bool dh_inline) > { > - if (!strcmp(dh_file, INLINE_FILE_TAG) && dh_inline) > + if (dh_inline) > { > if (!mbed_ok(mbedtls_dhm_parse_dhm(ctx->dhm_ctx, > - (const unsigned char *) > dh_inline, strlen(dh_inline)+1))) > + (const unsigned char *) dh_file, > + strlen(dh_file) + 1))) > { > msg(M_FATAL, "Cannot read inline DH parameters"); > } > @@ -306,9 +306,7 @@ tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, const > char *curve_name > > int > tls_ctx_load_pkcs12(struct tls_root_ctx *ctx, const char *pkcs12_file, > - const char *pkcs12_file_inline, > - bool load_ca_file > - ) > + bool pkcs12_file_inline, bool load_ca_file) > { > msg(M_FATAL, "PKCS #12 files not yet supported for mbed TLS."); > return 0; > @@ -324,8 +322,7 @@ tls_ctx_load_cryptoapi(struct tls_root_ctx *ctx, const > char *cryptoapi_cert) > > void > tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const char *cert_file, > - const char *cert_inline > - ) > + bool cert_inline) > { > ASSERT(NULL != ctx); > > @@ -334,10 +331,11 @@ tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const > char *cert_file, > ALLOC_OBJ_CLEAR(ctx->crt_chain, mbedtls_x509_crt); > } > > - if (!strcmp(cert_file, INLINE_FILE_TAG) && cert_inline) > + if (cert_inline) > { > if (!mbed_ok(mbedtls_x509_crt_parse(ctx->crt_chain, > - (const unsigned char *) > cert_inline, strlen(cert_inline)+1))) > + (const unsigned char *)cert_file, > + strlen(cert_file) + 1))) > { > msg(M_FATAL, "Cannot load inline certificate file"); > } > @@ -353,8 +351,7 @@ tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const > char *cert_file, > > int > tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const char *priv_key_file, > - const char *priv_key_inline > - ) > + bool priv_key_inline) > { > int status; > ASSERT(NULL != ctx); > @@ -364,19 +361,20 @@ tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const > char *priv_key_file, > ALLOC_OBJ_CLEAR(ctx->priv_key, mbedtls_pk_context); > } > > - if (!strcmp(priv_key_file, INLINE_FILE_TAG) && priv_key_inline) > + if (priv_key_inline) > { > status = mbedtls_pk_parse_key(ctx->priv_key, > - (const unsigned char *) > priv_key_inline, strlen(priv_key_inline)+1, > - NULL, 0); > + (const unsigned char *) priv_key_file, > + strlen(priv_key_file) + 1, NULL, 0); > > if (MBEDTLS_ERR_PK_PASSWORD_REQUIRED == status) > { > char passbuf[512] = {0}; > pem_password_callback(passbuf, 512, 0, NULL); > status = mbedtls_pk_parse_key(ctx->priv_key, > - (const unsigned char *) > priv_key_inline, > - strlen(priv_key_inline)+1, > (unsigned char *) passbuf, > + (const unsigned char *) > priv_key_file, > + strlen(priv_key_file) + 1, > + (unsigned char *) passbuf, > strlen(passbuf)); > } > } > @@ -398,7 +396,8 @@ tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const > char *priv_key_file, > management_auth_failure(management, UP_TYPE_PRIVATE_KEY, NULL); > } > #endif > - msg(M_WARN, "Cannot load private key file %s", priv_key_file); > + msg(M_WARN, "Cannot load private key file %s", > + print_if_inline(priv_key_file, priv_key_inline)); > return 1; > } > > @@ -571,7 +570,7 @@ external_key_len(void *vctx) > > int > tls_ctx_use_external_private_key(struct tls_root_ctx *ctx, > - const char *cert_file, const char > *cert_file_inline) > + const char *cert_file, bool > cert_file_inline) > { > ASSERT(NULL != ctx); > > @@ -598,18 +597,18 @@ tls_ctx_use_external_private_key(struct tls_root_ctx > *ctx, > > void > tls_ctx_load_ca(struct tls_root_ctx *ctx, const char *ca_file, > - const char *ca_inline, const char *ca_path, bool tls_server > - ) > + bool ca_inline, const char *ca_path, bool tls_server) > { > if (ca_path) > { > msg(M_FATAL, "ERROR: mbed TLS cannot handle the capath directive"); > } > > - if (ca_file && !strcmp(ca_file, INLINE_FILE_TAG) && ca_inline) > + if (ca_file && ca_inline) > { > if (!mbed_ok(mbedtls_x509_crt_parse(ctx->ca_chain, > - (const unsigned char *) > ca_inline, strlen(ca_inline)+1))) > + (const unsigned char *) ca_file, > + strlen(ca_file) + 1))) > { > msg(M_FATAL, "Cannot load inline CA certificates"); > } > @@ -626,8 +625,7 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > > void > tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, const char > *extra_certs_file, > - const char *extra_certs_inline > - ) > + bool extra_certs_inline) > { > ASSERT(NULL != ctx); > > @@ -636,11 +634,11 @@ tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, > const char *extra_certs_file, > ALLOC_OBJ_CLEAR(ctx->crt_chain, mbedtls_x509_crt); > } > > - if (!strcmp(extra_certs_file, INLINE_FILE_TAG) && extra_certs_inline) > + if (extra_certs_inline) > { > if (!mbed_ok(mbedtls_x509_crt_parse(ctx->crt_chain, > - (const unsigned char *) > extra_certs_inline, > - strlen(extra_certs_inline)+1))) > + (const unsigned char *) > extra_certs_file, > + strlen(extra_certs_file) + 1))) > { > msg(M_FATAL, "Cannot load inline extra-certs file"); > } > @@ -862,7 +860,7 @@ tls_version_to_major_minor(int tls_ver, int *major, int > *minor) { > > void > backend_tls_ctx_reload_crl(struct tls_root_ctx *ctx, const char *crl_file, > - const char *crl_inline) > + bool crl_inline) > { > ASSERT(crl_file); > > @@ -872,10 +870,11 @@ backend_tls_ctx_reload_crl(struct tls_root_ctx *ctx, > const char *crl_file, > } > mbedtls_x509_crl_free(ctx->crl); > > - if (!strcmp(crl_file, INLINE_FILE_TAG) && crl_inline) > + if (crl_inline) > { > if (!mbed_ok(mbedtls_x509_crl_parse(ctx->crl, > - (const unsigned char > *)crl_inline, strlen(crl_inline)+1))) > + (const unsigned char *)crl_file, > + strlen(crl_file) + 1))) > { > msg(M_WARN, "CRL: cannot parse inline CRL"); > goto err; > diff --git a/src/openvpn/ssl_openssl.c b/src/openvpn/ssl_openssl.c > index eae1e22..365b9fd 100644 > --- a/src/openvpn/ssl_openssl.c > +++ b/src/openvpn/ssl_openssl.c > @@ -432,17 +432,16 @@ cleanup: > > void > tls_ctx_load_dh_params(struct tls_root_ctx *ctx, const char *dh_file, > - const char *dh_file_inline > - ) > + bool dh_file_inline) > { > DH *dh; > BIO *bio; > > ASSERT(NULL != ctx); > > - if (!strcmp(dh_file, INLINE_FILE_TAG) && dh_file_inline) > + if (dh_file_inline) > { > - if (!(bio = BIO_new_mem_buf((char *)dh_file_inline, -1))) > + if (!(bio = BIO_new_mem_buf((char *)dh_file, -1))) > { > crypto_msg(M_FATAL, "Cannot open memory BIO for inline DH > parameters"); > } > @@ -461,7 +460,8 @@ tls_ctx_load_dh_params(struct tls_root_ctx *ctx, const > char *dh_file, > > if (!dh) > { > - crypto_msg(M_FATAL, "Cannot load DH parameters from %s", dh_file); > + crypto_msg(M_FATAL, "Cannot load DH parameters from %s", > + print_if_inline(dh_file, dh_file_inline)); > } > if (!SSL_CTX_set_tmp_dh(ctx->ctx, dh)) > { > @@ -556,9 +556,7 @@ tls_ctx_load_ecdh_params(struct tls_root_ctx *ctx, const > char *curve_name > > int > tls_ctx_load_pkcs12(struct tls_root_ctx *ctx, const char *pkcs12_file, > - const char *pkcs12_file_inline, > - bool load_ca_file > - ) > + bool pkcs12_file_inline, bool load_ca_file) > { > FILE *fp; > EVP_PKEY *pkey; > @@ -570,11 +568,11 @@ tls_ctx_load_pkcs12(struct tls_root_ctx *ctx, const > char *pkcs12_file, > > ASSERT(NULL != ctx); > > - if (!strcmp(pkcs12_file, INLINE_FILE_TAG) && pkcs12_file_inline) > + if (pkcs12_file_inline) > { > BIO *b64 = BIO_new(BIO_f_base64()); > - BIO *bio = BIO_new_mem_buf((void *) pkcs12_file_inline, > - (int) strlen(pkcs12_file_inline)); > + BIO *bio = BIO_new_mem_buf((void *) pkcs12_file, > + (int) strlen(pkcs12_file)); > ASSERT(b64 && bio); > BIO_push(b64, bio); > p12 = d2i_PKCS12_bio(b64, NULL); > @@ -719,14 +717,12 @@ tls_ctx_add_extra_certs(struct tls_root_ctx *ctx, BIO > *bio) > > /* Like tls_ctx_load_cert, but returns a copy of the certificate in **X509 */ > static void > -tls_ctx_load_cert_file_and_copy(struct tls_root_ctx *ctx, > - const char *cert_file, const char > *cert_file_inline, X509 **x509 > - ) > +tls_ctx_load_cert_file_and_copy(struct tls_root_ctx *ctx, const char > *cert_file, > + bool cert_file_inline, X509 **x509) > { > BIO *in = NULL; > X509 *x = NULL; > int ret = 0; > - bool inline_file = false; > > ASSERT(NULL != ctx); > if (NULL != x509) > @@ -734,11 +730,9 @@ tls_ctx_load_cert_file_and_copy(struct tls_root_ctx *ctx, > ASSERT(NULL == *x509); > } > > - inline_file = (strcmp(cert_file, INLINE_FILE_TAG) == 0); > - > - if (inline_file && cert_file_inline) > + if (cert_file_inline) > { > - in = BIO_new_mem_buf((char *)cert_file_inline, -1); > + in = BIO_new_mem_buf((char *) cert_file, -1); > } > else > { > @@ -768,7 +762,7 @@ tls_ctx_load_cert_file_and_copy(struct tls_root_ctx *ctx, > end: > if (!ret) > { > - if (inline_file) > + if (cert_file_inline) > { > crypto_msg(M_FATAL, "Cannot load inline certificate file"); > } > @@ -794,7 +788,7 @@ end: > > void > tls_ctx_load_cert_file(struct tls_root_ctx *ctx, const char *cert_file, > - const char *cert_file_inline) > + bool cert_file_inline) > { > tls_ctx_load_cert_file_and_copy(ctx, cert_file, cert_file_inline, NULL); > } > @@ -807,8 +801,7 @@ tls_ctx_free_cert_file(X509 *x509) > > int > tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const char *priv_key_file, > - const char *priv_key_file_inline > - ) > + bool priv_key_file_inline) > { > SSL_CTX *ssl_ctx = NULL; > BIO *in = NULL; > @@ -819,9 +812,9 @@ tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const > char *priv_key_file, > > ssl_ctx = ctx->ctx; > > - if (!strcmp(priv_key_file, INLINE_FILE_TAG) && priv_key_file_inline) > + if (priv_key_file_inline) > { > - in = BIO_new_mem_buf((char *)priv_key_file_inline, -1); > + in = BIO_new_mem_buf((char *) priv_key_file, -1); > } > else > { > @@ -849,7 +842,8 @@ tls_ctx_load_priv_file(struct tls_root_ctx *ctx, const > char *priv_key_file, > management_auth_failure(management, UP_TYPE_PRIVATE_KEY, NULL); > } > #endif > - crypto_msg(M_WARN, "Cannot load private key file %s", priv_key_file); > + crypto_msg(M_WARN, "Cannot load private key file %s", > + print_if_inline(priv_key_file, priv_key_file_inline)); > goto end; > } > > @@ -874,7 +868,7 @@ end: > > void > backend_tls_ctx_reload_crl(struct tls_root_ctx *ssl_ctx, const char > *crl_file, > - const char *crl_inline) > + bool crl_inline) > { > X509_CRL *crl = NULL; > BIO *in = NULL; > @@ -902,9 +896,9 @@ backend_tls_ctx_reload_crl(struct tls_root_ctx *ssl_ctx, > const char *crl_file, > > X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | > X509_V_FLAG_CRL_CHECK_ALL); > > - if (!strcmp(crl_file, INLINE_FILE_TAG) && crl_inline) > + if (crl_inline) > { > - in = BIO_new_mem_buf((char *)crl_inline, -1); > + in = BIO_new_mem_buf((char *) crl_file, -1); > } > else > { > @@ -913,20 +907,23 @@ backend_tls_ctx_reload_crl(struct tls_root_ctx > *ssl_ctx, const char *crl_file, > > if (in == NULL) > { > - msg(M_WARN, "CRL: cannot read: %s", crl_file); > + msg(M_WARN, "CRL: cannot read: %s", > + print_if_inline(crl_file, crl_inline)); > goto end; > } > > crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL); > if (crl == NULL) > { > - msg(M_WARN, "CRL: cannot read CRL from file %s", crl_file); > + msg(M_WARN, "CRL: cannot read CRL from file %s", > + print_if_inline(crl_file, crl_inline)); > goto end; > } > > if (!X509_STORE_add_crl(store, crl)) > { > - msg(M_WARN, "CRL: cannot add %s to store", crl_file); > + msg(M_WARN, "CRL: cannot add %s to store", > + print_if_inline(crl_file, crl_inline)); > goto end; > } > > @@ -1027,7 +1024,7 @@ done: > > int > tls_ctx_use_external_private_key(struct tls_root_ctx *ctx, > - const char *cert_file, const char > *cert_file_inline) > + const char *cert_file, bool > cert_file_inline) > { > RSA *rsa = NULL; > RSA *pub_rsa; > @@ -1112,9 +1109,7 @@ sk_x509_name_cmp(const X509_NAME *const *a, const > X509_NAME *const *b) > > void > tls_ctx_load_ca(struct tls_root_ctx *ctx, const char *ca_file, > - const char *ca_file_inline, > - const char *ca_path, bool tls_server > - ) > + bool ca_file_inline, const char *ca_path, bool tls_server) > { > STACK_OF(X509_INFO) *info_stack = NULL; > STACK_OF(X509_NAME) *cert_names = NULL; > @@ -1135,9 +1130,9 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > /* Try to add certificates and CRLs from ca_file */ > if (ca_file) > { > - if (!strcmp(ca_file, INLINE_FILE_TAG) && ca_file_inline) > + if (ca_file_inline) > { > - in = BIO_new_mem_buf((char *)ca_file_inline, -1); > + in = BIO_new_mem_buf((char *)ca_file, -1); > } > else > { > @@ -1209,11 +1204,12 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > { > crypto_msg(M_WARN, > "Cannot load CA certificate file %s > (entry %d did not validate)", > - np(ca_file), added); > + > + print_if_inline(ca_file, > ca_file_inline), > + added); Indenting looks off. > } > prev = cnum; > } > - > } > sk_X509_INFO_pop_free(info_stack, X509_INFO_free); > } > @@ -1227,7 +1223,7 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > { > crypto_msg(M_FATAL, > "Cannot load CA certificate file %s (no entries were > read)", > - np(ca_file)); > + print_if_inline(ca_file, ca_file_inline)); > } > > if (tls_server) > @@ -1237,7 +1233,8 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > { > crypto_msg(M_FATAL, "Cannot load CA certificate file %s > (only %d " > "of %d entries were valid X509 names)", > - np(ca_file), cnum, added); > + print_if_inline(ca_file, ca_file_inline), cnum, > + added); > } > } > > @@ -1265,13 +1262,12 @@ tls_ctx_load_ca(struct tls_root_ctx *ctx, const char > *ca_file, > > void > tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, const char > *extra_certs_file, > - const char *extra_certs_file_inline > - ) > + bool extra_certs_file_inline) > { > BIO *in; > - if (!strcmp(extra_certs_file, INLINE_FILE_TAG) && > extra_certs_file_inline) > + if (extra_certs_file_inline) > { > - in = BIO_new_mem_buf((char *)extra_certs_file_inline, -1); > + in = BIO_new_mem_buf((char *)extra_certs_file, -1); > } > else > { > @@ -1280,7 +1276,9 @@ tls_ctx_load_extra_certs(struct tls_root_ctx *ctx, > const char *extra_certs_file, > > if (in == NULL) > { > - crypto_msg(M_FATAL, "Cannot load extra-certs file: %s", > extra_certs_file); > + crypto_msg(M_FATAL, "Cannot load extra-certs file: %s", > + print_if_inline(extra_certs_file, > extra_certs_file_inline)); > + > } > else > { > diff --git a/src/openvpn/tls_crypt.c b/src/openvpn/tls_crypt.c > index c227b09..383c8ca 100644 > --- a/src/openvpn/tls_crypt.c > +++ b/src/openvpn/tls_crypt.c > @@ -44,7 +44,7 @@ tls_crypt_buf_overhead(void) > > void > tls_crypt_init_key(struct key_ctx_bi *key, const char *key_file, > - const char *key_inline, bool tls_server) { > + bool key_inline, bool tls_server) { > const int key_direction = tls_server ? > KEY_DIRECTION_NORMAL : KEY_DIRECTION_INVERSE; > > diff --git a/src/openvpn/tls_crypt.h b/src/openvpn/tls_crypt.h > index 47f75d0..801127b 100644 > --- a/src/openvpn/tls_crypt.h > +++ b/src/openvpn/tls_crypt.h > @@ -92,13 +92,14 @@ > * > * @param key The key context to initialize > * @param key_file The file to read the key from (or the inline tag to > - * indicate and inline key). > - * @param key_inline Array containing (zero-terminated) inline key, or > NULL > - * if not used. > + * indicate and inline key) or an array containing > + * (zero-terminated) inline key. > + * @param key_inline True if key_file contains an inline key, False > + * otherwise. > * @param tls_server Must be set to true is this is a TLS server instance. > */ > void tls_crypt_init_key(struct key_ctx_bi *key, const char *key_file, > - const char *key_inline, bool tls_server); > + bool key_inline, bool tls_server); > > /** > * Returns the maximum overhead (in bytes) added to the destination buffer by > -Steffan ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel