From 4bdade5b0bea1816a2479c73abc71b41f09ba727 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 19 Jun 2020 14:44:42 +0900 Subject: [PATCH] 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 --- agent/findkey.c | 158 ------------------------------------------------ agent/pksign.c | 2 +- 2 files changed, 1 insertion(+), 159 deletions(-) diff --git a/agent/findkey.c b/agent/findkey.c index d1b688888..1494615c4 100644 --- a/agent/findkey.c +++ b/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 diff --git a/agent/pksign.c b/agent/pksign.c index 96f877415..a2d5362be 100644 --- a/agent/pksign.c +++ b/agent/pksign.c @@ -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) {