From: Todd Short Date: Wed, 3 May 2017 20:16:51 +0000 (-0400) Subject: Fix #340: Parse ASN1_TIME to struct tm X-Git-Tag: OpenSSL_1_1_1-pre1~1362 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=1c036c6443af3d0d912f074b0a2c4055c804115c;ds=sidebyside Fix #340: Parse ASN1_TIME to struct tm This works with ASN1_UTCTIME and ASN1_GENERALIZED_TIME Reviewed-by: Rich Salz Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/3378) --- diff --git a/crypto/asn1/a_time.c b/crypto/asn1/a_time.c index 46f539cb8d..27f9bc6808 100644 --- a/crypto/asn1/a_time.c +++ b/crypto/asn1/a_time.c @@ -130,20 +130,26 @@ int ASN1_TIME_set_string(ASN1_TIME *s, const char *str) return 1; } -static int asn1_time_to_tm(struct tm *tm, const ASN1_TIME *t) +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm) { - if (t == NULL) { + if (s == NULL) { time_t now_t; + time(&now_t); + memset(tm, 0, sizeof(*tm)); if (OPENSSL_gmtime(&now_t, tm)) return 1; return 0; } - if (t->type == V_ASN1_UTCTIME) - return asn1_utctime_to_tm(tm, t); - else if (t->type == V_ASN1_GENERALIZEDTIME) - return asn1_generalizedtime_to_tm(tm, t); + if (s->type == V_ASN1_UTCTIME) { + memset(tm, 0, sizeof(*tm)); + return asn1_utctime_to_tm(tm, s); + } + if (s->type == V_ASN1_GENERALIZEDTIME) { + memset(tm, 0, sizeof(*tm)); + return asn1_generalizedtime_to_tm(tm, s); + } return 0; } @@ -152,9 +158,10 @@ int ASN1_TIME_diff(int *pday, int *psec, const ASN1_TIME *from, const ASN1_TIME *to) { struct tm tm_from, tm_to; - if (!asn1_time_to_tm(&tm_from, from)) + + if (!ASN1_TIME_to_tm(from, &tm_from)) return 0; - if (!asn1_time_to_tm(&tm_to, to)) + if (!ASN1_TIME_to_tm(to, &tm_to)) return 0; return OPENSSL_gmtime_diff(pday, psec, &tm_from, &tm_to); } diff --git a/doc/man3/ASN1_TIME_set.pod b/doc/man3/ASN1_TIME_set.pod index e1a5234727..b9c0dcd22e 100644 --- a/doc/man3/ASN1_TIME_set.pod +++ b/doc/man3/ASN1_TIME_set.pod @@ -3,7 +3,7 @@ =head1 NAME ASN1_TIME_set, ASN1_TIME_adj, ASN1_TIME_check, ASN1_TIME_set_string, -ASN1_TIME_print, ASN1_TIME_diff - ASN.1 Time functions +ASN1_TIME_print, ASN1_TIME_to_tm, ASN1_TIME_diff - ASN.1 Time functions =head1 SYNOPSIS @@ -13,6 +13,7 @@ ASN1_TIME_print, ASN1_TIME_diff - ASN.1 Time functions int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); int ASN1_TIME_check(const ASN1_TIME *t); int ASN1_TIME_print(BIO *b, const ASN1_TIME *s); + int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); int ASN1_TIME_diff(int *pday, int *psec, const ASN1_TIME *from, const ASN1_TIME *to); @@ -42,6 +43,11 @@ format. It will be of the format MMM DD HH:MM:SS YYYY [GMT], for example structure has invalid format it prints out "Bad time value" and returns an error. +ASN1_TIME_to_tm() converts the time B to the standard B structure. +If B is NULL, then the current time is converted. The output time is GMT. +Only the B, B, B, B, B and B +fields are updated. + ASN1_TIME_diff() sets B<*pday> and B<*psec> to the time difference between B and B. If B represents a time later than B then one or both (depending on the time difference) of B<*pday> and B<*psec> @@ -124,12 +130,19 @@ otherwise. ASN1_TIME_print() returns 1 if the time is successfully printed out and 0 if an error occurred (I/O error or invalid time format). +ASN1_TIME_to_tm() returns 1 if the time is successfully parsed and 0 if an +error occured (invalid time format). + ASN1_TIME_diff() returns 1 for success and 0 for failure. It can fail if the pass ASN1_TIME structure has invalid syntax for example. +=head1 HISTORY + +The ASN1_TIME_to_tm() function was added in OpenSSL 1.1.1. + =head1 COPYRIGHT -Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. +Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. Licensed under the OpenSSL license (the "License"). You may not use this file except in compliance with the License. You can obtain a copy diff --git a/include/openssl/asn1.h b/include/openssl/asn1.h index 47796db9e4..9b523f52cf 100644 --- a/include/openssl/asn1.h +++ b/include/openssl/asn1.h @@ -628,6 +628,7 @@ int ASN1_TIME_check(const ASN1_TIME *t); ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, ASN1_GENERALIZEDTIME **out); int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); diff --git a/util/libcrypto.num b/util/libcrypto.num index b2e5f68570..37cb2c2f76 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -4297,3 +4297,4 @@ UI_method_set_data_duplicator 4239 1_1_1 EXIST::FUNCTION:UI UI_dup_user_data 4240 1_1_1 EXIST::FUNCTION:UI UI_method_get_data_destructor 4241 1_1_1 EXIST::FUNCTION:UI ERR_load_strings_const 4242 1_1_1 EXIST::FUNCTION: +ASN1_TIME_to_tm 4243 1_1_1 EXIST::FUNCTION: