1*e7be843bSPierre Pronchery /* 2*e7be843bSPierre Pronchery * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. 3*e7be843bSPierre Pronchery * 4*e7be843bSPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 5*e7be843bSPierre Pronchery * this file except in compliance with the License. You can obtain a copy 6*e7be843bSPierre Pronchery * in the file LICENSE in the source distribution or at 7*e7be843bSPierre Pronchery * https://www.openssl.org/source/license.html 8*e7be843bSPierre Pronchery */ 9*e7be843bSPierre Pronchery 10*e7be843bSPierre Pronchery #include <stdio.h> 11*e7be843bSPierre Pronchery #include <time.h> 12*e7be843bSPierre Pronchery #include <openssl/asn1t.h> 13*e7be843bSPierre Pronchery #include "../testutil.h" 14*e7be843bSPierre Pronchery 15*e7be843bSPierre Pronchery /* 16*e7be843bSPierre Pronchery * tweak for Windows 17*e7be843bSPierre Pronchery */ 18*e7be843bSPierre Pronchery #ifdef WIN32 19*e7be843bSPierre Pronchery # define timezone _timezone 20*e7be843bSPierre Pronchery #endif 21*e7be843bSPierre Pronchery 22*e7be843bSPierre Pronchery #if defined(__FreeBSD__) || defined(__wasi__) 23*e7be843bSPierre Pronchery # define USE_TIMEGM 24*e7be843bSPierre Pronchery #endif 25*e7be843bSPierre Pronchery test_asn1_string_to_time_t(const char * asn1_string)26*e7be843bSPierre Proncherytime_t test_asn1_string_to_time_t(const char *asn1_string) 27*e7be843bSPierre Pronchery { 28*e7be843bSPierre Pronchery ASN1_TIME *timestamp_asn1 = NULL; 29*e7be843bSPierre Pronchery struct tm *timestamp_tm = NULL; 30*e7be843bSPierre Pronchery #if defined(__DJGPP__) 31*e7be843bSPierre Pronchery char *tz = NULL; 32*e7be843bSPierre Pronchery #elif !defined(USE_TIMEGM) 33*e7be843bSPierre Pronchery time_t timestamp_local; 34*e7be843bSPierre Pronchery #endif 35*e7be843bSPierre Pronchery time_t timestamp_utc; 36*e7be843bSPierre Pronchery 37*e7be843bSPierre Pronchery timestamp_asn1 = ASN1_TIME_new(); 38*e7be843bSPierre Pronchery if(timestamp_asn1 == NULL) 39*e7be843bSPierre Pronchery return -1; 40*e7be843bSPierre Pronchery if (!ASN1_TIME_set_string(timestamp_asn1, asn1_string)) 41*e7be843bSPierre Pronchery { 42*e7be843bSPierre Pronchery ASN1_TIME_free(timestamp_asn1); 43*e7be843bSPierre Pronchery return -1; 44*e7be843bSPierre Pronchery } 45*e7be843bSPierre Pronchery 46*e7be843bSPierre Pronchery timestamp_tm = OPENSSL_malloc(sizeof(*timestamp_tm)); 47*e7be843bSPierre Pronchery if (timestamp_tm == NULL) { 48*e7be843bSPierre Pronchery ASN1_TIME_free(timestamp_asn1); 49*e7be843bSPierre Pronchery return -1; 50*e7be843bSPierre Pronchery } 51*e7be843bSPierre Pronchery if (!(ASN1_TIME_to_tm(timestamp_asn1, timestamp_tm))) { 52*e7be843bSPierre Pronchery OPENSSL_free(timestamp_tm); 53*e7be843bSPierre Pronchery ASN1_TIME_free(timestamp_asn1); 54*e7be843bSPierre Pronchery return -1; 55*e7be843bSPierre Pronchery } 56*e7be843bSPierre Pronchery ASN1_TIME_free(timestamp_asn1); 57*e7be843bSPierre Pronchery 58*e7be843bSPierre Pronchery #if defined(__DJGPP__) 59*e7be843bSPierre Pronchery /* 60*e7be843bSPierre Pronchery * This is NOT thread-safe. Do not use this method for platforms other 61*e7be843bSPierre Pronchery * than djgpp. 62*e7be843bSPierre Pronchery */ 63*e7be843bSPierre Pronchery tz = getenv("TZ"); 64*e7be843bSPierre Pronchery if (tz != NULL) { 65*e7be843bSPierre Pronchery tz = OPENSSL_strdup(tz); 66*e7be843bSPierre Pronchery if (tz == NULL) { 67*e7be843bSPierre Pronchery OPENSSL_free(timestamp_tm); 68*e7be843bSPierre Pronchery return -1; 69*e7be843bSPierre Pronchery } 70*e7be843bSPierre Pronchery } 71*e7be843bSPierre Pronchery setenv("TZ", "UTC", 1); 72*e7be843bSPierre Pronchery 73*e7be843bSPierre Pronchery timestamp_utc = mktime(timestamp_tm); 74*e7be843bSPierre Pronchery 75*e7be843bSPierre Pronchery if (tz != NULL) { 76*e7be843bSPierre Pronchery setenv("TZ", tz, 1); 77*e7be843bSPierre Pronchery OPENSSL_free(tz); 78*e7be843bSPierre Pronchery } else { 79*e7be843bSPierre Pronchery unsetenv("TZ"); 80*e7be843bSPierre Pronchery } 81*e7be843bSPierre Pronchery #elif defined(USE_TIMEGM) 82*e7be843bSPierre Pronchery timestamp_utc = timegm(timestamp_tm); 83*e7be843bSPierre Pronchery #else 84*e7be843bSPierre Pronchery timestamp_local = mktime(timestamp_tm); 85*e7be843bSPierre Pronchery timestamp_utc = timestamp_local - timezone; 86*e7be843bSPierre Pronchery #endif 87*e7be843bSPierre Pronchery OPENSSL_free(timestamp_tm); 88*e7be843bSPierre Pronchery 89*e7be843bSPierre Pronchery return timestamp_utc; 90*e7be843bSPierre Pronchery } 91