diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c index 96ee63d310..7dfbc5faab 100644 --- a/crypto/asn1/a_time.c +++ b/crypto/asn1/a_time.c @@ -591,78 +591,3 @@ int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b) return -1; return 0; } - -/* - * tweak for Windows - */ -#ifdef WIN32 -# define timezone _timezone -#endif - -#if defined(__FreeBSD__) || defined(__wasi__) -# define USE_TIMEGM -#endif - -time_t ossl_asn1_string_to_time_t(const char *asn1_string) -{ - ASN1_TIME *timestamp_asn1 = NULL; - struct tm *timestamp_tm = NULL; -#if defined(__DJGPP__) - char *tz = NULL; -#elif !defined(USE_TIMEGM) - time_t timestamp_local; -#endif - time_t timestamp_utc; - - timestamp_asn1 = ASN1_TIME_new(); - if (!ASN1_TIME_set_string(timestamp_asn1, asn1_string)) - { - ASN1_TIME_free(timestamp_asn1); - return -1; - } - - timestamp_tm = OPENSSL_malloc(sizeof(*timestamp_tm)); - if (timestamp_tm == NULL) { - ASN1_TIME_free(timestamp_asn1); - return -1; - } - if (!(ASN1_TIME_to_tm(timestamp_asn1, timestamp_tm))) { - OPENSSL_free(timestamp_tm); - ASN1_TIME_free(timestamp_asn1); - return -1; - } - ASN1_TIME_free(timestamp_asn1); - -#if defined(__DJGPP__) - /* - * This is NOT thread-safe. Do not use this method for platforms other - * than djgpp. - */ - tz = getenv("TZ"); - if (tz != NULL) { - tz = OPENSSL_strdup(tz); - if (tz == NULL) { - OPENSSL_free(timestamp_tm); - return -1; - } - } - setenv("TZ", "UTC", 1); - - timestamp_utc = mktime(timestamp_tm); - - if (tz != NULL) { - setenv("TZ", tz, 1); - OPENSSL_free(tz); - } else { - unsetenv("TZ"); - } -#elif defined(USE_TIMEGM) - timestamp_utc = timegm(timestamp_tm); -#else - timestamp_local = mktime(timestamp_tm); - timestamp_utc = timestamp_local - timezone; -#endif - OPENSSL_free(timestamp_tm); - - return timestamp_utc; -} diff --git a/include/crypto/asn1.h b/include/crypto/asn1.h index 36af1d7689..b5683f007c 100644 --- a/include/crypto/asn1.h +++ b/include/crypto/asn1.h @@ -147,7 +147,6 @@ EVP_PKEY *ossl_d2i_PrivateKey_legacy(int keytype, EVP_PKEY **a, OSSL_LIB_CTX *libctx, const char *propq); X509_ALGOR *ossl_X509_ALGOR_from_nid(int nid, int ptype, void *pval); -time_t ossl_asn1_string_to_time_t(const char *asn1_string); void ossl_asn1_string_set_bits_left(ASN1_STRING *str, unsigned int num); #endif /* ndef OSSL_CRYPTO_ASN1_H */ diff --git a/test/asn1_time_test.c b/test/asn1_time_test.c index 7736fd3416..32bc4ff2ad 100644 --- a/test/asn1_time_test.c +++ b/test/asn1_time_test.c @@ -434,10 +434,10 @@ static int convert_asn1_to_time_t(int idx) { time_t testdateutc; - testdateutc = ossl_asn1_string_to_time_t(asn1_to_utc[idx].input); + testdateutc = test_asn1_string_to_time_t(asn1_to_utc[idx].input); if (!TEST_time_t_eq(testdateutc, asn1_to_utc[idx].expected)) { - TEST_info("ossl_asn1_string_to_time_t (%s) failed: expected %lli, got %lli\n", + TEST_info("test_asn1_string_to_time_t (%s) failed: expected %lli, got %lli\n", asn1_to_utc[idx].input, (long long int)asn1_to_utc[idx].expected, (long long int)testdateutc); diff --git a/test/build.info b/test/build.info index 9cbca834c8..e2b09ae965 100644 --- a/test/build.info +++ b/test/build.info @@ -26,7 +26,7 @@ IF[{- !$disabled{tests} -}] testutil/format_output.c testutil/load.c testutil/fake_random.c \ testutil/test_cleanup.c testutil/main.c testutil/testutil_init.c \ testutil/options.c testutil/test_options.c testutil/provider.c \ - testutil/apps_shims.c testutil/random.c $LIBAPPSSRC + testutil/apps_shims.c testutil/random.c testutil/helper.c $LIBAPPSSRC INCLUDE[libtestutil.a]=../include ../apps/include .. DEPEND[libtestutil.a]=../libcrypto diff --git a/test/ca_internals_test.c b/test/ca_internals_test.c index 24f7ba3884..776996b4ac 100644 --- a/test/ca_internals_test.c +++ b/test/ca_internals_test.c @@ -47,7 +47,7 @@ static int test_do_updatedb(void) } testdate = test_get_argument(2); - testdateutc = ossl_asn1_string_to_time_t(testdate); + testdateutc = test_asn1_string_to_time_t(testdate); if (TEST_time_t_lt(testdateutc, 0)) { return 0; } diff --git a/test/testutil.h b/test/testutil.h index a247f55ed6..35fbdab84e 100644 --- a/test/testutil.h +++ b/test/testutil.h @@ -648,5 +648,5 @@ X509 *load_cert_pem(const char *file, OSSL_LIB_CTX *libctx); X509 *load_cert_der(const unsigned char *bytes, int len); STACK_OF(X509) *load_certs_pem(const char *file); X509_REQ *load_csr_der(const char *file, OSSL_LIB_CTX *libctx); - +time_t test_asn1_string_to_time_t(const char *asn1_string); #endif /* OSSL_TESTUTIL_H */ diff --git a/test/testutil/helper.c b/test/testutil/helper.c new file mode 100644 index 0000000000..8da42b0fac --- /dev/null +++ b/test/testutil/helper.c @@ -0,0 +1,90 @@ +/* + * 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 + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include +#include "../testutil.h" + +/* + * tweak for Windows + */ +#ifdef WIN32 +# define timezone _timezone +#endif + +#if defined(__FreeBSD__) || defined(__wasi__) +# define USE_TIMEGM +#endif + +time_t test_asn1_string_to_time_t(const char *asn1_string) +{ + ASN1_TIME *timestamp_asn1 = NULL; + struct tm *timestamp_tm = NULL; +#if defined(__DJGPP__) + char *tz = NULL; +#elif !defined(USE_TIMEGM) + time_t timestamp_local; +#endif + time_t timestamp_utc; + + timestamp_asn1 = ASN1_TIME_new(); + if(timestamp_asn1 == NULL) + return -1; + if (!ASN1_TIME_set_string(timestamp_asn1, asn1_string)) + { + ASN1_TIME_free(timestamp_asn1); + return -1; + } + + timestamp_tm = OPENSSL_malloc(sizeof(*timestamp_tm)); + if (timestamp_tm == NULL) { + ASN1_TIME_free(timestamp_asn1); + return -1; + } + if (!(ASN1_TIME_to_tm(timestamp_asn1, timestamp_tm))) { + OPENSSL_free(timestamp_tm); + ASN1_TIME_free(timestamp_asn1); + return -1; + } + ASN1_TIME_free(timestamp_asn1); + +#if defined(__DJGPP__) + /* + * This is NOT thread-safe. Do not use this method for platforms other + * than djgpp. + */ + tz = getenv("TZ"); + if (tz != NULL) { + tz = OPENSSL_strdup(tz); + if (tz == NULL) { + OPENSSL_free(timestamp_tm); + return -1; + } + } + setenv("TZ", "UTC", 1); + + timestamp_utc = mktime(timestamp_tm); + + if (tz != NULL) { + setenv("TZ", tz, 1); + OPENSSL_free(tz); + } else { + unsetenv("TZ"); + } +#elif defined(USE_TIMEGM) + timestamp_utc = timegm(timestamp_tm); +#else + timestamp_local = mktime(timestamp_tm); + timestamp_utc = timestamp_local - timezone; +#endif + OPENSSL_free(timestamp_tm); + + return timestamp_utc; +}