diff --git a/crypto/asn1/a_gentm.c b/crypto/asn1/a_gentm.c index c79c6f538cdccc97f1c5ff3157d4102e6f59e8ba..2f72d4877cd374b76768985570c62d81bbec5757 100644 --- a/crypto/asn1/a_gentm.c +++ b/crypto/asn1/a_gentm.c @@ -115,7 +115,7 @@ err: #endif -int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *d) +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *d) { static const int min[9]={ 0, 0, 1, 1, 0, 0, 0, 0, 0}; static const int max[9]={99, 99,12,31,23,59,59,12,59}; diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c index e2eb9b243efbb17c046b097c50fcf4ae43d94b9c..57bc199376c50196669388b2ff761f1283665cb2 100644 --- a/crypto/asn1/a_time.c +++ b/crypto/asn1/a_time.c @@ -125,7 +125,7 @@ ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, return ASN1_GENERALIZEDTIME_adj(s, t, offset_day, offset_sec); } -int ASN1_TIME_check(ASN1_TIME *t) +int ASN1_TIME_check(const ASN1_TIME *t) { if (t->type == V_ASN1_GENERALIZEDTIME) return ASN1_GENERALIZEDTIME_check(t); @@ -196,3 +196,65 @@ int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) return 1; } + +#if 0 +static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *s) + { + const unsigned char *p; + + if (!ASN1_TIME_check(s)) + return 0; + + memset(tm, 0 ,sizeof tm); + p = s->data; + +#define g2(p) (((p)[0] - '0') * 10 + ((p)[1] - '0')) + if (s->type == V_ASN1_GENERALIZEDTIME) + { + int yr = g2(p) * 100 + g2(p + 2); + if (yr < 1900) + return 0; + tm->tm_year = yr - 1900; + p += 4; + } + else + { + tm->tm_year=g2(p); + if(tm->tm_year < 50) + tm->tm_year+=100; + p += 2; + } + tm->tm_mon=g2(p)-1; + tm->tm_mday=g2(p + 2); + tm->tm_hour=g2(p + 4); + tm->tm_min=g2(p + 6); + p += 8; + /* Seconds optional in UTCTime */ + if (s->type == V_ASN1_GENERALIZEDTIME || (*p >= '0' && *p <= '9')) + { + tm->tm_sec=g2(p); + p += 2; + } + else + tm->tm_sec = 0; + if (s->type == V_ASN1_GENERALIZEDTIME) + { + /* Skip any fractional seconds */ + if (*p == '.') + { + p++; + while (*p >= '0' && *p <= '9') + p++; + } + } + /* Timezone */ + if(*p != 'Z') + { + int off_sec = g2(p + 1) * 3600 + g2(p + 3) * 60; + if(*p == '-') + off_sec = -off_sec; + OPENSSL_gmtime_adj(tm, 0, off_sec); + } + return 1; + } +#endif diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c index 072e23659233479ce32b756276276638d95466a6..75608df3369d1b85376cb45a4c7e13bdc1ad3c4d 100644 --- a/crypto/asn1/a_utctm.c +++ b/crypto/asn1/a_utctm.c @@ -112,7 +112,7 @@ err: #endif -int ASN1_UTCTIME_check(ASN1_UTCTIME *d) +int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) { static const int min[8]={ 0, 1, 1, 0, 0, 0, 0, 0}; static const int max[8]={99,12,31,23,59,59,12,59}; diff --git a/crypto/asn1/asn1.h b/crypto/asn1/asn1.h index 45e8fe3159e74a9f85767f44210f31145213dee6..674eec8fe92f05d65e06c61653423d269e325155 100644 --- a/crypto/asn1/asn1.h +++ b/crypto/asn1/asn1.h @@ -839,7 +839,7 @@ int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) -int ASN1_UTCTIME_check(ASN1_UTCTIME *a); +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s,time_t t); ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec); @@ -849,7 +849,7 @@ int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s); #endif -int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *a); +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,time_t t); ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, long offset_sec); @@ -886,7 +886,7 @@ DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s,time_t t); ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s,time_t t, int offset_day, long offset_sec); -int ASN1_TIME_check(ASN1_TIME *t); +int ASN1_TIME_check(const ASN1_TIME *t); ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out); int ASN1_TIME_set_string(ASN1_TIME *s, const char *str);