2 * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
13 #include "internal/conf.h"
14 #include "crypto/ctype.h"
15 #include <openssl/crypto.h>
16 #include <openssl/err.h>
17 #include <openssl/conf.h>
18 #include <openssl/conf_api.h>
19 #include "conf_local.h"
20 #include <openssl/lhash.h>
22 static CONF_METHOD
*default_CONF_method
= NULL
;
24 /* Init a 'CONF' structure from an old LHASH */
26 void CONF_set_nconf(CONF
*conf
, LHASH_OF(CONF_VALUE
) *hash
)
28 if (default_CONF_method
== NULL
)
29 default_CONF_method
= NCONF_default();
31 default_CONF_method
->init(conf
);
36 * The following section contains the "CONF classic" functions, rewritten in
37 * terms of the new CONF interface.
40 int CONF_set_default_method(CONF_METHOD
*meth
)
42 default_CONF_method
= meth
;
46 LHASH_OF(CONF_VALUE
) *CONF_load(LHASH_OF(CONF_VALUE
) *conf
, const char *file
,
49 LHASH_OF(CONF_VALUE
) *ltmp
;
52 #ifdef OPENSSL_SYS_VMS
53 in
= BIO_new_file(file
, "r");
55 in
= BIO_new_file(file
, "rb");
58 ERR_raise(ERR_LIB_CONF
, ERR_R_SYS_LIB
);
62 ltmp
= CONF_load_bio(conf
, in
, eline
);
68 #ifndef OPENSSL_NO_STDIO
69 LHASH_OF(CONF_VALUE
) *CONF_load_fp(LHASH_OF(CONF_VALUE
) *conf
, FILE *fp
,
73 LHASH_OF(CONF_VALUE
) *ltmp
;
74 if ((btmp
= BIO_new_fp(fp
, BIO_NOCLOSE
)) == NULL
) {
75 ERR_raise(ERR_LIB_CONF
, ERR_R_BUF_LIB
);
78 ltmp
= CONF_load_bio(conf
, btmp
, eline
);
84 LHASH_OF(CONF_VALUE
) *CONF_load_bio(LHASH_OF(CONF_VALUE
) *conf
, BIO
*bp
,
90 CONF_set_nconf(&ctmp
, conf
);
92 ret
= NCONF_load_bio(&ctmp
, bp
, eline
);
98 STACK_OF(CONF_VALUE
) *CONF_get_section(LHASH_OF(CONF_VALUE
) *conf
,
106 CONF_set_nconf(&ctmp
, conf
);
107 return NCONF_get_section(&ctmp
, section
);
111 char *CONF_get_string(LHASH_OF(CONF_VALUE
) *conf
, const char *group
,
115 return NCONF_get_string(NULL
, group
, name
);
119 CONF_set_nconf(&ctmp
, conf
);
120 return NCONF_get_string(&ctmp
, group
, name
);
124 long CONF_get_number(LHASH_OF(CONF_VALUE
) *conf
, const char *group
,
132 status
= NCONF_get_number_e(NULL
, group
, name
, &result
);
136 CONF_set_nconf(&ctmp
, conf
);
137 status
= NCONF_get_number_e(&ctmp
, group
, name
, &result
);
140 return status
== 0 ? 0L : result
;
143 void CONF_free(LHASH_OF(CONF_VALUE
) *conf
)
146 CONF_set_nconf(&ctmp
, conf
);
147 NCONF_free_data(&ctmp
);
150 #ifndef OPENSSL_NO_STDIO
151 int CONF_dump_fp(LHASH_OF(CONF_VALUE
) *conf
, FILE *out
)
156 if ((btmp
= BIO_new_fp(out
, BIO_NOCLOSE
)) == NULL
) {
157 ERR_raise(ERR_LIB_CONF
, ERR_R_BUF_LIB
);
160 ret
= CONF_dump_bio(conf
, btmp
);
166 int CONF_dump_bio(LHASH_OF(CONF_VALUE
) *conf
, BIO
*out
)
170 CONF_set_nconf(&ctmp
, conf
);
171 return NCONF_dump_bio(&ctmp
, out
);
175 * The following section contains the "New CONF" functions. They are
176 * completely centralised around a new CONF structure that may contain
177 * basically anything, but at least a method pointer and a table of data.
178 * These functions are also written in terms of the bridge functions used by
179 * the "CONF classic" functions, for consistency.
182 CONF
*NCONF_new_ex(OSSL_LIB_CTX
*libctx
, CONF_METHOD
*meth
)
187 meth
= NCONF_default();
189 ret
= meth
->create(meth
);
191 ERR_raise(ERR_LIB_CONF
, ERR_R_MALLOC_FAILURE
);
194 ret
->libctx
= libctx
;
199 CONF
*NCONF_new(CONF_METHOD
*meth
)
201 return NCONF_new_ex(NULL
, meth
);
204 void NCONF_free(CONF
*conf
)
208 conf
->meth
->destroy(conf
);
211 void NCONF_free_data(CONF
*conf
)
215 conf
->meth
->destroy_data(conf
);
218 int NCONF_load(CONF
*conf
, const char *file
, long *eline
)
221 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_CONF
);
225 return conf
->meth
->load(conf
, file
, eline
);
228 #ifndef OPENSSL_NO_STDIO
229 int NCONF_load_fp(CONF
*conf
, FILE *fp
, long *eline
)
233 if ((btmp
= BIO_new_fp(fp
, BIO_NOCLOSE
)) == NULL
) {
234 ERR_raise(ERR_LIB_CONF
, ERR_R_BUF_LIB
);
237 ret
= NCONF_load_bio(conf
, btmp
, eline
);
243 int NCONF_load_bio(CONF
*conf
, BIO
*bp
, long *eline
)
246 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_CONF
);
250 return conf
->meth
->load_bio(conf
, bp
, eline
);
253 STACK_OF(CONF_VALUE
) *NCONF_get_section(const CONF
*conf
, const char *section
)
256 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_CONF
);
260 if (section
== NULL
) {
261 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_SECTION
);
265 return _CONF_get_section_values(conf
, section
);
268 char *NCONF_get_string(const CONF
*conf
, const char *group
, const char *name
)
270 char *s
= _CONF_get_string(conf
, group
, name
);
273 * Since we may get a value from an environment variable even if conf is
274 * NULL, let's check the value first
280 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE
);
283 ERR_raise_data(ERR_LIB_CONF
, CONF_R_NO_VALUE
,
284 "group=%s name=%s", group
, name
);
288 static int default_is_number(const CONF
*conf
, char c
)
290 return ossl_isdigit(c
);
293 static int default_to_int(const CONF
*conf
, char c
)
295 return (int)(c
- '0');
298 int NCONF_get_number_e(const CONF
*conf
, const char *group
, const char *name
,
303 int (*is_number
)(const CONF
*, char) = &default_is_number
;
304 int (*to_int
)(const CONF
*, char) = &default_to_int
;
306 if (result
== NULL
) {
307 ERR_raise(ERR_LIB_CONF
, ERR_R_PASSED_NULL_PARAMETER
);
311 str
= NCONF_get_string(conf
, group
, name
);
317 if (conf
->meth
->is_number
!= NULL
)
318 is_number
= conf
->meth
->is_number
;
319 if (conf
->meth
->to_int
!= NULL
)
320 to_int
= conf
->meth
->to_int
;
322 for (res
= 0; is_number(conf
, *str
); str
++) {
323 const int d
= to_int(conf
, *str
);
325 if (res
> (LONG_MAX
- d
) / 10L) {
326 ERR_raise(ERR_LIB_CONF
, CONF_R_NUMBER_TOO_LARGE
);
336 long _CONF_get_number(const CONF
*conf
, const char *section
,
343 status
= NCONF_get_number_e(conf
, section
, name
, &result
);
345 return status
== 0 ? 0L : result
;
348 #ifndef OPENSSL_NO_STDIO
349 int NCONF_dump_fp(const CONF
*conf
, FILE *out
)
353 if ((btmp
= BIO_new_fp(out
, BIO_NOCLOSE
)) == NULL
) {
354 ERR_raise(ERR_LIB_CONF
, ERR_R_BUF_LIB
);
357 ret
= NCONF_dump_bio(conf
, btmp
);
363 int NCONF_dump_bio(const CONF
*conf
, BIO
*out
)
366 ERR_raise(ERR_LIB_CONF
, CONF_R_NO_CONF
);
370 return conf
->meth
->dump(conf
, out
);
374 * These routines call the C malloc/free, to avoid intermixing with
375 * OpenSSL function pointers before the library is initialized.
377 OPENSSL_INIT_SETTINGS
*OPENSSL_INIT_new(void)
379 OPENSSL_INIT_SETTINGS
*ret
= malloc(sizeof(*ret
));
384 memset(ret
, 0, sizeof(*ret
));
385 ret
->flags
= DEFAULT_CONF_MFLAGS
;
391 #ifndef OPENSSL_NO_STDIO
392 int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS
*settings
,
393 const char *filename
)
395 char *newfilename
= NULL
;
397 if (filename
!= NULL
) {
398 newfilename
= strdup(filename
);
399 if (newfilename
== NULL
)
403 free(settings
->filename
);
404 settings
->filename
= newfilename
;
409 void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS
*settings
,
412 settings
->flags
= flags
;
415 int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS
*settings
,
418 char *newappname
= NULL
;
420 if (appname
!= NULL
) {
421 newappname
= strdup(appname
);
422 if (newappname
== NULL
)
426 free(settings
->appname
);
427 settings
->appname
= newappname
;
433 void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS
*settings
)
435 free(settings
->filename
);
436 free(settings
->appname
);