summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/ocsp/ocsp_cl.c75
-rw-r--r--src/lib/libcrypto/ts/ts_rsp_sign.c4
-rw-r--r--src/lib/libtls/tls_conninfo.c26
-rw-r--r--src/lib/libtls/tls_ocsp.c5
4 files changed, 58 insertions, 52 deletions
diff --git a/src/lib/libcrypto/ocsp/ocsp_cl.c b/src/lib/libcrypto/ocsp/ocsp_cl.c
index 5ef2226785..d8ee33c391 100644
--- a/src/lib/libcrypto/ocsp/ocsp_cl.c
+++ b/src/lib/libcrypto/ocsp/ocsp_cl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ocsp_cl.c,v 1.24 2024/03/02 09:08:41 tb Exp $ */ 1/* $OpenBSD: ocsp_cl.c,v 1.25 2024/03/24 11:30:12 beck Exp $ */
2/* Written by Tom Titchener <Tom_Titchener@groove.net> for the OpenSSL 2/* Written by Tom Titchener <Tom_Titchener@groove.net> for the OpenSSL
3 * project. */ 3 * project. */
4 4
@@ -68,6 +68,7 @@
68#include <openssl/ocsp.h> 68#include <openssl/ocsp.h>
69#include <openssl/objects.h> 69#include <openssl/objects.h>
70#include <openssl/pem.h> 70#include <openssl/pem.h>
71#include <openssl/posix_time.h>
71#include <openssl/x509.h> 72#include <openssl/x509.h>
72#include <openssl/x509v3.h> 73#include <openssl/x509v3.h>
73 74
@@ -394,69 +395,61 @@ int
394OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, 395OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd,
395 ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec) 396 ASN1_GENERALIZEDTIME *nextupd, long nsec, long maxsec)
396{ 397{
397 time_t t_now, t_tmp; 398 int64_t posix_next, posix_this, posix_now;
398 struct tm tm_this, tm_next, tm_tmp; 399 struct tm tm_this, tm_next;
399 400
400 time(&t_now); 401 /* Negative values of nsec make no sense */
402 if (nsec < 0)
403 return 0;
404
405 posix_now = time(NULL);
401 406
402 /* 407 /*
403 * Times must explicitly be a GENERALIZEDTIME as per section 408 * Times must explicitly be a GENERALIZEDTIME as per section
404 * 4.2.2.1 of RFC 6960 - It is invalid to accept other times 409 * 4.2.2.1 of RFC 6960 - It is invalid to accept other times
405 * (such as UTCTIME permitted/required by RFC 5280 for certificates) 410 * (such as UTCTIME permitted/required by RFC 5280 for certificates)
406 */ 411 */
407 412 /* Check that thisUpdate is valid. */
408 /* Check thisUpdate is valid and not more than nsec in the future */
409 if (ASN1_time_parse(thisupd->data, thisupd->length, &tm_this, 413 if (ASN1_time_parse(thisupd->data, thisupd->length, &tm_this,
410 V_ASN1_GENERALIZEDTIME) != V_ASN1_GENERALIZEDTIME) { 414 V_ASN1_GENERALIZEDTIME) != V_ASN1_GENERALIZEDTIME) {
411 OCSPerror(OCSP_R_ERROR_IN_THISUPDATE_FIELD); 415 OCSPerror(OCSP_R_ERROR_IN_THISUPDATE_FIELD);
412 return 0; 416 return 0;
413 } else { 417 }
414 t_tmp = t_now + nsec; 418 if (!OPENSSL_tm_to_posix(&tm_this, &posix_this))
415 if (gmtime_r(&t_tmp, &tm_tmp) == NULL) 419 return 0;
416 return 0; 420 /* thisUpdate must not be more than nsec in the future. */
417 if (ASN1_time_tm_cmp(&tm_this, &tm_tmp) > 0) { 421 if (posix_this - nsec > posix_now) {
418 OCSPerror(OCSP_R_STATUS_NOT_YET_VALID); 422 OCSPerror(OCSP_R_STATUS_NOT_YET_VALID);
419 return 0; 423 return 0;
420 } 424 }
421 425 /* thisUpdate must not be more than maxsec seconds in the past. */
422 /* 426 if (maxsec >= 0 && posix_this < posix_now - maxsec) {
423 * If maxsec specified check thisUpdate is not more than maxsec 427 OCSPerror(OCSP_R_STATUS_TOO_OLD);
424 * in the past 428 return 0;
425 */
426 if (maxsec >= 0) {
427 t_tmp = t_now - maxsec;
428 if (gmtime_r(&t_tmp, &tm_tmp) == NULL)
429 return 0;
430 if (ASN1_time_tm_cmp(&tm_this, &tm_tmp) < 0) {
431 OCSPerror(OCSP_R_STATUS_TOO_OLD);
432 return 0;
433 }
434 }
435 } 429 }
436 430
437 if (!nextupd) 431 /* RFC 6960 section 4.2.2.1 allows for servers to not set nextUpdate */
432 if (nextupd == NULL)
438 return 1; 433 return 1;
439 434
440 /* Check nextUpdate is valid and not more than nsec in the past */ 435 /* Check that nextUpdate is valid. */
441 if (ASN1_time_parse(nextupd->data, nextupd->length, &tm_next, 436 if (ASN1_time_parse(nextupd->data, nextupd->length, &tm_next,
442 V_ASN1_GENERALIZEDTIME) != V_ASN1_GENERALIZEDTIME) { 437 V_ASN1_GENERALIZEDTIME) != V_ASN1_GENERALIZEDTIME) {
443 OCSPerror(OCSP_R_ERROR_IN_NEXTUPDATE_FIELD); 438 OCSPerror(OCSP_R_ERROR_IN_NEXTUPDATE_FIELD);
444 return 0; 439 return 0;
445 } else {
446 t_tmp = t_now - nsec;
447 if (gmtime_r(&t_tmp, &tm_tmp) == NULL)
448 return 0;
449 if (ASN1_time_tm_cmp(&tm_next, &tm_tmp) < 0) {
450 OCSPerror(OCSP_R_STATUS_EXPIRED);
451 return 0;
452 }
453 } 440 }
454 441 if (!OPENSSL_tm_to_posix(&tm_next, &posix_next))
455 /* Also don't allow nextUpdate to precede thisUpdate */ 442 return 0;
456 if (ASN1_time_tm_cmp(&tm_next, &tm_this) < 0) { 443 /* Don't allow nextUpdate to precede thisUpdate. */
444 if (posix_next < posix_this) {
457 OCSPerror(OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE); 445 OCSPerror(OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE);
458 return 0; 446 return 0;
459 } 447 }
448 /* nextUpdate must not be more than nsec seconds in the past. */
449 if (posix_next + nsec < posix_now) {
450 OCSPerror(OCSP_R_STATUS_EXPIRED);
451 return 0;
452 }
460 453
461 return 1; 454 return 1;
462} 455}
diff --git a/src/lib/libcrypto/ts/ts_rsp_sign.c b/src/lib/libcrypto/ts/ts_rsp_sign.c
index 3013cffbc5..8eb687aab1 100644
--- a/src/lib/libcrypto/ts/ts_rsp_sign.c
+++ b/src/lib/libcrypto/ts/ts_rsp_sign.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ts_rsp_sign.c,v 1.32 2023/08/22 08:09:36 tb Exp $ */ 1/* $OpenBSD: ts_rsp_sign.c,v 1.33 2024/03/24 11:30:12 beck Exp $ */
2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL 2/* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL
3 * project 2002. 3 * project 2002.
4 */ 4 */
@@ -999,7 +999,7 @@ TS_RESP_set_genTime_with_precision(ASN1_GENERALIZEDTIME *asn1_time,
999 if (precision > TS_MAX_CLOCK_PRECISION_DIGITS) 999 if (precision > TS_MAX_CLOCK_PRECISION_DIGITS)
1000 goto err; 1000 goto err;
1001 1001
1002 if (!(tm = gmtime(&sec))) 1002 if (OPENSSL_gmtime(&sec, tm) == NULL)
1003 goto err; 1003 goto err;
1004 1004
1005 /* 1005 /*
diff --git a/src/lib/libtls/tls_conninfo.c b/src/lib/libtls/tls_conninfo.c
index 90fdfacad3..08f8714ecd 100644
--- a/src/lib/libtls/tls_conninfo.c
+++ b/src/lib/libtls/tls_conninfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_conninfo.c,v 1.24 2023/11/13 10:51:49 tb Exp $ */ 1/* $OpenBSD: tls_conninfo.c,v 1.25 2024/03/24 11:30:12 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2015 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2015 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2015 Bob Beck <beck@openbsd.org>
@@ -19,12 +19,27 @@
19#include <stdio.h> 19#include <stdio.h>
20#include <string.h> 20#include <string.h>
21 21
22#include <openssl/posix_time.h>
22#include <openssl/x509.h> 23#include <openssl/x509.h>
23 24
24#include <tls.h> 25#include <tls.h>
25#include "tls_internal.h" 26#include "tls_internal.h"
26 27
27int ASN1_time_tm_clamp_notafter(struct tm *tm); 28static int
29tls_convert_notafter(struct tm *tm, time_t *out_time)
30{
31 int64_t posix_time;
32
33 /* OPENSSL_timegm() fails if tm is not representable in a time_t */
34 if (OPENSSL_timegm(tm, out_time))
35 return 1;
36 if (!OPENSSL_tm_to_posix(tm, &posix_time))
37 return 0;
38 if (posix_time < INT32_MIN)
39 return 0;
40 *out_time = (posix_time > INT32_MAX) ? INT32_MAX : posix_time;
41 return 1;
42}
28 43
29int 44int
30tls_hex_string(const unsigned char *in, size_t inlen, char **out, 45tls_hex_string(const unsigned char *in, size_t inlen, char **out,
@@ -121,13 +136,10 @@ tls_get_peer_cert_times(struct tls *ctx, time_t *notbefore,
121 goto err; 136 goto err;
122 if (!ASN1_TIME_to_tm(after, &after_tm)) 137 if (!ASN1_TIME_to_tm(after, &after_tm))
123 goto err; 138 goto err;
124 if (!ASN1_time_tm_clamp_notafter(&after_tm)) 139 if (!tls_convert_notafter(&after_tm, notafter))
125 goto err; 140 goto err;
126 if ((*notbefore = timegm(&before_tm)) == -1) 141 if (!OPENSSL_timegm(&before_tm, notbefore))
127 goto err; 142 goto err;
128 if ((*notafter = timegm(&after_tm)) == -1)
129 goto err;
130
131 return (0); 143 return (0);
132 144
133 err: 145 err:
diff --git a/src/lib/libtls/tls_ocsp.c b/src/lib/libtls/tls_ocsp.c
index c7eb3e5986..f7d7ba9199 100644
--- a/src/lib/libtls/tls_ocsp.c
+++ b/src/lib/libtls/tls_ocsp.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_ocsp.c,v 1.24 2023/11/13 10:56:19 tb Exp $ */ 1/* $OpenBSD: tls_ocsp.c,v 1.25 2024/03/24 11:30:12 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2015 Marko Kreen <markokr@gmail.com> 3 * Copyright (c) 2015 Marko Kreen <markokr@gmail.com>
4 * Copyright (c) 2016 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2016 Bob Beck <beck@openbsd.org>
@@ -25,6 +25,7 @@
25 25
26#include <openssl/err.h> 26#include <openssl/err.h>
27#include <openssl/ocsp.h> 27#include <openssl/ocsp.h>
28#include <openssl/posix_time.h>
28#include <openssl/x509.h> 29#include <openssl/x509.h>
29 30
30#include <tls.h> 31#include <tls.h>
@@ -68,7 +69,7 @@ tls_ocsp_asn1_parse_time(struct tls *ctx, ASN1_GENERALIZEDTIME *gt, time_t *gt_t
68 return -1; 69 return -1;
69 if (!ASN1_TIME_to_tm(gt, &tm)) 70 if (!ASN1_TIME_to_tm(gt, &tm))
70 return -1; 71 return -1;
71 if ((*gt_time = timegm(&tm)) == -1) 72 if (!OPENSSL_timegm(&tm, gt_time))
72 return -1; 73 return -1;
73 return 0; 74 return 0;
74} 75}