diff options
Diffstat (limited to 'src')
| -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 | } | ||
