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