aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2008-08-11 08:08:08 +0000
committerWerner Koch <[email protected]>2008-08-11 08:08:08 +0000
commitac5c3fab300b18fa7013483e243e1becf699b69f (patch)
treea402aff3fa64f5b8494b49f3bace7e1180ca33df
parentFix APDU buffer problem under MAC OS. (diff)
downloadgnupg-ac5c3fab300b18fa7013483e243e1becf699b69f.tar.gz
gnupg-ac5c3fab300b18fa7013483e243e1becf699b69f.zip
Cehck for expire date overflows.
-rw-r--r--doc/DETAILS14
-rw-r--r--g10/keygen.c38
2 files changed, 33 insertions, 19 deletions
diff --git a/doc/DETAILS b/doc/DETAILS
index 1dd9f5569..a74c0e907 100644
--- a/doc/DETAILS
+++ b/doc/DETAILS
@@ -839,10 +839,16 @@ The format of this file is as follows:
The 3 parts of a key. Remember to use UTF-8 here.
If you don't give any of them, no user ID is created.
Expire-Date: <iso-date>|(<number>[d|w|m|y])
- Set the expiration date for the key (and the subkey). It
- may either be entered in ISO date format (2000-08-15) or as
- number of days, weeks, month or years. Without a letter days
- are assumed.
+ Set the expiration date for the key (and the subkey). It may
+ either be entered in ISO date format (2000-08-15) or as number
+ of days, weeks, month or years. The special notation
+ "seconds=N" is also allowed to directly give an Epoch
+ value. Without a letter days are assumed. Note that there is
+ no check done on the overflow of the type used by OpenPGP for
+ timestamps. Thus you better make sure that the given value
+ make sense. Although OpenPGP works with time intervals, GnuPG
+ uses an absolute value internally and thus the last year we
+ can represent is 2105.
Creation-Date: <iso-date>
Set the creation date of the key as stored in the key
information and which is also part of the fingerprint
diff --git a/g10/keygen.c b/g10/keygen.c
index 4e8dd50b4..a056e5320 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -1789,21 +1789,23 @@ ask_keysize( int algo )
u32
parse_expire_string( const char *string )
{
- int mult;
- u32 seconds,abs_date=0,curtime = make_timestamp();
-
- if( !*string )
- seconds = 0;
- else if ( !strncmp (string, "seconds=", 8) )
- seconds = atoi (string+8);
- else if( (abs_date = scan_isodatestr(string)) && abs_date > curtime )
- seconds = abs_date - curtime;
- else if( (mult=check_valid_days(string)) )
- seconds = atoi(string) * 86400L * mult;
- else
- seconds=(u32)-1;
-
- return seconds;
+ int mult;
+ u32 seconds;
+ u32 abs_date = 0;
+ u32 curtime = make_timestamp ();
+
+ if (!*string)
+ seconds = 0;
+ else if (!strncmp (string, "seconds=", 8))
+ seconds = atoi (string+8);
+ else if ((abs_date = scan_isodatestr(string)) && abs_date > curtime)
+ seconds = abs_date - curtime;
+ else if ((mult = check_valid_days (string)))
+ seconds = atoi (string) * 86400L * mult;
+ else
+ seconds = (u32)(-1);
+
+ return seconds;
}
/* Parsean Creation-Date string which is either "1986-04-26" or
@@ -1916,7 +1918,13 @@ ask_expire_interval(int object,const char *def_expire)
tty_printf (_("Your system can't display dates beyond 2038.\n"
"However, it will be correctly handled up to"
" 2106.\n"));
+ else
#endif /*SIZEOF_TIME_T*/
+ if ( (time_t)((unsigned long)(curtime+interval)) < curtime )
+ {
+ tty_printf (_("invalid value\n"));
+ continue;
+ }
}
if( cpr_enabled() || cpr_get_answer_is_yes("keygen.valid.okay",