/* * 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; }