From 005d2cc4a8f259d57f87a77f090dea447cde1f8b Mon Sep 17 00:00:00 2001 From: David Shaw Date: Thu, 6 Jun 2002 20:59:20 +0000 Subject: [PATCH] * main.h, g10.c (main), keygen.c (build_personal_digest_list): Put in a default digest preference list consisting of SHA-1, followed by every other installed digest except MD5. Note this is the same as having no digest preference at all except for SHA-1 being favored. * options.h, g10.c (main), keygen.c (keygen_set_std_prefs), pkclist.c (select_algo_from_prefs): Split --personal-preference-list into three: --personal-{cipher|digest|compress}-preferences. This allows a user to set one without affecting another (i.e. setting only a digest pref doesn't imply an empty cipher pref). * exec.c (exec_read): This is a safer way of guessing the return value of system(). Noted by Stefan Bellon. --- g10/ChangeLog | 18 +++++++ g10/exec.c | 2 +- g10/g10.c | 39 ++++++++++++--- g10/keygen.c | 133 ++++++++++++++++++++++++++++++++++++++------------ g10/main.h | 1 + g10/options.h | 4 +- g10/pkclist.c | 14 ++++-- 7 files changed, 167 insertions(+), 44 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index bbaa51625..d61c506f5 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,21 @@ +2002-06-06 David Shaw + + * main.h, g10.c (main), keygen.c (build_personal_digest_list): Put + in a default digest preference list consisting of SHA-1, followed + by every other installed digest except MD5. Note this is the same + as having no digest preference at all except for SHA-1 being + favored. + + * options.h, g10.c (main), keygen.c (keygen_set_std_prefs), + pkclist.c (select_algo_from_prefs): Split + --personal-preference-list into three: + --personal-{cipher|digest|compress}-preferences. This allows a + user to set one without affecting another (i.e. setting only a + digest pref doesn't imply an empty cipher pref). + + * exec.c (exec_read): This is a safer way of guessing the return + value of system(). Noted by Stefan Bellon. + 2002-06-05 David Shaw * hkp.c (parse_hkp_index): Be more robust with keyservers diff --git a/g10/exec.c b/g10/exec.c index 5b25f13ce..f2209d8f2 100644 --- a/g10/exec.c +++ b/g10/exec.c @@ -485,7 +485,7 @@ int exec_read(struct exec_info *info) } #else /* If we don't have the macros, do the best we can. */ - info->progreturn/=256; + info->progreturn = (info->progreturn & 0xff00) >> 8; #endif /* 127 is the magic value returned from system() to indicate diff --git a/g10/g10.c b/g10/g10.c index 1d21f4f43..cfe1cfb38 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -281,7 +281,9 @@ enum cmd_and_opt_values { aNull = 0, oNoAutoCheckTrustDB, oPreservePermissions, oDefaultPreferenceList, - oPersonalPreferenceList, + oPersonalCipherPreferences, + oPersonalDigestPreferences, + oPersonalCompressPreferences, oEmu3DESS2KBug, /* will be removed in 1.1 */ oEmuMDEncodeBug, oDisplay, @@ -560,7 +562,9 @@ static ARGPARSE_OPTS opts[] = { { aRebuildKeydbCaches, "rebuild-keydb-caches", 256, "@"}, { oPreservePermissions, "preserve-permissions", 0, "@"}, { oDefaultPreferenceList, "default-preference-list", 2, "@"}, - { oPersonalPreferenceList, "personal-preference-list", 2, "@"}, + { oPersonalCipherPreferences, "personal-cipher-preferences", 2, "@"}, + { oPersonalDigestPreferences, "personal-digest-preferences", 2, "@"}, + { oPersonalCompressPreferences, "personal-compress-preferences", 2, "@"}, { oEmu3DESS2KBug, "emulate-3des-s2k-bug", 0, "@"}, { oEmuMDEncodeBug, "emulate-md-encode-bug", 0, "@"}, { oDisplay, "display", 2, "@" }, @@ -819,7 +823,9 @@ main( int argc, char **argv ) char *cert_digest_string = NULL; char *s2k_cipher_string = NULL; char *s2k_digest_string = NULL; - char *pers_pref_list = NULL; + char *pers_cipher_list = NULL; + char *pers_digest_list = NULL; + char *pers_compress_list = NULL; int eyes_only=0; int pwfd = -1; int with_fpr = 0; /* make an option out of --fingerprint */ @@ -1362,7 +1368,15 @@ main( int argc, char **argv ) case oDefaultPreferenceList: opt.def_preference_list = pargs.r.ret_str; break; - case oPersonalPreferenceList: pers_pref_list=pargs.r.ret_str; break; + case oPersonalCipherPreferences: + pers_cipher_list=pargs.r.ret_str; + break; + case oPersonalDigestPreferences: + pers_digest_list=pargs.r.ret_str; + break; + case oPersonalCompressPreferences: + pers_compress_list=pargs.r.ret_str; + break; case oDisplay: opt.display = pargs.r.ret_str; break; case oTTYname: opt.ttyname = pargs.r.ret_str; break; case oTTYtype: opt.ttytype = pargs.r.ret_str; break; @@ -1597,8 +1611,21 @@ main( int argc, char **argv ) keygen_set_std_prefs(opt.def_preference_list,0)) log_error(_("invalid default preferences\n")); - if(pers_pref_list && keygen_set_std_prefs(pers_pref_list,1)) - log_error(_("invalid personal preferences\n")); + /* We provide defaults for the personal digest list */ + if(!pers_digest_list) + pers_digest_list=build_personal_digest_list(); + + if(pers_cipher_list && + keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM)) + log_error(_("invalid personal cipher preferences\n")); + + if(pers_digest_list && + keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH)) + log_error(_("invalid personal digest preferences\n")); + + if(pers_compress_list && + keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP)) + log_error(_("invalid personal compress preferences\n")); if( log_get_errorcount(0) ) g10_exit(2); diff --git a/g10/keygen.c b/g10/keygen.c index d8619f798..9d04845b1 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -271,43 +271,92 @@ keygen_set_std_prefs (const char *string,int personal) } } - if (!rc) { - if(personal) { - m_free(opt.personal_prefs); + if (!rc) + { + if(personal) + { + if(personal==PREFTYPE_SYM) + { + m_free(opt.personal_cipher_prefs); - if((nsym+nhash+nzip)==0) - opt.personal_prefs=NULL; - else { - int i,n=0; + if(nsym==0) + opt.personal_cipher_prefs=NULL; + else + { + int i; - opt.personal_prefs=m_alloc(sizeof(prefitem_t *)*(nsym+nhash+nzip+1)); + opt.personal_cipher_prefs= + m_alloc(sizeof(prefitem_t *)*(nsym+1)); - for (i=0; i