a_utctm.c
Go to the documentation of this file.
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to. The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  * notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  * notice, this list of conditions and the following disclaimer in the
29  * documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  * must display the following acknowledgement:
32  * "This product includes cryptographic software written by
33  * Eric Young (eay@cryptsoft.com)"
34  * The word 'cryptographic' can be left out if the rouines from the library
35  * being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  * the apps directory (application code) you must include an acknowledgement:
38  * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed. i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.] */
56 
57 #include <openssl/asn1.h>
58 
59 #include <string.h>
60 #include <time.h>
61 
62 #include <openssl/err.h>
63 #include <openssl/mem.h>
64 
65 #include "internal.h"
66 
67 
68 int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d)
69 {
70  static const int min[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
71  static const int max[8] = { 99, 12, 31, 23, 59, 59, 12, 59 };
72  char *a;
73  int n, i, l, o;
74 
75  if (d->type != V_ASN1_UTCTIME)
76  return (0);
77  l = d->length;
78  a = (char *)d->data;
79  o = 0;
80 
81  if (l < 11)
82  goto err;
83  for (i = 0; i < 6; i++) {
84  if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
85  i++;
86  if (tm)
87  tm->tm_sec = 0;
88  break;
89  }
90  if ((a[o] < '0') || (a[o] > '9'))
91  goto err;
92  n = a[o] - '0';
93  if (++o > l)
94  goto err;
95 
96  if ((a[o] < '0') || (a[o] > '9'))
97  goto err;
98  n = (n * 10) + a[o] - '0';
99  if (++o > l)
100  goto err;
101 
102  if ((n < min[i]) || (n > max[i]))
103  goto err;
104  if (tm) {
105  switch (i) {
106  case 0:
107  tm->tm_year = n < 50 ? n + 100 : n;
108  break;
109  case 1:
110  tm->tm_mon = n - 1;
111  break;
112  case 2:
113  tm->tm_mday = n;
114  break;
115  case 3:
116  tm->tm_hour = n;
117  break;
118  case 4:
119  tm->tm_min = n;
120  break;
121  case 5:
122  tm->tm_sec = n;
123  break;
124  }
125  }
126  }
127  if (a[o] == 'Z')
128  o++;
129  else if ((a[o] == '+') || (a[o] == '-')) {
130  int offsign = a[o] == '-' ? 1 : -1, offset = 0;
131  o++;
132  if (o + 4 > l)
133  goto err;
134  for (i = 6; i < 8; i++) {
135  if ((a[o] < '0') || (a[o] > '9'))
136  goto err;
137  n = a[o] - '0';
138  o++;
139  if ((a[o] < '0') || (a[o] > '9'))
140  goto err;
141  n = (n * 10) + a[o] - '0';
142  if ((n < min[i]) || (n > max[i]))
143  goto err;
144  if (tm) {
145  if (i == 6)
146  offset = n * 3600;
147  else if (i == 7)
148  offset += n * 60;
149  }
150  o++;
151  }
152  if (offset && !OPENSSL_gmtime_adj(tm, 0, offset * offsign))
153  return 0;
154  }
155  return o == l;
156  err:
157  return 0;
158 }
159 
161 {
162  return asn1_utctime_to_tm(NULL, d);
163 }
164 
166 {
167  ASN1_UTCTIME t;
168 
169  t.type = V_ASN1_UTCTIME;
170  t.length = strlen(str);
171  t.data = (unsigned char *)str;
172  if (ASN1_UTCTIME_check(&t)) {
173  if (s != NULL) {
174  if (!ASN1_STRING_set((ASN1_STRING *)s,
175  (unsigned char *)str, t.length))
176  return 0;
177  s->type = V_ASN1_UTCTIME;
178  }
179  return (1);
180  } else
181  return (0);
182 }
183 
185 {
186  return ASN1_UTCTIME_adj(s, t, 0, 0);
187 }
188 
190  int offset_day, long offset_sec)
191 {
192  char *p;
193  struct tm *ts;
194  struct tm data;
195  size_t len = 20;
196  int free_s = 0;
197 
198  if (s == NULL) {
199  free_s = 1;
200  s = ASN1_UTCTIME_new();
201  }
202  if (s == NULL)
203  goto err;
204 
205  ts = OPENSSL_gmtime(&t, &data);
206  if (ts == NULL)
207  goto err;
208 
209  if (offset_day || offset_sec) {
210  if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
211  goto err;
212  }
213 
214  if ((ts->tm_year < 50) || (ts->tm_year >= 150))
215  goto err;
216 
217  p = (char *)s->data;
218  if ((p == NULL) || ((size_t)s->length < len)) {
219  p = OPENSSL_malloc(len);
220  if (p == NULL) {
222  goto err;
223  }
224  if (s->data != NULL)
225  OPENSSL_free(s->data);
226  s->data = (unsigned char *)p;
227  }
228 
229  BIO_snprintf(p, len, "%02d%02d%02d%02d%02d%02dZ", ts->tm_year % 100,
230  ts->tm_mon + 1, ts->tm_mday, ts->tm_hour, ts->tm_min,
231  ts->tm_sec);
232  s->length = strlen(p);
233  s->type = V_ASN1_UTCTIME;
234  return (s);
235  err:
236  if (free_s && s)
238  return NULL;
239 }
240 
241 int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
242 {
243  struct tm stm, ttm;
244  int day, sec;
245 
246  if (!asn1_utctime_to_tm(&stm, s))
247  return -2;
248 
249  if (!OPENSSL_gmtime(&t, &ttm))
250  return -2;
251 
252  if (!OPENSSL_gmtime_diff(&day, &sec, &ttm, &stm))
253  return -2;
254 
255  if (day > 0)
256  return 1;
257  if (day < 0)
258  return -1;
259  if (sec > 0)
260  return 1;
261  if (sec < 0)
262  return -1;
263  return 0;
264 }
xds_interop_client.str
str
Definition: xds_interop_client.py:487
ASN1_UTCTIME_new
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_new(void)
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
string.h
error_ref_leak.err
err
Definition: error_ref_leak.py:35
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
xds_manager.p
p
Definition: xds_manager.py:60
ASN1_UTCTIME_free
OPENSSL_EXPORT void ASN1_UTCTIME_free(ASN1_UTCTIME *str)
ASN1_UTCTIME_check
int ASN1_UTCTIME_check(const ASN1_UTCTIME *d)
Definition: a_utctm.c:160
o
UnboundConversion o
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:97
OPENSSL_malloc
#define OPENSSL_malloc
Definition: boringssl_prefix_symbols.h:1885
OPENSSL_gmtime_adj
#define OPENSSL_gmtime_adj
Definition: boringssl_prefix_symbols.h:1871
ASN1_STRING_set
#define ASN1_STRING_set
Definition: boringssl_prefix_symbols.h:688
OPENSSL_gmtime_diff
#define OPENSSL_gmtime_diff
Definition: boringssl_prefix_symbols.h:1872
internal.h
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
asn1_utctime_to_tm
int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d)
Definition: a_utctm.c:68
err.h
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
min
#define min(a, b)
Definition: qsort.h:83
d
static const fe d
Definition: curve25519_tables.h:19
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
V_ASN1_UTCTIME
#define V_ASN1_UTCTIME
Definition: asn1.h:144
BIO_snprintf
#define BIO_snprintf
Definition: boringssl_prefix_symbols.h:864
tm
static uv_timer_t tm
Definition: test-tcp-open.c:41
ASN1_UTCTIME_adj
ASN1_UTCTIME * ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec)
Definition: a_utctm.c:189
ASN1_UTCTIME_set
ASN1_UTCTIME * ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
Definition: a_utctm.c:184
ASN1_UTCTIME_set_string
int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str)
Definition: a_utctm.c:165
mem.h
ASN1_UTCTIME_cmp_time_t
int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
Definition: a_utctm.c:241
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
run_grpclb_interop_tests.l
dictionary l
Definition: run_grpclb_interop_tests.py:410
OPENSSL_gmtime
#define OPENSSL_gmtime
Definition: boringssl_prefix_symbols.h:1870
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
asn1_string_st
Definition: asn1.h:543
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
asn1.h
ERR_R_MALLOC_FAILURE
#define ERR_R_MALLOC_FAILURE
Definition: err.h:371
offset
voidpf uLong offset
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:142


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:39