+++ /dev/null
-
- LICENSE ISSUES
- ==============
-
- The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
- the OpenSSL License and the original SSLeay license apply to the toolkit.
- See below for the actual license texts. Actually both licenses are BSD-style
- Open Source licenses. In case of any license issues related to OpenSSL
- please contact openssl-core@openssl.org.
-
- OpenSSL License
- ---------------
-
-/* ====================================================================
- * Copyright (c) 1998-2016 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
- * openssl-core@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).
- *
- */
-
- Original SSLeay License
- -----------------------
-
-/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@cryptsoft.com).
- * The implementation was written so as to conform with Netscapes SSL.
- *
- * This library is free for commercial and non-commercial use as long as
- * the following conditions are aheared to. The following conditions
- * apply to all code found in this distribution, be it the RC4, RSA,
- * lhash, DES, etc., code; not just the SSL code. The SSL documentation
- * included with this distribution is covered by the same copyright terms
- * except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed.
- * If this package is used in a product, Eric Young should be given attribution
- * as the author of the parts of the library used.
- * This can be in the form of a textual message at program startup or
- * in documentation (online or textual) provided with the package.
- *
- * 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 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 acknowledgement:
- * "This product includes cryptographic software written by
- * Eric Young (eay@cryptsoft.com)"
- * The word 'cryptographic' can be left out if the rouines from the library
- * being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
- * the apps directory (application code) you must include an acknowledgement:
- * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
- * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
- * ANY EXPRESS 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 AUTHOR OR 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.
- *
- * The licence and distribution terms for any publically available version or
- * derivative of this code cannot be changed. i.e. this code cannot simply be
- * copied and put under another distribution licence
- * [including the GNU Public Licence.]
- */
-
#include <vcore/TimeConversion.h>
#include <dpl/log/log.h>
+#include <memory>
#include <cstring>
#include <climits>
+#include <openssl/asn1.h>
#define TIME_MAX LONG_MAX // time_t max value in arch 32bit
namespace {
-void _gmtime_adj(struct tm *tm, int offset)
-{
- time_t t = mktime(tm);
- t += offset;
- memset(tm, 0, sizeof(struct tm));
- gmtime_r(&t, tm);
-}
-
-/*
- * from openssl/crypto/asn1/a_gentm.c, openssl version 1.0.2d
- * return 1 on success, 0 on error
- * 1. local time only : yyyymmddHHMMSS[.fff]
- * 2. UTC time only : yyyymmddHHMM[SS[.fff]]Z
- * 3. Difference between local and UTC times : yyyymmddHHMM[SS[.fff]](+|-)HHMM
- */
-int asn1_generalizedtime_to_tm(struct tm *tm, 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 };
- char *a;
- int n, i, l, o;
-
- if (d->type != V_ASN1_GENERALIZEDTIME)
- return (0);
-
- l = d->length;
- a = (char *)d->data;
- o = 0;
-
- /*
- * GENERALIZEDTIME is similar to UTCTIME except the year is represented
- * as YYYY. This stuff treats everything as a two digit field so make
- * first two fields 00 to 99
- */
- if (l < 13)
- goto err;
-
- for (i = 0; i < 7; i++) {
- if ((i == 6) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
- i++;
-
- if (tm)
- tm->tm_sec = 0;
-
- break;
- }
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = a[o] - '0';
-
- if (++o > l)
- goto err;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = (n * 10) + a[o] - '0';
-
- if (++o > l)
- goto err;
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
-
- if (tm) {
- switch (i) {
- case 0:
- tm->tm_year = n * 100 - 1900;
- break;
-
- case 1:
- tm->tm_year += n;
- break;
-
- case 2:
- tm->tm_mon = n - 1;
- break;
-
- case 3:
- tm->tm_mday = n;
- break;
-
- case 4:
- tm->tm_hour = n;
- break;
-
- case 5:
- tm->tm_min = n;
- break;
-
- case 6:
- tm->tm_sec = n;
- break;
- }
- }
- }
-
- /*
- * Optional fractional seconds: decimal point followed by one or more
- * digits.
- */
- if (a[o] == '.') {
- if (++o > l)
- goto err;
-
- i = o;
-
- while ((a[o] >= '0') && (a[o] <= '9') && (o <= l))
- o++;
-
- /* Must have at least one digit after decimal point */
- if (i == o)
- goto err;
- }
-
- if (a[o] == 'Z') {
- o++;
- } else if ((a[o] == '+') || (a[o] == '-')) {
- int offsign = a[o] == '-' ? -1 : 1, offset = 0;
- o++;
-
- if (o + 4 > l)
- goto err;
-
- for (i = 7; i < 9; i++) {
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = a[o] - '0';
- o++;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = (n * 10) + a[o] - '0';
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
-
- if (tm) {
- if (i == 7)
- offset = n * 3600;
- else if (i == 8)
- offset += n * 60;
- }
-
- o++;
- }
-
- if (offset)
- _gmtime_adj(tm, offset * offsign);
- } else if (a[o]) {
- /* Missing time zone information. */
- goto err;
- }
-
- return (o == l);
-err:
- return (0);
-}
-
-/*
- * from openssl/crypto/asn1/a_utctm.c, openssl version 1.0.2d
- * return 1 on success, 0 on error
- * 1. yymmddHHMM[SS]Z
- * 2. yymmddHHMM[SS](+|-)HHMM
- */
-int asn1_utctime_to_tm(struct tm *tm, 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 };
- char *a;
- int n, i, l, o;
-
- if (d->type != V_ASN1_UTCTIME)
- return (0);
-
- l = d->length;
- a = (char *)d->data;
- o = 0;
-
- if (l < 11)
- goto err;
-
- for (i = 0; i < 6; i++) {
- if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
- i++;
-
- if (tm)
- tm->tm_sec = 0;
-
- break;
- }
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = a[o] - '0';
-
- if (++o > l)
- goto err;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = (n * 10) + a[o] - '0';
-
- if (++o > l)
- goto err;
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
-
- if (tm) {
- switch (i) {
- case 0:
- tm->tm_year = n < 50 ? n + 100 : n;
- break;
-
- case 1:
- tm->tm_mon = n - 1;
- break;
-
- case 2:
- tm->tm_mday = n;
- break;
-
- case 3:
- tm->tm_hour = n;
- break;
-
- case 4:
- tm->tm_min = n;
- break;
-
- case 5:
- tm->tm_sec = n;
- break;
- }
- }
- }
-
- if (a[o] == 'Z') {
- o++;
- } else if ((a[o] == '+') || (a[o] == '-')) {
- int offsign = a[o] == '-' ? -1 : 1, offset = 0;
- o++;
-
- if (o + 4 > l)
- goto err;
-
- for (i = 6; i < 8; i++) {
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = a[o] - '0';
- o++;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
-
- n = (n * 10) + a[o] - '0';
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
-
- if (tm) {
- if (i == 6)
- offset = n * 3600;
- else if (i == 7)
- offset += n * 60;
- }
-
- o++;
- }
-
- if (offset)
- _gmtime_adj(tm, offset * offsign);
- }
-
- return o == l;
-err:
- return 0;
-}
+const int SECONDS_PER_DAY = 24 * 60 * 60;
} // namespace anonymous
if (res == NULL)
return 0;
- int ret = 0;
- struct tm tm;
- memset(&tm, 0, sizeof(tm));
-
- if (t->type == V_ASN1_UTCTIME)
- ret = asn1_utctime_to_tm(&tm, t);
- else if (t->type == V_ASN1_GENERALIZEDTIME)
- ret = asn1_generalizedtime_to_tm(&tm, t);
- else
- ret = 0;
+ std::unique_ptr<ASN1_TIME, decltype(&ASN1_TIME_free)> epoch(
+ ASN1_TIME_set(NULL, 0),
+ ASN1_TIME_free);
- if (ret == 0)
+ if (!epoch) {
+ LogError("ASN1_TIME_set() failed");
return 0;
+ }
- char buf[27]; // asctime_r return 26 characters
- memset(buf, 0, sizeof(buf));
- LogDebug("Convert asn1 to tm: " << asctime_r(&tm, buf));
- *res = timegm(&tm);
- LogDebug("Convert tm to time_t: " << *res);
+ int day, sec;
+ if (1 != ASN1_TIME_diff(&day, &sec, epoch.get(), t)) {
+ LogError("ASN1_TIME_diff() failed");
+ return 0;
+ }
- // If time_t occured overflow, set TIME_MAX.
- if (*res == -1) {
- LogDebug("Occured overflow time_t. it may year 2038 problem.");
+ if ((TIME_MAX - sec) / SECONDS_PER_DAY < day) {
+ LogDebug("Overflow in time_t occured");
*res = TIME_MAX;
+ } else {
+ *res = day * SECONDS_PER_DAY + sec;
}
return 1;