aboutsummaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
Diffstat (limited to 'g10')
-rw-r--r--g10/ChangeLog16
-rw-r--r--g10/encode.c15
-rw-r--r--g10/g10.c204
-rw-r--r--g10/main.h2
-rw-r--r--g10/misc.c47
-rw-r--r--g10/options.h23
-rw-r--r--g10/sign.c14
7 files changed, 179 insertions, 142 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 7619aeb62..abd64b31f 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,11 +1,27 @@
2003-05-02 David Shaw <[email protected]>
+ * sign.c (sign_file): Fix bug that causes spurious compression
+ preference warning.
+
+ * sign.c (clearsign_file): Fix bug that prevents proper warning
+ message from appearing when clearsigning in --pgp2 mode with a
+ non-v3 RSA key.
+
+ * main.h, misc.c (compliance_option_string, compliance_string,
+ compliance_failure), sign.c (sign_file, clearsign_file), encode.c
+ (encode_crypt, write_pubkey_enc_from_list): New functions to put
+ the "this message may not be usable...." warning in one place.
+
* options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c,
sign.c, encode.c, getkey.c, revoke.c: The current flags for
different levels of PGP-ness are massively complex. This is step
one in simplifying them. No functional change yet, just use a
macro to check for compliance level.
+ * options.h, g10.c (main): Part two of the simplification. Use a
+ single enum to indicate what we are compliant to (1991, 2440,
+ PGPx, etc.)
+
2003-05-01 David Shaw <[email protected]>
* packet.h, build-packet.c (build_sig_subpkt), export.c
diff --git a/g10/encode.c b/g10/encode.c
index 14f3d0576..1d7f2bd6a 100644
--- a/g10/encode.c
+++ b/g10/encode.c
@@ -415,8 +415,7 @@ encode_crypt( const char *filename, STRLIST remusr )
{
log_info(_("you can only encrypt to RSA keys of 2048 bits or "
"less in --pgp2 mode\n"));
- log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
- opt.xpgp2=0;
+ compliance_failure();
break;
}
}
@@ -467,8 +466,7 @@ encode_crypt( const char *filename, STRLIST remusr )
if( PGP2 ) {
log_info(_("unable to use the IDEA cipher for all of the keys "
"you are encrypting to.\n"));
- log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
- opt.xpgp2=0;
+ compliance_failure();
}
}
}
@@ -719,13 +717,8 @@ write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out )
if(opt.throw_keyid && (PGP2 || PGP6 || PGP7 || PGP8))
{
log_info(_("you may not use %s while in %s mode\n"),
- "--throw-keyid",
- PGP2?"--pgp2":PGP6?"--pgp6":PGP7?"--pgp7":"--pgp8");
-
- log_info(_("this message may not be usable by %s\n"),
- PGP2?"PGP 2.x":PGP6?"PGP 6.x":PGP7?"PGP 7.x":"PGP 8.x");
-
- opt.xpgp2=opt.xpgp6=opt.xpgp7=opt.xpgp8=0;
+ "--throw-keyid",compliance_option_string());
+ compliance_failure();
}
/* Okay, what's going on: We have the session key somewhere in
diff --git a/g10/g10.c b/g10/g10.c
index 16b71138e..b8f30b115 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -1437,8 +1437,7 @@ main( int argc, char **argv )
#endif /* __riscos__ */
break;
case oRFC1991:
- opt.xrfc1991 = 1;
- opt.xrfc2440 = 0;
+ opt.compliance = CO_RFC1991;
opt.force_v4_certs = 0;
opt.disable_mdc = 1;
opt.escape_from = 1;
@@ -1446,8 +1445,7 @@ main( int argc, char **argv )
case oOpenPGP:
/* TODO: When 2440bis becomes a RFC, these may need
changing. */
- opt.xrfc1991 = 0;
- opt.xrfc2440 = 1;
+ opt.compliance = CO_RFC2440;
opt.disable_mdc = 1;
opt.allow_non_selfsigned_uid = 1;
opt.allow_freeform_uid = 1;
@@ -1464,19 +1462,17 @@ main( int argc, char **argv )
opt.s2k_mode = 3; /* iterated+salted */
opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
- opt.xpgp2 = 0;
- opt.xpgp6 = 0;
- opt.xpgp7 = 0;
- opt.xpgp8 = 0;
break;
- case oPGP2: opt.xpgp2 = 1; break;
- case oNoPGP2: opt.xpgp2 = 0; break;
- case oPGP6: opt.xpgp6 = 1; break;
- case oNoPGP6: opt.xpgp6 = 0; break;
- case oPGP7: opt.xpgp7 = 1; break;
- case oNoPGP7: opt.xpgp7 = 0; break;
- case oPGP8: opt.xpgp8 = 1; break;
- case oNoPGP8: opt.xpgp8 = 0; break;
+ case oPGP2: opt.compliance = CO_PGP2; break;
+ case oPGP6: opt.compliance = CO_PGP6; break;
+ case oPGP7: opt.compliance = CO_PGP7; break;
+ case oPGP8: opt.compliance = CO_PGP8; break;
+ case oNoPGP2:
+ case oNoPGP6:
+ case oNoPGP7:
+ case oNoPGP8:
+ opt.compliance = CO_GNUPG;
+ break;
case oEmuMDEncodeBug: opt.emulate_bugs |= EMUBUG_MDENCODE; break;
case oCompressSigs: opt.compress_sigs = 1; break;
case oRunAsShmCP:
@@ -1770,113 +1766,101 @@ main( int argc, char **argv )
set_debug();
/* Do these after the switch(), so they can override settings. */
- if(PGP2 && (PGP6 || PGP7 || PGP8))
- log_error(_("%s not allowed with %s!\n"),
- "--pgp2",PGP6?"--pgp6":PGP7?"--pgp7":"--pgp8");
- else
+ if(PGP2)
{
- if(PGP2)
+ int unusable=0;
+
+ if(cmd==aSign && !detached_sig)
+ {
+ log_info(_("you can only make detached or clear signatures "
+ "while in --pgp2 mode\n"));
+ unusable=1;
+ }
+ else if(cmd==aSignEncr || cmd==aSignSym)
+ {
+ log_info(_("you can't sign and encrypt at the "
+ "same time while in --pgp2 mode\n"));
+ unusable=1;
+ }
+ else if(argc==0 && (cmd==aSign || cmd==aEncr || cmd==aSym))
+ {
+ log_info(_("you must use files (and not a pipe) when "
+ "working with --pgp2 enabled.\n"));
+ unusable=1;
+ }
+ else if(cmd==aEncr || cmd==aSym)
{
- int unusable=0;
+ /* Everything else should work without IDEA (except using
+ a secret key encrypted with IDEA and setting an IDEA
+ preference, but those have their own error
+ messages). */
- if(cmd==aSign && !detached_sig)
+ if(check_cipher_algo(CIPHER_ALGO_IDEA))
{
- log_info(_("you can only make detached or clear signatures "
- "while in --pgp2 mode\n"));
+ log_info(_("encrypting a message in --pgp2 mode requires "
+ "the IDEA cipher\n"));
+ idea_cipher_warn(1);
unusable=1;
}
- else if(cmd==aSignEncr || cmd==aSignSym)
+ else if(cmd==aSym)
{
- log_info(_("you can't sign and encrypt at the "
- "same time while in --pgp2 mode\n"));
- unusable=1;
- }
- else if(argc==0 && (cmd==aSign || cmd==aEncr || cmd==aSym))
- {
- log_info(_("you must use files (and not a pipe) when "
- "working with --pgp2 enabled.\n"));
- unusable=1;
- }
- else if(cmd==aEncr || cmd==aSym)
- {
- /* Everything else should work without IDEA (except using
- a secret key encrypted with IDEA and setting an IDEA
- preference, but those have their own error
- messages). */
-
- if(check_cipher_algo(CIPHER_ALGO_IDEA))
- {
- log_info(_("encrypting a message in --pgp2 mode requires "
- "the IDEA cipher\n"));
- idea_cipher_warn(1);
- unusable=1;
- }
- else if(cmd==aSym)
- {
- /* This only sets IDEA for symmetric encryption
- since it is set via select_algo_from_prefs for
- pk encryption. */
- m_free(def_cipher_string);
- def_cipher_string = m_strdup("idea");
- }
-
- /* PGP2 can't handle the output from the textmode
- filter, so we disable it for anything that could
- create a literal packet (only encryption and
- symmetric encryption, since we disable signing
- above). */
- if(!unusable)
- opt.textmode=0;
+ /* This only sets IDEA for symmetric encryption
+ since it is set via select_algo_from_prefs for
+ pk encryption. */
+ m_free(def_cipher_string);
+ def_cipher_string = m_strdup("idea");
}
- if(unusable)
- {
- log_info(_("this message may not be usable by %s\n"),
- "PGP 2.x");
- opt.xpgp2=0;
- }
- else
- {
- opt.xrfc1991 = 1;
- opt.xrfc2440 = 0;
- opt.force_mdc = 0;
- opt.disable_mdc = 1;
- opt.force_v4_certs = 0;
- opt.sk_comments = 0;
- opt.escape_from = 1;
- opt.force_v3_sigs = 1;
- opt.pgp2_workarounds = 1;
- opt.ask_sig_expire = 0;
- opt.ask_cert_expire = 0;
- m_free(def_digest_string);
- def_digest_string = m_strdup("md5");
- opt.def_compress_algo = 1;
- }
+ /* PGP2 can't handle the output from the textmode
+ filter, so we disable it for anything that could
+ create a literal packet (only encryption and
+ symmetric encryption, since we disable signing
+ above). */
+ if(!unusable)
+ opt.textmode=0;
}
- else if(PGP6)
- {
- opt.sk_comments=0;
- opt.escape_from=1;
- opt.force_v3_sigs=1;
- opt.ask_sig_expire=0;
- opt.def_compress_algo=1;
- opt.force_mdc=0;
- opt.disable_mdc=1;
- }
- else if(PGP7)
- {
- opt.sk_comments=0;
- opt.escape_from=1;
- opt.force_v3_sigs=1;
- opt.ask_sig_expire=0;
- opt.def_compress_algo=1;
- }
- else if(PGP8)
+
+ if(unusable)
+ compliance_failure();
+ else
{
- opt.escape_from=1;
- opt.def_compress_algo=1;
+ opt.force_mdc = 0;
+ opt.disable_mdc = 1;
+ opt.force_v4_certs = 0;
+ opt.sk_comments = 0;
+ opt.escape_from = 1;
+ opt.force_v3_sigs = 1;
+ opt.pgp2_workarounds = 1;
+ opt.ask_sig_expire = 0;
+ opt.ask_cert_expire = 0;
+ m_free(def_digest_string);
+ def_digest_string = m_strdup("md5");
+ opt.def_compress_algo = 1;
}
}
+ else if(PGP6)
+ {
+ opt.sk_comments=0;
+ opt.escape_from=1;
+ opt.force_v3_sigs=1;
+ opt.ask_sig_expire=0;
+ opt.def_compress_algo=1;
+ opt.force_mdc=0;
+ opt.disable_mdc=1;
+ }
+ else if(PGP7)
+ {
+ opt.sk_comments=0;
+ opt.escape_from=1;
+ opt.force_v3_sigs=1;
+ opt.ask_sig_expire=0;
+ opt.def_compress_algo=1;
+ }
+ else if(PGP8)
+ {
+ opt.escape_from=1;
+ opt.def_compress_algo=1;
+ }
/* must do this after dropping setuid, because string_to...
* may try to load an module */
diff --git a/g10/main.h b/g10/main.h
index 29e5f2e95..fd3fedadb 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -87,6 +87,8 @@ void deprecated_warning(const char *configname,unsigned int configlineno,
const char *option,const char *repl1,const char *repl2);
const char *compress_algo_to_string(int algo);
int check_compress_algo(int algo);
+void compliance_failure(void);
+const char *compliance_option_string(void);
/*-- helptext.c --*/
void display_online_help( const char *keyword );
diff --git a/g10/misc.c b/g10/misc.c
index ae553eb47..b68efd788 100644
--- a/g10/misc.c
+++ b/g10/misc.c
@@ -546,3 +546,50 @@ check_compress_algo(int algo)
return G10ERR_COMPR_ALGO;
}
+
+const char *
+compliance_option_string(void)
+{
+ switch(opt.compliance)
+ {
+ case CO_RFC2440:
+ return "--openpgp";
+ case CO_PGP2:
+ return "--pgp2";
+ case CO_PGP6:
+ return "--pgp6";
+ case CO_PGP7:
+ return "--pgp7";
+ case CO_PGP8:
+ return "--pgp8";
+ default:
+ return "???";
+ }
+}
+
+static const char *
+compliance_string(void)
+{
+ switch(opt.compliance)
+ {
+ case CO_RFC2440:
+ return "OpenPGP";
+ case CO_PGP2:
+ return "PGP 2.x";
+ case CO_PGP6:
+ return "PGP 6.x";
+ case CO_PGP7:
+ return "PGP 7.x";
+ case CO_PGP8:
+ return "PGP 8.x";
+ default:
+ return "???";
+ }
+}
+
+void
+compliance_failure(void)
+{
+ log_info(_("this message may not be usable by %s\n"),compliance_string());
+ opt.compliance=CO_GNUPG;
+}
diff --git a/g10/options.h b/g10/options.h
index e913a5edc..17d89e003 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -90,13 +90,10 @@ struct {
int compress_keys;
int compress_sigs;
int always_trust;
- /* TODO: change these to an emulate_pgp variable */
- int xpgp2;
- int xpgp6;
- int xpgp7;
- int xpgp8;
- int xrfc1991;
- int xrfc2440;
+ enum
+ {
+ CO_GNUPG=0, CO_RFC2440, CO_RFC1991, CO_PGP2, CO_PGP6, CO_PGP7, CO_PGP8
+ } compliance;
int pgp2_workarounds;
unsigned int emulate_bugs; /* bug emulation flags EMUBUG_xxxx */
int shm_coprocess;
@@ -207,11 +204,11 @@ struct {
#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE)
#define DBG_EXTPROG (opt.debug & DBG_EXTPROG_VALUE)
-#define RFC1991 (opt.xrfc1991)
-#define RFC2440 (opt.xrfc2440)
-#define PGP2 (opt.xpgp2)
-#define PGP6 (opt.xpgp6)
-#define PGP7 (opt.xpgp7)
-#define PGP8 (opt.xpgp8)
+#define RFC1991 (opt.compliance==CO_RFC1991 || opt.compliance==CO_PGP2)
+#define RFC2440 (opt.compliance==CO_RFC2440)
+#define PGP2 (opt.compliance==CO_PGP2)
+#define PGP6 (opt.compliance==CO_PGP6)
+#define PGP7 (opt.compliance==CO_PGP7)
+#define PGP8 (opt.compliance==CO_PGP8)
#endif /*G10_OPTIONS_H*/
diff --git a/g10/sign.c b/g10/sign.c
index f6fb89dbe..c2972b82f 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -647,8 +647,7 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
{
log_info(_("you can only detach-sign with PGP 2.x style keys "
"while in --pgp2 mode\n"));
- log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
- opt.xpgp2=0;
+ compliance_failure();
}
if(encryptflag && (rc=build_pk_list( remusr, &pk_list, PUBKEY_USAGE_ENC )))
@@ -764,9 +763,9 @@ sign_file( STRLIST filenames, int detached, STRLIST locusr,
select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
compr_algo=DEFAULT_COMPRESS_ALGO;
}
- else if(!opt.expert &&
- select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
- compr_algo,NULL)!=compr_algo)
+ else if(!opt.expert && pk_list
+ && select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
+ compr_algo,NULL)!=compr_algo)
log_info(_("forcing compression algorithm %s (%d) "
"violates recipient preferences\n"),
compress_algo_to_string(compr_algo),compr_algo);
@@ -890,12 +889,11 @@ clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
if( !old_style && !duration )
old_style = only_old_style( sk_list );
- if(!old_style && PGP2)
+ if(PGP2 && !only_old_style(sk_list))
{
log_info(_("you can only clearsign with PGP 2.x style keys "
"while in --pgp2 mode\n"));
- log_info(_("this message may not be usable by %s\n"),"PGP 2.x");
- opt.xpgp2=0;
+ compliance_failure();
}
/* prepare iobufs */