aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/openpgp-oid.c7
-rw-r--r--doc/gpg.texi9
-rw-r--r--g10/gpg.c3
-rw-r--r--g10/import.c12
-rw-r--r--g10/keydb.h2
-rw-r--r--g10/keyedit.c38
-rw-r--r--g10/keyid.c73
-rw-r--r--g10/keylist.c36
-rw-r--r--g10/mainproc.c8
-rw-r--r--g10/options.h1
-rw-r--r--g10/pkclist.c16
11 files changed, 153 insertions, 52 deletions
diff --git a/common/openpgp-oid.c b/common/openpgp-oid.c
index 28567b7fe..a2a3617b6 100644
--- a/common/openpgp-oid.c
+++ b/common/openpgp-oid.c
@@ -275,7 +275,7 @@ openpgp_curve_to_oid (const char *name, unsigned int *r_nbits)
if (!name)
oidstr = NULL;
- else if (!strcmp (name, "Ed25519"))
+ else if (!strcmp (name, "Ed25519") || !strcmp (name, "ed25519"))
{
oidstr = "1.3.6.1.4.1.11591.15.1";
nbits = 255;
@@ -324,8 +324,7 @@ openpgp_curve_to_oid (const char *name, unsigned int *r_nbits)
}
-/* Map an OpenPGP OID to the Libgcrypt curve NAME. If R_NBITS is not
- NULL store the bit size of the curve there. Returns "?" for
+/* Map an OpenPGP OID to the Libgcrypt curve NAME. Returns "?" for
unknown curve names. */
const char *
openpgp_oid_to_curve (const char *oid)
@@ -335,7 +334,7 @@ openpgp_oid_to_curve (const char *oid)
if (!oid)
name = "";
else if (!strcmp (oid, "1.3.6.1.4.1.11591.15.1"))
- name = "Ed25519";
+ name = "ed25519";
else if (!strcmp (oid, "1.2.840.10045.3.1.7"))
name = "nistp256";
else if (!strcmp (oid, "1.3.132.0.10"))
diff --git a/doc/gpg.texi b/doc/gpg.texi
index 26179bd77..c1ce07b98 100644
--- a/doc/gpg.texi
+++ b/doc/gpg.texi
@@ -2053,6 +2053,15 @@ Since GnuPG 2.0.10, this mode is always used and thus this option is
obsolete; it does not harm to use it though.
@end ifclear
+@ifset gpgtwoone
+@item --legacy-list-mode
+@opindex legacy-list-mode
+Revert to the pre-2.1 public key list mode. This only affects the
+human readable output and not the machine interface
+(i.e. @code{--with-colons}). Note that the legacy format does not
+allow to convey suitable information for elliptic curves.
+@end ifset
+
@item --with-fingerprint
@opindex with-fingerprint
Same as the command @option{--fingerprint} but changes only the format
diff --git a/g10/gpg.c b/g10/gpg.c
index 5b331055d..a48791343 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -331,6 +331,7 @@ enum cmd_and_opt_values
oTrustedKey,
oNoExpensiveTrustChecks,
oFixedListMode,
+ oLegacyListMode,
oNoSigCache,
oNoSigCreateCheck,
oAutoCheckTrustDB,
@@ -690,6 +691,7 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_s_n (oHonorHttpProxy, "honor-http-proxy", "@"),
ARGPARSE_s_n (oFastListMode, "fast-list-mode", "@"),
ARGPARSE_s_n (oFixedListMode, "fixed-list-mode", "@"),
+ ARGPARSE_s_n (oLegacyListMode, "legacy-list-mode", "@"),
ARGPARSE_s_n (oListOnly, "list-only", "@"),
ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict", "@"),
ARGPARSE_s_n (oIgnoreValidFrom, "ignore-valid-from", "@"),
@@ -2876,6 +2878,7 @@ main (int argc, char **argv)
break;
case oFastListMode: opt.fast_list_mode = 1; break;
case oFixedListMode: /* Dummy */ break;
+ case oLegacyListMode: opt.legacy_list_mode = 1; break;
case oListOnly: opt.list_only=1; break;
case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
diff --git a/g10/import.c b/g10/import.c
index 7ba7303b7..9c14e8b4b 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -792,6 +792,7 @@ import_one (ctrl_t ctrl,
int mod_key = 0;
int same_key = 0;
int non_self = 0;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
/* get the key and print some info about it */
node = find_kbnode( keyblock, PKT_PUBLIC_KEY );
@@ -805,9 +806,8 @@ import_one (ctrl_t ctrl,
if( opt.verbose && !opt.interactive )
{
- log_info( "pub %4u%c/%s %s ",
- nbits_from_pk( pk ),
- pubkey_letter( pk->pubkey_algo ),
+ log_info( "pub %s/%s %s ",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
keystr_from_pk(pk), datestr_from_pk(pk) );
if (uidnode)
print_utf8_buffer (log_get_stream (),
@@ -1539,6 +1539,7 @@ import_secret_one (ctrl_t ctrl, const char *fname, KBNODE keyblock,
int rc = 0;
int nr_prev;
kbnode_t pub_keyblock;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
/* Get the key and print some info about it */
node = find_kbnode (keyblock, PKT_SECRET_KEY);
@@ -1552,9 +1553,8 @@ import_secret_one (ctrl_t ctrl, const char *fname, KBNODE keyblock,
if (opt.verbose)
{
- log_info ("sec %4u%c/%s %s ",
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo),
+ log_info ("sec %s/%s %s ",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
keystr_from_pk (pk), datestr_from_pk (pk));
if (uidnode)
print_utf8_buffer (log_get_stream (), uidnode->pkt->pkt.user_id->name,
diff --git a/g10/keydb.h b/g10/keydb.h
index 449d22e18..6834fc9ad 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -256,6 +256,8 @@ int parse_auto_key_locate(char *options);
/*-- keyid.c --*/
int pubkey_letter( int algo );
+char *pubkey_string (PKT_public_key *pk, char *buffer, size_t bufsize);
+#define PUBKEY_STRING_SIZE 32
u32 v3_keyid (gcry_mpi_t a, u32 *ki);
void hash_public_key( gcry_md_hd_t md, PKT_public_key *pk );
size_t keystrlen(void);
diff --git a/g10/keyedit.c b/g10/keyedit.c
index 08b71d8b4..e455e845b 100644
--- a/g10/keyedit.c
+++ b/g10/keyedit.c
@@ -2683,6 +2683,7 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
int i;
int do_warn = 0;
PKT_public_key *primary = NULL;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
if (opt.with_colons)
{
@@ -2761,15 +2762,20 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
}
keyid_from_pk (pk, NULL);
- tty_printf ("%s%c %4u%c/%s ",
+ tty_printf ("%s%c %s/%s",
node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" :
node->pkt->pkttype == PKT_PUBLIC_SUBKEY ? "sub" :
node->pkt->pkttype == PKT_SECRET_KEY ? "sec" : "ssb",
(node->flag & NODFLG_SELKEY) ? '*' : ' ',
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo), keystr (pk->keyid));
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr (pk->keyid));
- tty_printf (_("created: %s"), datestr_from_pk (pk));
+ if (opt.legacy_list_mode)
+ tty_printf (" ");
+ else
+ tty_printf ("\n ");
+
+ tty_printf (_("created: %s"), datestr_from_pk (pk));
tty_printf (" ");
if (pk->flags.revoked)
tty_printf (_("revoked: %s"), revokestr_from_pk (pk));
@@ -2785,8 +2791,8 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
&& pk->seckey_info->is_protected
&& pk->seckey_info->s2k.mode == 1002)
{
- tty_printf (" ");
- tty_printf (_("card-no: "));
+ tty_printf ("%*s%s", opt.legacy_list_mode? 21:5, "",
+ _("card-no: "));
if (pk->seckey_info->ivlen == 16
&& !memcmp (pk->seckey_info->iv,
"\xD2\x76\x00\x01\x24\x01", 6))
@@ -2813,7 +2819,9 @@ show_key_with_all_names (KBNODE keyblock, int only_marked, int with_revoker,
{
if (opt.trust_model != TM_ALWAYS)
{
- tty_printf ("%*s", (int) keystrlen () + 13, "");
+ tty_printf ("%*s",
+ opt.legacy_list_mode?
+ ((int) keystrlen () + 13):5, "");
/* Ownertrust is only meaningful for the PGP or
classic trust models */
if (opt.trust_model == TM_PGP
@@ -2865,6 +2873,7 @@ show_basic_key_info (KBNODE keyblock)
{
KBNODE node;
int i;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
/* The primary key */
for (node = keyblock; node; node = node->next)
@@ -2876,12 +2885,12 @@ show_basic_key_info (KBNODE keyblock)
/* Note, we use the same format string as in other show
functions to make the translation job easier. */
- tty_printf ("%s %4u%c/%s ",
+ tty_printf ("%s %s/%s ",
node->pkt->pkttype == PKT_PUBLIC_KEY ? "pub" :
node->pkt->pkttype == PKT_PUBLIC_SUBKEY ? "sub" :
node->pkt->pkttype == PKT_SECRET_KEY ? "sec" :"ssb",
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo), keystr_from_pk (pk));
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr_from_pk (pk));
tty_printf (_("created: %s"), datestr_from_pk (pk));
tty_printf (" ");
tty_printf (_("expires: %s"), expirestr_from_pk (pk));
@@ -2915,16 +2924,17 @@ show_key_and_fingerprint (KBNODE keyblock)
{
KBNODE node;
PKT_public_key *pk = NULL;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
for (node = keyblock; node; node = node->next)
{
if (node->pkt->pkttype == PKT_PUBLIC_KEY)
{
pk = node->pkt->pkt.public_key;
- tty_printf ("pub %4u%c/%s %s ",
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo),
- keystr_from_pk (pk), datestr_from_pk (pk));
+ tty_printf ("pub %s/%s %s ",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr_from_pk(pk),
+ datestr_from_pk (pk));
}
else if (node->pkt->pkttype == PKT_USER_ID)
{
diff --git a/g10/keyid.c b/g10/keyid.c
index 5fa44ef9c..9ed64a4b5 100644
--- a/g10/keyid.c
+++ b/g10/keyid.c
@@ -1,6 +1,7 @@
/* keyid.c - key ID and fingerprint handling
* Copyright (C) 1998, 1999, 2000, 2001, 2003,
* 2004, 2006, 2010 Free Software Foundation, Inc.
+ * Copyright (C) 2014 Werner Koch
*
* This file is part of GnuPG.
*
@@ -57,13 +58,81 @@ pubkey_letter( int algo )
case PUBKEY_ALGO_ELGAMAL_E: return 'g' ;
case PUBKEY_ALGO_ELGAMAL: return 'G' ;
case PUBKEY_ALGO_DSA: return 'D' ;
- case PUBKEY_ALGO_EDDSA: return 'E' ; /* ECC EdDSA (sign only) */
- case PUBKEY_ALGO_ECDSA: return 'E' ; /* ECC DSA (sign only) */
case PUBKEY_ALGO_ECDH: return 'e' ; /* ECC DH (encrypt only) */
+ case PUBKEY_ALGO_ECDSA: return 'E' ; /* ECC DSA (sign only) */
+ case PUBKEY_ALGO_EDDSA: return 'E' ; /* ECC EdDSA (sign only) */
default: return '?';
}
}
+/* Return a string describing the public key algorithm and the
+ keysize. For elliptic curves the functions prints the name of the
+ curve because the keysize is a property of the curve. The string
+ is copied to the supplied buffer up a length of BUFSIZE-1.
+ Examples for the output are:
+
+ "rsa2048" - RSA with 2048 bit
+ "elg1024" - Elgamal with 1024 bit
+ "ed25519" - ECC using the curve Ed25519.
+ "E_1.2.3.4" - ECC using the unsupported curve with OID "1.2.3.4".
+ "E_1.3.6.1.4.1.11591.2.12242973" ECC with a bogus OID.
+ "unknown_N" - Unknown OpenPGP algorithm N.
+
+ If the option --legacy-list-mode is active, the output use the
+ legacy format:
+
+ "2048R" - RSA with 2048 bit
+ "1024g" - Elgamal with 1024 bit
+ "256E" - ECDSA using a curve with 256 bit
+
+ The macro PUBKEY_STRING_SIZE may be used to allocate a buffer with
+ a suitable size.*/
+char *
+pubkey_string (PKT_public_key *pk, char *buffer, size_t bufsize)
+{
+ const char *prefix = NULL;
+
+ if (opt.legacy_list_mode)
+ {
+ snprintf (buffer, bufsize, "%4u%c",
+ nbits_from_pk (pk), pubkey_letter (pk->pubkey_algo));
+ return buffer;
+ }
+
+ switch (pk->pubkey_algo)
+ {
+ case PUBKEY_ALGO_RSA:
+ case PUBKEY_ALGO_RSA_E:
+ case PUBKEY_ALGO_RSA_S: prefix = "rsa"; break;
+ case PUBKEY_ALGO_ELGAMAL_E: prefix = "elg"; break;
+ case PUBKEY_ALGO_DSA: prefix = "dsa"; break;
+ case PUBKEY_ALGO_ELGAMAL: prefix = "xxx"; break;
+ case PUBKEY_ALGO_ECDH:
+ case PUBKEY_ALGO_ECDSA:
+ case PUBKEY_ALGO_EDDSA: prefix = ""; break;
+ }
+
+ if (prefix && *prefix)
+ snprintf (buffer, bufsize, "%s%u", prefix, nbits_from_pk (pk));
+ else if (prefix)
+ {
+ char *curve = openpgp_oid_to_str (pk->pkey[0]);
+ const char *name = openpgp_oid_to_curve (curve);
+
+ if (*name && *name != '?')
+ snprintf (buffer, bufsize, "%s", name);
+ else if (curve)
+ snprintf (buffer, bufsize, "E_%s", curve);
+ else
+ snprintf (buffer, bufsize, "E_error");
+ xfree (curve);
+ }
+ else
+ snprintf (buffer, bufsize, "unknown_%u", (unsigned int)pk->pubkey_algo);
+
+ return buffer;
+}
+
/* Hash a public key. This function is useful for v4 fingerprints and
for v3 or v4 key signing. */
diff --git a/g10/keylist.c b/g10/keylist.c
index 9a96c872e..82d60c261 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -136,13 +136,13 @@ print_seckey_info (PKT_public_key *pk)
{
u32 keyid[2];
char *p;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
keyid_from_pk (pk, keyid);
p = get_user_id_native (keyid);
- tty_printf ("\nsec %4u%c/%s %s %s\n",
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo),
+ tty_printf ("\nsec %s/%s %s %s\n",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
keystr (keyid), datestr_from_pk (pk), p);
xfree (p);
@@ -156,6 +156,7 @@ print_pubkey_info (estream_t fp, PKT_public_key * pk)
{
u32 keyid[2];
char *p;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
keyid_from_pk (pk, keyid);
@@ -168,9 +169,8 @@ print_pubkey_info (estream_t fp, PKT_public_key * pk)
if (fp)
tty_printf ("\n");
- tty_fprintf (fp, "pub %4u%c/%s %s %s\n",
- nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo),
+ tty_fprintf (fp, "pub %s/%s %s %s\n",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
keystr (keyid), datestr_from_pk (pk), p);
xfree (p);
}
@@ -186,6 +186,7 @@ print_card_key_info (estream_t fp, kbnode_t keyblock)
char *hexgrip;
char *serialno;
int s2k_char;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
for (node = keyblock; node; node = node->next)
{
@@ -207,10 +208,11 @@ print_card_key_info (estream_t fp, kbnode_t keyblock)
else
s2k_char = '#'; /* Key not found. */
- tty_fprintf (fp, "%s%c %4u%c/%s ",
+ tty_fprintf (fp, "%s%c %s/%s ",
node->pkt->pkttype == PKT_PUBLIC_KEY ? "sec" : "ssb",
- s2k_char, nbits_from_pk (pk),
- pubkey_letter (pk->pubkey_algo), keystr_from_pk (pk));
+ s2k_char,
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr_from_pk (pk));
tty_fprintf (fp, _("created: %s"), datestr_from_pk (pk));
tty_fprintf (fp, " ");
tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
@@ -780,6 +782,7 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
int s2k_char;
char *hexgrip = NULL;
char *serialno = NULL;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
/* Get the keyid from the keyblock. */
node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
@@ -811,11 +814,12 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
check_trustdb_stale ();
- es_fprintf (es_stdout, "%s%c %4u%c/%s %s",
- secret? "sec":"pub",
- s2k_char,
- nbits_from_pk (pk), pubkey_letter (pk->pubkey_algo),
- keystr_from_pk (pk), datestr_from_pk (pk));
+
+ es_fprintf (es_stdout, "%s%c %s/%s %s",
+ secret? "sec":"pub",
+ s2k_char,
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr_from_pk (pk), datestr_from_pk (pk));
if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
|| pk->pubkey_algo == PUBKEY_ALGO_EDDSA
@@ -947,10 +951,10 @@ list_keyblock_print (KBNODE keyblock, int secret, int fpr, void *opaque)
else
s2k_char = ' ';
- es_fprintf (es_stdout, "%s%c %4u%c/%s %s",
+ es_fprintf (es_stdout, "%s%c %s/%s %s",
secret? "ssb":"sub",
s2k_char,
- nbits_from_pk (pk2), pubkey_letter (pk2->pubkey_algo),
+ pubkey_string (pk2, pkstrbuf, sizeof pkstrbuf),
keystr_from_pk (pk2), datestr_from_pk (pk2));
if (pk2->pubkey_algo == PUBKEY_ALGO_ECDSA
diff --git a/g10/mainproc.c b/g10/mainproc.c
index 5f8d1197b..6bd475ba3 100644
--- a/g10/mainproc.c
+++ b/g10/mainproc.c
@@ -923,6 +923,7 @@ list_node( CTX c, KBNODE node )
{
int any=0;
int mainkey;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
if( !node )
;
@@ -958,9 +959,10 @@ list_node( CTX c, KBNODE node )
}
}
else
- printf("%s %4u%c/%s %s%s",
- mainkey? "pub":"sub", nbits_from_pk( pk ),
- pubkey_letter( pk->pubkey_algo ), keystr_from_pk( pk ),
+ printf("%s %s/%s %s%s",
+ mainkey? "pub":"sub",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
+ keystr_from_pk( pk ),
datestr_from_pk( pk ), mainkey?" ":"");
if( mainkey ) {
diff --git a/g10/options.h b/g10/options.h
index 4a7eca2cf..15ae4126b 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -177,6 +177,7 @@ struct
int no_literal;
ulong set_filesize;
int fast_list_mode;
+ int legacy_list_mode;
int ignore_time_conflict;
int ignore_valid_from;
int ignore_crc_error;
diff --git a/g10/pkclist.c b/g10/pkclist.c
index e1a44289c..d94f59e11 100644
--- a/g10/pkclist.c
+++ b/g10/pkclist.c
@@ -188,6 +188,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
int min_num;
int did_help=defer_help;
unsigned int minimum=get_min_ownertrust(pk);
+ char pkstrbuf[PUBKEY_STRING_SIZE];
switch(minimum)
{
@@ -221,8 +222,8 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
KBNODE keyblock, un;
tty_printf(_("No trust value assigned to:\n"));
- tty_printf("%4u%c/%s %s\n",nbits_from_pk( pk ),
- pubkey_letter( pk->pubkey_algo ),
+ tty_printf("%s/%s %s\n",
+ pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
keystr(keyid), datestr_from_pk( pk ) );
p=get_user_id_native(keyid);
tty_printf(_(" \"%s\"\n"),p);
@@ -893,6 +894,7 @@ build_pk_list (ctrl_t ctrl,
int any_recipients=0;
strlist_t rov,remusr;
char *def_rec = NULL;
+ char pkstrbuf[PUBKEY_STRING_SIZE];
/* Try to expand groups if any have been defined. */
if (opt.grouplist)
@@ -1027,11 +1029,11 @@ build_pk_list (ctrl_t ctrl,
u32 keyid[2];
keyid_from_pk(iter->pk,keyid);
- tty_printf("%4u%c/%s %s \"",
- nbits_from_pk(iter->pk),
- pubkey_letter(iter->pk->pubkey_algo),
- keystr(keyid),
- datestr_from_pk(iter->pk));
+ tty_printf ("%s/%s %s \"",
+ pubkey_string (iter->pk,
+ pkstrbuf, sizeof pkstrbuf),
+ keystr(keyid),
+ datestr_from_pk (iter->pk));
if (iter->pk->user_id)
tty_print_utf8_string(iter->pk->user_id->name,