mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
New internal function OPENSSL_gmtime, which is intended to do the same
as gmtime_r() on the systems where that is defined.
This commit is contained in:
parent
e8734731d3
commit
b8e35bd66e
@ -35,13 +35,13 @@ SDIRS= md2 md5 sha mdc2 hmac ripemd \
|
||||
GENERAL=Makefile README crypto-lib.com install.com
|
||||
|
||||
LIB= $(TOP)/libcrypto.a
|
||||
LIBSRC= cryptlib.c mem.c mem_dbg.c cversion.c ex_data.c tmdiff.c cpt_err.c ebcdic.c uid.c
|
||||
LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdic.o uid.o
|
||||
LIBSRC= cryptlib.c mem.c mem_dbg.c cversion.c ex_data.c tmdiff.c cpt_err.c ebcdic.c uid.c o_time.c
|
||||
LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdic.o uid.o o_time.o
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
EXHEADER= crypto.h tmdiff.h opensslv.h opensslconf.h ebcdic.h symhacks.h
|
||||
HEADER= cryptlib.h buildinf.h md32_common.h $(EXHEADER)
|
||||
HEADER= cryptlib.h buildinf.h md32_common.h o_time.h $(EXHEADER)
|
||||
|
||||
ALL= $(GENERAL) $(SRC) $(HEADER)
|
||||
|
||||
|
@ -61,6 +61,7 @@
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "cryptlib.h"
|
||||
#include "o_time.h"
|
||||
#include <openssl/asn1.h>
|
||||
|
||||
#if 0
|
||||
@ -193,21 +194,17 @@ ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,
|
||||
{
|
||||
char *p;
|
||||
struct tm *ts;
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32)
|
||||
struct tm data;
|
||||
#endif
|
||||
|
||||
if (s == NULL)
|
||||
s=M_ASN1_GENERALIZEDTIME_new();
|
||||
if (s == NULL)
|
||||
return(NULL);
|
||||
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32)
|
||||
gmtime_r(&t,&data); /* should return &data, but doesn't on some systems, so we don't even look at the return value */
|
||||
ts=&data;
|
||||
#else
|
||||
ts=gmtime(&t);
|
||||
#endif
|
||||
ts=OPENSSL_gmtime(&t, &data);
|
||||
if (ts == NULL)
|
||||
return(NULL);
|
||||
|
||||
p=(char *)s->data;
|
||||
if ((p == NULL) || (s->length < 16))
|
||||
{
|
||||
|
@ -64,6 +64,7 @@
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "cryptlib.h"
|
||||
#include "o_time.h"
|
||||
#include <openssl/asn1t.h>
|
||||
|
||||
IMPLEMENT_ASN1_MSTRING(ASN1_TIME, B_ASN1_TIME)
|
||||
@ -100,14 +101,11 @@ int i2d_ASN1_TIME(ASN1_TIME *a, unsigned char **pp)
|
||||
ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t)
|
||||
{
|
||||
struct tm *ts;
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
|
||||
struct tm data;
|
||||
|
||||
gmtime_r(&t,&data);
|
||||
ts=&data; /* should return &data, but doesn't on some systems, so we don't even look at the return value */
|
||||
#else
|
||||
ts=gmtime(&t);
|
||||
#endif
|
||||
ts=OPENSSL_gmtime(&t,&data);
|
||||
if (ts == NULL)
|
||||
return NULL;
|
||||
if((ts->tm_year >= 50) && (ts->tm_year < 150))
|
||||
return ASN1_UTCTIME_set(s, t);
|
||||
return ASN1_GENERALIZEDTIME_set(s,t);
|
||||
|
@ -59,12 +59,8 @@
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "cryptlib.h"
|
||||
#include "o_time.h"
|
||||
#include <openssl/asn1.h>
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
#include <descrip.h>
|
||||
#include <lnmdef.h>
|
||||
#include <starlet.h>
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
int i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **pp)
|
||||
@ -191,59 +187,17 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
|
||||
{
|
||||
char *p;
|
||||
struct tm *ts;
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
|
||||
|
||||
struct tm data;
|
||||
#endif
|
||||
|
||||
if (s == NULL)
|
||||
s=M_ASN1_UTCTIME_new();
|
||||
if (s == NULL)
|
||||
return(NULL);
|
||||
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
|
||||
gmtime_r(&t,&data); /* should return &data, but doesn't on some systems, so we don't even look at the return value */
|
||||
ts=&data;
|
||||
#else
|
||||
ts=gmtime(&t);
|
||||
#endif
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
ts=OPENSSL_gmtime(&t, &data);
|
||||
if (ts == NULL)
|
||||
{
|
||||
static $DESCRIPTOR(tabnam,"LNM$DCL_LOGICAL");
|
||||
static $DESCRIPTOR(lognam,"SYS$TIMEZONE_DIFFERENTIAL");
|
||||
char result[256];
|
||||
unsigned int reslen = 0;
|
||||
struct {
|
||||
short buflen;
|
||||
short code;
|
||||
void *bufaddr;
|
||||
unsigned int *reslen;
|
||||
} itemlist[] = {
|
||||
{ 0, LNM$_STRING, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
};
|
||||
int status;
|
||||
return(NULL);
|
||||
|
||||
/* Get the value for SYS$TIMEZONE_DIFFERENTIAL */
|
||||
itemlist[0].buflen = sizeof(result);
|
||||
itemlist[0].bufaddr = result;
|
||||
itemlist[0].reslen = &reslen;
|
||||
status = sys$trnlnm(0, &tabnam, &lognam, 0, itemlist);
|
||||
if (!(status & 1))
|
||||
return NULL;
|
||||
result[reslen] = '\0';
|
||||
|
||||
/* Get the numerical value of the equivalence string */
|
||||
status = atoi(result);
|
||||
|
||||
/* and use it to move time to GMT */
|
||||
t -= status;
|
||||
|
||||
/* then convert the result to the time structure */
|
||||
ts=(struct tm *)localtime(&t);
|
||||
}
|
||||
#endif
|
||||
p=(char *)s->data;
|
||||
if ((p == NULL) || (s->length < 14))
|
||||
{
|
||||
@ -284,11 +238,7 @@ int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
|
||||
|
||||
t -= offset*60; /* FIXME: may overflow in extreme cases */
|
||||
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
|
||||
{ struct tm data; gmtime_r(&t, &data); tm = &data; }
|
||||
#else
|
||||
tm = gmtime(&t);
|
||||
#endif
|
||||
{ struct tm data; tm = OPENSSL_gmtime(&t, &data); }
|
||||
|
||||
#define return_cmp(a,b) if ((a)<(b)) return -1; else if ((a)>(b)) return 1
|
||||
year = g2(s->data);
|
||||
|
@ -174,7 +174,7 @@ $!
|
||||
$ APPS_DES = "DES/DES,CBC3_ENC"
|
||||
$ APPS_PKCS7 = "ENC/ENC;DEC/DEC;SIGN/SIGN;VERIFY/VERIFY,EXAMPLE"
|
||||
$
|
||||
$ LIB_ = "cryptlib,mem,mem_dbg,cversion,ex_data,tmdiff,cpt_err,ebcdic,uid"
|
||||
$ LIB_ = "cryptlib,mem,mem_dbg,cversion,ex_data,tmdiff,cpt_err,ebcdic,uid,o_time"
|
||||
$ LIB_MD2 = "md2_dgst,md2_one"
|
||||
$ LIB_MD4 = "md4_dgst,md4_one"
|
||||
$ LIB_MD5 = "md5_dgst,md5_one"
|
||||
|
202
crypto/o_time.c
Normal file
202
crypto/o_time.c
Normal file
@ -0,0 +1,202 @@
|
||||
/* crypto/o_time.c -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Richard Levitte (levitte@stacken.kth.se) for the OpenSSL
|
||||
* project 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <openssl/e_os2.h>
|
||||
#include "o_time.h"
|
||||
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
# include <libdtdef.h>
|
||||
# include <lib$routines.h>
|
||||
# include <lnmdef.h>
|
||||
# include <starlet.h>
|
||||
# include <descrip.h>
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
|
||||
{
|
||||
struct tm *ts = NULL;
|
||||
|
||||
#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r))
|
||||
/* should return &data, but doesn't on some systems,
|
||||
so we don't even look at the return value */
|
||||
gmtime_r(timer,result);
|
||||
ts = result;
|
||||
#elif !defined(OPENSSL_SYS_VMS)
|
||||
ts = gmtime(timer);
|
||||
memcpy(result, ts, sizeof(struct tm));
|
||||
ts = result;
|
||||
#endif
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
if (ts == NULL)
|
||||
{
|
||||
static $DESCRIPTOR(tabnam,"LNM$DCL_LOGICAL");
|
||||
static $DESCRIPTOR(lognam,"SYS$TIMEZONE_DIFFERENTIAL");
|
||||
char logvalue[256];
|
||||
unsigned int reslen = 0;
|
||||
struct {
|
||||
short buflen;
|
||||
short code;
|
||||
void *bufaddr;
|
||||
unsigned int *reslen;
|
||||
} itemlist[] = {
|
||||
{ 0, LNM$_STRING, 0, 0 },
|
||||
{ 0, 0, 0, 0 },
|
||||
};
|
||||
int status;
|
||||
time_t t;
|
||||
|
||||
/* Get the value for SYS$TIMEZONE_DIFFERENTIAL */
|
||||
itemlist[0].buflen = sizeof(logvalue);
|
||||
itemlist[0].bufaddr = logvalue;
|
||||
itemlist[0].reslen = &reslen;
|
||||
status = sys$trnlnm(0, &tabnam, &lognam, 0, itemlist);
|
||||
if (!(status & 1))
|
||||
return NULL;
|
||||
logvalue[reslen] = '\0';
|
||||
|
||||
/* Get the numerical value of the equivalence string */
|
||||
status = atoi(logvalue);
|
||||
|
||||
/* and use it to move time to GMT */
|
||||
t = *timer - status;
|
||||
|
||||
/* then convert the result to the time structure */
|
||||
#ifndef OPENSSL_THREADS
|
||||
ts=(struct tm *)localtime(&t);
|
||||
#else
|
||||
/* Since there was no gmtime_r() to do this stuff for us,
|
||||
we have to do it the hard way. */
|
||||
{
|
||||
/* The VMS epoch is the astronomical Smithsonian date,
|
||||
if I remember correctly, which is November 17, 1858.
|
||||
Furthermore, time is measure in thenths of microseconds
|
||||
and stored in quadwords (64 bit integers). unix_epoch
|
||||
below is January 1st 1970 expressed as a VMS time. The
|
||||
following code was used to get this number:
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <lib$routines.h>
|
||||
#include <starlet.h>
|
||||
|
||||
main()
|
||||
{
|
||||
unsigned long systime[2];
|
||||
unsigned short epoch_values[7] =
|
||||
{ 1970, 1, 1, 0, 0, 0, 0 };
|
||||
|
||||
lib$cvt_vectim(epoch_values, systime);
|
||||
|
||||
printf("%u %u", systime[0], systime[1]);
|
||||
}
|
||||
*/
|
||||
unsigned long unix_epoch[2] = { 1273708544, 8164711 };
|
||||
unsigned long deltatime[2];
|
||||
unsigned long systime[2];
|
||||
struct vms_vectime
|
||||
{
|
||||
short year, month, day, hour, minute, second,
|
||||
centi_second;
|
||||
} time_values;
|
||||
long operation;
|
||||
|
||||
/* Turn the number of seconds since January 1st 1970 to
|
||||
an internal delta time.
|
||||
Note that lib$cvt_to_internal_time() will assume
|
||||
that t is signed, and will therefore break on 32-bit
|
||||
systems some time in 2038.
|
||||
*/
|
||||
operation = LIB$K_DELTA_SECONDS;
|
||||
status = lib$cvt_to_internal_time(&operation,
|
||||
&t, deltatime);
|
||||
|
||||
/* Add the delta time with the Unix epoch and we have
|
||||
the current UTC time in internal format */
|
||||
status = lib$add_times(unix_epoch, deltatime, systime);
|
||||
|
||||
/* Turn the internal time into a time vector */
|
||||
status = sys$numtim(&time_values, systime);
|
||||
|
||||
/* Fill in the struct tm with the result */
|
||||
result->tm_sec = time_values.second;
|
||||
result->tm_min = time_values.minute;
|
||||
result->tm_hour = time_values.hour;
|
||||
result->tm_mday = time_values.day;
|
||||
result->tm_mon = time_values.month - 1;
|
||||
result->tm_year = time_values.year - 1900;
|
||||
|
||||
operation = LIB$K_DAY_OF_WEEK;
|
||||
status = lib$cvt_from_internal_time(&operation,
|
||||
&result->tm_wday, systime);
|
||||
result->tm_wday %= 7;
|
||||
|
||||
operation = LIB$K_DAY_OF_YEAR;
|
||||
status = lib$cvt_from_internal_time(&operation,
|
||||
&result->tm_yday, systime);
|
||||
result->tm_yday--;
|
||||
|
||||
result->tm_isdst = 0; /* There's no way to know... */
|
||||
|
||||
ts = result;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return ts;
|
||||
}
|
66
crypto/o_time.h
Normal file
66
crypto/o_time.h
Normal file
@ -0,0 +1,66 @@
|
||||
/* crypto/o_time.h -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Richard Levitte (levitte@stacken.kth.se) for the OpenSSL
|
||||
* project 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HEADER_O_TIME_H
|
||||
#define HEADER_O_TIME_H
|
||||
|
||||
#include <time.h>
|
||||
|
||||
struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user