1*40e63673Sop /* $OpenBSD: ts_conf.c,v 1.15 2024/08/26 22:01:28 op Exp $ */ 2f1535dc8Sdjm /* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL 3f1535dc8Sdjm * project 2002. 4f1535dc8Sdjm */ 5f1535dc8Sdjm /* ==================================================================== 6f1535dc8Sdjm * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 7f1535dc8Sdjm * 8f1535dc8Sdjm * Redistribution and use in source and binary forms, with or without 9f1535dc8Sdjm * modification, are permitted provided that the following conditions 10f1535dc8Sdjm * are met: 11f1535dc8Sdjm * 12f1535dc8Sdjm * 1. Redistributions of source code must retain the above copyright 13f1535dc8Sdjm * notice, this list of conditions and the following disclaimer. 14f1535dc8Sdjm * 15f1535dc8Sdjm * 2. Redistributions in binary form must reproduce the above copyright 16f1535dc8Sdjm * notice, this list of conditions and the following disclaimer in 17f1535dc8Sdjm * the documentation and/or other materials provided with the 18f1535dc8Sdjm * distribution. 19f1535dc8Sdjm * 20f1535dc8Sdjm * 3. All advertising materials mentioning features or use of this 21f1535dc8Sdjm * software must display the following acknowledgment: 22f1535dc8Sdjm * "This product includes software developed by the OpenSSL Project 23f1535dc8Sdjm * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24f1535dc8Sdjm * 25f1535dc8Sdjm * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26f1535dc8Sdjm * endorse or promote products derived from this software without 27f1535dc8Sdjm * prior written permission. For written permission, please contact 28f1535dc8Sdjm * licensing@OpenSSL.org. 29f1535dc8Sdjm * 30f1535dc8Sdjm * 5. Products derived from this software may not be called "OpenSSL" 31f1535dc8Sdjm * nor may "OpenSSL" appear in their names without prior written 32f1535dc8Sdjm * permission of the OpenSSL Project. 33f1535dc8Sdjm * 34f1535dc8Sdjm * 6. Redistributions of any form whatsoever must retain the following 35f1535dc8Sdjm * acknowledgment: 36f1535dc8Sdjm * "This product includes software developed by the OpenSSL Project 37f1535dc8Sdjm * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38f1535dc8Sdjm * 39f1535dc8Sdjm * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40f1535dc8Sdjm * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41f1535dc8Sdjm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42f1535dc8Sdjm * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43f1535dc8Sdjm * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44f1535dc8Sdjm * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45f1535dc8Sdjm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46f1535dc8Sdjm * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47f1535dc8Sdjm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48f1535dc8Sdjm * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49f1535dc8Sdjm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50f1535dc8Sdjm * OF THE POSSIBILITY OF SUCH DAMAGE. 51f1535dc8Sdjm * ==================================================================== 52f1535dc8Sdjm * 53f1535dc8Sdjm * This product includes cryptographic software written by Eric Young 54f1535dc8Sdjm * (eay@cryptsoft.com). This product includes software written by Tim 55f1535dc8Sdjm * Hudson (tjh@cryptsoft.com). 56f1535dc8Sdjm * 57f1535dc8Sdjm */ 58f1535dc8Sdjm 59*40e63673Sop #include <limits.h> 60*40e63673Sop #include <stdlib.h> 61f1535dc8Sdjm #include <string.h> 62f1535dc8Sdjm 638cf4d6a6Sjsing #include <openssl/opensslconf.h> 648cf4d6a6Sjsing 65f1535dc8Sdjm #include <openssl/crypto.h> 66a7b8f3c1Sdoug #include <openssl/err.h> 67f1535dc8Sdjm #include <openssl/pem.h> 68b6ab114eSjsing #include <openssl/ts.h> 69b6ab114eSjsing 70f1535dc8Sdjm /* Macro definitions for the configuration file. */ 71f1535dc8Sdjm 72f1535dc8Sdjm #define BASE_SECTION "tsa" 73f1535dc8Sdjm #define ENV_DEFAULT_TSA "default_tsa" 74f1535dc8Sdjm #define ENV_SERIAL "serial" 75f1535dc8Sdjm #define ENV_CRYPTO_DEVICE "crypto_device" 76f1535dc8Sdjm #define ENV_SIGNER_CERT "signer_cert" 77f1535dc8Sdjm #define ENV_CERTS "certs" 78f1535dc8Sdjm #define ENV_SIGNER_KEY "signer_key" 79f1535dc8Sdjm #define ENV_DEFAULT_POLICY "default_policy" 80f1535dc8Sdjm #define ENV_OTHER_POLICIES "other_policies" 81f1535dc8Sdjm #define ENV_DIGESTS "digests" 82f1535dc8Sdjm #define ENV_ACCURACY "accuracy" 83f1535dc8Sdjm #define ENV_ORDERING "ordering" 84f1535dc8Sdjm #define ENV_TSA_NAME "tsa_name" 85f1535dc8Sdjm #define ENV_ESS_CERT_ID_CHAIN "ess_cert_id_chain" 86f1535dc8Sdjm #define ENV_VALUE_SECS "secs" 87f1535dc8Sdjm #define ENV_VALUE_MILLISECS "millisecs" 88f1535dc8Sdjm #define ENV_VALUE_MICROSECS "microsecs" 89f1535dc8Sdjm #define ENV_CLOCK_PRECISION_DIGITS "clock_precision_digits" 90f1535dc8Sdjm #define ENV_VALUE_YES "yes" 91f1535dc8Sdjm #define ENV_VALUE_NO "no" 92f1535dc8Sdjm 93f1535dc8Sdjm /* Function definitions for certificate and key loading. */ 94f1535dc8Sdjm 95ec7cdc12Sjsing X509 * 96ec7cdc12Sjsing TS_CONF_load_cert(const char *file) 97f1535dc8Sdjm { 98f1535dc8Sdjm BIO *cert = NULL; 99f1535dc8Sdjm X509 *x = NULL; 100f1535dc8Sdjm 101ec7cdc12Sjsing if ((cert = BIO_new_file(file, "r")) == NULL) 102ec7cdc12Sjsing goto end; 103f1535dc8Sdjm x = PEM_read_bio_X509_AUX(cert, NULL, NULL, NULL); 104ec7cdc12Sjsing 105f1535dc8Sdjm end: 106f1535dc8Sdjm if (x == NULL) 107f1535dc8Sdjm fprintf(stderr, "unable to load certificate: %s\n", file); 108f1535dc8Sdjm BIO_free(cert); 109f1535dc8Sdjm return x; 110f1535dc8Sdjm } 111bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_load_cert); 112f1535dc8Sdjm 1136d179423Smiod STACK_OF(X509) * 1146d179423Smiod TS_CONF_load_certs(const char *file) 115f1535dc8Sdjm { 116f1535dc8Sdjm BIO *certs = NULL; 117f1535dc8Sdjm STACK_OF(X509) *othercerts = NULL; 118f1535dc8Sdjm STACK_OF(X509_INFO) *allcerts = NULL; 119f1535dc8Sdjm int i; 120f1535dc8Sdjm 121ec7cdc12Sjsing if (!(certs = BIO_new_file(file, "r"))) 122ec7cdc12Sjsing goto end; 123f1535dc8Sdjm 124ec7cdc12Sjsing if (!(othercerts = sk_X509_new_null())) 125ec7cdc12Sjsing goto end; 126f1535dc8Sdjm allcerts = PEM_X509_INFO_read_bio(certs, NULL, NULL, NULL); 127ec7cdc12Sjsing for (i = 0; i < sk_X509_INFO_num(allcerts); i++) { 128f1535dc8Sdjm X509_INFO *xi = sk_X509_INFO_value(allcerts, i); 129ec7cdc12Sjsing if (xi->x509) { 1306d179423Smiod if (sk_X509_push(othercerts, xi->x509) == 0) { 1316d179423Smiod sk_X509_pop_free(othercerts, X509_free); 1326d179423Smiod othercerts = NULL; 1336d179423Smiod goto end; 1346d179423Smiod } 135f1535dc8Sdjm xi->x509 = NULL; 136f1535dc8Sdjm } 137f1535dc8Sdjm } 138ec7cdc12Sjsing 139f1535dc8Sdjm end: 140f1535dc8Sdjm if (othercerts == NULL) 141f1535dc8Sdjm fprintf(stderr, "unable to load certificates: %s\n", file); 142f1535dc8Sdjm sk_X509_INFO_pop_free(allcerts, X509_INFO_free); 143f1535dc8Sdjm BIO_free(certs); 144f1535dc8Sdjm return othercerts; 145f1535dc8Sdjm } 146bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_load_certs); 147f1535dc8Sdjm 148ec7cdc12Sjsing EVP_PKEY * 149ec7cdc12Sjsing TS_CONF_load_key(const char *file, const char *pass) 150f1535dc8Sdjm { 151f1535dc8Sdjm BIO *key = NULL; 152f1535dc8Sdjm EVP_PKEY *pkey = NULL; 153f1535dc8Sdjm 154ec7cdc12Sjsing if (!(key = BIO_new_file(file, "r"))) 155ec7cdc12Sjsing goto end; 156f1535dc8Sdjm pkey = PEM_read_bio_PrivateKey(key, NULL, NULL, (char *) pass); 157ec7cdc12Sjsing 158f1535dc8Sdjm end: 159f1535dc8Sdjm if (pkey == NULL) 160f1535dc8Sdjm fprintf(stderr, "unable to load private key: %s\n", file); 161f1535dc8Sdjm BIO_free(key); 162f1535dc8Sdjm return pkey; 163f1535dc8Sdjm } 164bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_load_key); 165f1535dc8Sdjm 166f1535dc8Sdjm /* Function definitions for handling configuration options. */ 167f1535dc8Sdjm 168ec7cdc12Sjsing static void 169ec7cdc12Sjsing TS_CONF_lookup_fail(const char *name, const char *tag) 170f1535dc8Sdjm { 171f1535dc8Sdjm fprintf(stderr, "variable lookup failed for %s::%s\n", name, tag); 172f1535dc8Sdjm } 173f1535dc8Sdjm 174ec7cdc12Sjsing static void 175ec7cdc12Sjsing TS_CONF_invalid(const char *name, const char *tag) 176f1535dc8Sdjm { 177f1535dc8Sdjm fprintf(stderr, "invalid variable value for %s::%s\n", name, tag); 178f1535dc8Sdjm } 179f1535dc8Sdjm 180ec7cdc12Sjsing const char * 181ec7cdc12Sjsing TS_CONF_get_tsa_section(CONF *conf, const char *section) 182f1535dc8Sdjm { 183ec7cdc12Sjsing if (!section) { 184f1535dc8Sdjm section = NCONF_get_string(conf, BASE_SECTION, ENV_DEFAULT_TSA); 185f1535dc8Sdjm if (!section) 186f1535dc8Sdjm TS_CONF_lookup_fail(BASE_SECTION, ENV_DEFAULT_TSA); 187f1535dc8Sdjm } 188f1535dc8Sdjm return section; 189f1535dc8Sdjm } 190bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_get_tsa_section); 191f1535dc8Sdjm 192ec7cdc12Sjsing int 193ec7cdc12Sjsing TS_CONF_set_serial(CONF *conf, const char *section, TS_serial_cb cb, 194f1535dc8Sdjm TS_RESP_CTX *ctx) 195f1535dc8Sdjm { 196f1535dc8Sdjm int ret = 0; 197f1535dc8Sdjm char *serial = NCONF_get_string(conf, section, ENV_SERIAL); 198ec7cdc12Sjsing 199ec7cdc12Sjsing if (!serial) { 200f1535dc8Sdjm TS_CONF_lookup_fail(section, ENV_SERIAL); 201f1535dc8Sdjm goto err; 202f1535dc8Sdjm } 203f1535dc8Sdjm TS_RESP_CTX_set_serial_cb(ctx, cb, serial); 204f1535dc8Sdjm 205f1535dc8Sdjm ret = 1; 206ec7cdc12Sjsing 207f1535dc8Sdjm err: 208f1535dc8Sdjm return ret; 209f1535dc8Sdjm } 210bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_serial); 211f1535dc8Sdjm 212ec7cdc12Sjsing int 213ec7cdc12Sjsing TS_CONF_set_signer_cert(CONF *conf, const char *section, const char *cert, 214ec7cdc12Sjsing TS_RESP_CTX *ctx) 215f1535dc8Sdjm { 216f1535dc8Sdjm int ret = 0; 217f1535dc8Sdjm X509 *cert_obj = NULL; 218ec7cdc12Sjsing 219f1535dc8Sdjm if (!cert) 220f1535dc8Sdjm cert = NCONF_get_string(conf, section, ENV_SIGNER_CERT); 221ec7cdc12Sjsing if (!cert) { 222f1535dc8Sdjm TS_CONF_lookup_fail(section, ENV_SIGNER_CERT); 223f1535dc8Sdjm goto err; 224f1535dc8Sdjm } 225f1535dc8Sdjm if (!(cert_obj = TS_CONF_load_cert(cert))) 226f1535dc8Sdjm goto err; 227f1535dc8Sdjm if (!TS_RESP_CTX_set_signer_cert(ctx, cert_obj)) 228f1535dc8Sdjm goto err; 229f1535dc8Sdjm 230f1535dc8Sdjm ret = 1; 231ec7cdc12Sjsing 232f1535dc8Sdjm err: 233f1535dc8Sdjm X509_free(cert_obj); 234f1535dc8Sdjm return ret; 235f1535dc8Sdjm } 236bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_signer_cert); 237f1535dc8Sdjm 238ec7cdc12Sjsing int 239ec7cdc12Sjsing TS_CONF_set_certs(CONF *conf, const char *section, const char *certs, 240f1535dc8Sdjm TS_RESP_CTX *ctx) 241f1535dc8Sdjm { 242f1535dc8Sdjm int ret = 0; 243f1535dc8Sdjm STACK_OF(X509) *certs_obj = NULL; 244ec7cdc12Sjsing 245f1535dc8Sdjm if (!certs) 246f1535dc8Sdjm certs = NCONF_get_string(conf, section, ENV_CERTS); 247f1535dc8Sdjm /* Certificate chain is optional. */ 248ec7cdc12Sjsing if (!certs) 249ec7cdc12Sjsing goto end; 250ec7cdc12Sjsing if (!(certs_obj = TS_CONF_load_certs(certs))) 251ec7cdc12Sjsing goto err; 252ec7cdc12Sjsing if (!TS_RESP_CTX_set_certs(ctx, certs_obj)) 253ec7cdc12Sjsing goto err; 254ec7cdc12Sjsing 255f1535dc8Sdjm end: 256f1535dc8Sdjm ret = 1; 257f1535dc8Sdjm err: 258f1535dc8Sdjm sk_X509_pop_free(certs_obj, X509_free); 259f1535dc8Sdjm return ret; 260f1535dc8Sdjm } 261bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_certs); 262f1535dc8Sdjm 263ec7cdc12Sjsing int 264ec7cdc12Sjsing TS_CONF_set_signer_key(CONF *conf, const char *section, const char *key, 265ec7cdc12Sjsing const char *pass, TS_RESP_CTX *ctx) 266f1535dc8Sdjm { 267f1535dc8Sdjm int ret = 0; 268f1535dc8Sdjm EVP_PKEY *key_obj = NULL; 269ec7cdc12Sjsing 270f1535dc8Sdjm if (!key) 271f1535dc8Sdjm key = NCONF_get_string(conf, section, ENV_SIGNER_KEY); 272ec7cdc12Sjsing if (!key) { 273f1535dc8Sdjm TS_CONF_lookup_fail(section, ENV_SIGNER_KEY); 274f1535dc8Sdjm goto err; 275f1535dc8Sdjm } 276ec7cdc12Sjsing if (!(key_obj = TS_CONF_load_key(key, pass))) 277ec7cdc12Sjsing goto err; 278ec7cdc12Sjsing if (!TS_RESP_CTX_set_signer_key(ctx, key_obj)) 279ec7cdc12Sjsing goto err; 280f1535dc8Sdjm 281f1535dc8Sdjm ret = 1; 282ec7cdc12Sjsing 283f1535dc8Sdjm err: 284f1535dc8Sdjm EVP_PKEY_free(key_obj); 285f1535dc8Sdjm return ret; 286f1535dc8Sdjm } 287bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_signer_key); 288f1535dc8Sdjm 289ec7cdc12Sjsing int 290ec7cdc12Sjsing TS_CONF_set_def_policy(CONF *conf, const char *section, const char *policy, 291ec7cdc12Sjsing TS_RESP_CTX *ctx) 292f1535dc8Sdjm { 293f1535dc8Sdjm int ret = 0; 294f1535dc8Sdjm ASN1_OBJECT *policy_obj = NULL; 295ec7cdc12Sjsing 296f1535dc8Sdjm if (!policy) 297ec7cdc12Sjsing policy = NCONF_get_string(conf, section, ENV_DEFAULT_POLICY); 298ec7cdc12Sjsing if (!policy) { 299f1535dc8Sdjm TS_CONF_lookup_fail(section, ENV_DEFAULT_POLICY); 300f1535dc8Sdjm goto err; 301f1535dc8Sdjm } 302ec7cdc12Sjsing if (!(policy_obj = OBJ_txt2obj(policy, 0))) { 303f1535dc8Sdjm TS_CONF_invalid(section, ENV_DEFAULT_POLICY); 304f1535dc8Sdjm goto err; 305f1535dc8Sdjm } 306f1535dc8Sdjm if (!TS_RESP_CTX_set_def_policy(ctx, policy_obj)) 307f1535dc8Sdjm goto err; 308f1535dc8Sdjm 309f1535dc8Sdjm ret = 1; 310ec7cdc12Sjsing 311f1535dc8Sdjm err: 312f1535dc8Sdjm ASN1_OBJECT_free(policy_obj); 313f1535dc8Sdjm return ret; 314f1535dc8Sdjm } 315bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_def_policy); 316f1535dc8Sdjm 317ec7cdc12Sjsing int 318ec7cdc12Sjsing TS_CONF_set_policies(CONF *conf, const char *section, TS_RESP_CTX *ctx) 319f1535dc8Sdjm { 320f1535dc8Sdjm int ret = 0; 321f1535dc8Sdjm int i; 322f1535dc8Sdjm STACK_OF(CONF_VALUE) *list = NULL; 323ec7cdc12Sjsing char *policies = NCONF_get_string(conf, section, ENV_OTHER_POLICIES); 324ec7cdc12Sjsing 325f1535dc8Sdjm /* If no other policy is specified, that's fine. */ 326ec7cdc12Sjsing if (policies && !(list = X509V3_parse_list(policies))) { 327f1535dc8Sdjm TS_CONF_invalid(section, ENV_OTHER_POLICIES); 328f1535dc8Sdjm goto err; 329f1535dc8Sdjm } 330ec7cdc12Sjsing for (i = 0; i < sk_CONF_VALUE_num(list); ++i) { 331f1535dc8Sdjm CONF_VALUE *val = sk_CONF_VALUE_value(list, i); 332f1535dc8Sdjm const char *extval = val->value ? val->value : val->name; 333f1535dc8Sdjm ASN1_OBJECT *objtmp; 334ec7cdc12Sjsing if (!(objtmp = OBJ_txt2obj(extval, 0))) { 335f1535dc8Sdjm TS_CONF_invalid(section, ENV_OTHER_POLICIES); 336f1535dc8Sdjm goto err; 337f1535dc8Sdjm } 338f1535dc8Sdjm if (!TS_RESP_CTX_add_policy(ctx, objtmp)) 339f1535dc8Sdjm goto err; 340f1535dc8Sdjm ASN1_OBJECT_free(objtmp); 341f1535dc8Sdjm } 342f1535dc8Sdjm 343f1535dc8Sdjm ret = 1; 344ec7cdc12Sjsing 345f1535dc8Sdjm err: 346f1535dc8Sdjm sk_CONF_VALUE_pop_free(list, X509V3_conf_free); 347f1535dc8Sdjm return ret; 348f1535dc8Sdjm } 349bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_policies); 350f1535dc8Sdjm 351ec7cdc12Sjsing int 352ec7cdc12Sjsing TS_CONF_set_digests(CONF *conf, const char *section, TS_RESP_CTX *ctx) 353f1535dc8Sdjm { 354f1535dc8Sdjm int ret = 0; 355f1535dc8Sdjm int i; 356f1535dc8Sdjm STACK_OF(CONF_VALUE) *list = NULL; 357f1535dc8Sdjm char *digests = NCONF_get_string(conf, section, ENV_DIGESTS); 358ec7cdc12Sjsing 359ec7cdc12Sjsing if (!digests) { 360f1535dc8Sdjm TS_CONF_lookup_fail(section, ENV_DIGESTS); 361f1535dc8Sdjm goto err; 362f1535dc8Sdjm } 363ec7cdc12Sjsing if (!(list = X509V3_parse_list(digests))) { 364f1535dc8Sdjm TS_CONF_invalid(section, ENV_DIGESTS); 365f1535dc8Sdjm goto err; 366f1535dc8Sdjm } 367ec7cdc12Sjsing if (sk_CONF_VALUE_num(list) == 0) { 368f1535dc8Sdjm TS_CONF_invalid(section, ENV_DIGESTS); 369f1535dc8Sdjm goto err; 370f1535dc8Sdjm } 371ec7cdc12Sjsing for (i = 0; i < sk_CONF_VALUE_num(list); ++i) { 372f1535dc8Sdjm CONF_VALUE *val = sk_CONF_VALUE_value(list, i); 373f1535dc8Sdjm const char *extval = val->value ? val->value : val->name; 374f1535dc8Sdjm const EVP_MD *md; 375ec7cdc12Sjsing if (!(md = EVP_get_digestbyname(extval))) { 376f1535dc8Sdjm TS_CONF_invalid(section, ENV_DIGESTS); 377f1535dc8Sdjm goto err; 378f1535dc8Sdjm } 379f1535dc8Sdjm if (!TS_RESP_CTX_add_md(ctx, md)) 380f1535dc8Sdjm goto err; 381f1535dc8Sdjm } 382f1535dc8Sdjm 383f1535dc8Sdjm ret = 1; 384ec7cdc12Sjsing 385f1535dc8Sdjm err: 386f1535dc8Sdjm sk_CONF_VALUE_pop_free(list, X509V3_conf_free); 387f1535dc8Sdjm return ret; 388f1535dc8Sdjm } 389bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_digests); 390f1535dc8Sdjm 391ec7cdc12Sjsing int 392ec7cdc12Sjsing TS_CONF_set_accuracy(CONF *conf, const char *section, TS_RESP_CTX *ctx) 393f1535dc8Sdjm { 394f1535dc8Sdjm int ret = 0; 395f1535dc8Sdjm int i; 396f1535dc8Sdjm int secs = 0, millis = 0, micros = 0; 397f1535dc8Sdjm STACK_OF(CONF_VALUE) *list = NULL; 398f1535dc8Sdjm char *accuracy = NCONF_get_string(conf, section, ENV_ACCURACY); 399*40e63673Sop const char *errstr; 400f1535dc8Sdjm 401ec7cdc12Sjsing if (accuracy && !(list = X509V3_parse_list(accuracy))) { 402f1535dc8Sdjm TS_CONF_invalid(section, ENV_ACCURACY); 403f1535dc8Sdjm goto err; 404f1535dc8Sdjm } 405ec7cdc12Sjsing for (i = 0; i < sk_CONF_VALUE_num(list); ++i) { 406f1535dc8Sdjm CONF_VALUE *val = sk_CONF_VALUE_value(list, i); 407ec7cdc12Sjsing if (strcmp(val->name, ENV_VALUE_SECS) == 0) { 408*40e63673Sop if (val->value) { 409*40e63673Sop secs = strtonum(val->value, 0, INT_MAX, 410*40e63673Sop &errstr); 411*40e63673Sop if (errstr != NULL) { 412*40e63673Sop TS_CONF_invalid(section, 413*40e63673Sop ENV_VALUE_SECS); 414*40e63673Sop goto err; 415*40e63673Sop } 416*40e63673Sop } 417ec7cdc12Sjsing } else if (strcmp(val->name, ENV_VALUE_MILLISECS) == 0) { 418*40e63673Sop if (val->value) { 419*40e63673Sop millis = strtonum(val->value, 1, 999, &errstr); 420*40e63673Sop if (errstr != NULL) { 421*40e63673Sop TS_CONF_invalid(section, 422*40e63673Sop ENV_VALUE_MILLISECS); 423*40e63673Sop goto err; 424*40e63673Sop } 425*40e63673Sop } 426ec7cdc12Sjsing } else if (strcmp(val->name, ENV_VALUE_MICROSECS) == 0) { 427*40e63673Sop if (val->value) { 428*40e63673Sop micros = strtonum(val->value, 1, 999, &errstr); 429*40e63673Sop if (errstr != NULL) { 430*40e63673Sop TS_CONF_invalid(section, 431*40e63673Sop ENV_VALUE_MICROSECS); 432*40e63673Sop goto err; 433*40e63673Sop } 434*40e63673Sop } 435ec7cdc12Sjsing } else { 436f1535dc8Sdjm TS_CONF_invalid(section, ENV_ACCURACY); 437f1535dc8Sdjm goto err; 438f1535dc8Sdjm } 439f1535dc8Sdjm } 440f1535dc8Sdjm if (!TS_RESP_CTX_set_accuracy(ctx, secs, millis, micros)) 441f1535dc8Sdjm goto err; 442f1535dc8Sdjm 443f1535dc8Sdjm ret = 1; 444ec7cdc12Sjsing 445f1535dc8Sdjm err: 446f1535dc8Sdjm sk_CONF_VALUE_pop_free(list, X509V3_conf_free); 447f1535dc8Sdjm return ret; 448f1535dc8Sdjm } 449bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_accuracy); 450f1535dc8Sdjm 451ec7cdc12Sjsing int 452ec7cdc12Sjsing TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, 453f1535dc8Sdjm TS_RESP_CTX *ctx) 454f1535dc8Sdjm { 455f1535dc8Sdjm int ret = 0; 456f1535dc8Sdjm long digits = 0; 457f1535dc8Sdjm 458f1535dc8Sdjm /* If not specified, set the default value to 0, i.e. sec precision */ 459f1535dc8Sdjm if (!NCONF_get_number_e(conf, section, ENV_CLOCK_PRECISION_DIGITS, 460f1535dc8Sdjm &digits)) 461f1535dc8Sdjm digits = 0; 462695fd1d8Sbeck /* We only support second precision, so reject everything else */ 463695fd1d8Sbeck if (digits != 0) { 464f1535dc8Sdjm TS_CONF_invalid(section, ENV_CLOCK_PRECISION_DIGITS); 465f1535dc8Sdjm goto err; 466f1535dc8Sdjm } 467f1535dc8Sdjm 468f1535dc8Sdjm if (!TS_RESP_CTX_set_clock_precision_digits(ctx, digits)) 469f1535dc8Sdjm goto err; 470f1535dc8Sdjm 471f1535dc8Sdjm return 1; 472ec7cdc12Sjsing 473f1535dc8Sdjm err: 474f1535dc8Sdjm return ret; 475f1535dc8Sdjm } 476bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_clock_precision_digits); 477f1535dc8Sdjm 478ec7cdc12Sjsing static int 479ec7cdc12Sjsing TS_CONF_add_flag(CONF *conf, const char *section, const char *field, int flag, 480ec7cdc12Sjsing TS_RESP_CTX *ctx) 481f1535dc8Sdjm { 482f1535dc8Sdjm /* Default is false. */ 483f1535dc8Sdjm const char *value = NCONF_get_string(conf, section, field); 484ec7cdc12Sjsing 485ec7cdc12Sjsing if (value) { 486f1535dc8Sdjm if (strcmp(value, ENV_VALUE_YES) == 0) 487f1535dc8Sdjm TS_RESP_CTX_add_flags(ctx, flag); 488ec7cdc12Sjsing else if (strcmp(value, ENV_VALUE_NO) != 0) { 489f1535dc8Sdjm TS_CONF_invalid(section, field); 490f1535dc8Sdjm return 0; 491f1535dc8Sdjm } 492f1535dc8Sdjm } 493f1535dc8Sdjm 494f1535dc8Sdjm return 1; 495f1535dc8Sdjm } 496f1535dc8Sdjm 497ec7cdc12Sjsing int 498ec7cdc12Sjsing TS_CONF_set_ordering(CONF *conf, const char *section, TS_RESP_CTX *ctx) 499f1535dc8Sdjm { 500f1535dc8Sdjm return TS_CONF_add_flag(conf, section, ENV_ORDERING, TS_ORDERING, ctx); 501f1535dc8Sdjm } 502bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_ordering); 503f1535dc8Sdjm 504ec7cdc12Sjsing int 505ec7cdc12Sjsing TS_CONF_set_tsa_name(CONF *conf, const char *section, TS_RESP_CTX *ctx) 506f1535dc8Sdjm { 507f1535dc8Sdjm return TS_CONF_add_flag(conf, section, ENV_TSA_NAME, TS_TSA_NAME, ctx); 508f1535dc8Sdjm } 509bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_tsa_name); 510f1535dc8Sdjm 511ec7cdc12Sjsing int 512ec7cdc12Sjsing TS_CONF_set_ess_cert_id_chain(CONF *conf, const char *section, TS_RESP_CTX *ctx) 513f1535dc8Sdjm { 514f1535dc8Sdjm return TS_CONF_add_flag(conf, section, ENV_ESS_CERT_ID_CHAIN, 515f1535dc8Sdjm TS_ESS_CERT_ID_CHAIN, ctx); 516f1535dc8Sdjm } 517bb933e2fSbeck LCRYPTO_ALIAS(TS_CONF_set_ess_cert_id_chain); 518