summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_time.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_time.c')
-rw-r--r--src/lib/libcrypto/asn1/a_time.c117
1 files changed, 1 insertions, 116 deletions
diff --git a/src/lib/libcrypto/asn1/a_time.c b/src/lib/libcrypto/asn1/a_time.c
index a6c7c8e736..7a3742fd70 100644
--- a/src/lib/libcrypto/asn1/a_time.c
+++ b/src/lib/libcrypto/asn1/a_time.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: a_time.c,v 1.26 2015/10/02 15:04:45 beck Exp $ */ 1/* $OpenBSD: a_time.c,v 1.27 2015/10/19 16:32:37 beck Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -105,118 +105,3 @@ ASN1_TIME_free(ASN1_TIME *a)
105{ 105{
106 ASN1_item_free((ASN1_VALUE *)a, &ASN1_TIME_it); 106 ASN1_item_free((ASN1_VALUE *)a, &ASN1_TIME_it);
107} 107}
108
109ASN1_TIME *
110ASN1_TIME_set(ASN1_TIME *s, time_t t)
111{
112 return ASN1_TIME_adj(s, t, 0, 0);
113}
114
115ASN1_TIME *
116ASN1_TIME_adj(ASN1_TIME *s, time_t t, int offset_day, long offset_sec)
117{
118 struct tm *ts;
119 struct tm data;
120
121 ts = gmtime_r(&t, &data);
122 if (ts == NULL) {
123 ASN1err(ASN1_F_ASN1_TIME_ADJ, ASN1_R_ERROR_GETTING_TIME);
124 return NULL;
125 }
126 if (offset_day || offset_sec) {
127 if (!OPENSSL_gmtime_adj(ts, offset_day, offset_sec))
128 return NULL;
129 }
130 if ((ts->tm_year >= 50) && (ts->tm_year < 150))
131 return ASN1_UTCTIME_adj(s, t, offset_day, offset_sec);
132 return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec);
133}
134
135int
136ASN1_TIME_check(ASN1_TIME *t)
137{
138 if (t->type != V_ASN1_GENERALIZEDTIME && t->type != V_ASN1_UTCTIME)
139 return 0;
140 return (t->type == asn1_time_parse(t->data, t->length, NULL, t->type));
141}
142
143/* Convert an ASN1_TIME structure to GeneralizedTime */
144static ASN1_GENERALIZEDTIME *
145ASN1_TIME_to_generalizedtime_internal(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out)
146{
147 ASN1_GENERALIZEDTIME *ret;
148 char *str;
149 int newlen;
150 int i;
151
152 if (!ASN1_TIME_check(t))
153 return NULL;
154
155 ret = *out;
156
157 /* If already GeneralizedTime just copy across */
158 if (t->type == V_ASN1_GENERALIZEDTIME) {
159 if (!ASN1_STRING_set(ret, t->data, t->length))
160 return NULL;
161 return ret;
162 }
163
164 /* grow the string */
165 if (!ASN1_STRING_set(ret, NULL, t->length + 2))
166 return NULL;
167 /* ASN1_STRING_set() allocated 'len + 1' bytes. */
168 newlen = t->length + 2 + 1;
169 str = (char *)ret->data;
170 /* XXX ASN1_TIME is not Y2050 compatible */
171 i = snprintf(str, newlen, "%s%s", (t->data[0] >= '5') ? "19" : "20",
172 (char *) t->data);
173 if (i == -1 || i >= newlen) {
174 ASN1_GENERALIZEDTIME_free(ret);
175 *out = NULL;
176 return NULL;
177 }
178 return ret;
179}
180
181ASN1_GENERALIZEDTIME *
182ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out)
183{
184 ASN1_GENERALIZEDTIME *tmp = NULL, *ret;
185
186 if (!out || !*out) {
187 if (!(tmp = ASN1_GENERALIZEDTIME_new()))
188 return NULL;
189 if (out != NULL)
190 *out = tmp;
191 else
192 out = &tmp;
193 }
194
195 ret = ASN1_TIME_to_generalizedtime_internal(t, out);
196 if (ret == NULL && tmp != NULL)
197 ASN1_GENERALIZEDTIME_free(tmp);
198
199 return ret;
200}
201
202int
203ASN1_TIME_set_string(ASN1_TIME *s, const char *str)
204{
205 ASN1_TIME t;
206
207 t.length = strlen(str);
208 t.data = (unsigned char *)str;
209 t.flags = 0;
210
211 t.type = asn1_time_parse(t.data, t.length, NULL, V_ASN1_UTCTIME);
212 if (t.type == -1)
213 t.type = asn1_time_parse(t.data, t.length, NULL,
214 V_ASN1_GENERALIZEDTIME);
215 if (t.type == -1)
216 return 0;
217
218 if (s && !ASN1_STRING_copy((ASN1_STRING *)s, (ASN1_STRING *)&t))
219 return 0;
220
221 return 1;
222}