File: 0022-gpg-emit-RSA-pubkey-algorithm-when-in-compatibility-.patch

package info (click to toggle)
gnupg2 2.4.7-21
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie, trixie-updates
  • size: 50,644 kB
  • sloc: ansic: 287,552; sh: 7,938; lisp: 6,735; makefile: 1,982; awk: 160; xml: 53; python: 16; sed: 16; php: 14; perl: 13
file content (200 lines) | stat: -rw-r--r-- 8,113 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
From c7b4f522e8d17b00dad0a7e2227a5c95aff26938 Mon Sep 17 00:00:00 2001
From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Date: Tue, 4 Feb 2025 01:22:41 -0500
Subject: [PATCH GnuPG 15/19] gpg: emit RSA pubkey algorithm when in
 compatibility modes

* doc/gpg.texi (Compliance Options): --gnupg offers LibrePGP behavior,
and prefers LibrePGP where it diverges from OpenPGP; --rfc4880bis is
an alias for --gnupg; Explain that --rfc2440 is ancient; correct
punctuation. (default-new-key-algo): drop incorrect information
about defaults. (default-new-key-algo): Remind the user that this
should come after any compliance modes, like --allow-old-cipher-algos.
* g10/gpg.c (set_compliance_option): default pubkey algorithm for
legacy compliance is 3072-bit RSA.
* common/compliance.c (gnupg_compliance_label) new function,
prototyped...
* common/compliance.h: ...here.
* g10/keygen.c (parse_key_parameter_part): when using a legacy
compliance mode, ensure that new keys are only algorithms known by the
corresponding tools.

--

Before this fix, the following command:

   gpg --rfc4880 --quick-gen-key "$USERID"

would produce an OpenPGP secret key that would not be compatible for
use with an RFC 4880 client.  The generated certificate would be a
problem if the user has a another OpenPGP client that is limited to
RFC 4880, and it would be a problem for any peer who wants
to encrypt to or validate signatures from the corresponding
certificate.

With this fix, default key generation under a compatibility mode will
actually produce compatible, interoperable OpenPGP key.

GnuPG-bug-id: 7511
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
---
 common/compliance.c |  7 +++++++
 common/compliance.h |  2 ++
 doc/gpg.texi        | 40 ++++++++++++++++++----------------------
 g10/gpg.c           |  3 +++
 g10/keygen.c        |  9 +++++++++
 5 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/common/compliance.c b/common/compliance.c
index 84449af25..5e468a11c 100644
--- a/common/compliance.c
+++ b/common/compliance.c
@@ -696,6 +696,13 @@ gnupg_parse_compliance_option (const char *string,
   return -1;
 }
 
+/* Return label for the given COMPLIANCE mode.  */
+const char *
+gnupg_compliance_label (enum gnupg_compliance_mode compliance)
+{
+  /* just offset by strlen("--compliance=") */
+  return gnupg_compliance_option_string (compliance) + 13;
+}
 
 /* Return the command line option for the given COMPLIANCE mode.  */
 const char *
diff --git a/common/compliance.h b/common/compliance.h
index 111fdc74b..2ddf38f83 100644
--- a/common/compliance.h
+++ b/common/compliance.h
@@ -91,6 +91,8 @@ int gnupg_parse_compliance_option (const char *string,
                                    int quiet);
 const char *gnupg_compliance_option_string (enum gnupg_compliance_mode
                                             compliance);
+const char *gnupg_compliance_label (enum gnupg_compliance_mode
+                                    compliance);
 
 void gnupg_set_compliance_extra_info (unsigned int min_rsa);
 
diff --git a/doc/gpg.texi b/doc/gpg.texi
index f99afd7e5..fdbdc18bb 100644
--- a/doc/gpg.texi
+++ b/doc/gpg.texi
@@ -3094,12 +3094,11 @@ options.
 
 @item --gnupg
 @opindex gnupg
-Use standard GnuPG behavior. This is essentially OpenPGP behavior (see
-@option{--openpgp}), but with extension from the proposed update to
-OpenPGP and with some additional workarounds for common compatibility
-problems in different versions of PGP.  This is the default option, so
-it is not generally needed, but it may be useful to override a
-different compliance option in the gpg.conf file.
+Use standard GnuPG behavior. This is now LibrePGP behavior, which is a
+different draft protocol that overlaps in some cases with
+OpenPGP. This is the default option, so it is not generally needed,
+but it may be useful to override a different compliance option in the
+gpg.conf file.
 
 @item --openpgp
 @opindex openpgp
@@ -3118,21 +3117,20 @@ Note that this is currently the same thing as @option{--openpgp}.
 
 @item --rfc4880bis
 @opindex rfc4880bis
-Reset all packet, cipher and digest options to strict according to the
-proposed updates of RFC-4880.
+This option is obsolete; it is handled as an alias for @option{--gnupg}.
 
 @item --rfc2440
 @opindex rfc2440
-Reset all packet, cipher and digest options to strict RFC-2440
-behavior.  Note that by using this option encryption packets are
-created in a legacy mode without MDC protection.  This is dangerous
-and should thus only be used for experiments.  This option implies
-@option{--allow-old-cipher-algos}.  See also option
-@option{--ignore-mdc-error}.
+Set all packet, cipher and digest options to strict RFC-2440 behavior.
+RFC-2440 is a very old version of OpenPGP.  Note that by using this
+option encryption packets are created in a legacy mode without MDC
+protection.  This is dangerous and should thus only be used for
+experiments.  This option implies @option{--allow-old-cipher-algos}.
+See also option @option{--ignore-mdc-error}.
 
 @item --pgp6
 @opindex pgp6
-This option is obsolete; it is handled as an alias for @option{--pgp7}
+This option is obsolete; it is handled as an alias for @option{--pgp7}.
 
 @item --pgp7
 @opindex pgp7
@@ -3848,13 +3846,11 @@ absolute date in the form YYYY-MM-DD. Defaults to "0".
 @opindex default-new-key-algo @var{string}
 This option can be used to change the default algorithms for key
 generation. The @var{string} is similar to the arguments required for
-the command @option{--quick-add-key} but slightly different.  For
-example the current default of @code{"rsa2048/cert,sign+rsa2048/encr"}
-(or @code{"rsa3072"}) can be changed to the value of what we currently
-call future default, which is @code{"ed25519/cert,sign+cv25519/encr"}.
-You need to consult the source code to learn the details.  Note that
-the advanced key generation commands can always be used to specify a
-key algorithm directly.
+the command @option{--quick-add-key} but slightly different.  You need
+to consult the source code to learn the details.  Note that the
+advanced key generation commands can always be used to specify a key
+algorithm directly.  Setting a compliance mode will set or clear this
+flag, so it should only be used after a compliance mode setting.
 
 @item --no-auto-trust-new-key
 @opindex no-auto-trust-new-key
diff --git a/g10/gpg.c b/g10/gpg.c
index b1fb24b6b..2b1f47088 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2283,6 +2283,7 @@ set_compliance_option (enum cmd_and_opt_values option)
       opt.s2k_digest_algo = 0;
       opt.s2k_cipher_algo = DEFAULT_CIPHER_ALGO;
       opt.flags.allow_old_cipher_algos = 0;
+      opt.def_new_key_algo = NULL;
       break;
     case oOpenPGP:
     case oRFC4880:
@@ -2297,6 +2298,7 @@ set_compliance_option (enum cmd_and_opt_values option)
       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
       opt.flags.allow_old_cipher_algos = 1;
+      opt.def_new_key_algo = "rsa3072/cert,sign+rsa3072/encr";
       break;
     case oRFC2440:
       set_compliance_option (oGnuPG);
@@ -2309,6 +2311,7 @@ set_compliance_option (enum cmd_and_opt_values option)
       opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
       opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
       opt.flags.allow_old_cipher_algos = 1;
+      opt.def_new_key_algo = "rsa3072/cert,sign+rsa3072/encr";
       break;
     case oPGP7:
       set_compliance_option (oGnuPG);
diff --git a/g10/keygen.c b/g10/keygen.c
index 3f150946b..95759c9ae 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -3542,6 +3542,15 @@ parse_key_parameter_part (ctrl_t ctrl,
   else
     return gpg_error (GPG_ERR_UNKNOWN_CURVE);
 
+  if ((RFC4880||RFC2440||PGP8||PGP7) &&
+      (algo != PUBKEY_ALGO_RSA) &&
+      (algo != PUBKEY_ALGO_DSA) &&
+      (algo != PUBKEY_ALGO_ELGAMAL_E)) {
+    log_error (_("Cannot generate pubkey algorithm \"%s\" in compliance mode: %s\n"),
+               string, gnupg_compliance_label (opt.compliance));
+    return gpg_error (GPG_ERR_UNKNOWN_ALGORITHM);
+  }
+
   /* Parse the flags.  */
   keyuse = 0;
   if (flags)
-- 
2.47.2