diff options
author | Werner Koch <wk@gnupg.org> | 2019-02-08 12:10:45 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2019-02-08 12:10:45 +0100 |
commit | 03bf8e967adb2dd13329ba1089deb419d49e55c0 (patch) | |
tree | db126df88d088d92d8908a948e448c6fbd400e8d /common/sexputil.c | |
parent | card: Make "generate" work for PIV cards. (diff) | |
download | gnupg2-03bf8e967adb2dd13329ba1089deb419d49e55c0.tar.xz gnupg2-03bf8e967adb2dd13329ba1089deb419d49e55c0.zip |
common: Provide function to get public key algo names in our format.
* tools/card-tool-misc.c (pubkey_algo_string): Move to ...
* common/sexputil.c (pubkey_algo_string): here.
--
The new gpg format for public key algorithms is useful at other places
as well. Thus we make this new function available. Note that the
code we use in gpg is not based on s-expressions and thus a new
function was required.
Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'common/sexputil.c')
-rw-r--r-- | common/sexputil.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/common/sexputil.c b/common/sexputil.c index 02e52d0ed..d3020e169 100644 --- a/common/sexputil.c +++ b/common/sexputil.c @@ -577,3 +577,61 @@ get_pk_algo_from_canon_sexp (const unsigned char *keydata, size_t keydatalen) gcry_sexp_release (sexp); return algo; } + + +/* Given the public key S_PKEY, return a new buffer with a descriptive + * string for its algorithm. This function may return NULL on memory + * error. */ +char * +pubkey_algo_string (gcry_sexp_t s_pkey) +{ + const char *prefix; + gcry_sexp_t l1; + char *algoname; + int algo; + char *result; + + l1 = gcry_sexp_find_token (s_pkey, "public-key", 0); + if (!l1) + return xtrystrdup ("E_no_key"); + { + gcry_sexp_t l_tmp = gcry_sexp_cadr (l1); + gcry_sexp_release (l1); + l1 = l_tmp; + } + algoname = gcry_sexp_nth_string (l1, 0); + gcry_sexp_release (l1); + if (!algoname) + return xtrystrdup ("E_no_algo"); + + algo = gcry_pk_map_name (algoname); + switch (algo) + { + case GCRY_PK_RSA: prefix = "rsa"; break; + case GCRY_PK_ELG: prefix = "elg"; break; + case GCRY_PK_DSA: prefix = "dsa"; break; + case GCRY_PK_ECC: prefix = ""; break; + default: prefix = NULL; break; + } + + if (prefix && *prefix) + result = xtryasprintf ("%s%u", prefix, gcry_pk_get_nbits (s_pkey)); + else if (prefix) + { + const char *curve = gcry_pk_get_curve (s_pkey, 0, NULL); + const char *name = openpgp_oid_to_curve + (openpgp_curve_to_oid (curve, NULL), 0); + + if (name) + result = xtrystrdup (name); + else if (curve) + result = xtryasprintf ("X_%s", curve); + else + result = xtrystrdup ("E_unknown"); + } + else + result = xtryasprintf ("X_algo_%d", algo); + + xfree (algoname); + return result; +} |