From 2258bcded654fc970a747627c4f560a8b03cc5e8 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Wed, 12 Jul 2023 13:34:19 +0900 Subject: gpg: Fix expiration time when Creation-Date is specified. * g10/keygen.c (parse_expire_string_with_ct): New function, optionally supply the creation time. (parse_expire_string): Use parse_expire_string_with_ct with no creation time. (proc_parameter_file): Use parse_expire_string_with_ct possibly with the creation time. -- Cherry-pick from master commit of: b07b5144ff6a9208ea27fe1e1518270bd22b382c GnuPG-bug-id: 5252 Signed-off-by: NIIBE Yutaka --- g10/keygen.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'g10/keygen.c') diff --git a/g10/keygen.c b/g10/keygen.c index d5099dbb9..608867cfa 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -2740,14 +2740,19 @@ ask_curve (int *algo, int *subkey_algo, const char *current) * just cope for the next few years until we get a 64-bit time_t or * similar. */ -u32 -parse_expire_string( const char *string ) +static u32 +parse_expire_string_with_ct (const char *string, u32 creation_time) { int mult; u32 seconds; u32 abs_date = 0; - u32 curtime = make_timestamp (); time_t tt; + u32 curtime; + + if (creation_time == (u32)-1) + curtime = make_timestamp (); + else + curtime = creation_time; if (!string || !*string || !strcmp (string, "none") || !strcmp (string, "never") || !strcmp (string, "-")) @@ -2767,6 +2772,13 @@ parse_expire_string( const char *string ) return seconds; } +u32 +parse_expire_string ( const char *string ) +{ + return parse_expire_string_with_ct (string, (u32)-1); +} + + /* Parse a Creation-Date string which is either "1986-04-26" or "19860426T042640". Returns 0 on error. */ static u32 @@ -4130,6 +4142,7 @@ proc_parameter_file (ctrl_t ctrl, struct para_data_s *para, const char *fname, int is_default = 0; int have_user_id = 0; int err, algo; + u32 creation_time = (u32)-1; /* Check that we have all required parameters. */ r = get_parameter( para, pKEYTYPE ); @@ -4295,15 +4308,13 @@ proc_parameter_file (ctrl_t ctrl, struct para_data_s *para, const char *fname, if (r && *r->u.value && !(get_parameter_bool (para, pCARDKEY) && get_parameter_u32 (para, pKEYCREATIONDATE))) { - u32 seconds; - - seconds = parse_creation_string (r->u.value); - if (!seconds) + creation_time = parse_creation_string (r->u.value); + if (!creation_time) { log_error ("%s:%d: invalid creation date\n", fname, r->lnr ); return -1; } - r->u.creation = seconds; + r->u.creation = creation_time; r->key = pKEYCREATIONDATE; /* Change that entry. */ } @@ -4313,7 +4324,7 @@ proc_parameter_file (ctrl_t ctrl, struct para_data_s *para, const char *fname, { u32 seconds; - seconds = parse_expire_string( r->u.value ); + seconds = parse_expire_string_with_ct (r->u.value, creation_time); if( seconds == (u32)-1 ) { log_error("%s:%d: invalid expire date\n", fname, r->lnr ); -- cgit v1.2.3 From 96b69c1866dd960942c0c845ea3630f8884a8849 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Wed, 12 Jul 2023 14:04:28 +0900 Subject: gpg: Add support for Subkey-Expire-Date. * g10/keygen.c (enum para_name): Add pSUBKEYEXPIREDATE. (proc_parameter_file): Add support for pSUBKEYEXPIREDATE. (read_parameter_file): Add "Subkey-Expire-Date". -- Cherry-pick from master commit of: 23bcb78d279ebc81ec9340356401d19cf89985f1 Signed-off-by: NIIBE Yutaka --- g10/keygen.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'g10/keygen.c') diff --git a/g10/keygen.c b/g10/keygen.c index 608867cfa..c252b0de4 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -87,6 +87,7 @@ enum para_name { pEXPIREDATE, pKEYEXPIRE, /* in n seconds */ pSUBKEYCREATIONDATE, + pSUBKEYEXPIREDATE, pSUBKEYEXPIRE, /* in n seconds */ pAUTHKEYCREATIONDATE, /* Not yet used. */ pPASSPHRASE, @@ -4331,12 +4332,29 @@ proc_parameter_file (ctrl_t ctrl, struct para_data_s *para, const char *fname, return -1; } r->u.expire = seconds; - r->key = pKEYEXPIRE; /* change hat entry */ - /* also set it for the subkey */ - r = xmalloc_clear( sizeof *r + 20 ); - r->key = pSUBKEYEXPIRE; - r->u.expire = seconds; - append_to_parameter (para, r); + r->key = pKEYEXPIRE; /* change that entry */ + + /* Make SUBKEYEXPIRE from Subkey-Expire-Date, if any. */ + r = get_parameter( para, pSUBKEYEXPIREDATE ); + if( r && *r->u.value ) + { + seconds = parse_expire_string_with_ct (r->u.value, creation_time); + if( seconds == (u32)-1 ) + { + log_error("%s:%d: invalid subkey expire date\n", fname, r->lnr ); + return -1; + } + r->key = pSUBKEYEXPIRE; /* change that entry */ + r->u.expire = seconds; + } + else + { + /* Or else, set Expire-Date for the subkey */ + r = xmalloc_clear( sizeof *r + 20 ); + r->key = pSUBKEYEXPIRE; + r->u.expire = seconds; + append_to_parameter (para, r); + } } do_generate_keypair (ctrl, para, outctrl, card ); @@ -4367,6 +4385,7 @@ read_parameter_file (ctrl_t ctrl, const char *fname ) { "Name-Email", pNAMEEMAIL }, { "Name-Comment", pNAMECOMMENT }, { "Expire-Date", pEXPIREDATE }, + { "Subkey-Expire-Date", pSUBKEYEXPIREDATE }, { "Creation-Date", pCREATIONDATE }, { "Passphrase", pPASSPHRASE }, { "Preferences", pPREFERENCES }, -- cgit v1.2.3 From 606933dfb48ddd3113bc60eb8b18126112b3b8a4 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sat, 14 Oct 2023 17:23:42 +0200 Subject: gpg: Allow to specify seconds since Epoch beyond 2038. * g10/keygen.c (parse_expire_string_with_ct): Use new function scan_secondsstr. (parse_creation_string): Ditto. -- Noet that we cap the seconds at the year 2106. GnuPG-bug-id: 6736 --- g10/keygen.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'g10/keygen.c') diff --git a/g10/keygen.c b/g10/keygen.c index c252b0de4..06fc39aa1 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -2759,14 +2759,21 @@ parse_expire_string_with_ct (const char *string, u32 creation_time) || !strcmp (string, "never") || !strcmp (string, "-")) seconds = 0; else if (!strncmp (string, "seconds=", 8)) - seconds = atoi (string+8); + seconds = scan_secondsstr (string+8); else if ((abs_date = scan_isodatestr(string)) && (abs_date+86400/2) > curtime) seconds = (abs_date+86400/2) - curtime; else if ((tt = isotime2epoch (string)) != (time_t)(-1)) seconds = (u32)tt - curtime; else if ((mult = check_valid_days (string))) - seconds = atoi (string) * 86400L * mult; + { + uint64_t tmp64; + tmp64 = scan_secondsstr (string) * 86400L * mult; + if (tmp64 >= (u32)(-1)) + seconds = (u32)(-1) - 1; /* cap value. */ + else + seconds = (u32)tmp64; + } else seconds = (u32)(-1); @@ -2790,7 +2797,7 @@ parse_creation_string (const char *string) if (!*string) seconds = 0; else if ( !strncmp (string, "seconds=", 8) ) - seconds = atoi (string+8); + seconds = scan_secondsstr (string+8); else if ( !(seconds = scan_isodatestr (string))) { time_t tmp = isotime2epoch (string); -- cgit v1.2.3 From a4fe307b5535ed350fff63941aaa0b19ee2e683a Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 26 Oct 2023 12:01:44 +0200 Subject: gpg: Allow expiration time after 2038-01-19 on 32 bit Windows. * g10/keygen.c (parse_expire_string_with_ct): Use isotime2epoch_u64. (parse_creation_string): Ditto. -- GnuPG-bug-id: 6736 --- g10/keygen.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'g10/keygen.c') diff --git a/g10/keygen.c b/g10/keygen.c index 06fc39aa1..87940722d 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -2748,6 +2748,7 @@ parse_expire_string_with_ct (const char *string, u32 creation_time) u32 seconds; u32 abs_date = 0; time_t tt; + uint64_t tmp64; u32 curtime; if (creation_time == (u32)-1) @@ -2763,11 +2764,16 @@ parse_expire_string_with_ct (const char *string, u32 creation_time) else if ((abs_date = scan_isodatestr(string)) && (abs_date+86400/2) > curtime) seconds = (abs_date+86400/2) - curtime; - else if ((tt = isotime2epoch (string)) != (time_t)(-1)) - seconds = (u32)tt - curtime; + else if ((tt = isotime2epoch_u64 (string)) != (uint64_t)(-1)) + { + tmp64 = tt - curtime; + if (tmp64 >= (u32)(-1)) + seconds = (u32)(-1) - 1; /* cap value. */ + else + seconds = (u32)tmp64; + } else if ((mult = check_valid_days (string))) { - uint64_t tmp64; tmp64 = scan_secondsstr (string) * 86400L * mult; if (tmp64 >= (u32)(-1)) seconds = (u32)(-1) - 1; /* cap value. */ @@ -2800,8 +2806,13 @@ parse_creation_string (const char *string) seconds = scan_secondsstr (string+8); else if ( !(seconds = scan_isodatestr (string))) { - time_t tmp = isotime2epoch (string); - seconds = (tmp == (time_t)(-1))? 0 : tmp; + uint64_t tmp = isotime2epoch_u64 (string); + if (tmp == (uint64_t)(-1)) + seconds = 0; + else if (tmp > (u32)(-1)) + seconds = 0; + else + seconds = tmp; } return seconds; } -- cgit v1.2.3 From 95b9a31f81e4a56518269d2476b54a1f10fe8b3e Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 27 Oct 2023 14:20:47 +0200 Subject: gpg: Fix minor memory leak during certain smartcard operations. * g10/keygen.c (card_store_key_with_backup): Fix memory leak on error. --- g10/keygen.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'g10/keygen.c') diff --git a/g10/keygen.c b/g10/keygen.c index 87940722d..2f8528278 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -5386,17 +5386,26 @@ card_store_key_with_backup (ctrl_t ctrl, PKT_public_key *sub_psk, { ecdh_param_str = ecdh_param_str_from_pk (sk); if (!ecdh_param_str) - return gpg_error_from_syserror (); + { + free_public_key (sk); + return gpg_error_from_syserror (); + } } err = hexkeygrip_from_pk (sk, &hexgrip); if (err) - goto leave; + { + xfree (ecdh_param_str); + free_public_key (sk); + goto leave; + } memset(&info, 0, sizeof (info)); rc = agent_scd_getattr ("SERIALNO", &info); if (rc) { + xfree (ecdh_param_str); + free_public_key (sk); err = (gpg_error_t)rc; goto leave; } -- cgit v1.2.3