mirror of
https://github.com/openssl/openssl.git
synced 2024-11-21 01:15:20 +08:00
Add NCONF_get_section_names()
And a few additional fixups to make the no-deprecated configuration to build. Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15466)
This commit is contained in:
parent
6b750b89ee
commit
b3c2ed7043
@ -47,7 +47,7 @@ breaking changes, and mappings for the large list of deprecated functions.
|
||||
* The public definitions of conf_method_st and conf_st have been
|
||||
deprecated. They will be made opaque in a future release.
|
||||
|
||||
* Rich Salz *
|
||||
*Rich Salz and Tomáš Mráz*
|
||||
|
||||
* Client-initiated renegotiation is disabled by default. To allow it, use
|
||||
the -client_renegotiation option, the SSL_OP_ALLOW_CLIENT_RENEGOTIATION
|
||||
|
@ -20,11 +20,6 @@
|
||||
static void value_free_hash(const CONF_VALUE *a, LHASH_OF(CONF_VALUE) *conf);
|
||||
static void value_free_stack_doall(CONF_VALUE *a);
|
||||
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(CONF *conf)
|
||||
{
|
||||
return conf->libctx;
|
||||
}
|
||||
|
||||
CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section)
|
||||
{
|
||||
CONF_VALUE vv;
|
||||
|
@ -215,6 +215,38 @@ void NCONF_free_data(CONF *conf)
|
||||
conf->meth->destroy_data(conf);
|
||||
}
|
||||
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf)
|
||||
{
|
||||
return conf->libctx;
|
||||
}
|
||||
|
||||
typedef STACK_OF(OPENSSL_CSTRING) SECTION_NAMES;
|
||||
|
||||
IMPLEMENT_LHASH_DOALL_ARG_CONST(CONF_VALUE, SECTION_NAMES);
|
||||
|
||||
static void collect_section_name(const CONF_VALUE *v, SECTION_NAMES *names)
|
||||
{
|
||||
/* A section is a CONF_VALUE with name == NULL */
|
||||
if (v->name == NULL)
|
||||
sk_OPENSSL_CSTRING_push(names, v->section);
|
||||
}
|
||||
|
||||
static int section_name_cmp(OPENSSL_CSTRING const *a, OPENSSL_CSTRING const *b)
|
||||
{
|
||||
return strcmp(*a, *b);
|
||||
}
|
||||
|
||||
STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *cnf)
|
||||
{
|
||||
SECTION_NAMES *names;
|
||||
|
||||
if ((names = sk_OPENSSL_CSTRING_new(section_name_cmp)) == NULL)
|
||||
return NULL;
|
||||
lh_CONF_VALUE_doall_SECTION_NAMES(cnf->data, collect_section_name, names);
|
||||
sk_OPENSSL_CSTRING_sort(names);
|
||||
return names;
|
||||
}
|
||||
|
||||
int NCONF_load(CONF *conf, const char *file, long *eline)
|
||||
{
|
||||
if (conf == NULL) {
|
||||
|
@ -480,18 +480,29 @@ int X509V3_set_issuer_pkey(X509V3_CTX *ctx, EVP_PKEY *pkey)
|
||||
X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
const char *name, const char *value)
|
||||
{
|
||||
CONF ctmp;
|
||||
CONF *ctmp;
|
||||
X509_EXTENSION *ret;
|
||||
|
||||
CONF_set_nconf(&ctmp, conf);
|
||||
return X509V3_EXT_nconf(&ctmp, ctx, name, value);
|
||||
if ((ctmp = NCONF_new(NULL)) == NULL)
|
||||
return NULL;
|
||||
CONF_set_nconf(ctmp, conf);
|
||||
ret = X509V3_EXT_nconf(ctmp, ctx, name, value);
|
||||
NCONF_free(ctmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf,
|
||||
X509V3_CTX *ctx, int ext_nid, const char *value)
|
||||
{
|
||||
CONF ctmp;
|
||||
CONF_set_nconf(&ctmp, conf);
|
||||
return X509V3_EXT_nconf_nid(&ctmp, ctx, ext_nid, value);
|
||||
CONF *ctmp;
|
||||
X509_EXTENSION *ret;
|
||||
|
||||
if ((ctmp = NCONF_new(NULL)) == NULL)
|
||||
return NULL;
|
||||
CONF_set_nconf(ctmp, conf);
|
||||
ret = X509V3_EXT_nconf_nid(ctmp, ctx, ext_nid, value);
|
||||
NCONF_free(ctmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *conf_lhash_get_string(void *db, const char *section, const char *value)
|
||||
@ -524,10 +535,15 @@ void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash)
|
||||
int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
const char *section, X509 *cert)
|
||||
{
|
||||
CONF ctmp;
|
||||
CONF *ctmp;
|
||||
int ret;
|
||||
|
||||
CONF_set_nconf(&ctmp, conf);
|
||||
return X509V3_EXT_add_nconf(&ctmp, ctx, section, cert);
|
||||
if ((ctmp = NCONF_new(NULL)) == NULL)
|
||||
return 0;
|
||||
CONF_set_nconf(ctmp, conf);
|
||||
ret = X509V3_EXT_add_nconf(ctmp, ctx, section, cert);
|
||||
NCONF_free(ctmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Same as above but for a CRL */
|
||||
@ -535,10 +551,15 @@ int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
const char *section, X509_CRL *crl)
|
||||
{
|
||||
CONF ctmp;
|
||||
CONF *ctmp;
|
||||
int ret;
|
||||
|
||||
CONF_set_nconf(&ctmp, conf);
|
||||
return X509V3_EXT_CRL_add_nconf(&ctmp, ctx, section, crl);
|
||||
if ((ctmp = NCONF_new(NULL)) == NULL)
|
||||
return 0;
|
||||
CONF_set_nconf(ctmp, conf);
|
||||
ret = X509V3_EXT_CRL_add_nconf(ctmp, ctx, section, crl);
|
||||
NCONF_free(ctmp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Add extensions to certificate request */
|
||||
@ -546,8 +567,13 @@ int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx,
|
||||
const char *section, X509_REQ *req)
|
||||
{
|
||||
CONF ctmp;
|
||||
CONF *ctmp;
|
||||
int ret;
|
||||
|
||||
CONF_set_nconf(&ctmp, conf);
|
||||
return X509V3_EXT_REQ_add_nconf(&ctmp, ctx, section, req);
|
||||
if ((ctmp = NCONF_new(NULL)) == NULL)
|
||||
return 0;
|
||||
CONF_set_nconf(ctmp, conf);
|
||||
ret = X509V3_EXT_REQ_add_nconf(ctmp, ctx, section, req);
|
||||
NCONF_free(ctmp);
|
||||
return ret;
|
||||
}
|
||||
|
@ -3,19 +3,28 @@
|
||||
=head1 NAME
|
||||
|
||||
NCONF_new_ex, NCONF_new, NCONF_free, NCONF_default, NCONF_load,
|
||||
NCONF_get0_libctx
|
||||
NCONF_get0_libctx, NCONF_get_section, NCONF_get_section_names
|
||||
- functionality to Load and parse configuration files manually
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/conf.h>
|
||||
|
||||
typedef struct {
|
||||
char *section;
|
||||
char *name;
|
||||
char *value;
|
||||
} CONF_VALUE;
|
||||
|
||||
CONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth);
|
||||
CONF *NCONF_new(CONF_METHOD *meth);
|
||||
void NCONF_free(CONF *conf);
|
||||
CONF_METHOD *NCONF_default(void);
|
||||
int NCONF_load(CONF *conf, const char *file, long *eline);
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(CONF *conf);
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf);
|
||||
|
||||
STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *name);
|
||||
STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *conf);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@ -37,6 +46,16 @@ NCONF_default() gets the default method table for processing a configuration fil
|
||||
NCONF_get0_libctx() gets the library context associated with the I<conf>
|
||||
parameter.
|
||||
|
||||
NCONF_get_section_names() gets the names of the sections associated with
|
||||
the I<conf> as B<STACK_OF(OPENSSL_CSTRING)> strings. The individual strings
|
||||
are associated with the I<conf> and will be invalid after I<conf> is
|
||||
freed. The returned stack must be freed with sk_OPENSSL_CSTRING_free().
|
||||
|
||||
NCONF_get_section() gets the config values associated with the I<conf> from
|
||||
the config section I<name> as B<STACK_OF(CONF_VALUE)> structures. The returned
|
||||
stack is associated with the I<conf> and will be invalid after I<conf>
|
||||
is freed. It must not be freed by the caller.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
NCONF_load() returns 1 on success or 0 on error.
|
||||
@ -50,11 +69,12 @@ L<CONF_modules_load_file(3)>,
|
||||
|
||||
=head1 HISTORY
|
||||
|
||||
NCONF_new_ex() was added in OpenSSL 3.0.
|
||||
NCONF_new_ex(), NCONF_get0_libctx(), and NCONF_get_section_names() were added
|
||||
in OpenSSL 3.0.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
this file except in compliance with the License. You can obtain a copy
|
||||
|
@ -106,7 +106,7 @@ OSSL_DEPRECATEDIN_1_1_0 void OPENSSL_config(const char *config_name);
|
||||
*/
|
||||
|
||||
CONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth);
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(CONF *conf);
|
||||
OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf);
|
||||
CONF *NCONF_new(CONF_METHOD *meth);
|
||||
CONF_METHOD *NCONF_default(void);
|
||||
#ifndef OPENSSL_NO_DEPRECATED_3_0
|
||||
@ -120,6 +120,7 @@ int NCONF_load(CONF *conf, const char *file, long *eline);
|
||||
int NCONF_load_fp(CONF *conf, FILE *fp, long *eline);
|
||||
# endif
|
||||
int NCONF_load_bio(CONF *conf, BIO *bp, long *eline);
|
||||
STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *conf);
|
||||
STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf,
|
||||
const char *section);
|
||||
char *NCONF_get_string(const CONF *conf, const char *group, const char *name);
|
||||
|
@ -14,27 +14,6 @@
|
||||
#include <openssl/safestack.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
static STACK_OF(OPENSSL_CSTRING) *section_names = NULL;
|
||||
|
||||
static void collect_section_name(CONF_VALUE *v)
|
||||
{
|
||||
/* A section is a CONF_VALUE with name == NULL */
|
||||
if (v->name == NULL)
|
||||
sk_OPENSSL_CSTRING_push(section_names, v->section);
|
||||
}
|
||||
|
||||
static int section_name_cmp(OPENSSL_CSTRING const *a, OPENSSL_CSTRING const *b)
|
||||
{
|
||||
return strcmp(*a, *b);
|
||||
}
|
||||
|
||||
static void collect_all_sections(const CONF *cnf)
|
||||
{
|
||||
section_names = sk_OPENSSL_CSTRING_new(section_name_cmp);
|
||||
lh_CONF_VALUE_doall(cnf->data, collect_section_name);
|
||||
sk_OPENSSL_CSTRING_sort(section_names);
|
||||
}
|
||||
|
||||
static void dump_section(const char *name, const CONF *cnf)
|
||||
{
|
||||
STACK_OF(CONF_VALUE) *sect = NCONF_get_section(cnf, name);
|
||||
@ -53,11 +32,12 @@ int main(int argc, char **argv)
|
||||
long eline;
|
||||
CONF *conf = NCONF_new(NCONF_default());
|
||||
int ret = 1;
|
||||
STACK_OF(OPENSSL_CSTRING) *section_names = NULL;
|
||||
|
||||
if (conf != NULL && NCONF_load(conf, argv[1], &eline)) {
|
||||
int i;
|
||||
|
||||
collect_all_sections(conf);
|
||||
section_names = NCONF_get_section_names(conf);
|
||||
for (i = 0; i < sk_OPENSSL_CSTRING_num(section_names); i++) {
|
||||
dump_section(sk_OPENSSL_CSTRING_value(section_names, i), conf);
|
||||
}
|
||||
|
@ -5419,3 +5419,4 @@ BIO_debug_callback_ex 5546 3_0_0 EXIST::FUNCTION:
|
||||
b2i_PVK_bio_ex 5547 3_0_0 EXIST::FUNCTION:
|
||||
i2b_PVK_bio_ex 5548 3_0_0 EXIST::FUNCTION:
|
||||
NCONF_get0_libctx 5547 3_0_0 EXIST::FUNCTION:
|
||||
NCONF_get_section_names 5548 3_0_0 EXIST::FUNCTION:
|
||||
|
Loading…
Reference in New Issue
Block a user