xref: /freebsd/crypto/openssl/test/testutil/helper.c (revision e7be843b4a162e68651d3911f0357ed464915629)
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 Pronchery time_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