mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-30 16:17:02 +01: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
|
||||
RESULT. This function extracts the key from the private key
|
||||
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;
|
||||
}
|
||||
|
||||
algo = agent_pk_get_algo (s_skey);
|
||||
algo = get_pk_algo_from_key (s_skey);
|
||||
|
||||
if (shadow_info || no_shadow_info)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user