aboutsummaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
Diffstat (limited to 'g10')
-rw-r--r--g10/ChangeLog22
-rw-r--r--g10/armor.c67
-rw-r--r--g10/filter.h1
-rw-r--r--g10/g10.c17
-rw-r--r--g10/getkey.c12
-rw-r--r--g10/keyedit.c67
-rw-r--r--g10/keygen.c66
-rw-r--r--g10/keyid.c2
-rw-r--r--g10/main.h2
-rw-r--r--g10/mainproc.c8
-rw-r--r--g10/options.h1
-rw-r--r--g10/parse-packet.c8
-rw-r--r--g10/pubring.asc19
-rw-r--r--g10/sign.c25
14 files changed, 228 insertions, 89 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index f904c3716..be2a984f9 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,25 @@
+Fri Nov 20 16:54:52 1998 Werner Koch ([email protected])
+
+ * g10.c (main): New option --not-dash-escaped
+ * sign.c (write_dashed_escaped): Ditto.
+ * armor.c (find_header): Support for NotDashEscaped header.
+
+Thu Nov 19 07:17:31 1998 Werner Koch <[email protected]>
+
+ * parse-packet.c (dump_sig_subpkt): Fixed expire listing
+ * getkey.c (merge_keys_and_selfsig): Fixed expire calculation.
+ (merge_one_pk_and_selfsig): Ditto.
+ * keyedit.c (menu_expire). Ditto.
+ * keygen.c (keygen_add_key_expire): Ditto.
+ (ask_expire_interval): New and changed all local function to use
+ this instead.
+ (keygen_add_key_expire): Opaque should now be a public key;
+ changed all callers.
+
+ * parse.packet.c (parse): use skip_rest to skip packets.
+
+ * keyedit.c (keyedit_menu): New arg for cmdline cmds.
+
Wed Nov 18 20:33:50 1998 Werner Koch ([email protected])
* trustdb.c (check_trustdb): Now rechecks all gived userids.
diff --git a/g10/armor.c b/g10/armor.c
index c1da9accd..91eb55198 100644
--- a/g10/armor.c
+++ b/g10/armor.c
@@ -1,4 +1,4 @@
-/* armor.c - Armor filter
+/* armor.c - Armor flter
* Copyright (C) 1998 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
@@ -74,7 +74,10 @@ typedef enum {
fhdrENDClearsig,
fhdrENDClearsigHelp,
fhdrTESTSpaces,
+ fhdrCLEARSIGSimple,
+ fhdrCLEARSIGSimpleNext,
fhdrTEXT,
+ fhdrTEXTSimple,
fhdrERROR,
fhdrERRORShow,
fhdrEOF
@@ -110,7 +113,7 @@ static fhdr_state_t find_header( fhdr_state_t state,
byte *buf, size_t *r_buflen,
IOBUF a, size_t n,
unsigned *r_empty, int *r_hashes,
- int only_keyblocks );
+ int only_keyblocks, int *not_dashed );
static void
@@ -262,7 +265,7 @@ parse_hash_header( const char *line )
static fhdr_state_t
find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
IOBUF a, size_t n, unsigned *r_empty, int *r_hashes,
- int only_keyblocks )
+ int only_keyblocks, int *not_dashed )
{
int c=0, i;
const char *s;
@@ -343,8 +346,15 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
putc('\n', stderr);
}
if( clearsig && !(hashes=parse_hash_header( buf )) ) {
- log_error(_("invalid clearsig header\n"));
- state = fhdrERROR;
+ if( strlen(buf) > 15
+ && !memcmp( buf, "NotDashEscaped:", 15 ) ) {
+ *not_dashed = 1;
+ state = fhdrWAITHeader;
+ }
+ else {
+ log_error(_("invalid clearsig header\n"));
+ state = fhdrERROR;
+ }
}
else {
state = fhdrWAITHeader;
@@ -449,6 +459,31 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
log_info(_("armor: %s\n"), head_strings[hdr_line]);
break;
+ case fhdrCLEARSIGSimple:
+ /* we are at the begin of a new line */
+ case fhdrCLEARSIGSimpleNext:
+ n = 0;
+ c = 0;
+ while( n < buflen && (c=iobuf_get(a)) != -1 ) {
+ buf[n++] = c;
+ if( c == '\n' )
+ break;
+ }
+ buf[n] = 0;
+ if( c == -1 )
+ state = fhdrEOF;
+ else if( state == fhdrCLEARSIGSimple
+ && n > 15 && !memcmp(buf, "-----", 5 ) ) {
+ if( c == '\n' )
+ buf[n-1] = 0;
+ state = fhdrENDClearsig;
+ }
+ else if( c == '\n' )
+ state = fhdrCLEARSIGSimple;
+ else
+ state = fhdrCLEARSIGSimpleNext;
+ break;
+
case fhdrCLEARSIG:
case fhdrEMPTYClearsig:
case fhdrREADClearsig:
@@ -472,6 +507,10 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
break;
case fhdrCHECKDashEscaped3:
+ if( *not_dashed ) {
+ state = fhdrTEXTSimple;
+ break;
+ }
if( !(n > 1 && buf[0] == '-' && buf[1] == ' ' ) ) {
state = fhdrTEXT;
break;
@@ -501,7 +540,7 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
/* check the clearsig line */
if( n > 15 && !memcmp(buf, "-----", 5 ) )
state = fhdrENDClearsig;
- else if( buf[0] == '-' && buf[1] == ' ' )
+ else if( buf[0] == '-' && buf[1] == ' ' && !*not_dashed )
state = fhdrCHECKDashEscaped;
else {
state = fhdrTESTSpaces;
@@ -512,7 +551,7 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
/* check the clearsig line */
if( n > 15 && !memcmp(buf, "-----", 5 ) )
state = fhdrENDClearsig;
- else if( buf[0] == '-' && buf[1] == ' ' )
+ else if( buf[0] == '-' && buf[1] == ' ' && !*not_dashed )
state = fhdrCHECKDashEscaped2;
else {
state = fhdrREADClearsig;
@@ -591,6 +630,11 @@ find_header( fhdr_state_t state, byte *buf, size_t *r_buflen,
if( clearsig && state == fhdrTEXT )
state = fhdrCLEARSIG;
+ else if( clearsig && state == fhdrTEXTSimple ) {
+ state = fhdrCLEARSIGSimple;
+ buf[n] = '\n';
+ n++;
+ }
if( state == fhdrCLEARSIG || state == fhdrREADClearsig ) {
/* append CR,LF after removing trailing wspaces */
@@ -631,7 +675,7 @@ check_input( armor_filter_context_t *afx, IOBUF a )
n = DIM(afx->helpbuf);
state = find_header( state, afx->helpbuf, &n, a,
afx->helplen, &emplines, &afx->hashes,
- afx->only_keyblocks );
+ afx->only_keyblocks, &afx->not_dash_escaped );
switch( state ) {
case fhdrNOArmor:
afx->inp_checked = 1;
@@ -649,6 +693,8 @@ check_input( armor_filter_context_t *afx, IOBUF a )
case fhdrNullClearsig:
case fhdrCLEARSIG: /* start fake package mode (for clear signatures) */
+ case fhdrCLEARSIGSimple:
+ case fhdrCLEARSIGSimpleNext:
afx->helplen = n;
afx->helpidx = 0;
afx->faked = 1;
@@ -718,7 +764,8 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
state = find_header( state, afx->helpbuf, &n, a,
state == fhdrNullClearsig? afx->helplen:0,
&emplines, &afx->hashes,
- afx->only_keyblocks );
+ afx->only_keyblocks,
+ &afx->not_dash_escaped );
switch( state) {
case fhdrERROR:
invalid_armor();
@@ -733,6 +780,8 @@ fake_packet( armor_filter_context_t *afx, IOBUF a,
case fhdrREADClearsig:
case fhdrREADClearsigNext:
+ case fhdrCLEARSIGSimple:
+ case fhdrCLEARSIGSimpleNext:
afx->helplen = n;
break;
diff --git a/g10/filter.h b/g10/filter.h
index 1cf8f8e42..f4d924965 100644
--- a/g10/filter.h
+++ b/g10/filter.h
@@ -45,6 +45,7 @@ typedef struct {
int inp_bypass; /* set if the input is not armored */
int any_data;
const char *hdrlines;
+ int not_dash_escaped;
} armor_filter_context_t;
diff --git a/g10/g10.c b/g10/g10.c
index d2e196e9d..2d8bf6107 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -146,6 +146,7 @@ enum cmd_and_opt_values { aNull = 0,
oS2KDigest,
oS2KCipher,
oCharset,
+ oNotDashEscaped,
aTest };
@@ -294,6 +295,7 @@ static ARGPARSE_OPTS opts[] = {
{ oRunAsShmCP, "run-as-shm-coprocess", 4, "@" },
{ oSetFilename, "set-filename", 2, "@" },
{ oComment, "comment", 2, "@" },
+ { oNotDashEscaped, "not-dash-escaped", 0, "@" },
{0} };
@@ -767,6 +769,7 @@ main( int argc, char **argv )
log_error(_("%s is not a valid character set\n"),
pargs.r.ret_str);
break;
+ case oNotDashEscaped: opt.not_dash_escaped = 1; break;
default : pargs.err = configfp? 1:2; break;
}
@@ -988,9 +991,17 @@ main( int argc, char **argv )
case aSignKey: /* sign the key given as argument */
case aEditKey: /* Edit a key signature */
- if( argc != 1 )
- wrong_args(_("--edit-key username"));
- keyedit_menu(fname, locusr );
+ if( !argc )
+ wrong_args(_("--edit-key username [commands]"));
+ if( argc > 1 ) {
+ sl = NULL;
+ for( argc--, argv++ ; argc; argc--, argv++ )
+ append_to_strlist( &sl, *argv );
+ keyedit_menu( fname, locusr, sl );
+ free_strlist(sl);
+ }
+ else
+ keyedit_menu(fname, locusr, NULL );
break;
#endif /* IS_G10 */
diff --git a/g10/getkey.c b/g10/getkey.c
index dcc90a5be..a6d0ed1a9 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -721,7 +721,7 @@ merge_one_pk_and_selfsig( KBNODE keyblock, KBNODE knode )
*/
const byte *p;
p = parse_sig_subpkt( sig->hashed_data, SIGSUBPKT_KEY_EXPIRE, NULL );
- pk->expiredate = p? buffer_to_u32(p):0;
+ pk->expiredate = p? pk->timestamp + buffer_to_u32(p):0;
/* fixme: add usage etc. to pk */
break;
}
@@ -739,7 +739,7 @@ merge_keys_and_selfsig( KBNODE keyblock )
PKT_secret_key *sk = NULL;
PKT_signature *sig;
KBNODE k;
- u32 kid[2];
+ u32 kid[2] = { 0, 0 };
for(k=keyblock; k; k = k->next ) {
if( k->pkt->pkttype == PKT_PUBLIC_KEY
@@ -747,7 +747,7 @@ merge_keys_and_selfsig( KBNODE keyblock )
pk = k->pkt->pkt.public_key; sk = NULL;
if( pk->version < 4 )
pk = NULL; /* not needed for old keys */
- else
+ else if( k->pkt->pkttype == PKT_PUBLIC_KEY )
keyid_from_pk( pk, kid );
}
else if( k->pkt->pkttype == PKT_SECRET_KEY
@@ -755,7 +755,7 @@ merge_keys_and_selfsig( KBNODE keyblock )
pk = NULL; sk = k->pkt->pkt.secret_key;
if( sk->version < 4 )
sk = NULL;
- else
+ else if( k->pkt->pkttype == PKT_SECRET_KEY )
keyid_from_sk( sk, kid );
}
else if( (pk || sk ) && k->pkt->pkttype == PKT_SIGNATURE
@@ -770,12 +770,12 @@ merge_keys_and_selfsig( KBNODE keyblock )
const byte *p;
p = parse_sig_subpkt( sig->hashed_data, SIGSUBPKT_KEY_EXPIRE, NULL );
if( pk ) {
- pk->expiredate = p? buffer_to_u32(p):0;
+ pk->expiredate = p? pk->timestamp + buffer_to_u32(p):0;
/* fixme: add usage etc. */
pk = NULL; /* use only the first self signature */
}
else {
- sk->expiredate = p? buffer_to_u32(p):0;
+ sk->expiredate = p? sk->timestamp + buffer_to_u32(p):0;
sk = NULL; /* use only the first self signature */
}
}
diff --git a/g10/keyedit.c b/g10/keyedit.c
index 2d3a0d093..8ed316793 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -475,7 +475,7 @@ fix_keyblock( KBNODE keyblock )
*/
void
-keyedit_menu( const char *username, STRLIST locusr )
+keyedit_menu( const char *username, STRLIST locusr, STRLIST commands )
{
enum cmdids { cmdNONE = 0,
cmdQUIT, cmdHELP, cmdFPR, cmdLIST, cmdSELUID, cmdCHECK, cmdSIGN,
@@ -527,9 +527,10 @@ keyedit_menu( const char *username, STRLIST locusr )
int modified = 0;
int sec_modified = 0;
int toggle;
+ int have_commands = !!commands;
- if( opt.batch ) {
+ if( opt.batch && !have_commands ) {
log_error(_("can't do that in batchmode\n"));
goto leave;
}
@@ -574,8 +575,21 @@ keyedit_menu( const char *username, STRLIST locusr )
}
do {
m_free(answer);
- answer = cpr_get(N_("keyedit.cmd"), _("Command> "));
- cpr_kill_prompt();
+ if( have_commands ) {
+ if( commands ) {
+ answer = m_strdup( commands->d );
+ commands = commands->next;
+ }
+ else if( opt.batch ) {
+ answer = m_strdup("quit");
+ }
+ else
+ have_commands = 0;
+ }
+ if( !have_commands ) {
+ answer = cpr_get(N_("keyedit.cmd"), _("Command> "));
+ cpr_kill_prompt();
+ }
trim_spaces(answer);
} while( *answer == '#' );
@@ -617,6 +631,8 @@ keyedit_menu( const char *username, STRLIST locusr )
break;
case cmdQUIT:
+ if( have_commands )
+ goto leave;
if( !modified && !sec_modified )
goto leave;
if( !cpr_get_answer_is_yes(N_("keyedit.save.okay"),
@@ -1023,7 +1039,7 @@ menu_adduid( KBNODE pub_keyblock, KBNODE sec_keyblock )
assert(pk && sk );
rc = make_keysig_packet( &sig, pk, uid, NULL, sk, 0x13, 0,
- keygen_add_std_prefs, sk );
+ keygen_add_std_prefs, pk );
free_secret_key( sk );
if( rc ) {
log_error("signing failed: %s\n", g10_errstr(rc) );
@@ -1168,7 +1184,7 @@ menu_delkey( KBNODE pub_keyblock, KBNODE sec_keyblock )
static int
menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
{
- int n1, rc;
+ int n1, signumber, rc;
u32 expiredate;
int mainkey=0;
PKT_secret_key *sk; /* copy of the main sk */
@@ -1195,26 +1211,24 @@ menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
}
expiredate = ask_expiredate();
- /* fixme: check that expiredate is > key creation date */
-
- /* get the secret key , make a copy and set the expiration time into
- * that key (because keygen_add-key-expire expects it there)
- */
node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
- sk->expiredate = expiredate;
/* Now we can actually change the self signature(s) */
main_pk = sub_pk = NULL;
uid = NULL;
+ signumber = 0;
for( node=pub_keyblock; node; node = node->next ) {
if( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
main_pk = node->pkt->pkt.public_key;
keyid_from_pk( main_pk, keyid );
+ main_pk->expiredate = expiredate;
}
else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
- && (node->flag & NODFLG_SELKEY ) )
+ && (node->flag & NODFLG_SELKEY ) ) {
sub_pk = node->pkt->pkt.public_key;
+ sub_pk->expiredate = expiredate;
+ }
else if( node->pkt->pkttype == PKT_USER_ID )
uid = node->pkt->pkt.user_id;
else if( main_pk && node->pkt->pkttype == PKT_SIGNATURE ) {
@@ -1222,16 +1236,31 @@ menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
&& ( (mainkey && uid && (sig->sig_class&~3) == 0x10)
|| (!mainkey && sig->sig_class == 0x18) ) ) {
- /* this is a selfsignature which should be replaced */
+ /* this is a selfsignature which is to be replaced */
PKT_signature *newsig;
PACKET *newpkt;
KBNODE sn;
+ int signumber2 = 0;
+
+ signumber++;
+
+ if( (mainkey && main_pk->version < 4)
+ || (!mainkey && sub_pk->version < 4 ) ) {
+ log_info(_(
+ "You can't change the expiration date of a v3 key\n"));
+ free_secret_key( sk );
+ return 0;
+ }
/* find the corresponding secret self-signature */
for( sn=sec_keyblock; sn; sn = sn->next ) {
- if( sn->pkt->pkttype == PKT_SIGNATURE
- && !cmp_signatures( sn->pkt->pkt.signature, sig ) )
- break;
+ if( sn->pkt->pkttype == PKT_SIGNATURE ) {
+ PKT_signature *b = sn->pkt->pkt.signature;
+ if( keyid[0] == b->keyid[0] && keyid[1] == b->keyid[1]
+ && sig->sig_class == b->sig_class
+ && ++signumber2 == signumber )
+ break;
+ }
}
if( !sn )
log_info(_("No corresponding signature in secret ring\n"));
@@ -1240,11 +1269,11 @@ menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
if( mainkey )
rc = make_keysig_packet( &newsig, main_pk, uid, NULL,
sk, 0x13, 0,
- keygen_add_std_prefs, sk );
+ keygen_add_std_prefs, main_pk );
else
rc = make_keysig_packet( &newsig, main_pk, NULL, sub_pk,
sk, 0x18, 0,
- keygen_add_key_expire, sk );
+ keygen_add_key_expire, sub_pk );
if( rc ) {
log_error("make_keysig_packet failed: %s\n",
g10_errstr(rc));
diff --git a/g10/keygen.c b/g10/keygen.c
index a17d47927..34f4d97d1 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -54,12 +54,13 @@ write_uid( KBNODE root, const char *s )
int
keygen_add_key_expire( PKT_signature *sig, void *opaque )
{
- PKT_secret_key *sk = opaque;
+ PKT_public_key *pk = opaque;
byte buf[8];
u32 u;
- if( sk->expiredate ) {
- u = sk->expiredate;
+ if( pk->expiredate ) {
+ u = pk->expiredate > pk->timestamp? pk->expiredate - pk->timestamp
+ : pk->timestamp;
buf[0] = (u >> 24) & 0xff;
buf[1] = (u >> 16) & 0xff;
buf[2] = (u >> 8) & 0xff;
@@ -135,7 +136,7 @@ write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk )
/* and make the signature */
rc = make_keysig_packet( &sig, pk, uid, NULL, sk, 0x13, 0,
- keygen_add_std_prefs, sk );
+ keygen_add_std_prefs, pk );
if( rc ) {
log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
return rc;
@@ -176,7 +177,7 @@ write_keybinding( KBNODE root, KBNODE pub_root, PKT_secret_key *sk )
/* and make the signature */
rc = make_keysig_packet( &sig, pk, NULL, subpk, sk, 0x18, 0,
- keygen_add_key_expire, sk );
+ keygen_add_key_expire, subpk );
if( rc ) {
log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
return rc;
@@ -192,7 +193,7 @@ write_keybinding( KBNODE root, KBNODE pub_root, PKT_secret_key *sk )
static int
gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
- STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expiredate,
+ STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expireval,
int version )
{
int rc;
@@ -214,9 +215,9 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
pk = m_alloc_clear( sizeof *pk );
sk->timestamp = pk->timestamp = make_timestamp();
sk->version = pk->version = version;
- if( expiredate && expiredate < sk->timestamp )
- expiredate = sk->timestamp; /* key generatio may take long */
- sk->expiredate = pk->expiredate = expiredate;
+ if( expireval ) {
+ sk->expiredate = pk->expiredate = sk->timestamp + expireval;
+ }
sk->pubkey_algo = pk->pubkey_algo = algo;
pk->pkey[0] = mpi_copy( skey[0] );
pk->pkey[1] = mpi_copy( skey[1] );
@@ -268,7 +269,7 @@ gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
*/
static int
gen_dsa(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
- STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expiredate )
+ STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expireval )
{
int rc;
int i;
@@ -291,9 +292,9 @@ gen_dsa(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
pk = m_alloc_clear( sizeof *pk );
sk->timestamp = pk->timestamp = make_timestamp();
sk->version = pk->version = 4;
- if( expiredate && expiredate < pk->timestamp )
- expiredate = pk->timestamp; /* key generation may take long */
- sk->expiredate = pk->expiredate = expiredate;
+ if( expireval ) {
+ sk->expiredate = pk->expiredate = sk->timestamp + expireval;
+ }
sk->pubkey_algo = pk->pubkey_algo = PUBKEY_ALGO_DSA;
pk->pkey[0] = mpi_copy( skey[0] );
pk->pkey[1] = mpi_copy( skey[1] );
@@ -481,12 +482,12 @@ ask_keysize( int algo )
}
-u32
-ask_expiredate()
+static u32
+ask_expire_interval()
{
char *answer;
int valid_days=0;
- u32 expiredate = 0;
+ u32 interval = 0;
tty_printf(_("Please specify how long the key should be valid.\n"
" 0 = key does not expire\n"
@@ -494,7 +495,7 @@ ask_expiredate()
" <n>w = key expires in n weeks\n"
" <n>m = key expires in n months\n"
" <n>y = key expires in n years\n"));
- /* Note: The elgamal subkey for DSA has no exiration date because
+ /* Note: The elgamal subkey for DSA has no expiration date because
* it must be signed with the DSA key and this one has the expiration
* date */
@@ -520,12 +521,13 @@ ask_expiredate()
if( !valid_days ) {
tty_printf(_("Key does not expire at all\n"));
- expiredate = 0;
+ interval = 0;
}
else {
- expiredate = make_timestamp() + valid_days * 86400L;
+ interval = valid_days * 86400L;
/* print the date when the key expires */
- tty_printf(_("Key expires at %s\n"), asctimestamp(expiredate) );
+ tty_printf(_("Key expires at %s\n"),
+ asctimestamp(make_timestamp() + interval ) );
}
if( !cpr_enabled()
@@ -534,9 +536,15 @@ ask_expiredate()
break;
}
m_free(answer);
- return expiredate;
+ return interval;
}
+u32
+ask_expiredate()
+{
+ u32 x = ask_expire_interval();
+ return x? make_timestamp() + x : 0;
+}
static int
has_invalid_email_chars( const char *s )
@@ -804,7 +812,7 @@ generate_keypair()
STRING2KEY *s2k;
int rc;
int algo;
- u32 expiredate;
+ u32 expire;
int v4;
int both = 0;
@@ -820,7 +828,7 @@ generate_keypair()
tty_printf(_("DSA keypair will have 1024 bits.\n"));
}
nbits = ask_keysize( algo );
- expiredate = ask_expiredate();
+ expire = ask_expire_interval();
uid = ask_user_id(0);
if( !uid ) {
log_error(_("Key generation cancelled.\n"));
@@ -847,10 +855,10 @@ generate_keypair()
if( both )
rc = do_create( PUBKEY_ALGO_DSA, 1024, pub_root, sec_root,
- dek, s2k, &sk, expiredate, 1);
+ dek, s2k, &sk, expire, 1);
else
rc = do_create( algo, nbits, pub_root, sec_root,
- dek, s2k, &sk, expiredate, v4);
+ dek, s2k, &sk, expire, v4);
if( !rc )
write_uid(pub_root, uid );
if( !rc )
@@ -862,7 +870,7 @@ generate_keypair()
if( both ) {
rc = do_create( algo, nbits, pub_root, sec_root,
- dek, s2k, NULL, expiredate, 1 );
+ dek, s2k, NULL, expire, 1 );
if( !rc )
rc = write_keybinding(pub_root, pub_root, sk);
if( !rc )
@@ -951,7 +959,7 @@ generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock )
KBNODE node;
PKT_secret_key *sk = NULL; /* this is the primary sk */
int v4, algo;
- u32 expiredate;
+ u32 expire;
unsigned nbits;
char *passphrase = NULL;
DEK *dek = NULL;
@@ -988,7 +996,7 @@ generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock )
algo = ask_algo( &v4, 1 );
assert(algo);
nbits = ask_keysize( algo );
- expiredate = ask_expiredate();
+ expire = ask_expire_interval();
if( !cpr_enabled() && !cpr_get_answer_is_yes(N_("keygen.sub.okay"),
_("Really create? ") ) )
goto leave;
@@ -1002,7 +1010,7 @@ generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock )
}
rc = do_create( algo, nbits, pub_keyblock, sec_keyblock,
- dek, s2k, NULL, expiredate, v4 );
+ dek, s2k, NULL, expire, v4 );
if( !rc )
rc = write_keybinding(pub_keyblock, pub_keyblock, sk);
if( !rc )
diff --git a/g10/keyid.c b/g10/keyid.c
index fa5b9237e..21e7e12e3 100644
--- a/g10/keyid.c
+++ b/g10/keyid.c
@@ -310,7 +310,7 @@ expirestr_from_pk( PKT_public_key *pk )
if( !pk->expiredate )
return "never ";
- atime = pk->expiredate;
+ atime = pk->expiredate;
tp = gmtime( &atime );
sprintf(buffer,"%04d-%02d-%02d", 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
return buffer;
diff --git a/g10/main.h b/g10/main.h
index b95061495..746a94dc2 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -77,7 +77,7 @@ int check_key_signature( KBNODE root, KBNODE node, int *is_selfsig );
int delete_key( const char *username, int secure );
/*-- keyedit.c --*/
-void keyedit_menu( const char *username, STRLIST locusr );
+void keyedit_menu( const char *username, STRLIST locusr, STRLIST cmds );
/*-- keygen.c --*/
u32 ask_expiredate(void);
diff --git a/g10/mainproc.c b/g10/mainproc.c
index 50600a127..aa903025f 100644
--- a/g10/mainproc.c
+++ b/g10/mainproc.c
@@ -278,13 +278,7 @@ proc_plaintext( CTX c, PACKET *pkt )
md_enable( c->mfx.md, DIGEST_ALGO_SHA1 );
md_enable( c->mfx.md, DIGEST_ALGO_MD5 );
}
- #if 0
- if( c->mfx.md ) {
- m_check(c->mfx.md);
- if( c->mfx.md->list )
- m_check( c->mfx.md->list );
- }
- #endif
+
rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
/* can't write output but we hash it anyway to
diff --git a/g10/options.h b/g10/options.h
index 1502d7453..538b175d7 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -64,6 +64,7 @@ struct {
int s2k_mode;
int s2k_digest_algo;
int s2k_cipher_algo;
+ int not_dash_escaped;
} opt;
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
index a2923d958..2d82308dd 100644
--- a/g10/parse-packet.c
+++ b/g10/parse-packet.c
@@ -288,7 +288,7 @@ parse( IOBUF inp, PACKET *pkt, int reqtype, ulong *retpos,
}
if( do_skip || !pkttype || (reqtype && pkttype != reqtype) ) {
- skip_packet(inp, pkttype, pktlen);
+ skip_rest(inp, pktlen);
*skip = 1;
rc = 0;
goto leave;
@@ -636,7 +636,8 @@ dump_sig_subpkt( int hashed, int type, int critical,
break;
case SIGSUBPKT_SIG_EXPIRE:
if( length >= 4 )
- printf("sig expires %s", strtimestamp( buffer_to_u32(buffer) ) );
+ printf("sig expires after %s",
+ strtimevalue( buffer_to_u32(buffer) ) );
break;
case SIGSUBPKT_EXPORTABLE:
if( length )
@@ -653,7 +654,8 @@ dump_sig_subpkt( int hashed, int type, int critical,
break;
case SIGSUBPKT_KEY_EXPIRE:
if( length >= 4 )
- printf("key expires %s", strtimestamp( buffer_to_u32(buffer) ) );
+ printf("key expires after %s",
+ strtimevalue( buffer_to_u32(buffer) ) );
break;
case SIGSUBPKT_ARR:
p = "additional recipient request";
diff --git a/g10/pubring.asc b/g10/pubring.asc
index 55ab28ec3..a7258157d 100644
--- a/g10/pubring.asc
+++ b/g10/pubring.asc
@@ -1,18 +1,19 @@
pub 1024D/57548DCD 1998-07-07 Werner Koch (gnupg sig) <[email protected]>
Key fingerprint = 6BD9 050F D8FC 941B 4341 2DCC 68B7 AB89 5754 8DCD
+
pub 1024D/621CC013 1998-07-07 Werner Koch <[email protected]>
Key fingerprint = ECAF 7590 EB34 43B5 C7CF 3ACB 6C7E E1B8 621C C013
-sub 1536G/B5A18FF4 1998-07-07
+
pub 768R/0C9857A5 1995-09-30 Werner Koch <[email protected]>
Key fingerprint = 62 9E 97 C0 D5 55 76 3B 90 5A FA E9 81 1C 64 09
-uid Werner Koch (mein alter key) <[email protected]>
+
pub 768g/E1D81275 1998-02-09 werner <[email protected]>
Key fingerprint = 86E2 6681 6C0B 6DD5 4C06 BA6C E113 9763 E1D8 1275
-----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GNUPG v0.4.3b (GNU/Linux)
+Version: GnuPG v0.4.3c (GNU/Linux)
Comment: For info finger [email protected]
mQGiBDWiHh4RBAD+l0rg5p9rW4M3sKvmeyzhs2mDxhRKDTVVUnTwpMIR2kIA9pT4
@@ -24,9 +25,9 @@ TR641BceGHNdYiR/PiDBJsGQ3ac7n7pwhV4qex3IViRDJWz5Dzr88x+Oju63KtxY
urUIBACi7d1rUlHr4ok7iBRlWHYXU2hpUIQ8C+UOE1XXT+HB7mZLSRONQnWMyXnq
bAAW+EUUX2xpb54CevAg4eOilt0es8GZMmU6c0wdUsnMWWqOKHBFFlDIvyI27aZ9
quf0yvby63kFCanQKc0QnqGXQKzuXbFqBYW2UQrYgjXji8rd8bQnV2VybmVyIEtv
-Y2ggKGdudXBnIHNpZykgPGRkOWpuQGdudS5vcmc+iF0EExECAB0FAjYp/BsFCTns
-YxYDCwQDBRUDAgYBAxYCAQIXgAAKCRBot6uJV1SNzUUWAJ452cFtgpR+KSYpF7xI
-uTv/g2jE/QCfbggYOCUK9h4d6JNOuuI2ptbeUl6JAV8DBRA1oh5DA28RuP8+qgsQ
+Y2ggKGdudXBnIHNpZykgPGRkOWpuQGdudS5vcmc+iF0EExECAB0FAjZVoKYFCQht
+DIgDCwQDBRUDAgYBAxYCAQIXgAAKCRBot6uJV1SNzS4+AKCHdeYHMmKQV9mC7REE
+5Vz6d5rRBgCfVMcyRP7dxBwhytmwCDpAcCFvCLSJAV8DBRA1oh5DA28RuP8+qgsQ
A2MyBR0eiPUovYMz0DUXBbNs5606eaVeTJOn9WqkYGcS9xOKlGd8Xj0IcAKN30st
5AsC5hRqr82rrUjB5/CuVdbvk+Qkh6ixWCqo+RRrbgf8cKCg1x+lDj9PpeSD/B9U
U45ntxYamoXnPszxtzU+e73Nkbtrej5rgMK8tgTLkhTAbO8M15Mgtw2yOeDFfiCj
@@ -45,8 +46,8 @@ eUQrRDD9MTQ+XxcvEN0IpAj4kBJe9bR6HzAD/iecCmGwSlHUZZrgqWzv78o79XxD
dcuLdl4i2fL7kwEOf9jsDe7hGs27yrdJEmAG9QF9TOF9LJFmE1CqkgW+EpKxsY01
Wjm0BFJB1R7iPUaUtFRZxYqfgXarmPjql2iBi+cVjLzGu+4BSojVAPgP/hhcnIow
f4M4edPiICMP1GVjtCFXZXJuZXIgS29jaCA8d2VybmVyLmtvY2hAZ3V1Zy5kZT6I
-XQQTEQIAHQUCNin7pQUJO82WDAMLBAMFFQMCBgEDFgIBAheAAAoJEGx+4bhiHMAT
-k1QAn1vonMj+ydyZK020qCf40h6Ig2MTAJ9LehZbevQB1mZJud2MnXqiNxs65IkA
+XQQTEQIAHQUCNlWgGQUJCDhNJgMLBAMFFQMCBgEDFgIBAheAAAoJEGx+4bhiHMAT
+vRgAoJc50QYEJmqS7No1oKy1s1g2XuY3AJ9QekKaTlaTdxcrNRMb7tGFiLc//YkA
dQMFEDWjdxQdGfTBDJhXpQEBPfMC/0cxo+4xYVAplFO0nIYyjQgP7D8O0ufzPsIw
F3kvb7b5FNNjfp+DAhN6G0HOIgkL3GsWtCfH5UHali+mtNFIKDpTtr+F/lPpZP3O
PzzsLZS4hYTqmMs1O/ACq8axKgAilYkBXwMFEDWiJw4DbxG4/z6qCxADB9wFH0i6
@@ -184,6 +185,6 @@ o/ZDQfya+BlmbUbjNaEp0qr2BR4ypoz5jQSiQPUFN3I0RLRzR6bS+a1pUVucNMXQ
uu5GsvJpQW47DznFDDteZcpf+QaiKKcMfpUtbWOIIlWhMAtIAodBJxCqrgGWbVGE
kGtcrK7IW8NUDfpe/+KLcFzvx2XPo8+RHWrTlgf1RhEXdNx2up7gbuiHf+CD8kAB
zkINfmdYizmD1/JE8+DO8gCMopcY2hYmStG4E2lUCq79qCCBeORg5A==
-=ahHm
+=7eJ9
-----END PGP PUBLIC KEY BLOCK-----
diff --git a/g10/sign.c b/g10/sign.c
index 71b5108f0..52f36f937 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -458,6 +458,22 @@ write_dash_escaped( IOBUF inp, IOBUF out, MD_HANDLE md )
int lastlf = 1;
int state = 0;
+ if( opt.not_dash_escaped ) {
+ lastlf = 0;
+ while( (c = iobuf_get(inp)) != -1 ) {
+ md_putc(md, c );
+ iobuf_put( out, c );
+ lastlf = c;
+ }
+ if( lastlf != '\n' ) {
+ /* add a missing trailing LF */
+ md_putc(md, '\n' );
+ iobuf_put( out, '\n' );
+ }
+
+ return 0;
+ }
+
while( (c = iobuf_get(inp)) != -1 ) {
/* Note: We don't escape "From " because the MUA should cope with it */
if( lastlf ) {
@@ -579,7 +595,11 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
}
}
assert(any);
- iobuf_writestr(out, "\n\n" );
+ iobuf_writestr(out, "\n" );
+ if( opt.not_dash_escaped )
+ iobuf_writestr( out,
+ "NotDashEscaped: You need GnuPG to verify this message\n" );
+ iobuf_writestr(out, "\n" );
}
@@ -588,7 +608,8 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
PKT_secret_key *sk = sk_rover->sk;
md_enable(textmd, hash_for(sk->pubkey_algo));
}
- iobuf_push_filter( inp, text_filter, &tfx );
+ if( !opt.not_dash_escaped )
+ iobuf_push_filter( inp, text_filter, &tfx );
rc = write_dash_escaped( inp, out, textmd );
if( rc )
goto leave;