diff options
author | beck <> | 2024-03-26 00:39:22 +0000 |
---|---|---|
committer | beck <> | 2024-03-26 00:39:22 +0000 |
commit | 2e1f12635b32ea18eabebe5ea32396d52baf0a45 (patch) | |
tree | 6dd26637f37e838317ca1c60102598aac9f0db14 | |
parent | 524d4c4cfbabb48b87f3e55e544ecee35b5b6539 (diff) | |
download | openbsd-2e1f12635b32ea18eabebe5ea32396d52baf0a45.tar.gz openbsd-2e1f12635b32ea18eabebe5ea32396d52baf0a45.tar.bz2 openbsd-2e1f12635b32ea18eabebe5ea32396d52baf0a45.zip |
Change ts to only support one second precision.
RFC 3631 allows for sub second ASN1 GENERALIZED times, if you
choose to support sub second time precison. It does not
indicate that an implementation must support them.
Supporting sub second timestamps is just silly and unrealistic,
so set our maximum to one second of precision. We then simplify
this code by removing some nasty eye-bleed that made artisinally
hand crafted strings and jammed them into an ASN1_GENERALIZEDTIME.
ok tb@, jsing@, with one second precision tested by kn@
-rw-r--r-- | src/lib/libcrypto/ts/ts.h | 6 | ||||
-rw-r--r-- | src/lib/libcrypto/ts/ts_conf.c | 5 | ||||
-rw-r--r-- | src/lib/libcrypto/ts/ts_rsp_sign.c | 82 |
3 files changed, 9 insertions, 84 deletions
diff --git a/src/lib/libcrypto/ts/ts.h b/src/lib/libcrypto/ts/ts.h index 5215fc0583..c2b2a9ed3d 100644 --- a/src/lib/libcrypto/ts/ts.h +++ b/src/lib/libcrypto/ts/ts.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ts.h,v 1.23 2023/11/19 15:46:10 tb Exp $ */ | 1 | /* $OpenBSD: ts.h,v 1.24 2024/03/26 00:39:22 beck Exp $ */ |
2 | /* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL | 2 | /* Written by Zoltan Glozik (zglozik@opentsa.org) for the OpenSSL |
3 | * project 2002, 2003, 2004. | 3 | * project 2002, 2003, 2004. |
4 | */ | 4 | */ |
@@ -389,8 +389,8 @@ int TS_RESP_CTX_set_accuracy(TS_RESP_CTX *ctx, | |||
389 | '0' means sec, '3' msec, '6' usec, and so on. Default is 0. */ | 389 | '0' means sec, '3' msec, '6' usec, and so on. Default is 0. */ |
390 | int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, | 390 | int TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, |
391 | unsigned clock_precision_digits); | 391 | unsigned clock_precision_digits); |
392 | /* At most we accept usec precision. */ | 392 | /* At most we accept sec precision. */ |
393 | #define TS_MAX_CLOCK_PRECISION_DIGITS 6 | 393 | #define TS_MAX_CLOCK_PRECISION_DIGITS 0 |
394 | 394 | ||
395 | /* No flags are set by default. */ | 395 | /* No flags are set by default. */ |
396 | void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); | 396 | void TS_RESP_CTX_add_flags(TS_RESP_CTX *ctx, int flags); |
diff --git a/src/lib/libcrypto/ts/ts_conf.c b/src/lib/libcrypto/ts/ts_conf.c index 5d27a8bbc3..ef8569ef04 100644 --- a/src/lib/libcrypto/ts/ts_conf.c +++ b/src/lib/libcrypto/ts/ts_conf.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ts_conf.c,v 1.13 2023/11/19 15:46:10 tb Exp $ */ | 1 | /* $OpenBSD: ts_conf.c,v 1.14 2024/03/26 00:39:22 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 | */ |
@@ -437,7 +437,8 @@ TS_CONF_set_clock_precision_digits(CONF *conf, const char *section, | |||
437 | if (!NCONF_get_number_e(conf, section, ENV_CLOCK_PRECISION_DIGITS, | 437 | if (!NCONF_get_number_e(conf, section, ENV_CLOCK_PRECISION_DIGITS, |
438 | &digits)) | 438 | &digits)) |
439 | digits = 0; | 439 | digits = 0; |
440 | if (digits < 0 || digits > TS_MAX_CLOCK_PRECISION_DIGITS) { | 440 | /* We only support second precision, so reject everything else */ |
441 | if (digits != 0) { | ||
441 | TS_CONF_invalid(section, ENV_CLOCK_PRECISION_DIGITS); | 442 | TS_CONF_invalid(section, ENV_CLOCK_PRECISION_DIGITS); |
442 | goto err; | 443 | goto err; |
443 | } | 444 | } |
diff --git a/src/lib/libcrypto/ts/ts_rsp_sign.c b/src/lib/libcrypto/ts/ts_rsp_sign.c index dc8241d2be..e3101340c5 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.34 2024/03/25 07:02:22 beck Exp $ */ | 1 | /* $OpenBSD: ts_rsp_sign.c,v 1.35 2024/03/26 00:39:22 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 | */ |
@@ -90,9 +90,6 @@ static ESS_CERT_ID *ESS_CERT_ID_new_init(X509 *cert, int issuer_needed); | |||
90 | static int TS_TST_INFO_content_new(PKCS7 *p7); | 90 | static int TS_TST_INFO_content_new(PKCS7 *p7); |
91 | static int ESS_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc); | 91 | static int ESS_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc); |
92 | 92 | ||
93 | static ASN1_GENERALIZEDTIME *TS_RESP_set_genTime_with_precision( | ||
94 | ASN1_GENERALIZEDTIME *, time_t, long, unsigned); | ||
95 | |||
96 | /* Default callbacks for response generation. */ | 93 | /* Default callbacks for response generation. */ |
97 | 94 | ||
98 | static ASN1_INTEGER * | 95 | static ASN1_INTEGER * |
@@ -434,7 +431,7 @@ LCRYPTO_ALIAS(TS_RESP_CTX_get_tst_info); | |||
434 | int | 431 | int |
435 | TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, unsigned precision) | 432 | TS_RESP_CTX_set_clock_precision_digits(TS_RESP_CTX *ctx, unsigned precision) |
436 | { | 433 | { |
437 | if (precision > TS_MAX_CLOCK_PRECISION_DIGITS) | 434 | if (precision > 0) |
438 | return 0; | 435 | return 0; |
439 | ctx->clock_precision_digits = precision; | 436 | ctx->clock_precision_digits = precision; |
440 | return 1; | 437 | return 1; |
@@ -650,8 +647,7 @@ TS_RESP_create_tst_info(TS_RESP_CTX *ctx, ASN1_OBJECT *policy) | |||
650 | !TS_TST_INFO_set_serial(tst_info, serial)) | 647 | !TS_TST_INFO_set_serial(tst_info, serial)) |
651 | goto end; | 648 | goto end; |
652 | if (!(*ctx->time_cb)(ctx, ctx->time_cb_data, &sec, &usec) || | 649 | if (!(*ctx->time_cb)(ctx, ctx->time_cb_data, &sec, &usec) || |
653 | !(asn1_time = TS_RESP_set_genTime_with_precision(NULL, sec, usec, | 650 | ((asn1_time = ASN1_GENERALIZEDTIME_set(NULL, sec)) == NULL) || |
654 | ctx->clock_precision_digits)) || | ||
655 | !TS_TST_INFO_set_time(tst_info, asn1_time)) | 651 | !TS_TST_INFO_set_time(tst_info, asn1_time)) |
656 | goto end; | 652 | goto end; |
657 | 653 | ||
@@ -984,75 +980,3 @@ err: | |||
984 | 980 | ||
985 | return 0; | 981 | return 0; |
986 | } | 982 | } |
987 | |||
988 | |||
989 | static ASN1_GENERALIZEDTIME * | ||
990 | TS_RESP_set_genTime_with_precision(ASN1_GENERALIZEDTIME *asn1_time, | ||
991 | time_t sec, long usec, unsigned precision) | ||
992 | { | ||
993 | struct tm tm; | ||
994 | char genTime_str[17 + TS_MAX_CLOCK_PRECISION_DIGITS]; | ||
995 | char usecstr[TS_MAX_CLOCK_PRECISION_DIGITS + 2]; | ||
996 | char *p; | ||
997 | int rv; | ||
998 | |||
999 | if (precision > TS_MAX_CLOCK_PRECISION_DIGITS) | ||
1000 | goto err; | ||
1001 | |||
1002 | if (OPENSSL_gmtime(&sec, &tm) == NULL) | ||
1003 | goto err; | ||
1004 | |||
1005 | /* | ||
1006 | * Put "genTime_str" in GeneralizedTime format. We work around the | ||
1007 | * restrictions imposed by rfc3280 (i.e. "GeneralizedTime values MUST | ||
1008 | * NOT include fractional seconds") and OpenSSL related functions to | ||
1009 | * meet the rfc3161 requirement: "GeneralizedTime syntax can include | ||
1010 | * fraction-of-second details". | ||
1011 | */ | ||
1012 | if (precision > 0) { | ||
1013 | /* To make things a bit harder, X.690 | ISO/IEC 8825-1 provides | ||
1014 | the following restrictions for a DER-encoding, which OpenSSL | ||
1015 | (specifically ASN1_GENERALIZEDTIME_check() function) doesn't | ||
1016 | support: | ||
1017 | "The encoding MUST terminate with a "Z" (which means "Zulu" | ||
1018 | time). The decimal point element, if present, MUST be the | ||
1019 | point option ".". The fractional-seconds elements, | ||
1020 | if present, MUST omit all trailing 0's; | ||
1021 | if the elements correspond to 0, they MUST be wholly | ||
1022 | omitted, and the decimal point element also MUST be | ||
1023 | omitted." */ | ||
1024 | (void) snprintf(usecstr, sizeof(usecstr), ".%06ld", usec); | ||
1025 | /* truncate and trim trailing 0 */ | ||
1026 | usecstr[precision + 1] = '\0'; | ||
1027 | p = usecstr + strlen(usecstr) - 1; | ||
1028 | while (p > usecstr && *p == '0') | ||
1029 | *p-- = '\0'; | ||
1030 | /* if we've reached the beginning, delete the . too */ | ||
1031 | if (p == usecstr) | ||
1032 | *p = '\0'; | ||
1033 | |||
1034 | } else { | ||
1035 | /* empty */ | ||
1036 | usecstr[0] = '\0'; | ||
1037 | } | ||
1038 | rv = snprintf(genTime_str, sizeof(genTime_str), | ||
1039 | "%04d%02d%02d%02d%02d%02d%sZ", | ||
1040 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | ||
1041 | tm.tm_hour, tm.tm_min, tm.tm_sec, usecstr); | ||
1042 | if (rv < 0 || rv >= sizeof(genTime_str)) | ||
1043 | goto err; | ||
1044 | |||
1045 | /* Now call OpenSSL to check and set our genTime value */ | ||
1046 | if (!asn1_time && !(asn1_time = ASN1_GENERALIZEDTIME_new())) | ||
1047 | goto err; | ||
1048 | if (!ASN1_GENERALIZEDTIME_set_string(asn1_time, genTime_str)) { | ||
1049 | ASN1_GENERALIZEDTIME_free(asn1_time); | ||
1050 | goto err; | ||
1051 | } | ||
1052 | |||
1053 | return asn1_time; | ||
1054 | |||
1055 | err: | ||
1056 | TSerror(TS_R_COULD_NOT_SET_TIME); | ||
1057 | return NULL; | ||
1058 | } | ||