Add gpgme_pubkey_algo_string

* src/gpgme.h.in (GPGME_PK_EDDSA): New.
(gpgme_pubkey_algo_string): New.
* src/conversion.c (_gpgme_map_pk_algo): Add new algo.
* src/gpgme.c (gpgme_pubkey_algo_string): New.
(gpgme_pubkey_algo_name): Reformat.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2015-08-30 19:04:44 +02:00
parent c8e7870281
commit c4b6b35bfa
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
8 changed files with 98 additions and 37 deletions

7
NEWS
View File

@ -1,6 +1,13 @@
Noteworthy changes in version 1.6.1 (unreleased) [C25/A14/R_] Noteworthy changes in version 1.6.1 (unreleased) [C25/A14/R_]
------------------------------------------------ ------------------------------------------------
* New function to format a GnuPG style public key algorithm string.
* Interface changes relative to the 1.6.0 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gpgme_pubkey_algo_string NEW.
GPGME_PK_EDDSA NEW.
Noteworthy changes in version 1.6.0 (2015-08-26) [C25/A14/R0] Noteworthy changes in version 1.6.0 (2015-08-26) [C25/A14/R0]
------------------------------------------------ ------------------------------------------------

View File

@ -1161,6 +1161,9 @@ Algorithm as defined by FIPS 186-2 and RFC-6637.
This value indicates ECDH, the Eliptic Curve Diffie-Hellmann This value indicates ECDH, the Eliptic Curve Diffie-Hellmann
encryption algorithm as defined by RFC-6637. encryption algorithm as defined by RFC-6637.
@item GPGME_PK_EDDSA
This value indicates the EdDSA algorithm.
@end table @end table
@end deftp @end deftp
@ -1174,6 +1177,14 @@ If @var{algo} is not a valid public key algorithm, @code{NULL} is
returned. returned.
@end deftypefun @end deftypefun
@deftypefun {char *} gpgme_pubkey_algo_string (@w{gpgme_subkey_t @var{key}})
The function @code{gpgme_pubkey_algo_string} is a convenience function
to build and return an algorithm string in the same way GnuPG does
(e.g. ``rsa2048'' or ``ed25519''). The caller must free the result
using @code{gpgme_free}. On error (e.g. invalid argument or memory
exhausted), the function returns NULL and sets @code{ERRNO}.
@end deftypefun
@node Hash Algorithms @node Hash Algorithms
@section Hash Algorithms @section Hash Algorithms
@ -1954,9 +1965,11 @@ case, the data object @var{dh} is destroyed.
@deftypefun void gpgme_free (@w{void *@var{buffer}}) @deftypefun void gpgme_free (@w{void *@var{buffer}})
The function @code{gpgme_free} releases the memory returned by The function @code{gpgme_free} releases the memory returned by
@code{gpgme_data_release_and_get_mem}. It should be used instead of @code{gpgme_data_release_and_get_mem} and
the system libraries @code{free} function in case different allocators @code{gpgme_pubkey_algo_string}. It should be used instead of the
are used in a single program. system libraries @code{free} function in case different allocators are
used by a program. This is often the case if gpgme is used under
Windows as a DLL.
@end deftypefun @end deftypefun
@ -2838,7 +2851,7 @@ True if the secret key is stored on a smart card.
The serial number of a smart card holding this key or @code{NULL}. The serial number of a smart card holding this key or @code{NULL}.
@item char *curve @item char *curve
For ECC algoritms the name of the curve. For ECC algorithms the name of the curve.
@end table @end table
@end deftp @end deftp

View File

@ -427,6 +427,7 @@ _gpgme_map_pk_algo (int algo, gpgme_protocol_t protocol)
case 18: algo = GPGME_PK_ECDH; break; case 18: algo = GPGME_PK_ECDH; break;
case 19: algo = GPGME_PK_ECDSA; break; case 19: algo = GPGME_PK_ECDSA; break;
case 20: break; case 20: break;
case 22: algo = GPGME_PK_EDDSA; break;
default: algo = 0; break; /* Unknown. */ default: algo = 0; break; /* Unknown. */
} }
} }

View File

@ -271,7 +271,8 @@ gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len)
} }
/* Release the memory returned by gpgme_data_release_and_get_mem(). */ /* Release the memory returned by gpgme_data_release_and_get_mem() and
some other functions. */
void void
gpgme_free (void *buffer) gpgme_free (void *buffer)
{ {

View File

@ -1,7 +1,7 @@
/* gpgme.c - GnuPG Made Easy. /* gpgme.c - GnuPG Made Easy.
Copyright (C) 2000 Werner Koch (dd9jn) Copyright (C) 2000 Werner Koch (dd9jn)
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2012, Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2012,
2014 g10 Code GmbH 2014, 2015 g10 Code GmbH
This file is part of GPGME. This file is part of GPGME.
@ -994,41 +994,70 @@ gpgme_sig_notation_get (gpgme_ctx_t ctx)
return ctx->sig_notations; return ctx->sig_notations;
} }
/* Return a public key algorithm string made of the algorithm and size
or the curve name. May return NULL on error. Caller must free the
result using gpgme_free. */
char *
gpgme_pubkey_algo_string (gpgme_subkey_t subkey)
{
const char *prefix = NULL;
char *result;
if (!subkey)
{
gpg_err_set_errno (EINVAL);
return NULL;
}
switch (subkey->pubkey_algo)
{
case GPGME_PK_RSA:
case GPGME_PK_RSA_E:
case GPGME_PK_RSA_S: prefix = "rsa"; break;
case GPGME_PK_ELG_E: prefix = "elg"; break;
case GPGME_PK_DSA: prefix = "dsa"; break;
case GPGME_PK_ELG: prefix = "xxx"; break;
case GPGME_PK_ECC:
case GPGME_PK_ECDH:
case GPGME_PK_ECDSA:
case GPGME_PK_EDDSA: prefix = ""; break;
}
if (prefix && *prefix)
{
char buffer[40];
snprintf (buffer, sizeof buffer, "%s%u", prefix, subkey->length);
result = strdup (buffer);
}
else if (prefix && subkey->curve && *subkey->curve)
result = strdup (subkey->curve);
else if (prefix)
result = strdup ("E_error");
else
result = strdup ("unknown");
return result;
}
const char * const char *
gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo) gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo)
{ {
switch (algo) switch (algo)
{ {
case GPGME_PK_RSA: case GPGME_PK_RSA: return "RSA";
return "RSA"; case GPGME_PK_RSA_E: return "RSA-E";
case GPGME_PK_RSA_S: return "RSA-S";
case GPGME_PK_RSA_E: case GPGME_PK_ELG_E: return "ELG-E";
return "RSA-E"; case GPGME_PK_DSA: return "DSA";
case GPGME_PK_ECC: return "ECC";
case GPGME_PK_RSA_S: case GPGME_PK_ELG: return "ELG";
return "RSA-S"; case GPGME_PK_ECDSA: return "ECDSA";
case GPGME_PK_ECDH: return "ECDH";
case GPGME_PK_ELG_E: case GPGME_PK_EDDSA: return "EdDSA";
return "ELG-E"; default: return NULL;
case GPGME_PK_DSA:
return "DSA";
case GPGME_PK_ECC:
return "ECC";
case GPGME_PK_ELG:
return "ELG";
case GPGME_PK_ECDSA:
return "ECDSA";
case GPGME_PK_ECDH:
return "ECDH";
default:
return NULL;
} }
} }

View File

@ -223,5 +223,7 @@ EXPORTS
gpgme_set_status_cb @167 gpgme_set_status_cb @167
gpgme_get_status_cb @168 gpgme_get_status_cb @168
gpgme_pubkey_algo_string @169
; END ; END

View File

@ -261,7 +261,8 @@ typedef enum
GPGME_PK_ECC = 18, GPGME_PK_ECC = 18,
GPGME_PK_ELG = 20, GPGME_PK_ELG = 20,
GPGME_PK_ECDSA = 301, GPGME_PK_ECDSA = 301,
GPGME_PK_ECDH = 302 GPGME_PK_ECDH = 302,
GPGME_PK_EDDSA = 303
} }
gpgme_pubkey_algo_t; gpgme_pubkey_algo_t;
@ -1218,7 +1219,8 @@ gpgme_error_t gpgme_data_new_from_mem (gpgme_data_t *r_dh,
size is returned in R_LEN. */ size is returned in R_LEN. */
char *gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len); char *gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len);
/* Release the memory returned by gpgme_data_release_and_get_mem(). */ /* Release the memory returned by gpgme_data_release_and_get_mem() and
some other functions. */
void gpgme_free (void *buffer); void gpgme_free (void *buffer);
gpgme_error_t gpgme_data_new_from_cbs (gpgme_data_t *dh, gpgme_error_t gpgme_data_new_from_cbs (gpgme_data_t *dh,
@ -2232,6 +2234,10 @@ gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto);
void gpgme_result_ref (void *result); void gpgme_result_ref (void *result);
void gpgme_result_unref (void *result); void gpgme_result_unref (void *result);
/* Return a public key algorithm string (e.g. "rsa2048"). Caller must
free using gpgme_free. */
char *gpgme_pubkey_algo_string (gpgme_subkey_t subkey);
/* Return a statically allocated string with the name of the public /* Return a statically allocated string with the name of the public
key algorithm ALGO, or NULL if that name is not known. */ key algorithm ALGO, or NULL if that name is not known. */
const char *gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo); const char *gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo);

View File

@ -98,6 +98,8 @@ GPGME_1.1 {
gpgme_set_status_cb; gpgme_set_status_cb;
gpgme_get_status_cb; gpgme_get_status_cb;
gpgme_pubkey_algo_string;
}; };