mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-17 15:44:34 +02:00
agent: Use get_pk_algo_from_key.
* agent/findkey.c (key_parms_from_sexp, is_eddsa): Remove. (agent_pk_get_algo): Remove. * agent/pksign.c (agent_pksign_do): Use get_pk_algo_from_key. Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
d2e4aa5ee4
commit
4bdade5b0b
158
agent/findkey.c
158
agent/findkey.c
@ -1136,164 +1136,6 @@ agent_key_from_file (ctrl_t ctrl, const char *cache_nonce,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the string name from the S-expression S_KEY as well as a
|
|
||||||
string describing the names of the parameters. ALGONAMESIZE and
|
|
||||||
ELEMSSIZE give the allocated size of the provided buffers. The
|
|
||||||
buffers may be NULL if not required. If R_LIST is not NULL the top
|
|
||||||
level list will be stored there; the caller needs to release it in
|
|
||||||
this case. */
|
|
||||||
static gpg_error_t
|
|
||||||
key_parms_from_sexp (gcry_sexp_t s_key, gcry_sexp_t *r_list,
|
|
||||||
char *r_algoname, size_t algonamesize,
|
|
||||||
char *r_elems, size_t elemssize)
|
|
||||||
{
|
|
||||||
gcry_sexp_t list, l2;
|
|
||||||
const char *name, *algoname, *elems;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
if (r_list)
|
|
||||||
*r_list = NULL;
|
|
||||||
|
|
||||||
list = gcry_sexp_find_token (s_key, "shadowed-private-key", 0 );
|
|
||||||
if (!list)
|
|
||||||
list = gcry_sexp_find_token (s_key, "protected-private-key", 0 );
|
|
||||||
if (!list)
|
|
||||||
list = gcry_sexp_find_token (s_key, "private-key", 0 );
|
|
||||||
if (!list)
|
|
||||||
list = gcry_sexp_find_token (s_key, "public-key", 0 );
|
|
||||||
if (!list)
|
|
||||||
{
|
|
||||||
log_error ("invalid private key format\n");
|
|
||||||
return gpg_error (GPG_ERR_BAD_SECKEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
l2 = gcry_sexp_cadr (list);
|
|
||||||
gcry_sexp_release (list);
|
|
||||||
list = l2;
|
|
||||||
name = gcry_sexp_nth_data (list, 0, &n);
|
|
||||||
if (n==3 && !memcmp (name, "rsa", 3))
|
|
||||||
{
|
|
||||||
algoname = "rsa";
|
|
||||||
elems = "ne";
|
|
||||||
}
|
|
||||||
else if (n==3 && !memcmp (name, "dsa", 3))
|
|
||||||
{
|
|
||||||
algoname = "dsa";
|
|
||||||
elems = "pqgy";
|
|
||||||
}
|
|
||||||
else if (n==3 && !memcmp (name, "ecc", 3))
|
|
||||||
{
|
|
||||||
algoname = "ecc";
|
|
||||||
elems = "pabgnq";
|
|
||||||
}
|
|
||||||
else if (n==5 && !memcmp (name, "ecdsa", 5))
|
|
||||||
{
|
|
||||||
algoname = "ecdsa";
|
|
||||||
elems = "pabgnq";
|
|
||||||
}
|
|
||||||
else if (n==4 && !memcmp (name, "ecdh", 4))
|
|
||||||
{
|
|
||||||
algoname = "ecdh";
|
|
||||||
elems = "pabgnq";
|
|
||||||
}
|
|
||||||
else if (n==3 && !memcmp (name, "elg", 3))
|
|
||||||
{
|
|
||||||
algoname = "elg";
|
|
||||||
elems = "pgy";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log_error ("unknown private key algorithm\n");
|
|
||||||
gcry_sexp_release (list);
|
|
||||||
return gpg_error (GPG_ERR_BAD_SECKEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r_algoname)
|
|
||||||
{
|
|
||||||
if (strlen (algoname) >= algonamesize)
|
|
||||||
return gpg_error (GPG_ERR_BUFFER_TOO_SHORT);
|
|
||||||
strcpy (r_algoname, algoname);
|
|
||||||
}
|
|
||||||
if (r_elems)
|
|
||||||
{
|
|
||||||
if (strlen (elems) >= elemssize)
|
|
||||||
return gpg_error (GPG_ERR_BUFFER_TOO_SHORT);
|
|
||||||
strcpy (r_elems, elems);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r_list)
|
|
||||||
*r_list = list;
|
|
||||||
else
|
|
||||||
gcry_sexp_release (list);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return true if KEYPARMS holds an EdDSA key. */
|
|
||||||
static int
|
|
||||||
is_eddsa (gcry_sexp_t keyparms)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
gcry_sexp_t list;
|
|
||||||
const char *s;
|
|
||||||
size_t n;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
list = gcry_sexp_find_token (keyparms, "flags", 0);
|
|
||||||
for (i = list ? gcry_sexp_length (list)-1 : 0; i > 0; i--)
|
|
||||||
{
|
|
||||||
s = gcry_sexp_nth_data (list, i, &n);
|
|
||||||
if (!s)
|
|
||||||
continue; /* Not a data element. */
|
|
||||||
|
|
||||||
if (n == 5 && !memcmp (s, "eddsa", 5))
|
|
||||||
{
|
|
||||||
result = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gcry_sexp_release (list);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return the public key algorithm number of S_KEY. For ECC, returns
|
|
||||||
GCRY_PK_ECC (generic), even if it is known specifically for ECDSA. */
|
|
||||||
int
|
|
||||||
agent_pk_get_algo (gcry_sexp_t s_key)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
gcry_sexp_t list;
|
|
||||||
char algoname[6];
|
|
||||||
|
|
||||||
if (!s_key)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (key_parms_from_sexp (s_key, &list, algoname, sizeof algoname, NULL, 0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!strcmp (algoname, "rsa"))
|
|
||||||
result = GCRY_PK_RSA;
|
|
||||||
else if (!strcmp (algoname, "dsa"))
|
|
||||||
result = GCRY_PK_DSA;
|
|
||||||
else if (!strcmp (algoname, "ecc"))
|
|
||||||
{
|
|
||||||
if (is_eddsa (list))
|
|
||||||
result = GCRY_PK_EDDSA;
|
|
||||||
else
|
|
||||||
result = GCRY_PK_ECC;
|
|
||||||
}
|
|
||||||
else if (!strcmp (algoname, "ecdsa"))
|
|
||||||
result = GCRY_PK_ECC;
|
|
||||||
else
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
gcry_sexp_release (list);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return the key for the keygrip GRIP. The result is stored at
|
/* Return the key for the keygrip GRIP. The result is stored at
|
||||||
RESULT. This function extracts the key from the private key
|
RESULT. This function extracts the key from the private key
|
||||||
database and returns it as an S-expression object as it is. On
|
database and returns it as an S-expression object as it is. On
|
||||||
|
@ -320,7 +320,7 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
|
|||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
algo = agent_pk_get_algo (s_skey);
|
algo = get_pk_algo_from_key (s_skey);
|
||||||
|
|
||||||
if (shadow_info || no_shadow_info)
|
if (shadow_info || no_shadow_info)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user