summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_utctm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_utctm.c')
-rw-r--r--src/lib/libcrypto/asn1/a_utctm.c90
1 files changed, 86 insertions, 4 deletions
diff --git a/src/lib/libcrypto/asn1/a_utctm.c b/src/lib/libcrypto/asn1/a_utctm.c
index 07565974e3..d381c9e0d1 100644
--- a/src/lib/libcrypto/asn1/a_utctm.c
+++ b/src/lib/libcrypto/asn1/a_utctm.c
@@ -193,7 +193,8 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
193 { 193 {
194 char *p; 194 char *p;
195 struct tm *ts; 195 struct tm *ts;
196#if defined(THREADS) && !defined(WIN32) 196#if defined(THREADS) && !defined(WIN32) && !defined(__CYGWIN32__)
197
197 struct tm data; 198 struct tm data;
198#endif 199#endif
199 200
@@ -202,7 +203,7 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
202 if (s == NULL) 203 if (s == NULL)
203 return(NULL); 204 return(NULL);
204 205
205#if defined(THREADS) && !defined(WIN32) 206#if defined(THREADS) && !defined(WIN32) && !defined(__CYGWIN32__)
206 gmtime_r(&t,&data); /* should return &data, but doesn't on some systems, so we don't even look at the return value */ 207 gmtime_r(&t,&data); /* should return &data, but doesn't on some systems, so we don't even look at the return value */
207 ts=&data; 208 ts=&data;
208#else 209#else
@@ -248,10 +249,10 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
248 p=(char *)s->data; 249 p=(char *)s->data;
249 if ((p == NULL) || (s->length < 14)) 250 if ((p == NULL) || (s->length < 14))
250 { 251 {
251 p=Malloc(20); 252 p=OPENSSL_malloc(20);
252 if (p == NULL) return(NULL); 253 if (p == NULL) return(NULL);
253 if (s->data != NULL) 254 if (s->data != NULL)
254 Free(s->data); 255 OPENSSL_free(s->data);
255 s->data=(unsigned char *)p; 256 s->data=(unsigned char *)p;
256 } 257 }
257 258
@@ -264,3 +265,84 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
264#endif 265#endif
265 return(s); 266 return(s);
266 } 267 }
268
269
270int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
271 {
272 struct tm *tm;
273 int offset;
274 int year;
275
276#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
277
278 if (s->data[12] == 'Z')
279 offset=0;
280 else
281 {
282 offset = g2(s->data+13)*60+g2(s->data+15);
283 if (s->data[12] == '-')
284 offset = -offset;
285 }
286
287 t -= offset*60; /* FIXME: may overflow in extreme cases */
288
289#if defined(THREADS) && !defined(WIN32) && !defined(__CYGWIN32__)
290 { struct tm data; gmtime_r(&t, &data); tm = &data; }
291#else
292 tm = gmtime(&t);
293#endif
294
295#define return_cmp(a,b) if ((a)<(b)) return -1; else if ((a)>(b)) return 1
296 year = g2(s->data);
297 if (year < 50)
298 year += 100;
299 return_cmp(year, tm->tm_year);
300 return_cmp(g2(s->data+2) - 1, tm->tm_mon);
301 return_cmp(g2(s->data+4), tm->tm_mday);
302 return_cmp(g2(s->data+6), tm->tm_hour);
303 return_cmp(g2(s->data+8), tm->tm_min);
304 return_cmp(g2(s->data+10), tm->tm_sec);
305#undef g2
306#undef return_cmp
307
308 return 0;
309 }
310
311
312#if 0
313time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s)
314 {
315 struct tm tm;
316 int offset;
317
318 memset(&tm,'\0',sizeof tm);
319
320#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
321 tm.tm_year=g2(s->data);
322 if(tm.tm_year < 50)
323 tm.tm_year+=100;
324 tm.tm_mon=g2(s->data+2)-1;
325 tm.tm_mday=g2(s->data+4);
326 tm.tm_hour=g2(s->data+6);
327 tm.tm_min=g2(s->data+8);
328 tm.tm_sec=g2(s->data+10);
329 if(s->data[12] == 'Z')
330 offset=0;
331 else
332 {
333 offset=g2(s->data+13)*60+g2(s->data+15);
334 if(s->data[12] == '-')
335 offset= -offset;
336 }
337#undef g2
338
339 return mktime(&tm)-offset*60; /* FIXME: mktime assumes the current timezone
340 * instead of UTC, and unless we rewrite OpenSSL
341 * in Lisp we cannot locally change the timezone
342 * without possibly interfering with other parts
343 * of the program. timegm, which uses UTC, is
344 * non-standard.
345 * Also time_t is inappropriate for general
346 * UTC times because it may a 32 bit type. */
347 }
348#endif